CentOS7.3のminimalにDockerをインストールします。インストール後にbusyboxイメージを使用したデータボリュームコンテナを立てて、コンテナ内で永続的なデータを保存できるか確認します。
ここ最近ブレークしてきたDockerというコンテナ技術を勉強してみようと思います。目標は現在VPSで運用しているWebサーバやMailサーバ、DBサーバをDockerのコンテナ上で運用すること。期待する効果は可用性や信頼性・スケーラビリティーの向上です。
1.Dockerのインストール
まずは公式サイトの説明に従い始めてみます。説明によるとCentOSのインストール条件は「64bit でインストールされた何らかの CentOS バージョンを必要とします。さらに、CentOS 7 で動作する kernel は少なくとも 3.10 以上が必要です。」とのことなので念のため確認します。
1 2 |
# uname -r 3.10.0-514.el7.x86_64 |
大丈夫でした。ここでyumの公式リポジトリのインストール情報を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# yum info docker 読み込んだプラグイン:fastestmirror Loading mirror speeds from cached hostfile * base: mirror.fairway.ne.jp * extras: ftp.riken.jp * updates: ftp.riken.jp 利用可能なパッケージ 名前 : docker アーキテクチャー : x86_64 エポック : 2 バージョン : 1.12.5 リリース : 14.el7.centos 容量 : 20 M リポジトリー : extras/7/x86_64 要約 : Automates deployment of containerized applications URL : https://github.com/docker/docker ライセンス : ASL 2.0 説明 : Docker is an open-source engine that automates the : deployment of any application as a lightweight, portable, : self-sufficient container that will run virtually : anywhere. : : Docker containers can encapsulate any payload, and will : run consistently on and between virtually any server. The : same container that a developer builds and tests on a : laptop will run at scale, in production*, on VMs, : bare-metal servers, OpenStack clusters, public instances, : or combinations of the above |
バージョンは1.12.5のようです。
CentOS公式リポジトリよりもDocker公式リポジトリの方がバージョンが新しいようなのでそちらを使用してインストールします。以下のようにDocker用のリポジトリファイルを新規に作成します。
1 2 3 4 5 6 7 |
# vi /etc/yum.repos.d/docker.repo [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg |
上記リポジトリファイルを保存したら、yumでインストールします。
1 2 3 4 5 |
# yum -y install docker-engine ... インストール: docker-engine.x86_64 0:1.13.1-1.el7.centos ... |
インストールが終わったら以下のようにバージョンを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# docker version Client: Version: 1.13.1 API version: 1.26 Go version: go1.7.5 Git commit: 092cba3 Built: Wed Feb 8 06:38:28 2017 OS/Arch: linux/amd64 Server: Version: 1.13.1 API version: 1.26 (minimum version 1.12) Go version: go1.7.5 Git commit: 092cba3 Built: Wed Feb 8 06:38:28 2017 OS/Arch: linux/amd64 Experimental: false |
バージョン1.13.1がインストールできました。
2.Dockerの起動と確認
Dockerの状態を確認し起動と自動起動の設定を行います。
1 2 3 4 5 |
# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: inactive (dead) Docs: https://docs.docker.com |
起動していないようなので起動します。
1 2 3 4 |
# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) ... |
再起動時も自動起動するようにします。
1 |
# systemctl enable docker |
3.Dockerイメージの取得
DockerHubからコンテナイメージをダウンロード(Pull)します。
以下のように、まずはBusyboxとCentosをPullします。
1 2 3 4 5 6 7 8 9 10 11 12 |
# docker pull busybox Using default tag: latest latest: Pulling from library/busybox 4b0bc1c4050b: Pull complete Digest: sha256:817a12c32a39bbe394944ba49de563e085f1d3c5266eb8e9723256bc4448680e Status: Downloaded newer image for busybox:latest # docker pull centos Using default tag: latest latest: Pulling from library/centos 45a2e645736c: Pull complete Digest: sha256:c577af3197aacedf79c5a204cd7f493c8e07ffbce7f88f7600bf19c688c38799 Status: Downloaded newer image for centos:latest |
保存したイメージを確認します。
1 2 3 4 |
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 7968321274dc 6 weeks ago 1.11 MB centos latest 67591570dd29 2 months ago 192 M |
busyboxとcentosイメージがローカルに保存されています。busyboxは最小限のコンパクトなLinuxとして知られており1.11Mと極小サイズ。それに比べてcentosは192MBもありますが多機能なのでしょうがないのでしょう。nginxとかmysqlとか機能を限定したイメージを指定すればサイズは小さくなるようです。
4.データボリュームコンテナの作成
Dockerではイメージから作成したコンテナ内のデータは通常コンテナが終了すると消えてしまいます。ですが、アプリケーションを運用する際にデータを保持しておくことは必須の要件です。そこでコンテナでデータを保持できる仕組みデータボリュームコンテナを作成します。詳細は公式サイトの「コンテナでデータを管理する」を参照してください。
以下はbusyboxイメージを使用して datavolという名前のコンテナを起動しています。
1 |
# docker run -it -v /data --name datavol busybox |
run | コマンド | 新しいコンテナを起動します |
-it | オプション | 標準入力・疑似コンソールを有効化します |
-v | オプション | データボリューム /data をコンテナ内に作成します |
–name | オプション | コンテナに名前(datavol)を付けます |
起動したら、/data内にファイルを作成してみます。
1 |
/ # echo "hello japan" >> /data/japan.txt |
exitでコンテナを抜けます。
1 |
/ # exit |
作成したファイルはどこにあるのか確認します。inspectコマンドの引数にコンテナ名datavolを指定して調べます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# docker inspect datavol [ { "Id": "ee9d9f94935f97662e543ee846fbc6576188cdd4b47b50158a894e8b720e271e", "Created": "2017-02-12T11:47:35.623440471Z", "Path": "sh", "Args": [], "State": { ... "Mounts": [ { "Type": "volume", "Name": "cbc0e7e6572d36333ef54ab20fabdd1ab8b5f446d80f767116b9765a1b12c162", "Source": "/var/lib/docker/volumes/cbc0e7e6572d36333ef54ab20fabdd1ab8b5f446d80f767116b9765a1b12c162/_data", "Destination": "/data", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], |
上記「”Mounts”」ブロックの”Source”の値が実ディレクトリになります。ファイルが存在するかhost上で確認してみます。
1 2 3 |
#less /var/lib/docker/volumes/cbc0e7e6572d36333ef54ab20fabdd1ab8b5f446d80f767116b9765a1b12c162/_data/japan.txt hello japan 572d36333ef54ab20fabdd1ab8b5f446d80f767116b9765a1b12c162/_data/japan.txt (END) |
ありました。
作成したdatavolコンテナを起動して再接続してみます。
1 |
# docker start -ai datavol |
start | コマンド | 既存コンテナを起動します |
-ai | オプション | コンテナに接続し標準入力を有効にします |
以下でファイルを確認します。
1 2 3 4 5 |
_# less /data/japan.txt hello japan ~ ~ /data/japan.txt |
ありました。exitでコンテナを抜けます。
1 |
/ # exit |
5.他コンテナからデータボリュームコンテナを参照
centosイメージから作成したコンテナからデータボリュームコンテナを参照します。
以下の用にcentosイメージコンテナ起動時に–volumes-fromでコンテナ名「datavol」を指定します。またコンテナが終了したらコンテナを削除するように–rmオプションを指定しています(198MBのコンテナを残しておくとディスクを圧迫するので)。
1 |
# docker -it --volumes-from datavol --rm centos |
データボリュームが見えるか確認します。
1 2 |
[@219dea255943 /]#cat /data/japan.txt hello japan |
ありました。データも見えます。
centosコンテナコンソールからexitで抜けた後、コンテナが残っていないかps -aオプションで確認します。
1 2 3 4 |
[@219dea255943 /]#exit # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee9d9f94935f busybox "sh" 13 days ago Exited (0) 17 minutes ago datavol |
datavolコンテナ以外はありません。起動したcentosコンテナは”–rm”オプションによりコンテナ終了と同時に削除されています。
結論
コンテナ間でデータを連携するには、まずデータボリュームコンテナを作成しデータを保存しておけるボリュームを確保する。
他のコンテナからデータボリュームにアクセスするには、コンテナ起動時に–volumes-fromオプションで作成したデータボリュームコンテナ名を指定する。この方法ならどのコンテナからも同じ階層として永続データにアクセスできます。