1. 程式人生 > >docker 制作鏡像

docker 制作鏡像

commit DG 拓展 open file 技術分享 環境變量 add指令 而且

docker 制作鏡像

一、docker commit


啟動一個容器

[root@foundation12 docker]# docker run -it --name web ubuntu
技術分享圖片


docker commit 進行提交

[root@foundation12 docker]# docker commit -m "add files" web addweb

查看當前docker的鏡像列表,發現剛才創建的鏡像已經顯示出來了

[root@foundation12 docker]# docker images

技術分享圖片


然後查看剛才提交的鏡像的詳細信息

技術分享圖片

刪除已啟動的容器

技術分享圖片


用剛提交的鏡像,重新啟動一個容器

[root@foundation12 docker]# docker run -it addweb

可以看到,新的容器保留了之前的修改。

雖然鏡像是可讀的,但我們可以通過啟動容器對鏡像進行修改。



二、docker build


除了上述的方式docker commit可以將容器導成鏡像之外,還可以通過docker build進行操作,不過兩者有如下區別:

(1)docker commit 是往版本控制系統裏提交一次變更。使用這種方式制作鏡像,本質上是運行一個基礎鏡像,然後在基礎鏡像上進行軟件安裝和修改。最後再將改動提交到版本系統中。

(2)使用docker build創建鏡像需要編寫Dockerfile.這個相當於是自己編寫策略,相當於是docker裏的腳本,它具有可重復性、透明性。而且構建時是以層級進行構建的。非常方便。


下面就以Dockerfile的形式來編寫構建腳本


首先創建一個目錄來存放配置鏡像所需的信息

[root@foundation12 docker]# pwd
/tmp/docker
[root@foundation12 docker]# mkdir Dockerfile
[root@foundation12 docker]# cd Dockerfile


首先我們查看下從那個已有的鏡像進行拓展

技術分享圖片


選擇最後一個richxsl/rhel7,下面編寫Dockerfile文件

首先了解Dockerfile的語法

ADD

ADD命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上復制文件到目標容器的文件系統。如果源是一個URL,那該URL的內容將被下載並復制到容器中。

CMD

和RUN命令相似,CMD可以用於執行特定的命令。和RUN不同的是,這些命令不是在鏡像構建的過程中執行的,而是在用鏡像構建容器後被調用。

ENV

ENV命令用於設置環境變量。這些變量以”key=value”的形式存在,並可以在容器內被腳本或者程序調用。這個機制給在容器中運行應用帶來了極大的便利。

EXPOSE

EXPOSE用來指定端口,使容器內的應用可以通過端口和外界交互。

FROM

FROM命令可能是最重要的Dockerfile命令。改命令定義了使用哪個基礎鏡像啟動構建流程。基礎鏡像可以為任意鏡 像。如果基礎鏡像沒有被發現,Docker將試圖從Docker image index來查找該鏡像。FROM命令必須是Dockerfile的首個命令。

RUN

RUN命令是Dockerfile執行命令的核心部分。它接受命令作為參數並用於創建鏡像。不像CMD命令,RUN命令用於創建鏡像(在之前commit的層之上形成新的層)。


註:COPY與ADD的區別

Dockerfile中的COPY指令和ADD指令都可以將主機上的資源復制或加入到容器鏡像中,都是在構建鏡像的過程中完成的。

COPY指令和ADD指令的唯一區別在於是否支持從遠程URL獲取資源。COPY指令只能從執行docker build所在的主機上讀取資源並復制到鏡像中。而ADD指令還支持通過URL從遠程服務器讀取資源並復制到鏡像中。


[root@foundation12 Dockerfile]# vim Dockerfile

FROM richxsl/rhel7
MAINTAINER [email protected]
ENV HOSTNAME server1
EXPOSE 22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN yum install -y openssh-clients openssh-server && yum clean all && ssh-keygen -t rsa -f "/etc/ssh/ssh_host_ecdsa_key" -q -N "" && ssh-keygen -t ed25519 -f "/etc/ssh/ssh_host_ed25519_key" -q -N "" && echo root:redhat | chpasswd
CMD ["/usr/sbin/sshd","-D"]


(1)在Dockerfile中,#開頭的被認作是註釋;
(2)FROM代表這從哪個指定的鏡像為基礎處理接下來的命令,如果該鏡像不在本地,則docker會從dockerhub上進行下載。
(3)RUN代表著所需要執行的命令。
(4)COPY可以把指定的文件或者目錄在創建鏡像的時候拷貝到鏡像的指定位置。


[root@foundation12 Dockerfile]# vim dvd.repo

[dvd]
name=rhel7.3
baseurl=http://172.25.12.250/rhel7.3
gpgcheck=0


接下來執行Dockerfile腳本內容,[root@foundation12 Dockerfile]# docker build -t rhel7:v1 .

技術分享圖片

技術分享圖片


可以看到docker build的執行是按照步驟分步執行的,這種創建鏡像的方式非常的快捷,而且一旦出錯可以快速定位有問題的步驟

執行完成後,在鏡像列表中可以看到新創建的鏡像(第一個):

技術分享圖片


以新創建的鏡像去啟動一個容器:

[root@foundation12 Dockerfile]# docker run -d --name vm1 rhel7:v1
[root@foundation12 Dockerfile]# docker inspect vm1
技術分享圖片


連接新的容器

[root@foundation12 Dockerfile]# ssh [email protected]
技術分享圖片


docker 制作鏡像