docker-composeの起動・停止についてメモ書き。
概要
docker-composeにはいくつか起動・停止のオプションがある。
起動停止の要約は以下の通り。
起動/停止 | オプション | 説明 |
---|---|---|
起動 | start | コンテナ起動。 |
起動 | up | コンテナ作成→起動。 |
起動 | up –build | イメージビルド→コンテナ作成→起動。 |
停止 | stop | コンテナ停止。 |
停止 | down | コンテナ停止→コンテナ削除。 |
設定
PostgreSQL検証用のコンテナで確認。
設定ファイルは以下の通り。
- dockerfile
FROM postgres:13.9-alpine3.17
ENV LANG ja_JP.utf8
RUN apk update && apk add vim
- docker-compose.yaml
version: '3'
services:
db:
build: .
ports:
- 5433:5432
volumes:
- ./data:/var/lib/postgresql/data
environment:
POSTGRES_USER: testuser
POSTGRES_PASSWORD: testp@ssword
起動確認
イメージファイル無し
PostgreSQLのイメージファイルが無い状態で各起動コマンドを実行。
% docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql_mysqldb latest 3b546580ac85 3 days ago 790MB
- docker-compose start・・・×
コンテナが無いのでエラー。
% docker-compose start
Starting db ... failed
ERROR: No containers to start
ERROR: 1
- docker-compose up・・・△
ビルドしていないのでWARNINGが出るが、コンテナを起動できる。
ちなみに-dはデタッチするためのオプション。コンテナをバックグラウンドで実行する。
% docker-compose up -d
Creating network "postgresql_default" with the default driver
Building db
[+] Building 2.6s (7/7) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 122B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/postgres:13.9-alpine3.17 2.4s
=> [auth] library/postgres:pull token for registry-1.docker.io 0.0s
=> [1/2] FROM docker.io/library/postgres:13.9-alpine3.17@sha256:46e0328440ac2b9bb0e22cd07eba248a95f1e575256850a0ef98995891bb9af6 0.0s
=> CACHED [2/2] RUN apk update && apk add vim 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:6f6640a850ada8d04697f421f699cb5f91956105926e1d500ba516cc3526b92c 0.0s
=> => naming to docker.io/library/postgresql_db 0.0s
WARNING: Image for service db was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating postgresql_db_1 ... done
% docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql_mysqldb latest 3b546580ac85 3 days ago 790MB
postgresql_db latest 6f6640a850ad 6 days ago 266MB
% docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34de33402c12 postgresql_db "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp postgresql_db_1
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 3 days ago Up 3 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
- docker-compose up –build・・・○
正常起動。
イメージをビルドしていない初回実行時には–buildオプションを付ける。
% docker-compose up -d --build
Creating network "postgresql_default" with the default driver
Building db
[+] Building 5.4s (7/7) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 36B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/postgres:13.9-alpine3.17 5.3s
=> [auth] library/postgres:pull token for registry-1.docker.io 0.0s
=> [1/2] FROM docker.io/library/postgres:13.9-alpine3.17@sha256:46e0328440ac2b9bb0e22cd07eba248a95f1e575256850a0ef98995891bb9af6 0.0s
=> CACHED [2/2] RUN apk update && apk add vim 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:6f6640a850ada8d04697f421f699cb5f91956105926e1d500ba516cc3526b92c 0.0s
=> => naming to docker.io/library/postgresql_db 0.0s
Creating postgresql_db_1 ... done
% docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql_mysqldb latest 3b546580ac85 3 days ago 790MB
postgresql_db latest 6f6640a850ad 6 days ago 266MB
% docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
49044b08a02e postgresql_db "docker-entrypoint.s…" 29 seconds ago Up 25 seconds 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp postgresql_db_1
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 3 days ago Up 3 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
watanabekiyoshi@mac1 postgresql %
イメージファイル有り、コンテナ無し
PostgreSQLのイメージファイルが有る状態で各起動コマンドを実行。
watanabekiyoshi@mac1 postgresql % docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql_mysqldb latest 3b546580ac85 3 days ago 790MB
postgresql_db latest 6f6640a850ad 6 days ago 266MB
- docker-compose start・・・×
コンテナが無いのでエラー。
% docker-compose start
Starting db ... failed
ERROR: No containers to start
ERROR: 1
- docker-compose up・・・○
イメージファイルからコンテナを作成し起動。
docker-compose.ymlを更新し、コンテナを再作成する時に使用。
% docker-compose up -d
Creating network "postgresql_default" with the default driver
Creating postgresql_db_1 ... done
% docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a7e656ec368 postgresql_db "docker-entrypoint.s…" 23 seconds ago Up 19 seconds 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp postgresql_db_1
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 3 days ago Up 3 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
- docker-compose up –build・・・△
イメージの再ビルドを行う。
ただし、イメージ再構築時にdockerfileのキャッシュが残っていると変更が反映されない。そんな時は「docker-compose build –no-cache」でイメージを作り直す。余計な処理をしているので△。
% docker-compose up -d --build
Creating network "postgresql_default" with the default driver
Building db
[+] Building 5.2s (7/7) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 36B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/postgres:13.9-alpine3.17 5.0s
=> [auth] library/postgres:pull token for registry-1.docker.io 0.0s
=> [1/2] FROM docker.io/library/postgres:13.9-alpine3.17@sha256:46e0328440ac2b9bb0e22cd07eba248a95f1e575256850a0ef98995891bb9af6 0.0s
=> CACHED [2/2] RUN apk update && apk add vim 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:6f6640a850ada8d04697f421f699cb5f91956105926e1d500ba516cc3526b92c 0.0s
=> => naming to docker.io/library/postgresql_db 0.0s
Creating postgresql_db_1 ... done
% docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68c7fcadb75b postgresql_db "docker-entrypoint.s…" 15 seconds ago Up 11 seconds 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp postgresql_db_1
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 3 days ago Up 3 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
イメージファイル有り、コンテナ有り
PostgreSQLのイメージファイルとコンテナが有る状態で各起動コマンドを実行。
なお各コマンド実行時、コンテナは停止している。
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68c7fcadb75b postgresql_db "docker-entrypoint.s…" 9 minutes ago Exited (0) 17 seconds ago postgresql_db_1
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 3 days ago Up 3 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
- docker-compose start・・・○
コンテナ正常起動。
% docker-compose start
Starting db ... done
- docker-compose up・・・○
コンテナ正常起動。
コンテナを再作成しない。
% docker-compose up -d
Starting postgresql_db_1 ... done
- docker-compose up -d –build・・・△
コンテナ正常起動。
コンテナの「CREATED」が「9 hours ago」になっているのでキャッシュを使用している模様。
起動するだけなら余計な処理をしない方が良いので△。
% docker-compose up -d --build
Building db
[+] Building 5.4s (7/7) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 36B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/postgres:13.9-alpine3.17 5.3s
=> [auth] library/postgres:pull token for registry-1.docker.io 0.0s
=> [1/2] FROM docker.io/library/postgres:13.9-alpine3.17@sha256:46e0328440ac2b9bb0e22cd07eba248a95f1e575256850a0ef98995891bb9af6 0.0s
=> CACHED [2/2] RUN apk update && apk add vim 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:6f6640a850ada8d04697f421f699cb5f91956105926e1d500ba516cc3526b92c 0.0s
=> => naming to docker.io/library/postgresql_db 0.0s
Starting postgresql_db_1 ... done
% docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql_mysqldb latest 3b546580ac85 4 days ago 790MB
postgresql_db latest 6f6640a850ad 7 days ago 266MB
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68c7fcadb75b postgresql_db "docker-entrypoint.s…" 9 hours ago Up 31 seconds 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp postgresql_db_1
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 3 days ago Up 3 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
停止確認
- docker-compose stop
コンテナ停止。
コンテナを削除しない。
% docker-compose stop
Stopping postgresql_db_1 ... done
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55e44710e8bb postgresql_db "docker-entrypoint.s…" 17 seconds ago Exited (0) 8 seconds ago postgresql_db_1
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 4 days ago Up 4 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
docker-compose down
コンテナ停止。
コンテナを削除する。
% docker-compose down
Stopping postgresql_db_1 ... done
Removing postgresql_db_1 ... done
Removing network postgresql_default
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 4 days ago Up 4 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
おまけ
イメージファイル有り、コンテナ無しでコマンド実行
- docker-compose run
コンテナでコマンドを実行後、コンテナを停止。
% docker-compose run db ls /
Creating postgresql_db_run ... done
bin proc
dev root
docker-entrypoint-initdb.d run
etc sbin
home srv
lib sys
media tmp
mnt usr
opt var
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
945faf48cc96 postgresql_db "docker-entrypoint.s…" About a minute ago Exited (0) About a minute ago postgresql_db_run_4fc7e2cf8af0
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 4 days ago Up 4 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
コマンド実行後にコンテナを削除する場合は、–rmオプションを付ける。
コンテナを削除しないと溜まっていくので注意。
% docker-compose run --rm db ls /
Creating postgresql_db_run ... done
bin proc
dev root
docker-entrypoint-initdb.d run
etc sbin
home srv
lib sys
media tmp
mnt usr
opt var
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 4 days ago Up 4 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
起動中のコンテナでコマンド実行
- docker-compose exec
起動中のコンテナでコマンドを実行する場合はexecを使用。
コマンド実行後もコンテナは起動している。
% docker-compose up -d
Creating postgresql_db_1 ... done
% docker-compose exec db ls /
bin proc
dev root
docker-entrypoint-initdb.d run
etc sbin
home srv
lib sys
media tmp
mnt usr
opt var
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
657d4f2f878b postgresql_db "docker-entrypoint.s…" 51 seconds ago Up 47 seconds 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp postgresql_db_1
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 4 days ago Up 4 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
起動中のコンテナでコマンドを対話的に実行するにはexecコマンドでbashを実行する。
% docker-compose exec db bash ←コンテナに接続
# ls / ←コマンド実行
bin home opt sbin usr
dev lib proc srv var
docker-entrypoint-initdb.d media root sys
etc mnt run tmp
# exit ←切断
exit
% docker container ls -a ←コンテナが起動している事を確認
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
657d4f2f878b postgresql_db "docker-entrypoint.s…" 9 minutes ago Up 9 minutes 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp postgresql_db_1
0f06e09020e2 mysql_mysqldb "docker-entrypoint.s…" 4 days ago Up 4 days 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql_mysqldb_1
コメント