使用dockerfile手動構建JDK11鏡像運行容器并校驗

Docker官方維護鏡像的公共倉庫網站 Docker Hub 國內無法訪問了,大部分鏡像無法下載,準備逐步構建自己的鏡像庫。【轉載aliyun官方-容器鏡像服務 ACR】Docker常見問題

阿里云容器鏡像服務ACR(Alibaba Cloud Container Registry)是面向容器鏡像、Helm Chart等符合OCI標準的云原生制品安全托管及高效分發平臺。ACR企業版支持全球同步加速、大規模和大鏡像分發加速、多代碼源構建加速等全鏈路加速能力,與容器服務ACK無縫集成,幫助企業降低交付復雜度,打造云原生應用一站式解決方案。

一、下載Linux下的JDK11包

1.1 下載 jdk-11.0.19_linux-x64_bin.tar.gz

Java SE Development Kit 11.0.19
需要Oracle賬號登錄后才能下載。
這里放一個其他博主公開的Oracle公共賬號和密碼

在這里插入圖片描述

1.2 上傳下載的JDK11包到CentOS中的新建文件夾mydockerfile中

建議:dockerfile文件和jdk包放在同一個文件夾下,這樣不用build時用-f參數指定dockerfile的位置。
在這里插入圖片描述
這里文件夾的名稱寫成了mydockfile,應該是mydockerfile,后續已經重命名改正:
在這里插入圖片描述

二、編寫dockerfile文件并執行docker build命令構建鏡像

前提:安裝配置好docker,可參考我這篇 基于CentOS7安裝配置docker與docker-compose。

2.1 編寫并上傳dockerfile文件

我們使用命令 docker build , 從零開始來創建一個新的鏡像。為此,我們需要創建一個 dockerfile 文件,其中包含一組指令來告訴 Docker 如何構建我們的鏡像。每一個指令都會在鏡像上創建一個新的層,每一個指令的前綴都必須是大寫的。
第一條FROM,指定使用哪個鏡像源
RUN 指令告訴docker 在鏡像內執行命令,安裝了什么。。。
然后,我們使用 dockerfile 文件,通過 docker build 命令來構建一個鏡像。

注意:dockerfile文件要寫上Linux的系統版本,我這里使用的是CentOS的系統,查詢linux系統版本可參考我這篇
查看CentOS版本及系統位數與設置CentOS 7.9 2009 防火墻配置放開端口的命令與過程

dockerfile文件內容:

# 建立一個新的鏡像文件,配置模板:新建立的鏡像是以centos為基礎模板
# 因為jdk必須運行在操作系統之上
#每一個指令都會在鏡像上創建一個新的層,每一個指令的前綴都必須是大寫的。
#第一條FROM,指定使用哪個鏡像源FROM centos:7.9.2009#維護者 作者 郵箱
MAINTAINER djcking <djc814@qq.com>#RUN 指令告訴docker 在鏡像內執行命令,安裝了什么
#創建一個新目錄來存儲jdk文件
RUN  mkdir "/usr/local/java"#將jdk壓縮文件復制到鏡像中,它將自動解壓縮tar文件
ADD jdk-11.0.19_linux-x64_bin.tar.gz   /usr/local/java# 設置時區
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime# 設置環境變量
ENV JAVA_HOME /usr/local/java/jdk-11.0.19
ENV PATH $JAVA_HOME/bin:$PATH# VOLUME 指定了臨時文件目錄為/tmp
# 其效果是在主機 /var/lib/docker 目錄下創建了一個臨時文件,并鏈接到容器的/tmp
VOLUME /tmp

上傳dockerfile文件:
建議:dockerfile文件和jdk包放在同一個文件夾下,這樣不用build時用-f參數指定dockerfile的位置。

在這里插入圖片描述

2.2 執行docker build命令構建鏡像

dockerfile文件、鏡像-IMAGE,容器-CONTAINER三者的關系(個人學習理解):

1、docker build命令使用dockerfile文件中的配置來構建鏡像-IMAGE2、docker run命令運行構建好的鏡像-IMAGE來啟動容器-CONTAINER;3、鏡像-IMAGE是死的,因為它本質上就是為了生成容器而存在的,容器-CONTAINER是活的,因為最終運行服務時使用的是容器-CONTAINER

構建鏡像命令-docker build:

參數說明:
-t :指定要創建的目標鏡像名
.Dockerfile 文件所在目錄,可以指定Dockerfile 的絕對路徑
//進入存放jdk包與dockerfile的目錄mydockerfile
cd mydockerfile//-t 給新構建的鏡像取名為java, 并設定版本為11
//注意最后有個點,代表使用當前路徑的 Dockerfile 進行構建
//成功執行下面的docker build命令后,docker images 命令中,TAG就是11(鏡像標簽或者版本),Repository就是java,為鏡像倉庫源名。
docker build -t java:11 .

