2021年1月17日日曜日

Docker Composeを使ってみた

 設計のセオリー(ベストプラクティス、ロールモデル、セオリー) 

コンテナ部分の意識する設計 

  • デプロイに必要な「設定情報」 

  • ドラブル時の調査に必要な「ロギング」 

  • 正常なサービス継続や内部状態を知るための「監視」 

 

コンテナ設計ガイドライン 

 

設定情報の管理方法(クラウドベンダによる設定情報の外部管理サービス) 

  • AWS System Manager Parameter Store 

  • AWS Secrets Manager 

  • Google Cloud Secret Manager 

 

監視 

  • アプリケーションの起動確認 

  • Mackerelなどの監視SaaSからの外形監視 

  • Application Load Balancerなどからのヘルスチェック 

  • コンテナオーケストレーションによるコンテナ制御 

 

Docker Compose・・複数のコンテナ環境を一括管理する。 

試しに使ってみた。 

 

Docker-Composeのバージョン 

  • V1・・ネットワークやボリュームに非対応 

  • V2・・↑に対応 

  • V3・・Swarmモードを使わない、dockerstakによるオーケストレーションに対応 

 

Awesame Compose(asesameオーサム、素晴らしい、最高、すごい) 

Docker Composeの素晴らしいサンプル集 

asp.net+MySQLを見たがたいした情報は得られなかった。 

 

Docker Compose vs Swarmモード・・最近は差が少なくなってきている。 

Swarmモード vs Kubernetes・・K8Sは、複数のネットワーク空間を分離でき、数百台以上のノードを扱えるより大規模に向いている。 

 

Volumesの書式とデータ永続化の方法 

書式 

データの永続化の方法 

 

ホストディレクトリ:コンテナディレクトリ 

バインドマウント 

/ops/data:/var/lib/mysql 

データボリューム名:コンテナディレクトリ 

名前付きボリューム 

mysql_data:/var/lib/mysql 

コンテナディレクトリ 

匿名ボリューム 

/var/lib/mysql 

 

 

 

 

 

有益な情報 

docker runコマンドに-eオプションで環境変数を渡す 

docker run -it --name container-design-app -e MAIN_DB_HOST=db.example.privaete -e MAIN_DB_PORT=3306 -e MAIN_DB_NAME=sample_db -e MAIN_DB_PASSWORD=sample_password -d container-design-app:latest 

動作するアプリケーションには、GitのCommit Hashを渡す。 

 

 

実際にやってみた 

 

Windows PowerShell 

Copyright (C) Microsoft Corporation. All rights reserved. 

 

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6 

 

PS C:\Users\kiyotaka> docker-compose version 

docker-compose version 1.27.4, build 40524192 

docker-py version: 4.3.1 

CPython version: 3.7.4 

OpenSSL version: OpenSSL 1.1.1c  28 May 2019 

PS C:\Users\kiyotaka> docker version 

Client: Docker Engine - Community 

 Cloud integration: 1.0.4 

 Version:           20.10.2 

 API version:       1.41 

 Go version:        go1.13.15 

 Git commit:        2291f61 

 Built:             Mon Dec 28 16:14:16 2020 

 OS/Arch:           windows/amd64 

 Context:           default 

 Experimental:      true 

 

Server: Docker Engine - Community 

 Engine: 

  Version:          20.10.2 

  API version:      1.41 (minimum version 1.12) 

  Go version:       go1.13.15 

  Git commit:       8891c58 

  Built:            Mon Dec 28 16:15:23 2020 

  OS/Arch:          linux/amd64 

  Experimental:     false 

 containerd: 

  Version:          v1.4.3 

  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b 

 runc: 

  Version:          1.0.0-rc92 

  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff 

 docker-init: 

  Version:          0.19.0 

  GitCommit:        de40ad0 

 

PS C:\dev\sample_gomi> cd .\20210117_DockerWordPressMySQL\ 

PS C:\dev\sample_gomi\20210117_DockerWordPressMySQL> ls 

 

 

    ディレクトリ: C:\dev\sample_gomi\20210117_DockerWordPressMySQL 

 

 

Mode                 LastWriteTime         Length Name 

----                 -------------         ------ ---- 

-a----        2021/01/17     12:13            691 docker-compose.yml 

 

 

PS C:\dev\sample_gomi\20210117_DockerWordPressMySQL> docker-compose up -d 

Creating network "20210117_dockerwordpressmysql_default" with the default driver 

Creating volume "20210117_dockerwordpressmysql_wordpress_data" with default driver 

