【Docker】docker-compose "exec" について
こんばんは、葛の葉です。
さて、DockerComposeを使ってコンテナを立ち上げたり、あるいはDockerNetworkを構築したりすることがあると思います。DockerComposeで立ち上げたコンテナの中に侵入するためにdocker exec -it コンテナ名 /bin/bash
と打つ方もいらっしゃるかと思いますが、docker-compose.yml
にコンテナ名を確認しに行ったり、docker ps -a
等で動いている(あるいは死んでる)コンテナを見に行ったりしてコンテナ名を確認したりしているのかなと思慮します。
前置きが長くなってしまいましたが、今回は上記よりもう少し簡単にDockerComposeで起動したコンテナ内に侵入できるdocker-compose exec
についてお話します。
docker-composeの記載内容の例
version: "3" services: py: build: . image: python:3.6.5 container_name: test_python volumes: - "./program/:/var/program/" tty: true networks: test_net: ipv4_address: 172.20.0.2 rdy: image: redis:4.0.10 container_name: test_redis volumes: - "./data:/data" networks: test_net: ipv4_address: 172.20.0.3 networks: test_net: driver: bridge ipam: driver: default config: - subnet: 172.20.0.0/24
上記のようなdocker-compose.yml
があったとします。今回の方法ではサービスを用います。DockerComposeにおけるサービスとはコンテナにオプションを施したものの単位という認識でよいと思います。今回、docker-compose.ymlに記載されているサービスはpy
とrdy
とになります。py
というサービスはpython:3.6.5
のイメージを使ってコンテナを作成し、volumes
というオプションを使ってホストとゲスト間のディレクトリを共有しています。
まず、docker-compose.ymlがあるディレクトリ上でdocker-compose up -d
コマンドを実行し、2つのサービスをデタッチドモード起動しましょう。2つのサービスの起動が完了するまで待ちます。
上記のサービスに侵入するには以下のコマンドを使用します。
docker-compose exec (service名) /bin/bash
今回のケースだとdocker-compose exec py /bin/bash
になります。
root@50947e77690d:/#
こんな感じで出力されたかと思います。50947e77690d
の部分は人やタイミングによって変わるかな、と思います。
docker-compose exec (service名) (command)
例えばdocker-compose exec py python
とすることで、Pythonのコマンドラインを出力することできます。
Python 3.6.5 (default, Jun 27 2018, 08:15:56) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information.
今回は起動したサービスの元となっているImageがpython:3.6.5であり、pythonがインストールされているイメージであるため、上記のコマンドラインが出現しています。
では、もう一つのサービスであるrdy
のコンテナに入ってみましょう。こちらはRedis:4.0.1がインストールされているサービスなります。
> docker-compose exec rdy redis-cli set testkey hoge OK > docker-compose exec rdy redis-cli get testkey "hoge"
docker-compose exec rdy redis-cli set testkey hoge
を分解すると
docker-compose exec
はDockerComposeのコマンド
rdy
はdocker-compose.yml
で作成したサービスの名前
redis-cli set testkey hoge
はサービスに実行してもらうコマンド部分になります。
余談ですが、redis-cli
コマンドはRedis用のコマンドです。set (KEY) (VALUE)
とすると、KEYに値をセットでき、get (KEY)
とするとKEYにセットされた値を出力しています。
今回はtestkeyというKEYにhogeというVALUEを与えています。
/bin/bashもコマンドです
ご存知の方が多いと思いますが、/bin/bash
はbashというshellを呼び出すコマンドです。docker-compose exec (service名) /bin/bash
とは、サービス内のbashを呼び出しているので、サービス内に侵入できているわけです。