在這里插入圖片描述
通過上圖使用docker images命令 查看創建的jdk鏡像已經在列表中存在,IMAGE ID也成功生成了。

docker images 各參數說明:REPOSITORY:表示鏡像的倉庫源名TAG:鏡像的標簽或版本IMAGE ID:鏡像IDCREATED:鏡像創建時間SIZE:鏡像大小同一鏡像倉庫源可以有多個 TAG,代表這個倉庫源的不同個版本,如 jdk倉庫源里,有 111213....20 等多個不同的版本,我們使用 REPOSITORY:TAG 來定義并區分不同的鏡像,例如jdk:11,jdk:12,jdk:13,jdk:20等。

三、通過鏡像創建啟動容器并校驗

3.1 通過鏡像創建啟動容器


//運行該鏡像 
//此命令使用鏡像java:11,創建并啟動容器,執行成功會根據算法返回一個字符串,是CONTAINER ID,即辨別容器的ID。
// --name djcjdk11 代表一個別名。
docker run -id  --name djcjdk11 java:11//docker run 參數說明:
-i:交互式操作-d:后臺運行-t:終端。

docker ps命令查看正運行的容器(默認只顯示CONTAINER ID的前12位,完整的容器ID有64位,但已經足以區分不同的容器):
在這里插入圖片描述

3.2 校驗

因為我們創建的 djcjdk11容器是的本源包是 jdk-11.0.19_linux-x64_bin.tar.gz,所以校驗即檢查JDK的版本。

//docker exec:推薦大家使用 docker exec 命令,因為此命令會退出容器終端,但不會導致容器的停止。
//可以使用NAMES即djcjdk11或者CONTAINER ID的前四位或完整的CONTAINER ID
//以下6個命令任意一個皆可
docker exec -it NAMES  bash 
docker exec -it CONTAINER ID  bash
docker exec -it CONTAINER ID前幾位 bash
即
docker exec -it djcjdk11 bash 
docker exec -it 4001866f057c  bash
docker exec -it CONTAINER ID前幾位 bash ,如 docker exec -it 4001  bash或者docker exec -it NAMES  /bin/bash 
docker exec -it CONTAINER ID  /bin/bash
docker exec -it CONTAINER ID前幾位 /bin/bash
即
docker exec -it djcjdk11 /bin/bash
docker exec -it 4001866f057c /bin/bash
docker exec -it CONTAINER ID前幾位 /bin/bash,如 docker exec -it 4001  /bin/bash//檢測Java版本  java --version 或java -version
java --version 或java -version

在這里插入圖片描述

四、命令截圖一覽

4.1 命令

//1-進入文件夾
cd /home/mydockerfile//2-構建鏡像命令
//-t 給新構建的鏡像倉庫源取名為java, 并設定版本或者標簽為為11  即TAG
docker build -t java:11 .//3-查看imagesdocker images//4-啟動運行鏡像
//此命令使用鏡像java:11,創建并啟動容器,執行成功會根據算法返回一個字符串,是CONTAINER ID,即辨別容器的ID。
docker run -id  --name djcjdk11 java:11//5-查看正在運行的容器
docker ps//6-進入容器
//docker exec:推薦大家使用 docker exec 命令,因為此命令會退出容器終端,但不會導致容器的停止。
docker exec -it djcjdk11 bash 
或
docker exec -it 4001 /bin/bash //7-檢測Java版本  java --version 或java -version
java --version 或java -version--------其他命令---------//關閉容器 
//這里使用CONTAINER ID的前四位
docker stop 4001//docker logs  CONTAINER ID或者NAMES 可以查看容器內部的標準輸出。
//-f: 讓 docker logs 像使用 tail -f 一樣來輸出容器內部的標準輸出。
//補充:tail 命令可用于查看文件的內容,有一個常用的參數 -f 常用于查閱正在改變的日志文件。
//tail -f filename 會把 filename 文件里的最尾部的內容顯示在屏幕上,并且不斷刷新,只要 filename 更新就可以看到最新的文件內容。docker logs 4001或者 docker logs djcjdk11
docker logs -f 4001或者docker logs -f djcjdk11

鏡像和容器更多操作可以參考我這兩篇文章:
Docker基本操作之刪除容器Container和刪除鏡像IMAGE
Docker容器基本操作之啟動-停止-重啟

4.2 截圖

在這里插入圖片描述
在這里插入圖片描述

五、參考資料