Creating volume "20210117_dockerwordpressmysql_db_data" with default driver 

Pulling db (mysql:5.7)... 

5.7: Pulling from library/mysql 

a076a628af6f: Pull complete 

f6c208f3f991: Pull complete 

88a9455a9165: Pull complete 

406c9b8427c6: Pull complete 

7c88599c0b25: Pull complete 

25b5c6debdaf: Pull complete 

43a5816f1617: Pull complete 

7065aaa2655f: Pull complete 

b4bc531db40f: Pull complete 

8c3e9d7c9815: Pull complete 

fadfb9734ed2: Pull complete 

Digest: sha256:e08834258fcc0efd01df358222333919df53d4a0d9b2a54da05b204b822e3b7b 

Status: Downloaded newer image for mysql:5.7 

Pulling wordpress (wordpress:latest)... 

latest: Pulling from library/wordpress 

a076a628af6f: Already exists 

02bab8795938: Pull complete 

657d9d2c68b9: Pull complete 

f47b5ee58e91: Pull complete 

2b62153f094c: Pull complete 

60b09083723b: Pull complete 

1701d4d0a478: Pull complete 

bae0c4dc63ea: Pull complete 

a1c05958a901: Pull complete 

5964d339be93: Pull complete 

17c19430ed9f: Pull complete 

1c16920b970c: Pull complete 

1fab8f583d66: Pull complete 

473b1e99afb3: Pull complete 

7319f9ced717: Pull complete 

0fde4d7f1f2c: Pull complete 

b8ec91c53cb2: Pull complete 

c157b7dc82cb: Pull complete 

ffcbbf85de97: Pull complete 

426d16d4eb4f: Pull complete 

Digest: sha256:2d5f306e039a637bd86d9d1cfc1b465c987898e2784e4279754b9d3c2737121b 

Status: Downloaded newer image for wordpress:latest 

Creating 20210117_dockerwordpressmysql_db_1 ... done 

Creating 20210117_dockerwordpressmysql_wordpress_1 ... done 

PS C:\dev\sample_gomi\20210117_DockerWordPressMySQL> docker-compose ps 

                  Name                                 Command               State          Ports 

--------------------------------------------------------------------------------------------------------- 

20210117_dockerwordpressmysql_db_1          docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp 

20210117_dockerwordpressmysql_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8080->80/tcp 

PS C:\dev\sample_gomi\20210117_DockerWordPressMySQL> docker-compose logs -f --tail 10 

Attaching to 20210117_dockerwordpressmysql_wordpress_1, 20210117_dockerwordpressmysql_db_1 

db_1         | 2021-01-17T03:16:36.953753Z 0 [Warning] CA certificate ca.pem is self signed. 

db_1         | 2021-01-17T03:16:36.953848Z 0 [Note] Skipping generation of RSA key pair as key files are present in data directory. 

db_1         | 2021-01-17T03:16:36.954749Z 0 [Note] Server hostname (bind-address): '*'; port: 3306 

db_1         | 2021-01-17T03:16:36.955885Z 0 [Note] IPv6 is available. 

db_1         | 2021-01-17T03:16:36.956025Z 0 [Note]   - '::' resolves to '::'; 

db_1         | 2021-01-17T03:16:36.956080Z 0 [Note] Server socket created on IP: '::'. 

db_1         | 2021-01-17T03:16:36.962765Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. 

db_1         | 2021-01-17T03:16:36.978063Z 0 [Note] Event Scheduler: Loaded 0 events 

db_1         | 2021-01-17T03:16:36.978625Z 0 [Note] mysqld: ready for connections. 

db_1         | Version: '5.7.32'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL) 

wordpress_1  | 

wordpress_1  | MySQL Connection Error: (2002) Connection refused 

wordpress_1  | 

wordpress_1  | MySQL Connection Error: (2002) Connection refused 

wordpress_1  | 

wordpress_1  | MySQL Connection Error: (2002) Connection refused 

wordpress_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message 

wordpress_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message 

wordpress_1  | [Sun Jan 17 03:16:38.725211 2021] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.4.14 configured -- resuming normal operations 

wordpress_1  | [Sun Jan 17 03:16:38.725378 2021] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND' 

ERROR: Aborting. 

PS C:\dev\sample_gomi\20210117_DockerWordPressMySQL> docker network ls 

NETWORK ID     NAME                                    DRIVER    SCOPE 

3a2e2da02f30   20210117_dockerwordpressmysql_default   bridge    local 

5a1461676fb7   bridge                                  bridge    local 

03206456c01a   host                                    host      local 

