業務でdocker-composeを使うことになった人のためのマニュアル。

公開:2020/09/29
更新:2020/10/01
5 min読了の目安(約4500字TECH技術記事

いろんな会社でdockerが使われてきている昨今、なんとなく使ってる人も多いかと思います。
そこで、自分が業務などで利用しているコマンドや説明を書こうと思います。

私のレベルは本番ではdockerを使ってサーバーを立ててる民ではないので、そこまで詳しくないことをご了承ください。

前提

  • dockerほんのちょっとだけ分かる
  • Docker Desktopをすでに入れている状態
  • ローカルで開発している環境をごにょごにょしたい向け

前提認識

コンテナとイメージの違いを理解してないとこのあとの話は把握しにくいかもしれません。
イメージはビルドされたもの(もしくはスナップショット)で、コンテナはイメージを動かしているインスタンスと考えると良いでしょう。
イメージが消えない限りはコンテナを作るのは速いことを覚えておくと良いでしょう。

docker-composeって何よ

docker-composeは複数のdockerコンテナをまとめて管理することができるdockerのためのツールです。
これを使うことである程度dockerの知識が薄くてもいい感じに使うことが出来ます。(私もその一人)

アプリケーションを立ち上げたい

基本的にdocker-composeを使ってるプロジェクトでアプリケーションの各コンテナを立ち上げる場合、まずはdocker-compose.ymlがどこにあるかを確認します。
docker-compose.ymlがどこにあるかわかったら、そのディレクトリに移動してdocker-compose up -dで立ち上げることが出来ます。

$ docker-compose up -d

-dのオプションはデタッチド・モードと呼ばれ、バックグラウンド上でコンテナを立ち上げるモードです。これをつけてないとログがダラダラと流れ出します。

アプリケーションを落としたい

アプリケーションの各コンテナを落とすにはdocker-compose downを利用します。

$ docker-compose down

docker-compose stopというコマンドもありますが、こちらは立ち上げたコンテナを消さないで保持するコマンドです。こっちは基本的に使いません。

downの場合、立ち上げたコンテナを消してますがコンテナを消しているだけでイメージは消していません。基本的にイメージが消えない限りup -dのときにビルドは行われないので速度面なども気にする必要はありません。

ただ、ENTRYPOINTの内容が時間のかかる処理である場合のみstopを使うのは手ではあります。ENTRYPOINTに関してはコンテナを立ち上げる際に毎回呼び出されます。

アプリケーションを再起動したい

アプリケーションを再起動したい場合はrestartというコマンドが存在します。

$ docker-compose restart

restartはマウントしたサーバー設定などは更新されますが、コンテナ自体は更新されません。(Dockerfileが更新されていたとしてもそれは利用されない)
コンテナを更新したい場合は下のイメージが更新されたらを参照してください。

イメージが更新されたら

会社によっては専用のdockerイメージがある場合があります。
もしもdockerイメージが更新された場合、以下の手順で取り込むことが出来ます。

$ docker-compose down
$ docker-compose build --pull サービス名
$ docker-compose up -d

立ち上がっているコンテナの中に入りたいとき

立ち上がっているコンテナに入りたい場合はdocker-compose execを利用します。

$ docker-compose exec サービス名 コマンド
$ docker-compose exec php-fpm /bin/bash

立ち上がってるコンテナのログを確認したいとき

ログを確認したい場合はdocker-compose logsが利用できます。
基本的には--tailオプションを使って末尾から対象の行数だけ表示してtailして確認するのが一般的です。
ログを確認する方法は色々あって、ログをweb上で確認するためのdozzleというアプリケーションも存在します。

docker-compose logs --tail=5 必要であればサービス名

サービス名を書かなかった場合はdocker-composeにかかれているサービスすべてのログが流れます。

コンテナのアプリケーションからDBなどのサービスへ接続したいとき

コンテナ内のアプリケーションからDBなどのサービスに接続したい場合があると思います。
ipを頑張って指定する方法もありますが、これはコンテナが立ち上げ直されると変わってしまうためよくありません。
そういったときにはhost名の部分にサービス名を書きましょう。

例えば下に書いてあるdocker-compose.ymlの例で言うとhost名の部分にmysqlという文字列を設定することでアクセスすることが出来ます。

昔はサービスに対してlinksという項目を定義する必要がありましたが、現在は定義しなくとも自動的にアクセスすることが出来ます。

docker-compose.ymlについてもう少し知りたい

とりあえず、サンプルとしてdocker-compse.ymlを用意しました。
各場所にコメントを入れています。

version: "3" # 利用するdocker-compose.ymlのバージョン。バージョンによって書ける項目などが若干異なる
services: # 各サービスの定義
  nginx: # nginxという名前でサービスを定義、これがコンテナになる
    image: nginx:alpine # 取得してくるイメージ。ドメイン名が入ってない場合はDocker Hubのもの。/すら入ってない場合はdockerオフィシャルイメージ。
    volumes: # 共有ボリュームの設定
      - ./:/app # ホスト:コンテナ[:オプション]の順に記述する。
      - ./docker-assets/nginx/default.conf:/etc/nginx/conf.d/default.conf:cached
    ports: # ポートフォワーディングの設定
      - "8080:80" # 順番にホスト側:コンテナ側で書く
      
  php-fpm:
    build: ./docker-assets/php-fpm/ # buildが書かれている場合、ローカルにDockerfileが存在する。対象の場所にDockerfileというファイルがあるので見てみよう
    volumes:
      - ./:/app

  mysql:
    image: mysql:5.7 # :のあとに書かれているのは取得するタグ。イメージにタグが振られている。
    environment: # 環境変数。基本的にはビルド時に使われる。
      MYSQL_DATABASE: ${DB_DATABASE} # ${名前}と書いた場合、.envファイルを探しに行って対象のキーの値を割り当てる
      MYSQL_USER: user # もちろんそのまま文字列も指定できる
      MYSQL_PASSWORD: ${DB_PASSWORD:-passtext} # .envに書かれてなかった場合、passtextという文字列がセットされる
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    volumes:
      - db-data:/var/lib/mysql # ホストが下に定義されているvolumeの場合もある
volumes: # ボリュームの定義。コンテナが消えても保持しておきたいデータなどがある場合に定義する
  db-data: # db-dataというローカルボリュームを定義している

現在の主流のバージョンは2系または3系です。主に2系を使わなくてはいけない場合としてvolumes_fromでの記述がされている場合です。busybox等で共有を一括して書いているようなサービスがあると3系ではどちらのサービスにもvolumesの指定が必要でした。

メジャーバージョンのみ(3など)の記述で、マイナーバージョンを指定しない場合は3.0のように.0のバージョンになるので特定のバージョン以降で用意された項目を利用したい場合はマイナーバージョンまで指定しましょう。

その他の設定できる項目については公式をどうぞ。
https://docs.docker.com/compose/compose-file/

ローカルvolumeを消したいとき

まれにローカルボリュームを消したいときがあります。そんなときは-vオプションを利用しましょう。

$ docker-compose rm -v サービス名
サービス名を指定しなかったらdocker-compose.ymlに書かれているものすべて消えます

また、基本的にローカルボリュームはプロジェクト名_ボリューム名で作成されます。
なので、

$ docker volume ls

でボリューム一覧を確認して

$ docker volume rm プロジェクト名_ボリューム名

で削除することも可能です。

使用してないコンテナを削除したいとき

stopしているコンテナを削除してくれます。

$ docker container prune

使用してないvolumeを削除したいとき

docker container lsで紐付いてないvolumeをすべて削除できます。

$ docker volume prune

使用してないimageを削除したいとき

上記のvolumeを消したいやつと同じです。

$ docker image prune