中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Docker鏡像怎么構建Dockerfile

發布時間:2021-12-13 14:10:44 來源:億速云 閱讀:168 作者:iii 欄目:大數據

本篇內容主要講解“Docker鏡像怎么構建Dockerfile”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Docker鏡像怎么構建Dockerfile”吧!

Dockerfile 常用指令

FROM

  語法:FROM <image>:<tag>

  指明構建的新鏡像是來自于哪個基礎鏡像,如果沒有選擇 tag,那么默認值為 latest。

FROM centos:7

  如果不以任何鏡像為基礎,那么寫法為:FROM scratch。官方說明:scratch 鏡像是一個空鏡像,可以用于構建 busybox 等超小鏡像,可以說是真正的從零開始構建屬于自己的鏡像。

MAINTAINER(deprecated)

  語法:MAINTAINER <name>

  指明鏡像維護者及其聯系方式(一般是郵箱地址)。官方說明已過時,推薦使用 LABEL。

MAINTAINER mrhelloworld <mrhelloworld@126.com>

LABEL

  語法:LABEL <key>=<value> <key>=<value> <key>=<value> ...

  功能是為鏡像指定標簽。也可以使用 LABEL 來指定鏡像作者。

LABEL maintainer="mrhelloworld.com"

RUN

  語法:RUN <command>

  構建鏡像時運行的 Shell 命令,比如構建的新鏡像中我們想在 /usr/local 目錄下創建一個 java 目錄。

RUN mkdir -p /usr/local/java

ADD

  語法:ADD <src>... <dest>

  拷貝文件或目錄到鏡像中。src 可以是一個本地文件或者是一個本地壓縮文件,壓縮文件會自動解壓。還可以是一個 url,如果把 src 寫成一個 url,那么 ADD 就類似于 wget 命令,然后自動下載和解壓。

ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

COPY

  語法:COPY <src>... <dest>

  拷貝文件或目錄到鏡像中。用法同 ADD,只是不支持自動下載和解壓。

COPY jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

EXPOSE

  語法:EXPOSE <port> [<port>/<protocol>...]

  暴露容器運行時的監聽端口給外部,可以指定端口是監聽 TCP 還是 UDP,如果未指定協議,則默認為 TCP。

EXPOSE 80 443 8080/tcp

如果想使得容器與宿主機的端口有映射關系,必須在容器啟動的時候加上 -P 參數。

ENV

  語法:ENV <key> <value> 添加單個,ENV <key>=<value> ... 添加多個。

  設置容器內環境變量。

ENV JAVA_HOME /usr/local/java/jdk-11.0.6/

CMD

  語法:

  • CMD ["executable","param1","param2"],比如:CMD ["/usr/local/tomcat/bin/catalina.sh", "start"]

  • CMD ["param1","param2"] ,比如:CMD [ "echo", "$JAVA_HOME" ]

  • CMD command param1 param2,比如:CMD echo $JAVA_HOME

  啟動容器時執行的 Shell 命令。在 Dockerfile 中只能有一條 CMD 指令。如果設置了多條 CMD,只有最后一條 CMD 會生效。

CMD ehco $JAVA_HOME

  如果創建容器的時候指定了命令,則 CMD 命令會被替代。假如鏡像叫 centos:7,創建容器時命令是:docker run -it --name centos7 centos:7 echo "helloworld" 或者 docker run -it --name centos7 centos:7 /bin/bash,就不會輸出 $JAVA_HOME 的環境變量信息了,因為 CMD 命令被 echo "helloworld"/bin/bash 覆蓋了。

ENTRYPOINT

  語法:

  • ENTRYPOINT ["executable", "param1", "param2"],比如:ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh", "start"]

  • ENTRYPOINT command param1 param2,比如:ENTRYPOINT ehco $JAVA_HOME

  啟動容器時執行的 Shell 命令,同 CMD 類似,不會被 docker run 命令行指定的參數所覆蓋。在 Dockerfile 中只能有一條 ENTRYPOINT 指令。如果設置了多條 ENTRYPOINT,只有最后一條 ENTRYPOINT 會生效。

