Docker compose まとめ

わかりやすい

knowledge.sakura.ad.jp

docker-composeとdockerの違いについて

docker-composeとは複数の環境をまとめて作るときに使う

マイクロサービス という事

docker-compose.yml ファイルに記載する

記載例

//version: 3と記載するのがポイント
version: '3'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis

//redis(NoSQL)のDBと一緒に利用することがわかる
  redis:
    image: redis
volumes:
  logvolume01: {}

もし docker-comoseで記載しないと、 docker run で2つ起動して上げれば良い

これは WordPress の例

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
docker run --name some-wordpress -e WORDPRESS_DB_PASSWORD=my-secret-pw --link some-mysql:mysql -d -p 8080:80 wordpress

docker runはこのように書く optionイメージ を指定する必要がある。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

imageの一覧は

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              latest              efdecc2e377a        2 weeks ago         933MB
mariadb             latest              1f9cfa8dc305        3 weeks ago         356MB
voting-app          latest              f8d9398120d6        2 months ago        74.7MB
<none>              <none>              fde4aa84a5d5        2 months ago        951MB
redis               latest              dcf9ec9265e0        2 months ago        98.2MB

ということは mariadbをrunしたいときは

--name はイメージに自分の名前をつけた わかり易い名前が推奨されている

docker run --name my_mariadb mariadb

しかしエラー

 You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

パスワードをセットしなさいと言われる

docker run --name my_mariadb mariadb -e MYSQL_ROOT_PASSWORD=xxxxxx -d mariadb:3.1

しかしエラー 同じ名前のコンテナがあるよ。削除するかリネームしなさいと言われる Conflict. The container name "/my_mariadb" is already in use by container "36d38d69c7a7bf803a27916aca45f458d531e1a4a14770416343df330ff295c8". You have to remove (or rename) that container to be able to reuse that name.

コンテナ削除する まずはdockerのコンテナの確認

$ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
36d38d69c7a7        mariadb             "docker-entrypoint.s…"   12 minutes ago      Exited (1) 12 minutes ago                       my_mariadb
3b70100d7faa        python:3.7.3        "/bin/bash"              29 hours ago        Exited (127) 29 hours ago                       suspicious_cerf
298c4e99003e        python:3.7.3        "python3"                29 hours ago        Exited (0) 29 hours ago                         objective_golick
1ad46aeb98e1        34a                 "python3"                29 hours ago        Exited (0) 29 hours ago                         strange_haslett
e61049880c06        python:3.7.3        "/bin/bash"              30 hours ago        Exited (0) 29 hours ago                         optimistic_brown
52051b32155e        python              "-i -t python:3.7.3 …"   30 hours ago        Created    

このID 36d.....を削除したい

docker rm 36d

これでなくなったので再度挑戦

エラー 基本に戻り dockerの本のチュートリアルをする

dockerを起動 名前はwebserver デーモンで ポートはホストが80 コンテナのポートは80 webserber はeNginX
$ docker run --name webserver -d -p 80:80 nginx

エラー docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:80: bind: address already in use.

調べてみると -p オプションの左側がホストのポート 右側がコンテナのポート(ローカルPCで接続するところ)らしい

でもって、Nginxのコンテナ側のポートを変更する。

エラー コンテナのwebserverという名前は使われているらしい docker: Error response from daemon: Conflict. The container name "/webserver" is already in use by container "08cb6a6c8097d57d955fa664d7e979efd6ce1f72507888e4131fdfd99520121b". You have to remove (or rename) that container to be able to reuse that name.

確認してみる コンテナはps -a で確認できる

$ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
08cb6a6c8097        nginx               "nginx -g 'daemon of…"   10 minutes ago      Created                                         webserver
8f01129608e1        mariadb             "docker-entrypoint.s…"   32 minutes ago      Exited (1) 32 minutes ago                       my_mariadb
3b70100d7faa        python:3.7.3   

あった、ということは container runは一発でコマンドを決めないと行けないらしい buildはしなくてよいのか?という疑問がのこる また run と container runの違いは?

調べたら同じだった。 dockerのバージョンによって、同じものになったようだ
現在では docker run を利用する

公式サイトの日本語訳ドキュメント

docs.docker.jp

このあたりが難しいところ 削除して// id は 08c

$ docker rm 08c

これで成功

$ docker run --name webserver -d -p 8080:8080 nginx

プロセスが動いているか確認 -d でデーモンオプションをつけたので、動いているので、確認できるはず

$ docker ps

動いていた!

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
6108bcbd3f4a        nginx               "nginx -g 'daemon of…"   28 seconds ago      Up 27 seconds       80/tcp, 0.0.0.0:8080->8080/tcp   webserver

docker stats

詳細を確認 statsと打たないといけない 

$ docker stats webserver

stats — Docker-docs-ja 19.03 ドキュメント

CTR + C で抜けれる

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
6108bcbd3f4a        webserver           0.00%               1.93MiB / 1.943GiB   0.10%               1.05kB / 0B         8.19kB / 0B         2

プロセスの停止

docker stop webserver

コンテナを再度削除して作り直す 成功!

$ docker run --name webserver -d -p 80:80 nginx

localhost:80でnginxが表示される

f:id:happy_teeth_ago:20200221010937p:plain 原因はMAMPが動いていたから

詳細はinspectで確認できる mariadbのバージョンが知りたかったので助かった。

docker image inspect mariadb

 "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.10",
                "GPG_KEYS=177F4010FE56CA3336300305F1656F24C74CD1D8",
                "MARIADB_MAJOR=10.4",