b1cd822f350c   none                                    null      local 

PS C:\dev\sample_gomi\20210117_DockerWordPressMySQL> docker volume ls 

DRIVER    VOLUME NAME 

local     20210117_dockerwordpressmysql_db_data 

local     20210117_dockerwordpressmysql_wordpress_data 

local     96778665e1140bb21c2b90510009db9f54dd2b495a8f7728a1bf15b638959f42 

local     myvol 

PS C:\dev\sample_gomi\20210117_DockerWordPressMySQL> docker-compose down -v  ・・・-vボリューム削除 

Stopping 20210117_dockerwordpressmysql_wordpress_1 ... done 

Stopping 20210117_dockerwordpressmysql_db_1        ... done 

Removing 20210117_dockerwordpressmysql_wordpress_1 ... done 

Removing 20210117_dockerwordpressmysql_db_1        ... done 

Removing network 20210117_dockerwordpressmysql_default 

Removing volume 20210117_dockerwordpressmysql_wordpress_data 

Removing volume 20210117_dockerwordpressmysql_db_data 

PS C:\dev\sample_gomi\20210117_DockerWordPressMySQL> 

 

 

 

 

ついでに.NET Core+MySQLもやってみた。 

 

初回の起動について 

 

PS C:\dev\sample_gomi\20210117_DockerASP.NETMySQL> docker-compose up -d 

Creating network "20210117_dockeraspnetmysql_default" with the default driver 

Building web 

Step 1/12 : FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build 

2.1: Pulling from dotnet/core/sdk 

2587235a7635: Pull complete 

953fe5c215cb: Pull complete 

d4d3f270c7de: Pull complete 

ed36dafe30e3: Pull complete 

cbd152e08112: Pull complete 

a3b01e7d05dc: Pull complete 

d44dabb4b917: Pull complete 

Digest: sha256:8bb207493e4e79ad5a7ed5f3c834f4792d6013100f89889126344c3543d98584 

Status: Downloaded newer image for mcr.microsoft.com/dotnet/core/sdk:2.1 

 ---> 69d571ddbbec 

Step 2/12 : WORKDIR /app 

 ---> Running in ad9a7a3e3512 

Removing intermediate container ad9a7a3e3512 

 ---> 923165acf1f5 

Step 3/12 : COPY *.sln . 

 ---> aadeede3665c 

