1. 程式人生 > >製作各種docker映象

製作各種docker映象

        做了一個星期的映象,收貨頗多,現在整理記錄下來,當做工作筆記吧。把常用的幾個映象的Dockerfile分享下。

        製作基礎docker映象

        第一步:設定docker映象源

yum install -y yum-priorities && rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
        第二步:安裝 docker-io febootstrap,用來製作centos映象,到時候會生成個centos的映象。
yum -y install docker-io;如果沒有安裝docker,則需要先安裝docker
service docker start ;啟動docker
yum -y install febootstrap;製作docker映象工具
        第三步:作CentOS映象檔案centos6-image目錄
febootstrap -i bash -i wget -i yum -i iputils -i iproute -i man -i vim -i openssh-server -i openssh-clients -i tar -i gzip centos6 centos6-image http://mirrors.aliyun.com/centos/6/os/x86_64/

      上一步執行後會生成一個centos6-image檔案目錄,上面命令中引數 -i 後面的都是基礎映象中安裝的一些服務。如果你不想要這麼多服務(因為把所有服務安裝後鏡像會變的非常大)可以只安裝一些基本的,必不可少的服務。centos6是指版本,centos6-image是生成的目錄名稱。

        第四步:這時root目錄下沒有任何檔案,也不沒有隱藏的點檔案,如:.bash_logout  .bash_profile  .bashrc如果這時製作出來的映象使用ssh登入,會直接進入根目錄下,而一般映象都是進入root目錄下的,所以可以在centos6-image目錄的root目錄把.bash_logout  .bash_profile  .bashrc這三個檔案設定一下。

cd centos6-image && cp etc/skel/.bash* root/

        第五步:生成最基礎的base映象

cd centos6-image && tar -c .|docker import - centos6-base

       第六步:檢視映象,也可以直接進入centos6-base檢視

docker images  ;這個是檢視所有生成的映象
docker run -i -t centos:centos6 /bin/bash;進終端(沒有ssh服務),-i 分配終端,-t表示在前臺執行,-d表示在後臺執行

 根據基礎映象製作ssh的docker映象

        製作ssh登入映象,最主要的就是Dockerfile(當然這裡說的就是Dockerfile這種方法),在某個目錄中新建一個Dockerfile檔案(命名一定要為Dockerfile)。

        下面來分析下Dockerfile檔案:

#Dockerfile  
FROM centos6-base  #表示把某個映象作為基礎映象,相當於面嚮物件語言中繼承,表示生成的映象裡面包含了基礎映象的一些服務
MAINTAINER yzh #這是個映象作者資訊
RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN sed -ri 's/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
#上面幾行都是配置ssh登入目錄和登入驗證的,而ssh的安裝是在基礎映象centos6-base中完成的(-i openssh-server -i openssh-clients)
EXPOSE 22  #表示開啟哪個埠號,22號埠是給ssh服務使用的;如果不需要埠號可以註釋掉這行
RUN echo 'root:redhat' | chpasswd  #這是修改root密碼,其實這種方法不是很好,因為這是設定root密碼,不是更改
RUN yum install -y yum-priorities && rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
RUN yum install tar gzip gcc vim wget -y
#上面是安裝些工具和源
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8  #設定環境
CMD /usr/sbin/sshd -D  #設定開啟的服務,每個映象只能有一個CMD有效
#End

        根據Dockerfile檔案生成映象:docker build -t 生成映象名稱  Dockerfile位置;假設:映象名為centos6-ssh,Dockerfile在/home/yzh/ssh裡面

