1. 程式人生 > >docker製作映象的兩種方法

docker製作映象的兩種方法

一、需求

  由於在測試環境中使用了docker官網的centos 映象,但是該映象裡面預設沒有安裝ssh服務,在做測試時又需要開啟ssh。所以上網也查了查資料。下面詳細的紀錄下。在centos 容器內安裝ssh後,轉成新的映象用於後期測試使用。

  

二、映象定製

第一種方式(手動修改容器映象)

1.先下載centos映象

[[email protected] ~]# docker pull centos

2.啟動容器並進行配置

啟動容器,

[[email protected] ~]# docker run -it -d --name test-centos1 centos
d72250ecaa5e3e36226a1edd749f494d9f00eddc4143c81ac3565aa4e551791a

命令註釋:-it : 進行互動式操作

     -d : 等同於 -d=true,容器將會在後臺執行,不然執行一次命令後,退出後,便是exit狀態了。

     --name : 容器啟動後的名字,預設不指定,將會隨機產生一個名字。或者使用 -name="containers_name" 

     centos:使用的映象名稱

進入容器,安裝ssh server,以及配置開機啟動

[[email protected] ~]# docker exec -it test-centos1 /bin/bash
[[email protected] /]# ifconfig
bash: ifconfig
: command not found

我們檢查了下容器,暫時安裝以下必用的軟體吧 net-tools,openssh-server

[[email protected] /]# yum install openssh-server net-tools -y

建立ssh 所需的目錄,並在根目錄建立sshd 啟動指令碼

複製程式碼
[[email protected] /]# mkdir -pv /var/run/sshd
mkdir: created directory '/var/run/sshd'

[[email protected] /]# cat /auto_sshd.sh 
#!/bin/bash
/usr/sbin/sshd -D
[
[email protected]
/]# chmod +x /auto_sshd.sh
複製程式碼

修改容器內root 的賬戶密碼

[[email protected] /]# echo "root:iloveworld" | chpasswd 

生成ssh 主機dsa 金鑰(不然ssh 該容器時,會出現錯誤。)

