Dockerセットアップ 第4弾
DockerComposeのymlファイル作成と起動
1.docker-knowledgeのymlファイルを作成
- 以下のShellファイルを作成
version: '3' #swarm-mode対応http://docs.docker.jp/engine/swarm/index.html services: app: image: koda/docker-knowledge:latest #コンテナ名を明示的に指定する container_name: docker-knowledge volumes: - /home/nomura_r_104/knowledge:/root/.knowledge - /usr/local/etc/knowledge/webapps:/usr/local/tomcat/webapps ports: - 8080:8080 restart: always tty: true #dbが起動してからappが起動する. depends_on: - db proxy: image: nginx:latest #コンテナ名を明示的に指定する container_name: reverse-proxy volumes: - /usr/local/etc/knowledge/html:/usr/share/nginx/html - /usr/local/etc/knowledge/nginx/conf.d/:/etc/nginx/conf.d ports: - 80:80 restart: always tty: true db: image: postgres:latest #コンテナ名を明示的に指定する container_name: postgres #コンテナの環境変数を追加する。 #build オプションと合わせて指定すると、build中は enviroment で指定した #環境変数は見えないことに注意。 #build に変数を渡す場合は args オプションで指定する。 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=admin123 - POSTGRES_DB=docker_knowledge volumes: - /usr/local/etc/knowledge/postgres/data:/var/lib/postgresql/data restart: always tty: true
1-1.versionについて
- 以下の指定は
docker-compose
のファイルバージョンを指定している docker-composeファイルバージョン3-リファレンスはこちら
version: '3'
1-2.serviceについて
- 以下の指定は
サービスの定義
を示します。 - サービスの定義とは、そのサービスを起動する各コンテナーに適用される設定を行うことです
service:
1-3.service名について
- 起動するコンテナのサービス名の定義を示します。
- サービス名はコンテナにあった自由なサービス名を定義することが可能
app:
1-4.imageについて
- dockerのイメージファイルの定義を示します。
- [イメージ名]:[バージョン]を記載します。
- Dockerのイメージ一覧はこちら
image: koda/docker-knowledge:latest
1-5.container_nameについて
- コンテナの名前の定義を示します。
container_name: docker-knowledge
1-6.container_nameについて
- コンテナの名前の定義を示します。
container_name: docker-knowledge
1-7.volumesについて
データを永続化できる場所の定義を示します。
コンテナ内部にデータ(ファイル)を保存しても、コンテナ破棄すると消えてしまう。
- データを永続化したいときは、コンテナの外にデータを置く必要がある。
- その場所のことを、ボリュームと呼ぶ。
記述方法1
[マウントするホストサーバ側のフォルダを指定]:[コンテナのマウントするフォルダを指定]
volumes: - /home/nomura_r_104/knowledge:/root/.knowledge - /usr/local/etc/knowledge/webapps:/usr/local/tomcat/webapps
記述方法2(コンテナ名指定も可能)
- 指定したコンテナ名がマウントしているボリュームを同じマウントポイントで共有できる。
volumes-from: <Container Name> #例:上記の「volumes」のマウントポイントを共有 #volumes: # - /home/nomura_r_104/knowledge:/root/.knowledge # - /usr/local/etc/knowledge/webapps:/usr/local/tomcat/webapps
1-8.portsについて
- ホストのポートとコンテナのポートをマッピングしてforwardingを行います。
記述方法
[ホストのポート番号を指定]:[コンテナのポート番号を指定]
- 以下の記載も可能 [ホストのIPを指定]:[ホストのポート番号を指定]:[コンテナのポート番号を指定]
ports: - 8080:8080
- 注意事項
- HOST:CONTAINER形式でポートをマッピングする場合、60未満のコンテナポートを使用すると、YAMLがxx:yyの形式の数値を60進数の値として解析するため、誤った結果が生じる可能性があります。このため、ポートマッピングを常に文字列として明示的に指定することをお勧めします。
1-9.restartについて
- 再起動ポリシーの定義を示します。
- 再起動ポリシーとは、コンテナが終了時に再起動すべきかどうかを定義します。
restart: always
ポリシー | 結果 |
---|---|
no (なし) | コンテナが終了しても、自動的には再起動しません。これがデフォルトです。 |
on-failure [:最大リトライ数] | コンテナが 0 以外の終了コードで停止したら再起動します。オプションで Docker デーモンが何度再起動を試みるかを指定できます。 |
always (常に) | コンテナの終了コードに拘わらず、常にコンテナの再起動を試みます。Docker デーモンは無制限に再起動を試みます。また、デーモンの起動時にも、コンテナの状況に拘わらず常に起動を試みます。 |
unless-stopped (停止していない場合) | コンテナの終了コードに拘わらず、常にコンテナの再起動を試みます。しかし、直近のコンテナが停止状態であったのであれば、デーモンの起動時にコンテナを開始しません。 |
1-10.ttyについて
- コンテナの起動維持の設定を示します。
- コンテナに疑似TTY(標準出力の接続先デバイス)を割り当てる
- tty:trueと書くと常時起動が可能となる。
tty: true
- tty
- 標準出力の接続先デバイス
1-11.depends_onについて
- サービスの起動順番を示します。
- サービスの起動順番を制御
- Compose は常に依存関係に従ってコンテナを起動しようとします。
- 依存関係とは、
depends_on
,links
,volumes_form
,network_mode:
,サービス:...
を指定している場合です。
depends_on: - db
1-12.environmentについて
- コンテナの環境変数を追加する。
- build オプションと合わせて指定すると、build中は enviroment で指定した環境変数は見えないことに注意。
- buildに変数を渡す場合は args オプションで指定する。
environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=admin123 - POSTGRES_DB=docker_knowledge
/usr/local/tomcat/webapps/ROOT.war -> knowledge.war
2.docker-composeの起動
- 以下のコマンドでdocker-composeを起動させる。
docker-compose -f [ymlファイル名] up -d
2-1.-f
について
-f
を利用してyml指定してコンテナ起動を行うことが出来る。
docker-compose -f [ymlファイル名]
2-2.up
について
up
を指定するとコンテナの構築・起動まで行います。- キャッシュがある場合はそれを使って一発でイメージの構築から、コンテナの構築・起動までします。
- imageがなくてもbuildから実行してくれます。
docker-compose -f [ymlファイル名] up
- 注意
- 新しいサービスを初めて立ち上げる場合はもちろんキャッシュはないので docker-compose up --build コマンドを利用する
2-3.-d
について
- デタッチモード(分離するという意味)
- -dをつけることでバックグラウンドで実行することができます。
- コンテナ内に入らず、バックグラウンドでコンテナを動作させる。
docker-compose -f [ymlファイル名] up -d
- 補足説明
- 一般的には docker-compose up が使われるでしょう。 up を使うと docker-compose.yml ファイル中で定義したサービスの開始または再起動を行います。デフォルトは「アタッチド」モードであり、全てのコンテナのログが画面上に表示されます。「デタッチド」モード( -d )では、Compose はコンテナを実行すると終了しますが、コンテナは後ろで動き続けます。
3.docker-composeの停止
- 以下のコマンドでdocker-composeを停止させる。
docker-compose -f [ymlファイル名] stop
3-1.stop
について
stop
を指定するとコンテナの起動停止を行います。
docker-compose -f [ymlファイル名] stop
4.docker-composeのその他コマンドについて
- docker-composeのコマンドは多く代表的なものを記載
4-1.start
について
start
を指定するとコンテナの起動を行います。- サービスを開始します。これは既にコンテナがある状態でなければなりません。
docker-compose -f [ymlファイル名] start
4-2.ps
について
ps
を指定するとdokcer-composeのサービス名の一覧を表示します。起動を行います。
docker-compose ps
4-3.exec
について
- サービスに対する任意のコマンドを実行することができます。
- 以下の様に「bash」起動してコンテナに入ることも可能です。
#サービス名「db」を指定しpostgresのコンテナに入ります。 docker-compose -f [ymlファイル名] exec db bash
- docker -compose exec
- コマンドはデフォルトでは TTY が割り当てられます。なので、「docker exec -it [docker name] bash)」みたに「-it」を指定する必要がない
- bash起動
- 「bash」起動させることで、通常のOSと同じ様にシェルコマンド(ls,cd,mv,cpなど)でコンテナ内を操作できる。
- dockerの場合
- 「docker exec -it [docker name] bash」を指定します。
フォアグラウンドとデタッチの違いについて
- 図1:以下の様に双方利用用途が異なります。
- 図2:フォアグラウンドのメリットとデメリットは以下の通り。
- 図3:デタッチ(バックグラウンド起動)のメリットとデメリットは以下の通り。
- 図4:デタッチ(バックグラウンド起動)時のアプリケーション常時起動の解決方法その1
- 図5:デタッチ(バックグラウンド起動)時のアプリケーション常時起動の解決方法その2
DockerComposeの起動時にエラーが発生した場合の対処方法
DockerComposeの起動時エラー
- DockerComposeの起動コマンドを実行した際に
下記のエラーが発生
した際の対処方法
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running? If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
エラーの対処方法
- 原因としてアカウント権限の
dockerグループが存在しない
と発生する。 - 対象方法として、以下のように
新規でdockerグループを作成
し、それに対して実行するアカウント
をグループに所属
させると解消する。
# dockerグループがなければ作る sudo groupadd docker # 現行ユーザをdockerグループに所属させる sudo gpasswd -a $USER docker # dockerデーモンを再起動する (CentOS7の場合) sudo systemctl restart docker # exitして再ログインすると反映される。 exit
参考サイト
Docker、ボリューム(Volume)について真面目に調べた - Qiita
Docker の Data Volume まわりを整理する - Qiita
よくある質問と回答 — Docker-docs-ja 17.06.Beta ドキュメント
Compose file version3のリファレンス - Qiita
docker-compose の ports 指定まとめ - Qiita
Docker 上の nginx で Mattermost と Knowledge と Joomla をリバースプロキシさせてみた Ver.1 - Qiita
docker-compose コマンドまとめ - Qiita
docker-compose up
とか build
とか start
とかの違いを理解できていなかったのでまとめてみた。 - Qiita