cd centos6-images;docker build -t centos6-ssh  /home/yzh/ssh #就可以生成一個centos6-ssh映象了

        用docker images檢視下所有映象,你會看到兩個映象:centos6-base和centos6-ssh。這樣centos6-ssh就是ssh登入的docker映象了。

        映象的測試步驟命令

        當製作完一個映象後緊接著就要測試下這個映象是否正確,裡面的一些服務是否可用。上面提到的兩篇文章中有比較詳細的測試說明,還有資料儲存,遷移備份,可以參考下他們的文章。我目前沒有用到資料儲存及遷移備份,所以就用簡單的步驟測試下:         第一步:檢視映象資訊,可以看到有映象名稱和映象的id以及生成的時間。         docker images         第二步:用測試映象生成一個容器,可以根據映象名稱或者映象id來生成。最後會得到一連串數字和字母組成的資訊,應該就是容器標識ID。         docker run -d xxx(映象名或者id)         第三步:利用上一步生成的容器ID,來檢視測試映象生成的容器資訊。這一步會得到有關容器的詳細資訊,其中包括iP地址。         docker inspect xxxx(容器id)         第四步:利用上一步中得到的ip地址,ssh登陸。         ssh [email protected](容器ip)         第五步:測試服務,這裡ssh服務在登陸時已經測試完了。如果是其他映象,比如mysql:那麼這一步就是進入映象測試MySQL服務了,不同服務用不同方法測試。

        映象和容器的刪除     

        每測試完一個映象都要刪除掉所有的容器,避免佔用的空間過大。         刪除單個容器(指定容器):         首先要檢視下當前有哪些容器在執行:docker ps -a         找出需要刪除的容器,讓它停止:docker stop xxx(CONTAINER ID)         刪除該容器:docker  rm  xxx(CONTAINER ID)         刪除所有容器:         如果你要刪除所有的容器就可以不用那麼麻煩了,直接停止所有容器的執行:docker stop $(docker ps -a -q);然後刪除所有容器:docker rm $(docker ps -a -q);         刪除映象:         如果製作映象失敗,或者想重新新增功能,需要刪除原來映象,則用:docker images檢視所有映象;然後用:docker rmi xxx(映象名或映象id)

        製作Apache映象

        分享下Apache映象的製作,這個映象稍微和基礎映象的製作不太一樣。因為這個映象起來以後要同時開啟兩個服務:ssh服務(必須的)和Apache服務,而Dockerfile中CMD只能有一句有效。所以要藉助另外一種方法:supervisord;其他步驟一樣,唯一不同的就是Dockerfile檔案,這個Dockerfile是在ssh映象為基礎製造的(一般都是以ssh映象為基礎映象,因為不管哪個映象都需要ssh登陸的)         Dockerfile檔案:
#Dockerfile
FROM centos6-ssh
MAINTAINER <a target=_blank href="http://blog.csdn.net/yuzhihui_no1">http://blog.csdn.net/yuzhihui_no1</a>

EXPOSE 80 #為Apache服務開啟服務埠
RUN yum -y install httpd supervisor;chkconfig httpd on ; mkdir -p /var/log/supervisor
ADD supervisord.conf /etc/supervisord.conf  #把本地的檔案拷貝到映象系統中
CMD ["/usr/bin/supervisord"]  #執行supervisord.conf指令碼檔案
#End
        RUN    xxx ;後面是跟著要執行的命令,這些命令就是在Linux中安裝某個工具/軟體/服務的命令了。這裡引入了supervisord.conf檔案:
[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:httpd]
command=/sbin/service httpd start
        這樣就可以同時啟動兩個服務了。其他步驟和基礎映象製作一樣,但要記住supervisord.conf要和Dockerfile放在同一級目錄下。

        製作Java映象

        本來Java映象可以和基礎映象一樣製作的,但是發現安裝jdk包或者線上獲取jdk包時總是報錯,所以我就到官網上下載了個jdk放到伺服器上,然後用ADD命令加入到映象系統中,在系統裡面解壓,最後刪除jdk包,配置環境就可以了。          Dockerfile檔案:
 #Dockerfile
 FROM centos6-ssh
 MAINTAINER yzh

 RUN mkdir -p /usr/java;yum install -y tar
 ADD jdk-8u25-linux-x64.tar.gz  /usr/java/ #把本地的jdk加到映象系統中
 
 RUN echo 'export JAVA_HOME=/usr/java/jdk1.8.0_25'>> /etc/profile ; echo 'export JRE_HOME=/usr/java/jdk1.8.0_25/jre'>> /etc/profile; echo 'export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin'>> /etc     /profile
 RUN echo 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib'>> /etc/profile; echo 'export JAVA_HOME JRE_HOME PATH CLASSPATH ' >> /etc/profile