Docker 鏡像使用
Docker 容器使用
Docker Dockerfile
Docker Compose
Docker 倉庫管理
Linux tail 命令
查看CentOS版本及系統位數與設置CentOS 7.9 2009 防火墻配置放開端口的命令與過程
實戰:用dockerfile創建鏡像實現springboot項目容器化
實戰:用docker-compose容器化springboot項目
【Docker】手動構建 OracleJDK11 鏡像
【SpringBoot + Docker】編寫Dockerfile安裝jdk11.0.3,并部署SpringBoot項目
Docker - 安裝openjdk11并啟動運行
Docker之dockerfile制作jdk鏡像
docker 文件編寫,和jdk11運行java的Dockerfile文件
Linux rm命令 刪除文件夾

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40724.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40724.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40724.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

內網穿透-外遠程連接中的RabbitMQ服務

文章目錄 前言1.安裝erlang 語言2.安裝rabbitMQ3. 內網穿透3.1 安裝cpolar內網穿透(支持一鍵自動安裝腳本)3.2 創建HTTP隧道 4. 公網遠程連接5.固定公網TCP地址5.1 保留一個固定的公網TCP端口地址5.2 配置固定公網TCP端口地址 前言 RabbitMQ是一個在 AMQP(高級消息隊列協議)基…

Linux:shell腳本:基礎使用(4)《正則表達式-grep工具》

正則表達式定義&#xff1a; 使用單個字符串來描述&#xff0c;匹配一系列符合某個句法規則的字符串 正則表達式的組成&#xff1a; 普通字符串: 大小寫字母&#xff0c;數字&#xff0c;標點符號及一些其他符號 元字符&#xff1a;在正則表達式中具有特殊意義的專用字符 正則表…

python中__main__的解釋

源自于&#xff1a;https://zhuanlan.zhihu.com/p/340997807 Python程序運行時是從模塊頂行開始&#xff0c;最頂層&#xff08;沒有被縮進&#xff09;的代碼都會被執行&#xff0c;所以Python中并不需要一個統一的main()作為程序的入口。 __name__是Python的內置變量&#…

藍橋杯嵌入式省一教程:(三)按鍵掃描與定時器中斷

在第一講中曾經提到&#xff0c;GPIO有輸入輸出兩種模式。在點亮LED時&#xff0c;我們已經使用了GPIO輸出模式&#xff0c;在按鍵識別中&#xff0c;我們將要使用GPIO輸入模式。首先來看看按鍵的電路原理圖&#xff08;下圖在選手資源數據包——CT117E-M4產品手冊中&#xff0…

Android CCodec (二十) CCodec Native服務實現分析

