一、docker鏡像的創建方法
1、基於已有鏡像創建
2、基於本地模板創建
3、基於dockerfile創建
4、搭建私有倉庫及其使用方法
一、docker鏡像的創建方法
docker鏡像是除了docker的核心技術之外,也是應用發佈的標準格式。一個完整的docker鏡像可以支撐一個docker容器的運行,在docker的整個使用過程中,進入一個已經定型的容器之後,就可以在容器中進行操作,最常見的操作就是在容器中安裝應用服務,如果要把已經安裝的服務進行遷移,就需要把環境及搭建的服務生成新的鏡像。
創建鏡像的方法有三種,分別是基於已有鏡像創建、基於本地模板創建及基於dockerfile創建。接下來會將這幾種方法依次寫下來。
1、基於已有鏡像創建
基於已有鏡像創建主要是使用docker commit命令,本質上就是把一個容器裏面運行的程序及該程序的運行環境打包起來生成新的鏡像。
命令格式如下:
docker commit [選項] 容器ID/名稱 倉庫名稱:[標籤]
常用選項如下:
-m:說明信息;
-a:作者信息;
-p:生成過程中停止容器的運行
基於已有鏡像創建新的鏡像舉例:
1)啓動一個鏡像,在容器裏做修改,然後將修改後的容器提交爲新的鏡像,需要記住該容器的ID號,如下:
[root@centos01 ~]# docker images <!--查看本地鏡像-->
REPOSITORY TAG IMAGE ID CREATED SIZE
hub.c.163.com/public/centos 6.7-tools b2ab0ed558bb 3 years ago 602 MB
[root@centos01 ~]# docker run -it -d --name centos6.7 hub.c.163.com/public/centos:6.7-tools
<!--基於docker宿主機鏡像運行一個容器-->
e70418f794378109bb583e2d9171b55d7fd747460cff2819f1dffb9df04dac4c
[root@centos01 ~]# docker ps <!--查看正在運行的容器 加-a參數是查看所有容器-->
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e70418f79437 hub.c.163.com/public/centos:6.7-tools "/usr/bin/supervisord" About a minute ago Up About a minute 22/tcp centos6.7
[root@centos01 ~]# docker exec -it centos6.7 /bin/bash <!--登錄剛創建的容器-->
[root@e70418f79437 /]# echo "lyx" > /etc/lyx.txt <!--寫入測試數據-->
[root@e70418f79437 /]# exit <!--退出容器-->
exit
[root@centos01 ~]# docker commit -m "newnamed" -a "lyx" centos6.7 centos6.701
<!--使用docker commit命令創建一個新的鏡像-->
sha256:305f99b50a1e8844ea21a2411649108f662ad5d42c35fa9ff2cf3608172d1590
[root@centos01 ~]# docker images <!--查看剛創建的鏡像是否生成-->
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6.701 latest 305f99b50a1e 32 seconds ago 602 MB
hub.c.163.com/public/centos 6.7-tools b2ab0ed558bb 3 years ago 602 MB
[root@centos01 ~]# docker create -it centos6.701 /bin/bash <!--基於新創建的鏡像創建一個容器-->
eb6522ec046e9b3c7bfcb1edb5c84545aa8264f27075c019ee89da9150039e2f
[root@centos01 ~]# docker ps <!--查看所有容器,獲取剛創建的容器ID-->
[root@centos01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eb6522ec046e centos6.701 "/bin/bash" 55 seconds ago Created condescending_darwin
e70418f79437 hub.c.163.com/public/centos:6.7-tools "/usr/bin/supervisord" 9 minutes ago Up 9 minutes 22/tcp centos6.7
[root@centos01 ~]# docker start eb6522ec046e <!--啓動容器-->
eb6522ec046e
[root@centos01 ~]# docker exec -it eb6 /bin/bash <!--登錄到新創建的容器-->
[root@eb6522ec046e /]# cat /etc/lyx.txt <!--驗證之前容器寫入的數據是否還在-->
lyx
[root@eb6522ec046e /]# exit <!--退出容器-->
exit
2、基於本地模板創建
通過導入操作系統模板文件可以生成鏡像,模板可以從OPENVZ開源項目,或者 https://wiki.openvz.org/Download/template/precreated ,優先使用OPENVZ開源項目那個鏈接;
基於本地模板創建舉例:
1)下載centos 7的迷你版系統模板,使用docker導入命令導入爲本地鏡像:
[root@centos01 ~]# wget https://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz
................<!--省略部分內容-->
[root@centos01 ~]# ls | grep centos <!--確認已經下載centos7的模板壓縮包-->
centos-7-x86_64-minimal.tar.gz
[root@centos01 ~]# cat centos-7-x86_64-minimal.tar.gz |docker import - docker:new
<!--使用docker導入命令導入爲本地鏡像-->
sha256:6d662f735ee8efbd53f23e017fdb5c777303aaab93a085ee6c10d9fcb71b4ba8
[root@centos01 ~]# docker images | grep new <!--查看導入的鏡像-->
docker new 6d662f735ee8 27 seconds ago 435 MB
<!--至此,可使用這個鏡像創建容器並部署需要的功能,進行使用了-->
[root@centos01 ~]# docker run -it -d docker:new /bin/bash <!--使用新鏡像運行一個容器-->
0c10ee4230983b020a0268f40d4523685226ee570271e71a5b5d24ec57e8f46a
[root@centos01 ~]# docker ps |grep new <!--查看剛運行的容器ID-->
0c10ee423098 docker:new "/bin/bash" About a minute ago Up About a minute nostalgic_wescoff
[root@centos01 ~]# docker exec -it 0c1 /bin/bash <!--使用ID前三位登錄剛運行的容器-->
[root@0c10ee423098 /]# ls
bin boot dev etc fastboot home lib lib64 ...... <!--查看-->
[root@0c10ee423098 /]# exit <!--退出容器-->
exit
3、基於dockerfile創建
dockerfile是由一組指令組成的文件,其中每條指令對應Linux中的一條命令,docker程序將讀取dockerfile中的指令生成指定鏡像。
dockerfile結構大致分爲四個部分:
基礎鏡像信息;
維護者信息;
鏡像操作指令;
容器啓動時執行指令;
dockerfile每行支持一條指令,每條指令可攜帶多個參數,支持使用“#”號開頭的註釋;
dockerfile中的配置項介紹:
[root@centos01 ~]# docker tag docker:new centos7.lyx
[root@centos01 ~]# docker images | grep lyx
centos7.lyx latest 6d662f735ee8 9 minutes ago 435 MB
[root@centos01 ~]# vim Dockerfile
FROM centos <!--第一行必須指明基於的基礎鏡像(該鏡像必須存在)-->
MAINTAINER The centos project <[email protected]> <!--維護該鏡像的用戶信息-->
<!--以下是鏡像的操作指令-->
RUN yum -y update
RUN yum -y install openssh-server
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
EXPOSE 22 <!--開啓22端口-->
CMD ["/usr/sbin/sshd","-D"] <!--啓動容器時執行指令-->
在編寫dockerfile時,有嚴格的格式需要遵循:第一行必須使用FROM指令指明所基於的鏡像名稱;之後使用MAINTAINER指令說明維護該鏡像的用戶信息;然後是鏡像操作相關指令,如RUN指令,每運行一條指令,都會給基礎鏡像添加新的一層;最後使用CMD指令來指定啓動容器時要運行的命令操作。
dockerfile有十幾條命令可用於構建鏡像,其中常見的指令如下:
dockerfile使用舉例——使用dockerfile創建apache鏡像並在容器中運行
1)創建鏡像並加載到容器中運行:
[root@centos01 ~]# mkdir apache <!--建立工作目錄-->
[root@centos01 ~]# cd apache/ <!--切換至新建的目錄-->
[root@centos01 apache]# vim Dockerfile <!--編寫dockerfile文件-->
FROM centos <!--基於的基礎鏡像centos-->
MAINTAINER the centos project <[email protected]> <!--維護該鏡像的用戶信息-->
RUN yum -y update <!--使用yum進行更新-->
RUN yum -y install httpd <!--鏡像操作指令安裝apache軟件包-->
EXPOSE 80 <!--開啓80端口-->
ADD index.html /var/www/html/index.html <!--將本地的首頁文件index.html複製到鏡像中-->
ADD run.sh /run.sh <!--將本地的運行腳本run.sh複製到鏡像中-->
RUN chmod 775 /run.sh <!--賦予腳本執行權限-->
RUN systemctl disable httpd <!--設置apache服務不自行啓動-->
CMD ["/run.sh"] <!--啓動容器時執行腳本-->
<!--輸入上述信息後,保存退出-->
[root@centos01 apache]# docker images | grep centos
<!--確保本地有centos的基礎鏡像,因爲在dockerfile文件中指定了該鏡像-->
centos7 system c065d5c0571d About an hour ago 435 MB
[root@centos01 apache]# vim run.sh <!--編寫執行腳本內容-->
#!/bin/bash
rm -rf /run/httpd/* <!--清理httpd的緩存-->
exec /usr/sbin/apachectl -D FOREGROUND <!--啓動apache服務-->
[root@centos01 apache]# echo "dockerfile test" >index.html <!--編寫一個首頁文件-->
[root@centos01 apache]# ls <!--確保當前目錄下的文件有以下三個-->
Dockerfile index.html run.sh
<!--當以上準備完成後,就可以使用docker build命令來創建鏡像,如下:-->
[root@centos01 apache]# docker build -t httpd:centos .
<!--注意上面命令的末尾有個“.”,表示當前路徑,若不加則會報錯。-->
<!--其中“-t”選項用來指定鏡像的標籤信息-->
Sending build context to Docker daemon 4.096 kB
Step 1/10 : FROM centos
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
.................. <!--省略部分內容,此處需要靜等幾分鐘,此時系統在執行dockerfile文件中的指令-->
<!--若在顯示信息中有報紅的信息,只要配置文件無誤,一般屬於正常(是有關yum的信息)-->
Removing intermediate container 81a3d6c9d3db
Step 10/10 : CMD /run.sh
---> Running in 5cdc467fd874
---> 5d56b826432d
Removing intermediate container 5cdc467fd874
Successfully built 5d56b826432d
<!--當出現以上提示,則表示新的鏡像已經創建成功了-->
<!--在整個創建過程中,可以看到每運行一次dockerfile中的指令,都會以給初始鏡像加上新的一層-->
[root@centos01 apache]# docker run -d -p 81:80 httpd:centos
<!--將新生成的鏡像加載到容器中運行-->
<!--其中“-p”選項實現從本地端口81到容器中80端口的映射-->
192cd783028dcb3013ebb40b65ba8450e695e424e700a13cb8a44bb84af3e71a
[root@centos01 apache]# docker ps -a <!--查詢容器是否運行-->
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
192cd783028d httpd:centos "/run.sh" About a minute ago Up About a minute 0.0.0.0:81->80/tcp gallant_khorana
<!--省略部分內容-->
至此,可以看到新生成的鏡像已經在容器中加載運行了,本機(宿主機,不是docker容器)的IP地址爲192.168.1.1,此時client訪問192.168.1.1的81端口,就相當於訪問了剛運行的容器的80端口,如下:
4、搭建私有倉庫及其使用方法
隨着創鍵的鏡像增多,就需要有一個保存鏡像的地方,這就是倉庫。目前有兩種倉庫:公共倉庫和私有倉庫。最方便的就是使用公共倉庫上傳和下載,下載公共倉庫的鏡像是不需要註冊的,但是上傳時,是需要註冊的。下面介紹如何創建私有倉庫。
方法如下:
[root@centos01 ~]# docker pull registry:2 <!--下載registry:2的鏡像-->
[root@centos01 ~]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2
<!--p:端口映射(前面是宿主機端口:後面是容器暴露的端口)-->
<!---v:掛載目錄(前面是宿主機的目錄:後面的是容器的目錄)自動創建宿主機的目錄-->
[root@centos01 ~]# docker tag centos:nginx 192.168.1.1:5000/centos:nginx
[root@centos01 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.1:5000
<!--修改原本的配置文件添加不安全的倉庫,地址是宿主機的IP地址與5000端口-->
[root@centos01 ~]# systemctl daemon-reload
[root@centos01 ~]# systemctl restart docker <!--重新啓動docker服務-->
[root@centos01 ~]# docker ps <!--確認registry容器正常運行-->
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2645c31b2306 registry:2 "/entrypoint.sh /etc…" 21 minutes ago Up 42 seconds 0.0.0.0:5000->5000/tcp registry
[root@centos01 ~]# docker push 192.168.1.1:5000/centos:nginx <!--上傳鏡像到私有倉庫-->
私有倉庫搭建完成,驗證成功!這時打開另一臺docker主機下載進行測試:
[root@centos01 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.1:5000
<!--修改原本的配置文件添加不安全的倉庫,地址是registry主機的IP地址與5000端口-->
[root@centos01 ~]# systemctl daemon-reload
[root@centos01 ~]# systemctl restart docker <!--重新啓動docker服務-->
[root@centos01 ~]# docker run -itd --name nginx 192.168.1.1:5000/centos:nginx nginx -g "daemon off;"
<!--基於鏡像創建容器-->
[root@centos01 ~]# docker inspect nginx <!--查看容器的詳細信息-->
[root@centos01 ~]# curl 172.17.0.3 <!--測試訪問-->
私有倉庫這是纔算搭建完成!測試完成!
———————— 本文至此結束,感謝閱讀 ————————