#上面是配置jdk環境變數 
 RUN source /etc/profile;yum clean all  #使環境變數生效

 ADD HelloWorld.java  /home/java/HelloWorld.java #加入一個簡單的Java測試程式
 
 CMD /usr/sbin/sshd -D
 #End
        要通過ADD命令新增到映象系統中的檔案必須和Dockerfile在同一級目錄,比如Java映象中的Dockerfile同級目錄下有:HelloWorld.java  jdk-8u25-linux-x64.tar.gz檔案。還有點Dockerfile中ADD命令還會解壓一些基本的壓縮包,像上面的新增jdk時,可以不需要自己去解壓,只需要安裝tar解壓命令就可以了。         若有不正確之處,望大家指正,共同學習!謝謝!!!         ---------------------------------------------------------------------補充---------------------------------------------------------------------         最近又做了幾個比較複雜的docker映象,這裡總結下:拿postgresql映象來說吧。如果按照以往的做法當然是先在實驗機上做些安裝操作,等到安裝成功,測試沒問題後,就把這些步驟寫到dockerfile中。當然因為是資料庫,需要開機自啟動,所以要用到supervisord.conf把兩種服務都寫到這個配置中去。然後把這些寫好的檔案放到伺服器上開始製作映象了。         但是你會發現這樣的製作方法會很慢(這種方法也有個優點,就是根據dockerfile能很清楚的知道這個映象中做了些什麼操作),如果你夠熟練了,那麼就應該嘗試一種升級版的新方法,用容器製作映象;

        用容器快速製作映象

        用容器製造映象就是建立某個映象的容器,比如製作postgresql映象時,因為它也是一個數據庫,所以就用mysql的容器來製作。得到mysql的映象,然後進入該映象,開始安裝postgresql了,安裝完後測試下,如果可以,就把該容器打包成一個映象,就可以了;下面看下簡單的操作步驟:         1、開始製作postgresql映象時,先用mysql得到一個容器:docker run -d  xxx_mysql_xxx         2、省略些步驟(有關建立容器,登入容器之類的命令,請參考本blog中的 “映象的測試步驟命令“ )         3、當進入到容器中時,首先是解除安裝掉mysql,檢視下有多少個mysql軟體包:rpm -qa | grep 'mysql';然後根據顯示的軟體包一一解除安裝掉:yum remove xxx;         4、對於postgresql安裝的步驟,可以參考下http://blog.51yip.com/pgsql/1520.html         5、就是修改開機啟動了,因為這是個mysql映象,開機啟動的開始設定的是mysql的服務;可以進去修改下:vim  /etc/supervisord.conf中,把相關的啟動命令修改下就可以了;         6、把容器打包成一個映象:docker commit  xxx(容器的id)   xxxx(要製作成的映象名)         通過上面的步驟就可以很快的製作成一個映象,這種製作映象的方法有很多好處:         第一就是可以步步為營。當你製作一個比較複雜點的映象時,不可能一步就能做成功,所以當你覺得下面一步可能要出錯時(不可逆的錯誤),可以先把該映象打個包,如果接下來失誤了,刪掉這個容器,再用剛才打包好的映象做個容器,繼續前面的步驟。         第二就是不管你在容器中怎麼折騰都沒關係,大不了刪除掉這個容器,如果你在物理伺服器上就要相當注意了,要不然duang的一下,整個伺服器就癱瘓了。         第三好處和第一個差不多,因為有些資料庫不能測試的,你一測試就會產生很大的資料(日誌,還有些預設的資料)(我做mongodb映象時,測試了下打包後的映象竟然達到4個多G,而沒測試的就幾百MB,相差太大了),因為docker映象不能太大,否則不好上傳。所以一般是做好了,先打個包成映象,然後接著測試下,如果成功。那就可以了。

        把映象拉到openstack中測試

        1、先找到keystone_admin,執行命令:source keystonerc_admin           2、把製作的映象放到openstack中,命令: docker save centos(centos為映象名稱) | glance image-create --is-public=True --container-format=docker --disk-format=raw --name centos(centos為映象名稱)   驗證操作是否成功:echo $?  如果為0,應該就成功了。         3、登入到openstack中,到映象那一欄看看是否有你上傳的映象         4、在openstack中建立容器開始測試

        對docker映象進行打包和解包

        1、打包:docker save IMAGENAME(映象名稱) | bzip2 -9 -c>img.tar.bz2(打包後的名稱)         2、解包:bzip2 -d -c <img.tar.bz2(打包後的名稱) | docker load         利用埠號進入docker容器中:ssh -p port(埠號)  [email protected]           glance命令:         glance image-list         glance image-delete