一、基於容器制作鏡像
-
在容器中完成操作后制作;
-
制作命令:docker commit
格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
--author, -a 作者信息
--pause, -p 制作時候暫停
--message, -m 創建時候注釋
--change, -c 創建時應用dockerfile中的命令
示例:制作一個帶有httpd服務的鏡像
[root@node-65 ~]# docker run --name b1 -it docker.io/busybox #創建網頁目錄 / # mkdir /data/html -pv created directory: '/data/' created directory: '/data/html' / # vi /data/html/index.html <h1>BUSY BOX SERVER<h1> #啟動httpd服務 / # httpd -h /data/html/ / # netstat -tnl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 :::80 :::* LISTEN #基於bi容器制作鏡像 [root@node-65 ~]# docker commit -p -a "hehe <hehe@hehe.com>" b1 docker.io/hehe/bbox:v0.1.1-httpd 或者使用-c選項指定網頁路徑 [root@node-65 ~]# docker commit -p -a "hehe <hehe@hehe.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' b1 docker.io/hehe/bbox:v0.1.2-httpd #查詢本地鏡像 [root@node-65 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/hehe/bbox v0.1.1-httpd 786bd69b3a86 49 seconds ago 1.15 MB docker.io/busybox latest 758ec7f3a1ee 3 days ago 1.15 MB #使用生成的鏡像創建一個容器 [root@node-65 ~]# docker run --name h1 -d docker.io/hehe/bbox:v0.1.1-httpd /bin/httpd -f -h /data/html 如果指定網頁路徑使用: [root@node-65 ~]# docker run --name h1 -d docker.io/hehe/bbox:v0.1.1-httpd #查詢h1容器ip等信息 [root@node-65 ~]# docker inspect h1 ............. "IPAddress": "172.17.0.3" #使用curl命令,測試容器啟動,http服務是否一起啟動 [root@node-65 ~]# curl http://172.17.0.3 <h1>BUSY BOX SERVER<h1>
示例2:配置一個nginx鏡像,啟動容器使nginx工作在前台
#下載centos鏡像 [root@node-65 ~]# docker pull docker.io/centos #使用centos鏡像啟動容器 [root@node-65 ~]# docker run --name c1 -it docker.io/centos #報錯 WARNING: IPv4 forwarding is disabled. Networking will not work. #打開宿主機的核心轉發功能 net.ipv4.ip_forward=1 >> /usr/lib/sysctl.d/00-system.conf #重啟網絡 #再次使用centos鏡像啟動容器 [root@node-65 ~]# docker run --name c2 -it docker.io/centos #安裝epel源和nginx [root@f68abe0c2601 /]# yum install epel-release -y root@f68abe0c2601 /]# yum install nginx -y #配置nginx文件,添加 [root@f68abe0c2601 /]# vi /etc/nginx/nginx.conf ........... user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; daemon off; #添加,使nginx工作在前台 #測試啟動nginx [root@f68abe0c2601 /]# nginx #此時光標停止,證明nginx已經工作在前台了 #制作鏡像 [root@node-65 ~]# docker commit -p -a "hehe <hehe@hehe.com>" -c 'CMD ["/usr/sbin/nginx"]' c2 docker.io/hehe/centos:v0.1.0-nginx sha256:6aadb46a288a0907fb2dd4b395ad066c00cbd52b9f84051b6245f269e0404c5a [root@node-65 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/hehe/centos v0.1.0-nginx 6aadb46a288a 46 seconds ago 395 MB ##使用生成的鏡像創建一個容器,-d運行在后台 [root@node-65 ~]# docker run --name h2 -d docker.io/hehe/centos:v0.1.0-nginx 20b666c4a0aa6b1ef561c66606cf94587b3fc1535131cb3e13ddb3efee28cb17 [root@node-65 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 20b666c4a0aa docker.io/hehe/centos:v0.1.0-nginx "/usr/sbin/nginx" 15 seconds ago Up 14 seconds h2 #查詢容器ip信息 [root@node-65 ~]# docker inspect ........ "IPAddress": "172.17.0.3", #測試nginx [root@node-65 ~]# curl http://172.17.0.3 nginx測試頁信息 ......... <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> ..........
二、 基於鏡像文件Dockerfile制作
- Dockerfile是使用源代碼構建docker的鏡像,編輯一個Dockerfile,而后根據此文件制作;
* docker可以自動通過讀取Dockerfile中的指令,自動構建鏡像。- Dockerfile是一個文本文檔包含所有用戶的命令,可以在命令行上調用組建一個鏡像。
- 使用docker build命令的用戶可以讀取docker file中的連續指令,自動構建一個鏡像。
1、制作格式
格式
- 指令有次序,第一個指令必須是'FROM',基於那個base image(基礎鏡像)制作。
# Comment #首行注釋信息
INSTRUCTION arguments #指令一般使用大寫字母
環境變量ENV
- 設置變量,在容器啟動時變量傳遞到容器中選項,使容器適用於多種環境應用。
- 變量格式:使用syntax語法格式,支持bash修飾符
#變量格式
$variable_name or ${variable_name}
#判斷
${variable:-word} #variable變量非空且有值,就用本身的值,否則就賦值為word(給變量設置默認值)
${variable:+word} #variable變量非空且有值,就賦值為word,如果無值則不賦值
.dockerignore路徑使用
- .dockerignore目錄一般放在構建根目錄目錄中,作用是存放不被打包到鏡像中的文件。
- 構建鏡像時,首先查詢 並排除.dockerignore目錄中的文件,然后打包鏡像,這里支持全局通配符使用,例如“*”號。
2、制作指令
FROM
- FROM指令是最重的一個且必須為Dockerfile文件開篇的第一個非注釋行,用於為映像文件構建過程指定基准鏡像,后續的指令運行於此基准鏡像所提供的運行環境。
- 實踐中,基准鏡像可以是任何可用鏡像文件,默認情況下,docker build會在docker主機上查找指定的鏡像文件,在其不存在時,則會從Docker Hub Registry上拉取所需的鏡像文件。
- 如果找不到指定的鏡像文件,docker build會返回一個錯誤信息
Syntax語法格式
FROM <image>[:<tag>] 或
FROM <image>@<digest>
<image>:指定作為base image的名稱;
<tag>:base image的標簽,為可選項,省略時默認為latest;
MAINTANIER
- 用於讓鏡像制作者提供本人的詳細信息
- Dockerfile並不限制MAINTAINER指令可在出現的位置,但推薦將其放置於FROM指令之后
Syntax語法格式
MAINTAINER <authtor's detail>
<author's detail>可是任何文本信息,但約定俗成地使用作者名稱及郵件地址
COPY
- 用於從Docker主機復制文件至創建的新映像文件
Syntax語法
COPY <src> ... <dest> 或
COPY ["<src>",... "<dest>"]
<src>:要復制的源文件或目錄,支持使用通配符
<dest>:目標路徑,即正在創建的image的文件系統路徑;建議為<dest>使用絕對路徑,否則,COPY指定則以WORKDIR為其起始路徑;
注意:在路徑中有空白字符時,通常使用第二種格式
文件復制准則
- <src>必須是build上下文中的路徑,不能是其父目錄中的文件
- 如果<src>是目錄,則其內部文件或子目錄會被遞歸復制,但<src>目錄自身不會被復制
- 如果指定了多個<src>,或在<src>中使用了通配符,則<dest>必須是一個目錄,且必須以/結尾
- 如果<dest>事先不存在,它將會被自動創建,這包括其父目錄路徑
示例:
#查看已有鏡像 [root@node-65 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ......... docker.io/busybox latest 758ec7f3a1ee 6 days ago 1.15 MB ........ #創建工作目錄 [root@node-65 ~]# mkdir bbox [root@node-65 ~]# cd bbox/ #編輯要拷貝的文件 [root@node-65 bbox]# vim index.html #編輯dockerfile文件 [root@node-65 bbox]# vim dockerfile FROM busybox:latest #基於那個鏡像 MAINTAINER "hehe <hehe@hehe.com>" #作者信息 COPY index.html /data/html/ #執行命令,目標文件目錄不存在會自動創建 COPY data /data/ #當復制目錄時注意,只遞歸復制data目錄下所有文件,不復制data目錄本身,/data/為容器中自動創建目錄。 #構建鏡像 [root@node-65 bbox]# docker build ./ -t docker.io/busybox:v0.2.0 #指明構建的根目錄,有dockerfile的就是構建根目錄,-t指明tag標簽 Sending build context to Docker daemon 3.072 kB Step 1/3 : FROM busybox:latest #執行指令第一行,構建第一層鏡像 ---> 758ec7f3a1ee Step 2/3 : MAINTAINER "hehe <hehe@hehe.com>" #執行指令第二行,構建第二層鏡像 ---> Running in f5fc881f9f93 ---> b3e8146d6485 Removing intermediate container f5fc881f9f93 Step 3/3 : COPY index.html /data/html/ #執行指令第三行,構建第三層鏡像 6e71f53ff091 Removing intermediate container 03f483f87c98 Successfully built 6e71f53ff091 #構建成功 #查詢鏡像 [root@node-65 bbox]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/busybox v0.2.0 6e71f53ff091 16 minutes a
ADD
- ADD指令類似於COPY指令,ADD支持使用TAR文件和URL路徑
Syntax語法格式
ADD <src> ... <dest> 或
ADD ["<src>",... "<dest>"]
操作准則
- 同COPY指令
- 如果<src>為URL且<dest>不以/結尾,則<src>指定的文件將被下載並直接被創建為<dest>;如果<dest>以/結尾,則文件名URL指定的文件將被直接下載並保存為<dest>/<filename>
- 如果<src>是一個本地系統上的壓縮格式的tar文件,它將被展開為一個目錄
,其行為類似於“tar -x”命令;然而,通過URL獲取到的tar文件將不會自動
展開; - 如果<src>有多個,或其間接或直接使用了通配符,則<dest>必須是一個以/結尾的目錄路徑;如果<dest>不以/結尾,則其被視作一個普通文件,<src>的內容將被直接寫入到<dest>;
示例:
#編輯dockerfile文件 [root@node-65 bbox]# vim dockerfile FROM busybox:latest #基於那個鏡像 MAINTAINER "hehe <hehe@hehe.com>" #作者信息 ADD http://120.52.51.15/nginx.org/download/nginx-1.15.8.tar.gz /usr/src/ #指明下路徑,下載到容器的那個目錄下 #構建鏡像 [root@node-65 bbox]# docker build ./ -t docker.io/busybox:v0.2.1 Sending build context to Docker daemon 3.072 kB Step 1/3 : FROM busybox:latest ---> 758ec7f3a1ee Step 2/3 : MAINTAINER "hehe <hehe@hehe.com>" ---> Using cache ---> b3e8146d6485 Step 3/3 : ADD http://120.52.51.15/nginx.org/download/nginx-1.15.8.tar.gz /usr/src/ Downloading 1.028 MB/1.028 MB #第三行執行已下載 ---> 089314c3ad7e Removing intermediate container 7ae8d8e836e0 Successfully built 089314c3ad7e #構建完成 #查詢鏡像 [root@node-65 bbox]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/busybox v0.2.1 089314c3ad7e About a minu
WORKDIR
- 用於為Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和
ADD指定設定工作目錄
Syntax語法格式
WORKDIR <dirpath>
- 在Dockerfile文件中,WORKDIR指令可出現多次,其路徑也可以為相對路徑,不過其是相對此前一個WORKDIR指令指定的路徑
- 另外,WORKDIR也可調用由ENV指定定義的變量
例如
l WORKDIR /var/log
l WORKDIR $STATEPATH
VOLUME
- 用於在image中創建一個掛載點目錄,以掛載Docker host上的卷或
其它容器上的卷
Syntax語法
VOLUME <mountpoint> 或
VOLUME ["<mountpoint>"] 多個卷由中括號括起來中間逗號隔開
- 如果掛載點目錄路徑下此前在文件存在,docker run命令會在卷掛載完成后將此前的所有文件復制到新掛載的卷中
示例:
#編輯dockerfile文件 [root@node-65 bbox]# vim dockerfile FROM busybox:latest #基於那個鏡像 MAINTAINER "hehe <hehe@hehe.com>" #作者信息 ADD http://120.52.51.15/nginx.org/download/nginx-1.15.8.tar.gz /usr/src/ #指明下路徑,下載到容器的那個目錄下 VOLUME /data/html/ #指明容器中的掛載路徑,宿主機對應路徑有docker管理生成
EXPOSE
- 用於為容器打開指定要監聽的端口以實現與外部通信
Syntax語法
EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]
- <protocol>用於指定傳輸層協議,可為tcp或udp二者之一,默認為TCP協議
EXPOSE指令可一次指定多個端口,例如
#編輯dockerfile文件 [root@node-65 bbox]# vim dockerfile FROM busybox:latest #基於那個鏡像 MAINTAINER "hehe <hehe@hehe.com>" #作者信息 ADD http://120.52.51.15/nginx.org/download/nginx-1.15.8.tar.gz /usr/src/ #指明下路徑,下載到容器的那個目錄下 VOLUME /data/html/ #指明容器中的掛載路徑,宿主機對應路徑有docker管理生成 EXPOSE 80/tcp #暴露80端口
ENV
- 用於為鏡像定義所需的環境變量,並可被Dockerfile文件中位於其后的其它指令(如ENV、ADD、COPY等)所調用
- 調用格式為
{variable_name}
Syntax語法
ENV <key> <value> 或
ENV <key>=<value> ...
-
第一種格式中,<key>之后的所有內容均會被視作其<value>的組成部分
,因此,一次只能設置一個變量; -
第二種格式可用一次設置多個變量,每個變量為一個"<key>=<value>"的
鍵值對,如果<value>中包含空格,可以以反斜線()進行轉義,也可通過
對<value>加引號進行標識;另外,反斜線也可用於續行; -
定義多個變量時,建議使用第二種方式,以便在同一層中完成所有功能
例如:
#編輯dockerfile文件 [root@node-65 bbox]# vim dockerfile FROM busybox:latest #基於那個鏡像 MAINTAINER "hehe <hehe@hehe.com>" #作者信息 ENV nginx_file http://120.52.51.15/nginx.org/download/nginx-1.15.8.tar.gz #設定nginx_file變量值 ADD ${nginx_file} /usr/src/ #調用變量,下載到容器的那個目錄下
RUN
- 用於指定docker build過程中運行的程序,其可以是任何命令
Syntax語法
RUN <command> 或
RUN ["<executable>", "<param1>", "<param2>"]
- 第一種格式中,<command>通常是一個shell命令,且以“/bin/sh -c”來運行它。
- 第二種語法格式中的參數是一個JSON格式的數組,其中<executable>為要運行的命令,后面的<paramN>為傳遞給命令的選項或參數;然而,此種格式指定的命令不會以“/bin/sh -c”來發起,因此常見的shell操作如變量替換以及通配符(?,*等)替換將不會進行;不過,如果要運行的命令依賴於此shell特性的話,可以將其替換為類似下面的格式。
#編輯dockerfile文件 [root@node-65 bbox]# vim dockerfile FROM busybox:latest #基於那個鏡像 MAINTAINER "hehe <hehe@hehe.com>" #作者信息 RUN /bin/adduser -D myuser && \ /bin/mkdir /tmp/testdir #添加一個myuser用戶,並創建目錄
CMD
- 類似於RUN指令,CMD指令也可用於運行任何命令或應用程序,不過,二者的運行時間點不同
- RUN指令運行於映像文件構建過程中,而CMD指令運行於基於Dockerfile
構建出的新映像文件啟動一個容器時 - CMD指令的首要目的在於為啟動的容器指定默認要運行的程序,且其運
行結束后,容器也將終止;不過,CMD指定的命令其可以被docker run的
命令行選項所覆蓋 - 在Dockerfile中可以存在多個CMD指令,但僅最后一個會生效
Syntax語法格式
CMD <command> 或
CMD [“<executable>”, “<param1>”, “<param2>”] 或
CMD ["<param1>","<param2>"]
- 前兩種語法格式的意義同RUN
- 第三種則用於為ENTRYPOINT指令提供默認參數
ENTRYPOINT
- 類似CMD指令的功能,用於為容器指定默認運行程序,從而使得容器像是一個單獨的可執行程序
- 與CMD不同的是,由ENTRYPOINT啟動的程序不會被docker run命令行指定的參數所覆蓋,而且,這些命令行參數會被當作參數傳遞給ENTRYPOINT指定指定的程序
- 不過,docker run命令的--entrypoint選項的參數可覆蓋ENTRYPOINT指令
指定的程序
Syntax語法格式
ENTRYPOINT <command>
ENTRYPOINT ["<executable>", "<param1>", "<param2>"]
- docker run命令傳入的命令參數會覆蓋CMD指令的內容並且附加到
ENTRYPOINT命令最后做為其參數使用 - Dockerfile文件中也可以存在多個ENTRYPOINT指令,但僅有最后
一個會生效
USER
- 用於指定運行image時的或運行Dockerfile中任何RUN、CMD或
ENTRYPOINT指令指定的程序時的用戶名或UID - 默認情況下,container的運行身份為root用戶
Syntax語法格式
USER <UID>|<UserName>
- 需要注意的是,<UID>可以為任意數字,但實踐中其必須為/etc/passwd中
某用戶的有效UID,否則,docker run命令將運行失敗
ONBUILD
- 用於在Dockerfile中定義一個觸發器
- Dockerfile用於build映像文件,此映像文件亦可作為base image被
另一個Dockerfile用作FROM指令的參數,並以之構建新的映像文件 - 在后面的這個Dockerfile中的FROM指令在build過程中被執行時,將會“觸發”創建其base image的Dockerfile文件中的ONBUILD指令定義的觸發器
Syntax語法格式
ONBUILD <INSTRUCTION>
- 盡管任何指令都可注冊成為觸發器指令,但ONBUILD不能自我嵌套,且不會觸發FROM和MAINTAINER指令
- 使用包含ONBUILD指令的Dockerfile構建的鏡像應該使用特殊的標簽,例如
ruby:2.0-onbuild - 在ONBUILD指令中使用ADD或COPY指令應該格外小心,因為新構建過程的上下文在缺少指定的源文件時會失敗
#編輯dockerfile文件 [root@node-65 bbox]# vim dockerfile FROM busybox:latest #基於那個鏡像 MAINTAINER "hehe <hehe@hehe.com>" #作者信息 ONBUILD RUN /bin/adduser -D myuser #當使用這個鏡像做基礎鏡像時候,觸發執行命令,自動添加一個myuser用戶
示例使用dockerfile文件制作nginx的鏡像:
#創建工作目錄
[root@node-65 ~]# mkdir nginx
#創建nginx測試頁
[root@node-65 ~]# vim index.html
<h1> nginx test page </h1>
[root@node-65 nginx]# vim dockerfile
FROM centos:latest #基准鏡像
MAINTAINER "hehe <hehe@hehe.com>" #作者信息
WORKDIR /usr/local/src/ #工作目錄
ENV NG_VERSION nginx-1.15.8 #定義環境變量
RUN yum -y install epel-release #安裝epel倉庫
RUN yum -y install wget && wget http://120.52.51.15/nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz #下載nginx文件並解壓
#安裝編譯依賴包
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data
RUN yum clean all #清理倉庫
RUN useradd -M -s /sbin/nologin nginx #創建nginx用戶
WORKDIR /usr/local/src/$NG_VERSION #切換工作目錄
#編譯安裝nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
ADD index.html /usr/local/nginx/html #復制測試頁面到容器中
VOLUME /usr/local/nginx/html #設置容器中要掛在到宿主機的目錄
ENV PATH /usr/local/nginx/sbin:$PATH #設置sbin環境變量
EXPOSE 80/tcp #暴露80端口
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]
#當ENTRYPOINT和CMD連用時,CMD的命令是ENTRYPOINT命令的參數,兩者連用相當於nginx -g "daemon off;"而當一起連用的時候命令格式最好一致(這里選擇的都是json格式的是成功的,如果都是sh模式可以試一下)
#構建鏡像
[root@node-65 nginx]# docker build ./ -t docker.io/centos-nginx:v0.6.4
#根據構建的鏡像運行容器
[root@node-65 nginx]# docker run --name h17 -d -p82:80 docker.io/centos-nginx:v0.6.4
a0657540fc0edc1e57e2fb494af5714f14242a4cf18bb076b4cb30099f45b46e
#查看容器
[root@node-65 nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0657540fc0e docker.io/centos-nginx:v0.6.4 "nginx -g 'daemon ..." 8 minutes ago Up 8 minutes 0.0.0.0:82->80/tcp h17
#查看卷掛載信息
[root@node-65 nginx]# docker inspect -f "{{.Mounts}}" h17
[{volume 2f4e45badaa0c21bc9211ebbb2c44c6f68d3c19b36facf74b3d9ac6be0775d64 /var/lib/docker/volumes/2f4e45badaa0c21bc9211ebbb2c44c6f68d3c19b36facf74b3d9ac6be0775d64/_data /usr/local/nginx/html local true }]
#修改宿主機掛載目錄
[root@node-65]# vim /var/lib/docker/volumes/2f4e45badaa0c21bc9211ebbb2c44c6f68d3c19b36facf74b3d9ac6be0775d64/_data/index.html
<h1> nginx test page </h1> <h1> HELLO DOCKER </h1>
三、將鏡像文件導出為tar文件
- 將一個或多個圖像保存到一個tar存檔,此方式不通過上傳dockhut分發鏡像,通過拷貝tar存檔,實現快速分發鏡像。
格式:docker save [OPTIONS] IMAGE [IMAGE...]
[root@node-65 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/hehe/centos v0.1.0-nginx 6aadb46a288a 23 minutes ago 395 MB #鏡像保存到本地 [root@node-65 ~]# docker save -o /root/centos-v0.1.0-nginx.tar 6aadb46a288a [root@node-65 ~]# ll total 747852 -rw-------. 1 root root 1233 Sep 25 19:45 anaconda-ks.cfg -rw------- 1 root root 406230016 Dec 30 11:14 centos-v0.1.0-nginx.tar
四、從tar文件導入鏡像
docker load從tar存檔文件讀取
格式:docker load [OPTIONS]
--input, -i 從tar存檔文件讀取,而不是STDIN
--quiet, -q false 工作在靜默模式,不輸出操作信息
[root@node-65 ~]# docker load -i /root/centos-v0.1.0-nginx.tar
作者:任總
鏈接:https://www.jianshu.com/p/dc4cd0547d1e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
