Docker(ドッカー)実践編(2)

「Docker(ドッカー)実践編(1)」の続きです、この回はdockerfileを使ったコンテナイメージの作成と、データ保存用コンテナについて学習します。

 

1.Dockerfileを使ったコンテナイメージの作成
2.削除系コマンドの練習(お掃除の実施)
3.データ保存用コンテナの作成

 

1.Dockerfileを使ったコンテナイメージの作成

・Dockerfileの作成とコンテナイメージ操作

— Docker TIPS —

$ docker images ローカルに保存されているDockerイメージ一覧を表示
$ docker pull DockerHub等からイメージを取得し、ローカルに保存
$ docker build Dockerfileを元にDockerイメージを作成
$ docker history {IMAGE} {IMAGE}イメージに関する作成履歴を表示
$ docker save ローカルに保存されているイメージをファイル等に出力
$ docker load Dockerイメージファイルを取り込み、ローカルに保存
$ docker rm {CONTAINER} コンテナの削除
$ docker rmi {IMAGE} イメージの削除

 

 

1)サーバーに保存されているDockerイメージの確認
-先ほどnginxのコンテナ作成時にDockerHubからpullされた、nginxイメージが存在する。

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

nginx               latest              e43d811ce2f4        5 days ago          181.4 MB

 

 

2)Dockerfileの作成
-Dockerfileは空のディレクトリ内に作成する事
-1) で確認したnginxイメージを元に、試しにデフォルトのWebページを書き換えたイメージをビルドするためのDockerfileを作成してみる。

$ mkdir nginx
 
$ vi nginx/Dockerfile

FROM nginx:latest

RUN echo "index.html overwrite." > /usr/share/nginx/html/index.html

Dockerfileの編集を実施

 

3)上で作ったDockerfileを元に、新たなイメージをビルドする。

$ docker build -t nginx:new ~/nginx

Sending build context to Docker daemon 2.048 kB

Step 1 : FROM nginx:latest

 ---> e43d811ce2f4
 
Step 2 : RUN echo "index.html overwrite." > /usr/share/nginx/html/index.html

 ---> Running in 2572e76d609d
 
 ---> 6b778e62fb35
 
Removing intermediate container 2572e76d609d

Successfully built 6b778e62fb35

 

 

4)Dockerイメージの確認
-新たにnginx:new のイメージが作成されていることを確認します(TAG: new)。

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE

nginx               new                 6b778e62fb35        About a minute ago   181.4 MB

nginx               latest                e43d811ce2f4        5 days ago           181.4 MB

 

 

5)Dockerイメージの履歴確認

$ docker history nginx:new

IMAGE               CREATED             CREATED BY                                      SIZE

COMMENT

6b778e62fb35        2 minutes ago       /bin/sh -c echo "index.html overwrite." > /us   22 B
              
e43d811ce2f4        5 days ago          /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon    0 B
                 
<missing>           5 days ago          /bin/sh -c #(nop)  EXPOSE 443/tcp 80/tcp        0 B

<missing>           5 days ago          /bin/sh -c ln -sf /dev/stdout /var/log/nginx/   0 B

<missing>           5 days ago          /bin/sh -c apt-key adv --keyserver hkp://pgp.   58.43 MB
            
<missing>           5 days ago          /bin/sh -c #(nop)  ENV NGINX_VERSION=1.11.5-1   0 B
                 
<missing>           5 days ago          /bin/sh -c #(nop)  MAINTAINER NGINX Docker Ma   0 B
                 
<missing>           5 days ago          /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B
                 
<missing>           5 days ago          /bin/sh -c #(nop) ADD file:23aa4f893e3288698c   123 MB

 

 

6)作成したDockerイメージからのコンテナ起動

$ docker run --name nginx2 -p 8002:80 -d nginx:new

cced9bba4481b46b4433803d2a7ebd600d0d7c00d908d931f725bc2508de0320

 

 

7)ブラウザで下記URLを開くと、起動したnginxへ接続します。
http://{VPSのIP}:8002/
-Dockerfileで書き換えたコンテンツが表示されます。

起動したnginxへ接続

 

 

8)イメージのファイル出力
-3)の手順でDockerfileを元にビルドしたイメージをファイルへ出力します。

$ docker save -o dump_image nginx:new
 
$ ls -al dump_image
 
-rw------- 1 dockeradmin dockeradmin 189449728 Oct 27 13:45 dump_image

 

 

2.削除系コマンドの練習(お掃除の実施)

上記で起動したコンテナについて、お掃除がてら削除系コマンドを実行してみます。
1)コンテナの削除
-1-6)で起動したコンテナを削除します。
-起動中のコンテナは通常削除できませんが、-f オプションを使用するとSIGKILLで停止した上で削除します。

$ docker rm -f nginx2

nginx2

 

 

2)イメージの削除
-イメージを使用しているコンテナが存在すると、イメージを削除することができません。

