目錄
Docker鏡像的創建方法
1)基於已有鏡像創建(類似於最新快照,適用於保存新容器文件)
2)由本地模板創建鏡像(適用於創建全新純淨版底層系統)
3)基於Dockfile創建(適用於高級服務搭建和配置)
Docker鏡像除了是Docker的核心技術之外,也是應用發佈的標準格式。一個完整的Docker鏡像可以支撐一個Docker容器的運行,在Docker的整個使用過程中,進入一個已經定型的容器之後,就可以在容器中進行操作,最常見的操作就是在容器中安裝應用服務,如果要把已經安裝的服務進行遷移,就需要把環境及搭建的服務生成新的鏡像。
創建鏡像的方法有三種分別爲:
- 基於已有鏡像創建
- 基於本地模板創建
- 基於Dockerfile創建
1.基於已有鏡像創建(類似於最新快照,適用於保存新容器文件)
基於已有鏡像創建主要使用“docker commit”命令,其實質就是把一個容器裏面運行的程序及該程序的運行環境打包起來生成新的鏡像。
語法:docker commit [選項] 容器id/名稱 倉庫名稱:[標籤]
常用的選項:
-m:說明信息
-a:作者信息
-p:生成過程中停止容器的運行
如:把容器id爲df3b34be596c ,做成鏡像111:111
[root@localhost ~]# docker ps -a //先查看容器ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df3b34be596c dhcp:dhcp "/entrypoint.sh" 2 days ago Exited (1) 2 days ago stoic_jennings
[root@localhost ~]# docker commit -m "newdhcp" -a "t3117" df3b34be596c 111:111 //生成鏡像
sha256:454893fd71c3a491a6d0745dc7f9dc817061068546fc715dfd37f604cda9956a
[root@localhost ~]# docker images //查看鏡像
REPOSITORY TAG IMAGE ID CREATED SIZE
111 111 454893fd71c3 18 seconds ago 105 MB
centos7 dhcp 645089167d00 4 days ago 84.7 MB
dhcp dhcp 52cbff801df2 11 months ago 105 MB
docker.io/networkboot/dhcpd latest 52cbff801df2 11 months ago 105 MB
2.由本地模板創建鏡像(適用於創建全新純淨版底層系統)
模板下載地址:wget http://download.openvz.org/template/precreated/
實驗使用centos-7-x86_64-minimal.tar.gz,現實中可以按環境任意選擇
[root@localhost ~]# wget http://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz
--2020-02-19 13:15:11-- http://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz
Resolving download.openvz.org (download.openvz.org)... 185.231.241.69
Connecting to download.openvz.org (download.openvz.org)|185.231.241.69|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 145639219 (139M) [application/x-gzip]
Saving to: ‘centos-7-x86_64-minimal.tar.gz’
100%[=============================================>] 145,639,219 393KB/s in 8m 37s
2020-02-19 13:23:51 (275 KB/s) - ‘centos-7-x86_64-minimal.tar.gz’ saved [145639219/145639219]
創建鏡像:
[root@localhost ~]# cat centos-7-x86_64-minimal.tar.gz |docker import - docker:centos7.1
//docker後面是新的鏡像名字
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker centos7.1 fe688f03fa33 35 seconds ago 435 MB
3.基於Dockfile創建(適用於高級服務搭建和配置)
除了手動生成docker鏡像之外,還可以使用Dockerfile自動生成鏡像。Dockerfile是由一組指令組成的文件,其中每條指令對應Linux中的一條命令,Docker程序將讀取Dockerfile中的指令生成指定鏡像。
Dockerfile結構大致分爲4個部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啓動時候執行指令。Dockerfile每行支持一條指令,每條指令可攜帶多個參數,支持使用以“#”號開頭的註釋。
- 項描述:
- FROM centos \\指定基於的基礎鏡像,鏡像centos必須存在
- MAINTAINER \\維護該鏡像的用戶信息
- RUN yum -y install openssh-server \\鏡像中的操作命令,可寫多條
- EXPOSE 22 \\容器開放的端口
- CMD ["/usr/sbin/sshd","-D"] \\啓動容器時執行命令,可寫多條但僅最後一條生效
1) 建立工作目錄並進入
mkdir /root/apache
cd /root/apache
2) 編寫Dockerfile文件
在編寫Dockerfile時,有嚴格的格式需要遵循:第一行必須使用FROM指令指明所基於的鏡像名字,之後使用MAINTAINER 維護該鏡像的用戶信息。
[root@localhost ~]# vim Dokerfile
FROM centos //這裏centos是鏡像名字,不是標籤
#第一行必須指明基於的基礎鏡像
MAINTAINER The CentOS project <qinziteng>
#維護該鏡像的用戶信息
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文件使用的基礎鏡像是centos,所以要保證首先獲取此基礎鏡像,使用“docker pull docker.io/centos” 獲取鏡像,之後的容器運行纔會有效.
3)編寫運行腳本文件
[root@localhost apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/* //清理httpd的緩存
exec /usr/sbin/apachectl -D FOREGROUND //啓動apache服務
//啓動容器時,進程、腳本都要在前臺啓動
4)編寫網站默認首頁
[root@localhost apache]# echo "qinziten" > index.html //創建首頁文件
[root@localhost apache]# ls
Dockerfile index.html run.sh //保持三個文件在一個目錄下
5)使用Dockerfile生成鏡像
編寫完成Dockerfile及相關內容後,通過“docker build”命令來創建鏡像
語法:docker build [選項] 路徑
常用選項“-t”指定鏡像的標籤信息
[root@localhost apache]# docker build -t httpd:centos .
注意後面有“.”表示當前路徑
6)使用新的鏡像運行容器
[root@localhost ~]# docker run -d -p 12345:80 httpd:centos
ee9adf324443b006ead23f2d9c71f86d1a4eb73358fb684ee3a2d058a0ac4243
//使用新生成的鏡像加載到容器中運行
//“-p”選項實現從本地端口12345到容器中80端口的映射
[root@localhost ~]# docker ps -a //查看鏡像確認結果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee9adf324443 httpd:centos "/run.sh" About a minute ago Up About a minute 0.0.0.0:12345->80/tcp admiring_bardeen