ゆるい感じのプログラムを書きたい。

プログラムの敷居を下げて、多くの人が開発出来るように色々書いていきます!

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について

version: '3'

1-2.serviceについて

  • 以下の指定はサービスの定義を示します。
  • サービスの定義とは、そのサービスを起動する各コンテナーに適用される設定を行うことです
service:

1-3.service名について

  • 起動するコンテナのサービス名の定義を示します。
  • サービス名はコンテナにあった自由なサービス名を定義することが可能
app:

1-4.imageについて

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」起動してコンテナに入ることも可能です。

docker-compose execについて

#サービス名「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:以下の様に双方利用用途が異なります。 f:id:kassans:20200511002521p:plain


  • 図2:フォアグラウンドのメリットとデメリットは以下の通り。
    f:id:kassans:20200511002547p:plain
    dockerフォアグラウンドとデタッチの違いについて2


  • 図3:デタッチ(バックグラウンド起動)のメリットとデメリットは以下の通り。
    f:id:kassans:20200511002626p:plain
    dockerフォアグラウンドとデタッチの違いについて3


  • 図4:デタッチ(バックグラウンド起動)時のアプリケーション常時起動の解決方法その1
    f:id:kassans:20200511002645p:plain
    dockerフォアグラウンドとデタッチの違いについて4


  • 図5:デタッチ(バックグラウンド起動)時のアプリケーション常時起動の解決方法その2
    f:id:kassans:20200511002703p:plain
    dockerフォアグラウンドとデタッチの違いについて5


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 ドキュメント

dockerコンテナにファイルを転送する

Compose file version3のリファレンス - Qiita

docker-compose の ports 指定まとめ - Qiita

Docker 上の nginx で Mattermost と Knowledge と Joomla をリバースプロキシさせてみた Ver.1 - Qiita

docker-compose コマンドまとめ - Qiita

docker-composeコマンド - Qiita

docker-compose up とか build とか start とかの違いを理解できていなかったのでまとめてみた。 - Qiita

dockerfileとdocker-compose.ymlのファイル名を変える方法 - Qiita

デタッチモードについて

デタッチドまたはフォアグラウンドについて

postgres環境の動作確認その1 - Qiita

postgres環境の動作確認その2 | Crudzoo