docker使用四(dockerミラーを作成)

13380 ワード

イメージを作成
   dockerのミラーを使用する場合、テストとして使用すれば、直接にdocker倉庫から既製のミラーをダウンロードして使用することができます.生産環境で使うなら、自分の需要性と安全性を満足させるために、自分で作ったミラーを使ったほうがいいです.dockerミラー像を作成する方法は、主に三つあります.既存のイメージに基づいたコンテナを作成し、ローカルテンプレートに基づいて導入し、dockerfileに基づいて作成します.
基礎鏡像:自分の鏡像を作る前に、docker hbに基礎鏡像をダウンロードする必要があります.基本ミラーはBusBox、Alphine、Debian/Ubuntu、Centos/Fedoraなどのオペレーティングシステムを選択して、基礎ミラーを選択します.
一、既存のイメージに基づくコンテナの作成
コンテナ作成のコマンド形式:docker comit[OPTTIONS]CONTAINER[REPOSITORY[:TAG]][flags]
一般的なオプション:
          -a(--author=")著者情報
         -c(--change=")提出時に、CMD_ENTRY POINT_ENV_124 EXPOSE_LABEL_OBUILD USER_VOLUME_WORKDIRなどを含むdockerfile命令を実行する.
         -m(-message=")メッセージの提出
         -p(--pause=true)提出時に容器運転を停止します.
1、既存のミラーコンテナに基づいてイメージを作成する
#       
root@docker-server:~# docker run -it ubuntu:16.04 /bin/bash
#              
root@63b4307c45f0:/# mkdir /test/dayi123 -p
#   docker commit         
root@docker-server:~# docker commit -m "create new file" -a "dayi123" 63b4307c45f0 testubuntu:1.0
sha256:0be200520abd7965bb64303db3ea3150237cd849196dd5e9a3d009d34970d5b3
 
2、ミラーを作成して、ミラーにsshサービスを追加します.
#     centos        ,   /bin/bash    
root@docker-server:~# docker run  -it centos:6.5 /bin/bash
#       openssh-server
[root@3349fc93dfe9 /]# yum install openssh-server
#       sshd  
[root@3349fc93dfe9 /]# /usr/sbin/sshd -D &    
[1]31
#         
[root@3349fc93dfe9 /]# ss -tanl
State      Recv-Q Send-Q      Local Address:Port  Peer Address:Port 
LISTEN     0       128                  :::22                  :::*     
LISTEN     0       128                   *:22                  *:* 
#  ssh         ,  pam    
[root@3349fc93dfe9 /]# sed -i "s/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g" /etc/pam.d/sshd
#  root     ssh  ,            
[root@3349fc93dfe9 /]# mkdir /root/.ssh -p
[root@3349fc93dfe9 /]# vi /root/.ssh/authorized_keys
[root@3349fc93dfe9 /]# cat /root/.ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1pd5p34qkLQGts8UvNUQWYu8zx7T5M2W+h2l/IMS9wy9BrVtQisTnMF+zi3CTR9Mgzumch7rHBjpJa/imTGISfwx0gQ9RY6dWiPXt7sUVSIPcXXNdml6wtLcvMTbPxnVg/S4GVN8OsiQNBEFWzvrR9RFrCGtwI9z8Ayg5q1HVNehBHtLND1wEahspojo9QnFyKa9GZDpsl4V2r/JlD3zBeUjtcrFQKtJ4jpg/VYWzEbQBmv9amRuOmhl2S0V5xpPJ948SAgnd70aT1WHHC8P8LdvllDcgSVaZwPMZS4hwsvSDvgDjgOH6K1fcnXzu6BlAXS/pFsZIQh4Ns0asf8pz root@docker-server
#    ssh       run.sh
[root@3349fc93dfe9 /]# vi /run.sh
[root@3349fc93dfe9 /]# cat /run.sh 
#!/bin/bash
/usr/sbin/sshd -D
[root@3349fc93dfe9 /]# chmod +x run.sh 
[root@3349fc93dfe9 /]# exit
#    ssh         
root@docker-server:~# docker commit 3349fc93dfe9 sshd:centos
sha256:98a492fad9d8ea556d8aef740dcb508a6f985d500f26d6696874f41f6852e92e
#        
root@docker-server:~# docker images
REPOSITORY    TAG         IMAGE ID      CREATED             SIZE
sshd         centos      98a492fad9d8  4 seconds ago       514MB
#             ,          22  
root@docker-server:~# docker run -it -p 10022:22 -d sshd:centos /bin/bash /run.sh
af9c50e166cb5d3273bd6378474c34cd432eb2fd4c68986d7d93ba9c9472710a
#                  
root@docker-server:~# docker ps
CONTAINER ID    IMAGE               COMMAND               CREATED             STATUS              PORTS                   NAMES
af9c50e166cb        sshd:centos         "/bin/bash /run.sh"   6 seconds ago       Up 5 seconds        0.0.0.0:10022->22/tcp   gracious_colden
#  ssh        ,  ssh      
root@docker-server:~# ssh 10.0.0.16 -p 10022
The authenticity of host '[10.0.0.16]:10022 ([10.0.0.16]:10022)' can't be established.
RSA key fingerprint is SHA256:kFGUqwSd9WSJWB59LXlsAiVSbaZ6i9cjTKaGKxVXwsU.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[10.0.0.16]:10022' (RSA) to the list of known hosts.
[root@af9c50e166cb ~]#
二、ローカルテンプレートによる導入
   直接に一つのオペレーティングシステムのテンプレートファイルから一つのミラーを導入することができます.導入されたミラーは他のホストから導出されたミラーを使用することもできます.OpenVZから提供されたテンプレートを使用して作成することもできます.
ミラーコマンド形式を導入します.docker import[OPTTIONS]file|-[REPOSITORY[:TAG]]
#     redis   
root@docker-server:~# docker import redis_run.tar dayi123/redis:1.1  
sha256:62cd458bd1200e36ffdcf2176cd3ead21e744b3e6d19ffdc4d980819d4b4134d
root@docker-server:~# docker images
REPOSITORY       TAG         IMAGE ID          CREATED             SIZE
dayi123/redis    1.1          62cd458bd120    5 seconds ago       104MB
#             
root@docker-server:~# cat nginx_run.tar | docker import - dayi123/nginx:1.1
sha256:54eb4a4e69027e2bc857d35a2f58965d87f9d9f73b877fb7af3e0fcdb71546d4
三、Docerfileを使って鏡像を作る
1、dockerfile基本構造
       dockerfileはテキスト形式のプロファイルであり、dockerfileは命令文の一行で構成されています.dockerfileは一般的に4つの部分から構成されています.それぞれの場合は基本的なミラー情報、メンテ情報、ミラー操作コマンドとコンテナ起動時に実行します.dockerfileの構造は以下の通りです.
#               
From ubutu 
#      
MAINTAINER docker_user [email protected] 
#        
apt/sourcelist.list 
RUN apt-get update && apt-get install -y ngnix 
RUN echo "
daemon off;">>/etc/ngnix/nignix.conf # CMD /usr/sbin/ngnix
2、dockerfileで鏡像作成の指示
(1)FROM
     FROMコマンドは、ミラーを作成するベースミラーを指定します.ベースミラーがローカルに存在しない場合は、docker hupでダウンロードします.
    フォーマット:FROM
 任意のDocerfileの中の第一の命令はFROM命令でなければなりません.同じDocerfileで複数のミラーを作成すれば、複数のFROM命令が使用できます.
(2)MAINTAINER
   MAINTAINERコマンドは、ミラーを生成するAuthor属性領域に書き込みます.
 フォーマット:MAINTAINERイメージ(u)[email protected]
(3)RUN
   RUN命令は、指定コマンドを実行するために使用されます.
 フォーマット:RUN
             RUN["executable],"param 1"param 2"
   前の命令はshell端末でコマンドを実行します.後の命令はexecで実行され、shell環境は起動されません.後の命令はJSON配列に解析されますので、二重引用符が必要です.
   他の端末タイプを使用することを指定することは、第二の命令により実現され得る.各RUNコマンドは、現在のイメージに基づいて指定コマンドを実行し、新しいイメージとして提出します.コマンドが長い場合は、\改行が使用できます.
(4)CMD
   CMDコマンドは、コンテナ起動時にデフォルトで実行されるコマンドを指定します.
 フォーマット:CMD[「executable」、「param 1」、「param 2」
            CMD command param 1 param 2
            CMD["param 1"param 2"
   第一のフォーマットはexecを使用して実行されるもので、第二は「bin/sh」で実行され、相互作用が必要なアプリケーションに提供され、第三はENTRY POINTに提供されるデフォルトパラメータである.
   各DocerfileにはCMDコマンドが一つしかありません.複数のコマンドが指定されている場合、最後の一つだけ実行されます.ユーザが容器を起動する時に、手動で実行のコマンド(runのパラメータとして)を指定したら、CMDで指定されたコマンドを上書きします.
(5)LABEL
    LABELコマンドは、ミラー画像を生成するメタデータラベル情報を指定するために使用される.
 フォーマットは:LABEL==…
(6)EXPOSE
   EXPOSEは、ミラー内サービスの傍受を宣言するためのポートです.
フォーマット:EXPOSE
   この命令は説明の役割を果たしただけで、ポートマッピングは自動的に完了しません.
(7)ENV
  環境変数を指定して、ミラー生成中に後続のRUNコマンドによって使用され、ミラースタートのコンテナにも存在します.
  書式:ENV
               ENV=
    指定した環境変数は、容器を運転する際に環境変数を再指定して上書きすることができます.
(8)ADD
  このコマンドは、指定されたパスの内容をコンテナにコピーします.
  フォーマット:ADD
    Docker fileがあるディレクトリの相対的なパスであっても良いし、URLであってもいいし、tarファイルであれば自動的にディレクトリの下に解凍されます.パスは正規の書式をサポートしています.
(9)COPY
    COPYコマンドは、ローカルの(dockerfileのディレクトリの相対パス、ファイルまたはディレクトリ)のコンテンツをミラーにコピーします.ターゲットパスが存在しない場合、自動的に作成されます.
 フォーマット:COPY
   COPYパスも正則をサポートします.
(10)ENTRY POINT
   ミラーのデフォルトの入口コマンドを指定します.この入口コマンドは、コンテナを起動する時にルートコマンドとして実行されます.すべての着信値をコマンドのパラメータとして使用します.
 フォーマット:ENTRY POINT[「executable」、「param 1」、「param 2」
             ENERY POINT command param 1 param 2
  最初のフォーマットはexec呼び出しで実行され、第二のフォーマットはshellで実行されます.
  各Docker fileの中には一つのENTY POINTしかないので、複数を指定すると最後の効果が発生します.起動容器を作成する時も「--entrypoint」パラメータで上書きできます.
(11)VOLUM
    データボリュームのマウントポイントを作成します.
 フォーマット:VOLUME["/data]]
   ローカルホストまたは他のコンテナからデータボリュームをマウントすることができます.一般的にはデータベースと保存するデータを保存するために使用されます.
(12)USER
  コンテナを実行する際のユーザ名またはUIDを指定します.
  フォーマット:USER daemen
     コンテナに管理者権限が必要でない場合は、このコマンドで実行ユーザを指定し、必要なユーザを事前に作成することができます.
(13)WORKDIR
     WORKDIR命令は、後続のRUN、CMD、ENTRYPOINT命令のためにワークディレクトリを設定するために使用される.
  フォーマット:WORKDIR/path/to/workdir
  複数のWORKDIRコマンドが使用されてもよく、後続のコマンドパラメータが相対パスであれば、前のコマンドに基づいて指定されるコマンドがあります.
(14)ARG
  いくつかのミラー内で使用するパラメータを指定します.これらのパラメータは、docker buildコマンドを実行する時にのみ--build-arg=形式で入力されます.
  フォーマット:ARG[=]
(15)OBUILD
     ONBUILは、作成したミラーを他のミラーのベースミラーに設定します.
  フォーマット:ONBUILD[INSTRUCTION]
(16)STOSIGNAL
    作成したミラースタートのコンテナが終了する信号の値を指定します.
(17)HEALTHCHECK
    起動容器の配置はどうやって健康診断を行いますか?
  フォーマット:HEALTHCHECK[OPTIONS]CMD command
               HEALTHCHECK NONE
  オプション:--interval=DURATIONはどれぐらいの頻度で検査しますか?デフォルトは30 sです.
               --timeout=DURATIONは一度も検査していません.待ち時間はデフォルトでは30 Sです.
               --retries=N失敗したら、何回か試してみます.一番失敗しました.デフォルトは3です.
  第一の形式は、実行されたコマンドの戻り値が0かどうかによって判断され、第二の形式はベースミラーの健康診断を禁止します.
(18)SHELL
    他のコマンドがshellを使用する場合のデフォルトのshellタイプを指定します.
    フォーマット:SHELL[executable]、「parameters」
    標準値:[]/“/bin/sh”、“-c”]
3、鏡像を作成する
  dockerfileを作成したら、docker buildコマンドでミラーを作成することができます.
  コマンド形式:docker build[OPTTIONS]PATH|URL|-.
  常用オプション:-tイメージを生成するタグ情報を指定します.
                      -fコンテンツ経路以外のDocerfileを指定する.
  作成プロセス:サブディレクトリを含む指定されたパスのすべてのDocefileを読み込むように命令し、ディレクトリの下のすべてのコンテンツをサービス側に送信し、サービス側でミラー画像を作成します.また、dockerignoreファイルを作成することにより、指定されたディレクトリまたはファイルをdockerに無視させることができます.
4、dockerfilを使って鏡像を作成する
(1)dockerfileを使ってssh鏡像を作成する
作業ディレクトリを作成:
#      
root@docker-server:/home/dayi123# mkdir sshd_ubuntu
root@docker-server:/home/dayi123# cd sshd_ubuntu
dockerfileファイルを作成します.ファイルの内容は以下の通りです.
#      
FROM ubuntu:16.04
#    
MAINTAINER dayi123 [email protected]
#    
RUN apt-get update
#  ssh  
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
RUN sed -ri "s/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g" /etc/pam.d/sshd
#            
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#       
EXPOSE 22
#  ssh     
CMD ["/run.sh"]
ベースミラーがセントロなら、他の操作構成は同じです.dockerfileの内容は以下の通りです.
#      
FROM centos:6
#    
MAINTAINER dayi123 [email protected]
#  ssh  
RUN rpm --rebuilddb
RUN yum install openssh-server -y 
#    
RUN rpm --rebuilddb
RUN yum -y update
RUN mkdir -p /root/.ssh
#  ssh    
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
#            
RUN chmod 755 /run.sh
RUN chmod 600 /etc/ssh/ssh_host_rsa_key
RUN echo dayi123 | passwd --stdin root
#       
EXPOSE 22
#  ssh     
CMD ["/run.sh"]
run.shファイルを作成します.内容は以下の通りです.
root@docker-server:/home/dayi123/sshd_ubuntu# cat run.sh 
#!/bin/bash 
/usr/sbin/sshd -D
ミラーを作成:
root@docker-server:/home/dayi123/sshd_ubuntu# docker build -t sshd:ubuntu16.04 .
Sending build context to Docker daemon  4.608kB
Step 1/12 : FROM ubuntu:16.04
 ---> 70b70c987e8f
Step 2/12 : MAINTAINER dayi123 [email protected]
作成した鏡像を表示します.
root@docker-server:/home/dayi123/sshd_ubuntu# docker images
REPOSITORY   TAG         IMAGE ID            CREATED             SIZE
sshd        ubuntu16.04   39bff62c2248        20 minutes ago      256MB
作成した鏡像を検証
#                    
root@docker-server:/home/dayi123/sshd_ubuntu# docker run -d -p 22222:22 sshd:ubuntu16.04 
05775c46eff631f97cf24637c12a00deac1a1f0a428dc981ab1e030bd79da03f
#  ssh    
root@docker-server:/home/dayi123/sshd_ubuntu# ssh 10.0.0.16 -p 22222
The authenticity of host '[10.0.0.16]:22222 ([10.0.0.16]:22222)' can't be established.
ECDSA key fingerprint is SHA256:pP8aSQDFA8kNdkqQVARFp+BW93mFkIwxmw4bBQjnVZg.
Are you sure you want to continue connecting (yes/no)? yes
......
(2)作成したばかりのsshdサービス付きのセントロミラーを使ってnginxイメージを作成する
作業ディレクトリを作成
[root@ansible-server docker]# mkdir nginx_centos
[root@ansible-server docker]# cd nginx_centos/
dockerfileを作成するファイルの内容は以下の通りです.
[root@ansible-server nginx_centos]# cat Dockerfile 
#    
FROM sshd:centos6.9
#    
MAINTAINER dayi123 [email protected]
#              
WORKDIR /usr/local/src
RUN yum -y install gcc zlib zlib-devel openssl openssl-devel pcre pcre-devel make wget
#    nginx
RUN wget http://nginx.org/download/nginx-1.14.0.tar.gz
RUN tar -zxvf nginx-1.14.0.tar.gz
#    nginx
WORKDIR nginx-1.14.0
RUN ./configure --prefix=/usr/local/nginx --with-pcre --with-http_ssl_module && make && make install
#  nginx
RUN /usr/local/nginx/sbin/nginx
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/run.sh
CMD ["/usr/local/sbin/run.sh"]
#    22、80、443  
EXPOSE 22
EXPOSE 80
EXPOSE 443
起動したスクリプトファイルを作成:
#          sshd   nginx  
[root@ansible-server nginx_centos]# cat run.sh 
#!/bin/bash
/usr/sbin/sshd &
/usr/local/nginx/sbin/nginx
ミラーを作成:
[root@ansible-server nginx_centos]# docker build -t nginx:centos .
先ほど作成したミラーを使ってコンテナを作成し、テストします.
#    
[root@ansible-server nginx_centos]# docker run -d -P httpd:centos
#       
[root@ansible-server nginx_centos]# docker ps
CONTAINER ID   IMAGE            COMMAND                     CREATED       STATUS     PORTS              NAMES
92ee03494be5   httpd:centos    "/usr/local/sbin/run…"   9 minutes ago       Up 9 minutes        0.0.0.0:32775->22/tcp, 0.0.0.0:32774->80/tcp, 0.0.0.0:32773->443/tcp   adoring_feynman
#  nginx
[root@ansible-server nginx_centos]# curl http://127.0.0.1:32774



Welcome to nginx!
......