ENTRYPOINT ehco $JAVA_HOME
  • 如果在 Dockerfile 中同時寫了 ENTRYPOINT 和 CMD,并且 CMD 指令不是一個完整的可執行命令,那么 CMD 指定的內容將會作為 ENTRYPOINT 的參數;

  • 如果在 Dockerfile 中同時寫了 ENTRYPOINT 和 CMD,并且 CMD 是一個完整的指令,那么它們兩個會互相覆蓋,誰在最后誰生效

WORKDIR

  語法:WORKDIR /path/to/workdir

  為 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 設置工作目錄。

WORKDIR /usr/local

VOLUME

  指定容器掛載點到宿主機自動生成的目錄或其他容器。一般的使用場景為需要持久化存儲數據時。

# 容器的 /var/lib/mysql 目錄會在運行時自動掛載為匿名卷,匿名卷在宿主機的 /var/lib/docker/volumes 目錄下
VOLUME ["/var/lib/mysql"]

一般不會在 Dockerfile 中用到,更常見的還是在 docker run 的時候通過 -v 指定數據卷。

構建鏡像

  Dockerfile 文件編寫好以后,真正構建鏡像時需要通過 docker build 命令。

  docker build 命令用于使用 Dockerfile 創建鏡像。

# 使用當前目錄的 Dockerfile 創建鏡像
docker build -t mycentos:7 .
# 通過 -f Dockerfile 文件的位置創建鏡像
docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 .
  • -f:指定要使用的 Dockerfile 路徑;

  • --tag, -t:鏡像的名字及標簽,可以在一次構建中為一個鏡像設置多個標簽。

關于 . 理解

  我們在使用 docker build 命令去構建鏡像時,往往會看到命令最后會有一個 . 號。它究竟是什么意思呢?

  很多人以為是用來指定 Dockerfile 文件所在的位置的,但其實 -f 參數才是用來指定 Dockerfile 的路徑的,那么 . 號究竟是用來做什么的呢?

  Docker 在運行時分為 Docker 引擎(服務端守護進程)客戶端工具,我們日常使用各種 docker 命令,其實就是在使用 客戶端工具Docker 引擎 進行交互。

  當我們使用 docker build 命令來構建鏡像時,這個構建過程其實是在 Docker 引擎 中完成的,而不是在本機環境。如果在 Dockerfile 中使用了一些 ADD 等指令來操作文件,如何讓 Docker 引擎 獲取到這些文件呢?

  這里就有了一個 鏡像構建上下文 的概念,當構建的時候,由用戶指定構建鏡像時的上下文路徑,而 docker build 會將這個路徑下所有的文件都打包上傳給 Docker 引擎,引擎內將這些內容展開后,就能獲取到上下文中的文件了。

  舉個栗子:我的宿主機 jdk 文件在 /root 目錄下,Dockerfile 文件在 /usr/local/dockerfile 目錄下,文件內容如下:

ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

  那么構建鏡像時的命令就該這樣寫:

docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 /root

  再舉個栗子:我的宿主機 jdk 文件和 Dockerfile 文件都在 /usr/local/dockerfile 目錄下,文件內容如下:

ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

  那么構建鏡像時的命令則這樣寫:

docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 .

Dockerfile 實踐

  接下來我們通過基礎鏡像 centos:7,在該鏡像中安裝 jdk 和 tomcat 以后將其制作為一個新的鏡像 mycentos:7

  創建目錄。

mkdir -p /usr/local/dockerfile

  編寫 Dockerfile 文件。

vi Dockerfile

  Dockerfile 文件內容如下:

# 指明構建的新鏡像是來自于 centos:7 基礎鏡像
FROM centos:7
# 通過鏡像標簽聲明了作者信息
LABEL maintainer="mrhelloworld.com"
# 設置工作目錄
WORKDIR /usr/local
# 新鏡像構建成功以后創建指定目錄
RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
# 拷貝文件到鏡像中并解壓
ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
ADD apache-tomcat-9.0.37.tar.gz /usr/local/tomcat
# 暴露容器運行時的 8080 監聽端口給外部
EXPOSE 8080
# 設置容器內 JAVA_HOME 環境變量
ENV JAVA_HOME /usr/local/java/jdk-11.0.6/
ENV PATH $PATH:$JAVA_HOME/bin
# 啟動容器時啟動 tomcat
CMD ["/usr/local/tomcat/apache-tomcat-9.0.37/bin/catalina.sh", "run"]

  構建鏡像。

[root@localhost ~]# docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 /root/
Sending build context to Docker daemon  191.4MB
Step 1/10 : FROM centos:7
 ---> 7e6257c9f8d8
Step 2/10 : LABEL maintainer="mrhelloworld.com"
 ---> Running in 3f18aa4f3fb2
Removing intermediate container 3f18aa4f3fb2
 ---> 7364f68ca4ab
Step 3/10 : WORKDIR /usr/local
 ---> Running in d9889152cfc4
Removing intermediate container d9889152cfc4
 ---> d05bd2e09fa4
Step 4/10 : RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
 ---> Running in 3bcd6ef78350
Removing intermediate container 3bcd6ef78350
 ---> 4832abf9d769
Step 5/10 : ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
 ---> e61474bf7a76
Step 6/10 : ADD apache-tomcat-9.0.37.tar.gz /usr/local/tomcat
 ---> 7110cdff7438
Step 7/10 : EXPOSE 8080
 ---> Running in a4731c1cf77d
Removing intermediate container a4731c1cf77d
 ---> f893cefee00c
Step 8/10 : ENV JAVA_HOME /usr/local/java/jdk-11.0.6/
 ---> Running in f0cb08f390db
Removing intermediate container f0cb08f390db
 ---> ff9f6acf6844
Step 9/10 : ENV PATH $PATH:$JAVA_HOME/bin
 ---> Running in eae88cf841d0
Removing intermediate container eae88cf841d0
 ---> 4b9226a23b10
Step 10/10 : CMD ["/usr/local/tomcat/apache-tomcat-9.0.37/bin/catalina.sh", "run"]
 ---> Running in ccf481045906
Removing intermediate container ccf481045906
 ---> 9ef76a16441b
Successfully built 9ef76a16441b
Successfully tagged mycentos:7

鏡像構建歷史

docker history 鏡像名稱:標簽|ID
docker history mycentos:7

Docker鏡像怎么構建Dockerfile

使用構建的鏡像創建容器

# 創建容器
docker run -di --name mycentos7 -p 8080:8080 mycentos:7
# 進入容器
docker exec -it mycentos7 /bin/bash
# 測試 java 環境變量
[root@dcae87df010b /]# java -version
java version "11.0.6" 2020-01-14 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.6+8-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.6+8-LTS, mixed mode)
# 訪問 http://192.168.10.10:8080/ 看到頁面說明環境 OK!

Docker鏡像怎么構建Dockerfile

到此,相信大家對“Docker鏡像怎么構建Dockerfile”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

澎湖县| 芒康县| 宝山区| 夏河县| 台江县| 修武县| 桂平市| 平陆县| 青海省| 广昌县| 六盘水市| 漳平市| 汉阴县| 泗阳县| 杂多县| 通许县| 南江县| 尚义县| 泸溪县| 黑水县| 大足县| 阳山县| 县级市| 柏乡县| 哈密市| 庆城县| 体育| 平陆县| 永德县| 清丰县| 林口县| 扎赉特旗| 永康市| 镶黄旗| 特克斯县| 越西县| 扬中市| 广水市| 商城县| 黔西| 嫩江县|