[[email protected] /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
[[email protected] /]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

我們加一個history記錄的時間功能吧,這樣方便後期檢視

echo 'export HISTTIMEFORMAT="%F %T `whoami` "' >> /etc/profile

OK,配置基本完畢咯。清理命令歷史紀錄,之後退出容器。現在可以生成一個新的docker 映象了。

3.配置完成後,進行打包成新的映象

複製程式碼
[[email protected] ~]# docker commit test-centos1 centos_sshd:7.0
sha256:6e3330b30dfff5f029f102874e54cfffffbc37dcf2a4eb7304c817148fbc944d

[[email protected] ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
centos_sshd                  7.0                 6e3330b30dff        8 seconds ago       310.1 MB
docker.io/ubuntu             latest              e4415b714b62        12 days ago         128.1 MB
複製程式碼

命令註釋:commit: 提交一個具有新配置的容器成為映象,後面跟容器的name 或者容器Id ,最後是生成新映象的名字

更新:這條命令更方便以後啟動,如下:

[[email protected] ~]# docker commit --change='CMD ["/auto_sshd.sh"]' -c "EXPOSE 22" test-centos1 centos_sshd:7.0
sha256:7bb4efd82c4ff1f241cbc57ee45aab1b05d214b1e9fcd51196696c67d480e70b

命令註釋: --change : 將後期使用此映象執行容器時的命令引數、開放的容器埠提前設定好。

4.驗證

檢視映象,並啟動新的容器

複製程式碼
[[email protected] ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
centos_sshd                  7.0                 7bb4efd82c4f        4 minutes ago       310.1 MB
docker.io/ubuntu             latest              e4415b714b62        12 days ago         128.1 MB

[[email protected] ~]# docker run -d -it --name centos_7.0-1 centos_sshd:7.0
ec17e553d5c4c60865afeb99df8dfd1f4e7d4ba6e1b0d5516f9127f09d1d6356
[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS           PORTS          NAMES
ec17e553d5c4        centos_sshd:7.0           "/auto_sshd.sh"          6 seconds ago       Up 5 seconds     22/tcp         centos_7.0-1
複製程式碼

進行ssh測試,先檢視一下該容器的ip,之後ssh。ok

複製程式碼
[[email protected] ~]# docker exec centos_7.0-1 hostname -i
172.17.0.4

[[email protected] ~]# ssh [email protected]172.17.0.4
The authenticity of host '172.17.0.4 (172.17.0.4)' can't be established.
RSA key fingerprint is 87:88:07:12:ac:0a:90:28:10:e1:9e:eb:1f:d6:c9:9d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.4' (RSA) to the list of known hosts.
[email protected]172.17.0.4's password: 
Last login: Tue Nov 29 16:00:49 2016 from gateway

[[email protected] ~]# w   
 16:34:17 up 63 days,  7:49,  1 user,  load average: 0.00, 0.02, 0.05
USER     TTY      FROM             [email protected]   IDLE   JCPU   PCPU WHAT
root     pts/0    gateway          16:34    1.00s  0.00s  0.00s w
[[email protected] ~]# ping gateway
PING gateway (172.17.0.1) 56(84) bytes of data.
64 bytes from gateway (172.17.0.1): icmp_seq=1 ttl=64 time=0.048 ms
複製程式碼

第二種方式(推薦:利用Dockerfile檔案)

我的認為它就像ansible的playbook一樣。Dockerfile包含建立映象所需要的全部指令。基於在Dockerfile中的指令,我們可以使用Docker build命令來建立映象。通過減少映象和容器的建立過程來簡化部署。

1.建立Dockerfile檔案

新建一個目錄,在裡面新建一個dockerfile檔案(新建一個的目錄,主要是為了和以防和其它dockerfile混亂 )

複製程式碼
[[email protected] ~]# mkdir centos7-dockerfile

[[email protected] centos7-dockerfile]# cat Dockerfile 
# The dockerfile has Change add sshd services on Centos7.0
#centos7:latest image
FROM centos:latest

MAINTAINER Yifeng,http://www.cnblogs.com/hanyifeng

#Install sshd net-tools
RUN yum install openssh-server net-tools -y
RUN mkdir /var/run/sshd

#Set password for root
RUN echo 'root:iloveworld' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

#Set history record
ENV HISTTIMEFORMAT "%F %T  "

#Fix sshd service:Read from socket failed: Connection reset by peer?
RUN ssh-keygen -A

#Change timezone CST
RUN \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

#Open 22 port
EXPOSE 22

#Auto running sshd service
CMD ["/usr/sbin/sshd","-D"]
複製程式碼

上述檔案內容就是一個dockerfile 常見的命令組合。開頭帶#號的為註釋

檔案解釋:

     FROM: 必不可少的命令,從某個映象作為基。如 FROM <image_name> ,或者 FROM <image_name>:<tag>. 如果不加tag,預設為latest。先從本地映象倉庫去搜索基映象,如過本地沒有,在去網上docker registry去尋找。

     MAINTAINER:標明該Dockerfile作者及聯絡方式,可忽略不寫

     RUN:建立新的映象時,可以執行在系統裡的命令,如安裝特定的軟體以及設定環境變數。

     ENV:設定系統環境變數(注意:寫在/etc/profile裡的命令在dockerfile這裡會不生效,所以為改成ENV的方式)

     EXPOSE:開放容器內的埠,但不和宿主機進行對映。方便在宿主機上進行開發測試。(如需對映到宿主機埠,可在執行容器時使用 -p host_port:container_port)

     CMD:設定執行的命令,經常用於容器啟動時指定的某個操作。如執行自定義指令碼服務,或者是執行系統命令。CMD 只能存在一條,如在Dockerfile中有多條CMD的話,只有最後一條CMD生效!

2.執行build 建立映象

使用docker build命令來建立映象

[[email protected] centos7-dockerfile]# docker build -t centos_sshd_1 .

 -t 選項來docker build新的映象以便於標記構建的映象,. 表示當前目錄,也可以指定dockerfile 檔案所在目錄。

下面縮略的內容是構建映象時的輸出,可以看下。

docker build stdout

3.檢視映象列表,並建立容器

[[email protected] centos7-dockerfile]# docker images
REPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE
centos_sshd_1                                  latest              d4620c9949b8        4 minutes ago       308.4 MB
centos_sshd                                    7.0                 7bb4efd82c4f        2 days ago          310.1 MB

我們剛剛新建的容器已經存在了,現在用它來建立容器

複製程式碼
[[email protected] centos7-dockerfile]# docker run -d -it --name centos-two centos_sshd_1
7ae51091c138d249b5e97f6957073e748db278c0f1cf856e968ca78a4aec1a5b

檢視容器
[[email protected] centos7-dockerfile]# docker ps   
CONTAINER ID        IMAGE                    COMMAND               CREATED             STATUS              PORTS             NAMES
7ae51091c138        centos_sshd_1            "/usr/sbin/sshd -D"   16 seconds ago      Up 15 seconds       22/tcp            centos-two
複製程式碼