LoginSignup
0
0

ただただ初心者がDocker Composeを使ってみるだけ

Last updated at Posted at 2023-01-15

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オプションをつけることで起動中でも削除可能

よく使うコマンドにおける名称指定の違い

他にもコマンドはあるけど、cpexecで指定する名称が違うので気を付ける。
  ※参考にした本にはどっちも【コンテナ名】って書いてあって迷いました。

  • $ 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つのコンテナを使ったサービスとか立ち上げて
ボリュームの永続化みたいなことをやってみたい

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0