1、C2解碼服務registerAsService注冊流程 google實現CCodec的vendor默認解碼服務代碼路徑是在frameworks/av/media/codec2/hidl/services/vendor.cpp中,而其注冊的是HIDL服務,本文就對HIDL服務注冊做簡要分析。首先看下vendor.cpp中的代碼注冊流程。 int main(int /* argc *…

高等數學教材重難點題型總結(三)微分中值定理和導數的應用

第三章&#xff0c;微分中值定理的證明題等&#xff0c;非常重要&#xff0c;需要牢牢掌握 1.證明中值定理對某函數在給定區間上的正確性 2.與中值定理有關的證明題 3.微分中值定理應用于求證不等式 4.洛必達法則求極限 5.洛必達的經典錯誤反例 6.按某項實現多項式冪展開 7.求帶…

以 Java NIO 的角度理解 Netty

文章目錄 前言Java NIO 工作原理Selector 的創建ServerSocketChannel 的創建ServerSocketChannel 注冊 Selector對事件的處理總結 前言 上篇文章《Netty 入門指南》主要涵蓋了 Netty 的入門知識&#xff0c;包括 Netty 的發展歷程、核心功能與組件&#xff0c;并且通過實例演示…

rabbitmq的發布確認

生產者將信道設置成 confirm 模式&#xff0c;一旦信道進入 confirm 模式&#xff0c; 所有在該信道上面發布的 消息都將會被指派一個唯一的 ID (從 1 開始)&#xff0c;一旦消息被投遞到所有匹配的隊列之后&#xff0c;broker 就會發送一個確認給生產者(包含消息的唯一 ID)&…

AI巨浪下,數據技術如何驅動智能未來?

引言 數據技術是大數據時代的核心驅動力&#xff0c;也是推動各行各業數字化轉型和智能化升級的關鍵因素。隨著云計算、人工智能、區塊鏈等新興技術的不斷發展和融合&#xff0c;數據技術也呈現出多模態、混合處理、自動化管理等新的趨勢和特點。 8 月 19 日&#xff08;周六&…

域名和ip的關系

域名和ip的關系 一&#xff1a;什么是域名 域名&#xff0c;簡稱域名、網域&#xff0c;是由一串用點分隔的名字組成的上某一臺計算機或計算機組的名稱&#xff0c;用于在數據傳輸時標識 計算機的電子方位(有時也指地理位置)。網域名稱系統&#xff0c;有時也簡稱為域名…

【寶藏系列】嵌入式 C 語言代碼優化技巧【超詳細版】

【寶藏系列】嵌入式 C 語言代碼優化技巧【超詳細版】 文章目錄 【寶藏系列】嵌入式 C 語言代碼優化技巧【超詳細版】前言整形數除法和取余數合并除法和取余數通過2的冪次進行除法和取余數取模的一種替代方法使用數組下標全局變量使用別名變量的生命周期分割變量類型局部變量指針…

Centos下的tcpdump抓包用法

先查一下是否安裝, 無的話裝一下 (版本低的用yum install) : rpm -qa tcpdump dnf install tcpdump 1. 列出能抓包的網卡: tcpdump -D | --list-interfaces 2. 在eth0網卡上抓來源為10.1.1.1 的包, 只抓一個包 (-n這里是不解析DNS) : tcpdump -i eth0 -n src 10.1.1.1 -…

STM32 F103C8T6學習筆記3:串口配置—串口收發—自定義Printf函數

今日學習使用STM32 C8T6的串口&#xff0c;我們在經過學習筆記2的總結歸納可知&#xff0c;STM32 C8T6最小系統板上有三路串口&#xff0c;如下圖&#xff1a; 今日我們就著手學習如何配置開通這些串口進行收發&#xff0c;這里不講串口通信概念與基礎&#xff0c;可以自行網上…

一文讀懂HTML

文章目錄 HTML的歷史HTML的作用HTML的基本語言 HTML的歷史 HTML&#xff08;HyperText Markup Language&#xff09;的歷史可以追溯到20世紀90年代早期&#xff0c;它是互聯網發展的重要里程碑之一。以下是HTML的歷史概述&#xff1a; 早期階段&#xff08;1980年代末 - 1990年…

FLatten Transformer 簡化版Transformer

今天在找論文時&#xff0c;看到一篇比較新奇的論文&#xff0c;在這里跟大家分享一下&#xff0c;希望可以給一些人提供一些思路。雖然現在Transformer 比較火&#xff0c;在分割上面也應用的比較多&#xff0c;但是我一直不喜歡用&#xff0c;其中一個原因是結構太復雜了&…

golang官方限流器rate包實踐

日常開發中&#xff0c;對于某些接口有請求頻率的限制。比如登錄的接口、發送短信的接口、秒殺商品的接口等等。 官方的golang.org/x/time/rate包中實現了令牌桶的算法。 封裝限流器可以將ip、手機號這種的作為限流器組的標識。 接下來就是實例化限流器和獲取令牌函數的實現…

C++:模擬實現list及迭代器類模板優化方法

文章目錄 迭代器模擬實現 本篇模擬實現簡單的list和一些其他注意的點 迭代器 如下所示是利用拷貝構造將一個鏈表中的數據挪動到另外一個鏈表中&#xff0c;構造兩個相同的鏈表 list(const list<T>& lt) {emptyinit();for (auto e : lt){push_back(e);} }void test_…

運動路徑規劃,ROS發布期望運動軌跡

目錄 一、Python實現&#xff08;推薦方法&#xff09; 1.1代碼cubic_spline_path.py 1.2使用方法 二、C實現 參考博客 想讓機器人/智能車無人駕駛&#xff0c;要有期望路徑&#xff0c;最簡單的是一條直線&#xff0c;或者是一條光滑曲線。 生成路徑的方法有兩種&#xf…

【網絡編程(二)】NIO快速入門

NIO Java NIO 三大核心組件 Buffer&#xff08;緩沖區&#xff09;&#xff1a;每個客戶端連接都會對應一個Buffer&#xff0c;讀寫數據通過緩沖區讀寫。Channel&#xff08;通道&#xff09;&#xff1a;每個channel用于連接Buffer和Selector&#xff0c;通道可以進行雙向讀…

Linux下C++開發

Linux下C開發 Linux 系統介紹 簡介 Linux屬于多用戶多任務操作系統&#xff0c;而Windows屬于單用戶多任務操作系統Linux一切皆文件目錄結構 bin 存儲二進制可執行文件dev 存放的是外接設備&#xff0c;例如磁盤&#xff0c;光盤等。在其中的外接設備是不能直接被使用的&…