$ docker rmi nginx:new

Untagged: nginx:new

Deleted: sha256:6b778e62fb35cffa0b4ee3a118f7a2eb64150f7408ad35980ec05965136eef99

Deleted: sha256:816c7ef1fabbf03733b753283d38a7df5ccbbdf1ffbc39294d1a2a4993520913

 

 

3)イメージ一覧の確認
-nginx (TAG: new)のイメージが存在しないことを確認します。

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

nginx               latest              e43d811ce2f4        5 days ago          181.4 MB

 

 

4)イメージファイルの読み込み

$ docker load -i dump_image
 
b04f4b3c29b6: Loading layer [=================================>] 4.096 kB/4.096 kB

Loaded image: nginx:newayer [======>                                            ]    512 B/4.096 kB

 

 

5)イメージ一覧の確認
-nginx (TAG: new)のイメージが再度現れたことを確認します。

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

nginx               new                 6b778e62fb35        47 minutes ago      181.4 MB

nginx               latest              e43d811ce2f4        5 days ago          181.4 MB

 

 

3.データ保存用コンテナの作成

Dockerコンテナ内のデータは永続化しておかないとコンテナが止まった際に、データが消えてしまいます。これを防ぐ為に、コンテナ外(今回はVPS内の領域)にデータを保存します。その際のテクニックがデータボリュームコンテナ(busybox)です。

・データボリュームコンテナの作成とコンテナ間参照

1)データボリューム一覧確認

$ docker volume ls

DRIVER              VOLUME NAME

何も存在しません

 

2)データボリュームコンテナの作成

-軽量なbusyboxのコンテナイメージを使ったコンテナを作成し、そこにデータボリュームを紐付けます(-v オプション)。
-データボリュームコンテナは起動する必要はないため、docker create コマンドを用います。

$ docker create -v /usr/share/nginx/html --name datavol busybox

Unable to find image 'busybox:latest' locally

latest: Pulling from library/busybox

56bec22e3559: Pull complete
 
Digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912

Status: Downloaded newer image for busybox:latest

da8b8ab8f91d044350de61f7937beb1592c2836785f8fb3731312f59d2f4b105

 

 

3)データボリューム一覧確認

$ docker volume ls

DRIVER              VOLUME NAME

local               7ed07cfc078ccd5c1cba355ff6f38a5da3379a919d87821eebe253749d755b2f

上記で作成したデータボリュームが追加されていることが解ります。

 

 

4)データボリュームの詳細情報取得
-引数には3)で確認したVOLUME NAMEを付与します。
-実行結果の”Mountpoint” の項目から、ホスト上のデータボリュームのマウントポイントを確認できます。

$ docker volume inspect 7ed07cfc078ccd5c1cba355ff6f38a5da3379a919d87821eebe253749d755b2f

[
   
    {
       
        "Name": "7ed07cfc078ccd5c1cba355ff6f38a5da3379a919d87821eebe253749d755b2f",
        
        "Driver": "local",
        
        "Mountpoint": "/var/lib/docker/volumes/7ed07cfc078ccd5c1cba355ff6f38a5da3379a919d87821eebe253749d755b2f/_data",
        
        "Labels": null,
        
        "Scope": "local"
        
    }
    
]

 

 

5)データボリューム内にnginxで表示させるコンテンツ(index.html)を設置
-設置するパスは 4)で得られた結果を用いてください。

$ sudo vi /var/lib/docker/volumes/ff588bf9097055a9f9b0377494b2663d5ae6050/_data/index.html

hogehoge test!!!

 

 

6)作成したデータボリュームコンテナを参照するnginxコンテナの起動
- 一つのデータボリュームコンテナは複数のコンテナから参照することができます。
- –volumes-from オプションでボリューム参照を行います。
- Read-onlyオプション(:ro)を指定することで、参照元からのファイルの変更を防ぐこともできます。(コマンド2行目が:roを指定)

$ docker run --name nginx3 -p 8003:80 --volumes-from datavol -d nginx
 
$ docker run --name nginx4 -p 8004:80 --volumes-from datavol:ro -d nginx

 

 

7)それぞれのコンテナのnginxに接続し、5)で作成した内容が表示されることを確認しましょう。

http://{VPSのIP}:8003/
http://{VPSのIP}:8004/

 

 

今回、データボリュームコンテナはVPSサーバー内のディレクトリを参照していますが、VPSがマウントしたサーバー外部のNFSサーバーを参照することも可能です。システムに必要とされるデータの読み書き性能や可用性を考慮し、データの保存先を決めることが必要です。

 

図:VPSの内部状況(ストレージ)

図:VPSの内部状況(ストレージ)

 

 

 

いわさき
テクノロジー&オペレーション開発本部所属             (監修:とみなが)                     

オススメ記事

関連サービス

VPS VPSクラウド