Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【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に記載されているサービスはpyrdyとになります。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のコマンド

rdydocker-compose.ymlで作成したサービスの名前

redis-cli set testkey hogeはサービスに実行してもらうコマンド部分になります。

余談ですが、redis-cliコマンドはRedis用のコマンドです。set (KEY) (VALUE)とすると、KEYに値をセットでき、get (KEY)とするとKEYにセットされた値を出力しています。

今回はtestkeyというKEYにhogeというVALUEを与えています。

/bin/bashもコマンドです

ご存知の方が多いと思いますが、/bin/bashbashというshellを呼び出すコマンドです。docker-compose exec (service名) /bin/bashとは、サービス内のbashを呼び出しているので、サービス内に侵入できているわけです。