コンテナにターミナル接続するには?
ファイルを共有する準備として、送信先となるコンテナのパスを知っておく必要があります。
そのため、ターミナルでコンテナに接続して、ディレクトリ構造を調べておきます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81ad607d97ee httpd "httpd-foreground" 31 minutes ago Up 31 minutes 0.0.0.0:8089->80/tcp, :::8089->80/tcp apache1
$ docker exec -it apache1 /bin/bash
root@81ad607d97ee:/usr/local/apache2# pwd
/usr/local/apache2
このような流れで、コンテナにターミナル接続しましょう。
$ docker exec コマンドで接続します。
apache1 のところは、コンテナ名です。docker ps の最終列でコンテナ名を拾えます。
/bin/bash は使用するシェルのパスです。この指定が一般的です。
ホスト→コンテナへのファイル共有
ホスト~コンテナ間のファイルのコピーには、 docker cpコマンドを使用します。
構文
$ docker cp [ホストのパス] [コンテナ名]:[コンテナのパス]
例
$ docker cp C:/Users/edu/Documents/index.html apache1:/usr/local/apache2/htdocs
コンテナ→ホストへのファイル共有
構文はホスト→コンテナと同様です。コピー元とコピー先を入れ替えた形になります。
構文
$ docker cp [コンテナ名]:[コンテナのパス] [ホストのパス]
例
$ docker cp apache1:/usr/local/apache2/htdocs/index.html C:/Users/edu/Documents
ホストのディスクをコンテナにマウントする
マウントの種類
ボリュームマウント
ホストのDocker Engineが管理している領域内にボリュームを作成し、ディスクとしてコンテナにマウントする方法。
使用法は手軽だが、領域内のボリュームはエクスプローラーから操作操作できないため、頻繁にファイル共有が発生する場合は不向きである。
手軽に扱えるため、Docker社はボリュームマウントを推奨している。
ボリュームマウントで扱うボリュームはdocker volumeコマンドで操作する。
バインドマウント
ホストのDocker Engine管理外のフォルダを、コンテナにマウントする方法。
ホストのフォルダを直接扱えるため、利便性は高い。
バインドマウントのやり方(直接マウント)
構文
-v [ホストのフォルダ]:[コンテナのディレクトリ]
docker run をするときに、上記の-vオプションでマウント元とマウント先のディレクトリを指定します。
例
$ docker run --name apache2 -dti -p 8090:80 -v C:\Users\xxx\Documents\apa_folder:/usr/local/apache2/htdocs httpd
45bdbad4cc83cde572b7a2e9cbc854884240b4b8a1efe332344745e4b62ed899
この後、コンテナでマウント先を見ると、ホストのフォルダが共有できていることが確認できます。
ボリュームマウントのやり方
docker volumeコマンドでDockerボリュームを操作します。
ボリュームを作成する・削除する
作成
$ docker volume create myvolume1
myvolume1
削除
$ docker volume rm myvolume1
作成済みのボリュームを一覧表示する
$ docker volume ls
DRIVER VOLUME NAME
local myvolume1
ボリュームをコンテナにマウントする
$ docker run --name myapache -dit -p 8089:80 -v myvolume1:/usr/local/apache2/httpd httpd
-v [マウントするボリューム名]:[マウント先のパス] の形式で指定します。
ボリュームの中身を見るには?
Dockerボリュームはマウントしたコンテナからしか見れません。
ホストのファイルシステムからボリュームを見ることはできません。