[Docker] ホストマシンのvolume mountの設定方法

ホストマシンとコンテナのボリュームをマウント

e.g.
ホストマシンの ~/work と コンテナ内の /myapp を同期させる

~/work/file1.txt
/myapp/file2.txt

ファイル名が同じだった場合、ホストマシンがコンテナを上書きする

### Dockerにおけるマウント指定
Dockerによる環境構築をする際、ボリュームをマウントする方法はDockerfile, Composeファイル、コマンドラインの3つがある

### 1. Dockerfileによるマウント
Dockerfile内でVOLUME命令を書く。この命令では、引数としてコンテナ側のディレクトリしか指定することはできない

VOLUME /myapp

Dockerfile

FROM debian
RUN mkdir /myapp && \
	echo "Hello, World" > /myapp/file.txt
VOLUME /myapp

$ sudo docker build -t hello .
$ sudo docker run -it hello bash
# cat /myapp/file.txt
Hello, World

Dockerfileにボリュームのマウント設定をする際は、ホストマシンのディレクトリを指定することができない

### 2. docker-composeによるマウント
composeファイルでは、ホストマシンのディレクトリも指定することができる

volumes:
  - ./work:/myapp

– ホストマシンのディレクトリ: Composeファイルから見た相対パスもしくは絶対パス
– コンテナのディレクトリ: 絶対パス

$ tree
.
├── docker-compose.yml
└── test
└── file.txt
$ cat test/file.txt
hello shinbashi!

docker-compose.yml

version: '3'
services:
  web:
    image: debian
    volumes:
      - ./test:/myapp

$ sudo docker-compose run web bash
Creating network “entrypoint_default” with the default driver
root@e8b020e943ae:/# cat /myapp/file.txt
hello shinbashi!
root@e8b020e943ae:/#

### DockerfileとComposeファイルを同じディレクトリに作成
$ tree
.
├── Dockerfile
├── docker-compose.yml
└── test
└── file.txt

dockerfile

FROM debian
RUN mkdir /myapp && \
	echo "It's a beautiful day." > /myapp/another_file.txt

docker-compose.yml

version: '3'
services:
  web:
    build: . 
    volumes:
      - ./test:/myapp

なるほどー、少し見えなかったものが見えてきた