2017年10月28日土曜日

docker-compose でデータコンテナを作成して別コンテナでマウントする方法

概要

docker-compose を使ってデータコンテナを作成し同時に別のコンテナからデータコンテナの領域をマウントする yml ファイルを作成してみました

環境

  • macOS X 10.12.6
  • docker 17.09.0-ce
  • docker-compose 1.16.1

docker-compose.yml

全体は以下の通りです

version: '2'
services:
  main:
    image: nginx
    ports:
      - 80:80
    volumes_from:
      - vol
    links:
      - vol
    container_name: main
  vol:
    build: .
    image: vol_image
    volumes:
      - /share
    container_name: vol

コンテナを永続化させるために nginx のイメージを使っています
動作確認のために使ってるだけなので他のイメージからでも OK です

vol がデータコンテナ側の定義になります
確認のためファイルを 1 つコンテナに追加してそれが共有されているか確認するためイメージはビルドします
ビルド後のイメージ名は vol_image とします
データコンテナが共有する領域を定義するのは volumes で行います
今回の場合 /share というパスが共有されるので、別のコンテナがデータコンテナをマウントすると /share が共有されます

main 側がマウントする側のコンテナになります
ポイントは volumes_from になります
ここにはデータコンテナのコンテナ名を指定します
今回であれば vol になるので、それを指定します
links はなくても OK です

Dockerfile

ファイルを 1 つ追加しているだけです
nginx コンテナ内にある既存のファイルを使っても問題ないですがわかりやすいように独自でファイルを作成して追加しています

FROM nginx:latest

RUN mkdir -p /share
ADD ./hoge /share

動作確認

  • docker-compose up -d

でコンテナのビルド、起動をしましょう

Creating network "docker_default" with the default driver
Building vol
Step 1/3 : FROM nginx:latest
latest: Pulling from library/nginx
bc95e04b23c0: Pull complete
110767c6efff: Pull complete
f081e0c4df75: Pull complete
Digest: sha256:004ac1d5e791e705f12a17c80d7bb1e8f7f01aa7dca7deee6e65a03465392072
Status: Downloaded newer image for nginx:latest
 ---> 1e5ab59102ce
Step 2/3 : RUN mkdir -p /share
 ---> Running in e6d30579c4f9
 ---> 3db5418c7f21
Removing intermediate container e6d30579c4f9
Step 3/3 : ADD ./hoge /share
 ---> 2dd5e9403fa6
Successfully built 2dd5e9403fa6
Successfully tagged vol_image:latest
WARNING: Image for service vol was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating vol ... 
Creating vol ... done
Creating main ... 
Creating main ... done

コンテナが起動したら領域がちゃんと main 側にマウントされているか確認してみます

  • docker exec -it main ls -ltr /share
total 4
-rw-r--r-- 1 root root 5 Oct 25 07:59 hoge

こんな感じでマウントされてファイルが存在していれば OK です

最後に

docker-compose でデータコンテナを作成して別コンテナでその領域をマウントする方法を紹介しました
docker コマンドの -v--volumes-from を使っているだけです

ちなみにデータコンテナ側が停止すると共有されるのは停止するまでの状態になります
またデータコンテナ側には新規でファイルが追加されなくなります (当然かもしれませんが)

0 件のコメント:

コメントを投稿