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文件中的配置來構建鏡像-IMAGE;2、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倉庫源里,有 11、12、13....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命令 刪除文件夾