Step 4/12 : COPY aspnetapp/*.csproj ./aspnetapp/ 

 ---> 13ecdf0949a4 

Step 5/12 : RUN dotnet restore 

 ---> Running in 42c13f96b94c 

  Restore completed in 4.36 sec for /app/aspnetapp/aspnetapp.csproj. 

Removing intermediate container 42c13f96b94c 

 ---> b2103339448e 

Step 6/12 : COPY aspnetapp/. ./aspnetapp/ 

 ---> e53a42255f60 

Step 7/12 : WORKDIR /app/aspnetapp 

 ---> Running in 47f93b0550ac 

Removing intermediate container 47f93b0550ac 

 ---> 5fc479eb8541 

Step 8/12 : RUN dotnet publish -c Release -o out 

 ---> Running in 5700de775d46 

Microsoft (R) Build Engine version 16.2.37902+b5aaefc9f for .NET Core 

Copyright (C) Microsoft Corporation. All rights reserved. 

 

  Restore completed in 138.68 ms for /app/aspnetapp/aspnetapp.csproj. 

  aspnetapp -> /app/aspnetapp/bin/Release/netcoreapp2.1/aspnetapp.dll 

  aspnetapp -> /app/aspnetapp/bin/Release/netcoreapp2.1/aspnetapp.Views.dll 

  aspnetapp -> /app/aspnetapp/out/ 

Removing intermediate container 5700de775d46 

 ---> f2c2760f0d70 

 

Step 9/12 : FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS runtime 

2.1: Pulling from dotnet/core/aspnet 

8aff230071c9: Pull complete 

bf20f79c691a: Pull complete 

26c37aa54a58: Pull complete 

1be7d4556892: Pull complete 

Digest: sha256:c6abe7059b096c890700ae3a31f4452dc27ee4135c82040ec14ecfc233a35d7b 

Status: Downloaded newer image for mcr.microsoft.com/dotnet/core/aspnet:2.1 

 ---> 7685a653f837 

Step 10/12 : WORKDIR /app 

 ---> Running in d4870ed5cb53 

Removing intermediate container d4870ed5cb53 

 ---> 7db49484834a 

Step 11/12 : COPY --from=build /app/aspnetapp/out ./ 

 ---> a6a04b382155 

Step 12/12 : ENTRYPOINT ["dotnet", "aspnetapp.dll"] 

 ---> Running in da90c40031cc 

Removing intermediate container da90c40031cc 

 ---> 78ff25732e44 

 

Successfully built 78ff25732e44 

Successfully tagged 20210117_dockeraspnetmysql_web:latest 

WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. 

Pulling db (microsoft/mssql-server-linux:)... 

latest: Pulling from microsoft/mssql-server-linux 

59ab41dd721a: Pull complete 

57da90bec92c: Pull complete 

06fe57530625: Pull complete 

5a6315cba1ff: Pull complete 

739f58768b3f: Pull complete 

0b751601bca3: Pull complete 

bcf04a22644a: Pull complete 

6b5009e4f470: Pull complete 

a9dca2f6722a: Pull complete 

Digest: sha256:9b700672670bb3db4b212e8aef841ca79eb2fce7d5975a5ce35b7129a9b90ec0 

Status: Downloaded newer image for microsoft/mssql-server-linux:latest 

Creating 20210117_dockeraspnetmysql_web_1 ... done 

Creating 20210117_dockeraspnetmysql_db_1  ... done 

 

 

アプリの入れ替えについて 

 

PS C:\dev\sample_gomi\20210117_DockerASP.NETMySQL> docker-compose build 

db uses an image, skipping 

Building web 

Step 1/12 : FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build 

 ---> 69d571ddbbec 

Step 2/12 : WORKDIR /app 

 ---> Using cache 

 ---> 923165acf1f5 

Step 3/12 : COPY *.sln . 

 ---> Using cache 

 ---> aadeede3665c 

Step 4/12 : COPY aspnetapp/*.csproj ./aspnetapp/ 

 ---> Using cache 

 ---> 13ecdf0949a4 

Step 5/12 : RUN dotnet restore 

 ---> Using cache 

 ---> b2103339448e 

Step 6/12 : COPY aspnetapp/. ./aspnetapp/ 

 ---> 44bfdf470986 

Step 7/12 : WORKDIR /app/aspnetapp 

 ---> Running in 8c5cec9ef958 

Removing intermediate container 8c5cec9ef958 

 ---> b78ce01684f4 

Step 8/12 : RUN dotnet publish -c Release -o out 

 ---> Running in c5449475307b 

Microsoft (R) Build Engine version 16.2.37902+b5aaefc9f for .NET Core 

Copyright (C) Microsoft Corporation. All rights reserved. 

 

  Restore completed in 3.2 sec for /app/aspnetapp/aspnetapp.csproj. 

  aspnetapp -> /app/aspnetapp/bin/Release/netcoreapp2.1/aspnetapp.dll 

  aspnetapp -> /app/aspnetapp/bin/Release/netcoreapp2.1/aspnetapp.Views.dll 

  aspnetapp -> /app/aspnetapp/out/ 

Removing intermediate container c5449475307b 

 ---> 561dd4511eac 

 

Step 9/12 : FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS runtime 

 ---> 7685a653f837 

Step 10/12 : WORKDIR /app 

 ---> Using cache 

 ---> 7db49484834a 

Step 11/12 : COPY --from=build /app/aspnetapp/out ./ 

 ---> 0ed89799623d 

Step 12/12 : ENTRYPOINT ["dotnet", "aspnetapp.dll"] 

 ---> Running in f84f899bdf2f 

Removing intermediate container f84f899bdf2f 

 ---> 1420a6a3101e 

 

Successfully built 1420a6a3101e 

Successfully tagged 20210117_dockeraspnetmysql_web:latest 

PS C:\dev\sample_gomi\20210117_DockerASP.NETMySQL> docker-compose down 

Stopping 20210117_dockeraspnetmysql_web_1 ... done 

Stopping 20210117_dockeraspnetmysql_db_1  ... done 

Removing 20210117_dockeraspnetmysql_web_1 ... done 

Removing 20210117_dockeraspnetmysql_db_1  ... done 

Removing network 20210117_dockeraspnetmysql_default 

PS C:\dev\sample_gomi\20210117_DockerASP.NETMySQL> docker-compose up -d 

Creating network "20210117_dockeraspnetmysql_default" with the default driver 

Creating 20210117_dockeraspnetmysql_web_1 ... done 

Creating 20210117_dockeraspnetmysql_db_1  ... done 

PS C:\dev\sample_gomi\20210117_DockerASP.NETMySQL> 

 

 

 

 

↓ソースを変更してHogeHogeを追加。