Dockerのコマンドを使ってコンテナを立てることもできるが、composeを使うことで
docker操作をコード化し、加えて複数のコンテナをまとめて管理することができるみたいなので、どんなものなのか使ってみた
Docker Compseをインストール
いろんな記事を参考にしてインストールする
公式githubでバージョンの確認は忘れずに
# curl -L "https://github.com/docker/compose/releases/download/2.15.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
実行権限を与える
# chmod +x /usr/local/bin/docker-compose
インストールされたことを確認した
と思ったらcomposeが反応してない
[root@docker bin]# docker compose --version
Docker version 20.10.22, build 3a2c30b
docker-compose
は古いバージョン(V1)
2023年4月以降はdocker compose
に変わるらしい(V2)
なのに-
が無いと「そんなコマンド無いよ!」って言われてしまう状態
※V1とV2の詳細はこちらのQiita記事を参照
[opc@docker ~]$ docker compose version
docker: 'compose' is not a docker command.
See 'docker --help'
[opc@docker ~]$ docker-compose version
Docker Compose version v2.15.1
「cli-plugins」ディレクトリにdocker-compose実行ファイルを置くと良いみたい。
動作確認成功!
[root@docker cli-plugins]# pwd
/usr/libexec/docker/cli-plugins
[root@docker cli-plugins]# ll
合計 122308
-rwxr-xr-x 1 root root 29865304 12月 16 07:31 docker-app
-rwxr-xr-x 1 root root 51857264 12月 16 07:31 docker-buildx
-rwxr-xr-x 1 root root 43515904 1月 12 17:46 docker-compose
[root@docker cli-plugins]# docker compose version
Docker Compose version v2.15.1
composeを試す
Dockerで実行していたことをyaml形式で書くことで管理することができる
コンテナ用ディレクトリを作成し「compose.yaml」という名前で管理することが良いらしい
ということで、apache
ディレクトリの中にcompose.yamlファイルを作成して試してみる
/home/
└── opc
├── Dockerfile
└── apache
└── compose.yaml
コンテナを立ち上げる
動作確認として、簡単にyaml形式で書いてみた。
下記コマンドを実行したと同義になるはず。
- docker pull nephken/world-is-mine-1
- docker run --name web-test -i -t -d -p 8083:80 nephken/world-is-mine-1
services:
web:
image: nephken/world-is-mine-1
container_name: web-test
ports:
- "8083:80"
yamlファイルを格納したカレントディレクトリで実行
※-d
バックグラウンドで実行
だけど、「Exited (0)」というエラーで起動されず。
[root@docker apache]# docker compose up -d
[+] Running 2/2
⠿ Network apache_default Created 0.1s
⠿ Container apache-web-1 Started 0.6s
[opc@docker apache]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
618f2914f883 nephken/world-is-mine-1 "bash" 8 seconds ago Exited (0) 7 seconds ago web-test
エラー調査
docker run
で直接立ち上げると、なぜか起動する。
[opc@docker ~]$ docker run --name web-test -i -t -d -p 8083:80 nephken/world-is-mine-1
eb4772b1ff424058570de486a6eedfef6a9d22133983d3a1fd7a777c511b6b95
[opc@docker ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eb4772b1ff42 nephken/world-is-mine-1 "bash" 5 seconds ago Up 5 seconds 0.0.0.0:8080->80/tcp, :::8083->80/tcp web-test
ログは何も出てこない。。
[opc@docker apache]$ docker compose logs
[opc@docker apache]$
削除の仕方が悪かったのかと思い、いろいろな削除を試したが
何も改善されない。。
### 停止済みのコンテナを強制的に削除
[opc@docker apache]$ docker compose rm --force
### イメージを構築しながらコンテナを作成して開始する
[opc@docker apache]$ docker compose up -d --build
[+] Running 2/2
⠿ Network apache_default Created 0.1s
⠿ Container web-test Started 0.4s
### コンテナのボリュームもあわせて削除
[opc@docker apache]$ docker compose down -v
[+] Running 2/0
⠿ Container web-test Removed 0.0s
⠿ Network apache_default Removed
エラー調査の結果
結果、servicesに書くべき項目が少なかったことが原因でした。
※tty: true
を加えることで、正常に起動を確認
docker run
のときはオプションで-t
を付けてたのに、docker compose
で付けてなかったということ
※こちらの記事を参考にしました。
※でも、imageを「httpd:2.4」に変えると動くんだよなぁ。。。不思議。。。
services:
web:
image: nephken/world-is-mine-1
container_name: web-test
ports:
- "8083:80"
tty: true
立ち上がったことを確認
止める場合はdocker compose stop
立ち上げる場合はdocker compose start
[opc@docker apache]$ docker compose ls
NAME STATUS CONFIG FILES
apache running(1) /home/opc/apache/compose.yaml
立てたコンテナを停止/削除する
docker compose down
が一般的みたい。
コンテナ、コンテナ用に作られたネットワーク、ボリュームを一度に削除するコマンド
- これらを個別にやらずに済む
docker stop 【コンテナID】
docker rm 【コンテナID】
docker volume rm (docker volume prune)
docker network rm (docker volume prune)
docker rmi 【イメージID】
[opc@docker apache]$ docker compose ls
NAME STATUS CONFIG FILES
apache running(1) /home/opc/apache/compose.yaml
[opc@docker apache]$ docker compose down
[+] Running 2/2
⠿ Container web-test Removed 10.2s
⠿ Network apache_default Removed 0.1s
[opc@docker apache]$ docker compose ls
NAME STATUS CONFIG FILES
[opc@docker apache]$
よく使うオプション
-rmi
使用したイメージごと削除,-rmi all
にすると全部
-v
composeファイルで指定したボリュームごと削除(本記事の場合は意味ない)
--remove-orphans
composeファイルで定義していないコンテナも削除(ちょっとよくわからない)
備忘 rmとdownについて
-
docker compose rm
もあるけど、これはコンテナだけを削除するコマンド
コンテナに紐づくネットワークは削除されないし、コンテナが停止している必要がある
※-s
オプションをつけることで起動中でも削除可能
よく使うコマンドにおける名称指定の違い
他にもコマンドはあるけど、cp
とexec
で指定する名称が違うので気を付ける。
※参考にした本にはどっちも【コンテナ名】って書いてあって迷いました。
-
$ docker compose cp <ファイル名> 【サービス名】:ディレクトリ
ホスト⇄コンテナ間でファイルをやり取りする際に使用する
サービス名を指定する必要がある
※SERVICEに表示されている名称
※composeファイルのservicesで指定 -
$ docker compose exec 【コンテナ名】 <コマンド>
ホスト上からコンテナ内でコマンドを実行するときに使用する
コンテナ名を指定する必要がある
※NAMEに表示されている名称
※composeファイルのcontainer_nameで指定
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
web-test nephken/world-is-mine-1 "bash" web 9 minutes ago Up 9 minutes 0.0.0.0:8083->80/tcp, :::8083->80/tcp
まとめ
dockerコマンドでもコンテナを立ち上げて構築することはできるけど
composeファイルに書き込むことで
docker compose up -d
だけで済むようになるというのがdocker composeの機能
(めちゃくちゃざっくり)
次は2つのコンテナを使ったサービスとか立ち上げて
ボリュームの永続化みたいなことをやってみたい