コンテナの作成・起動
docker container run --name コンテナ名 -p ホスト側ポート番号:コンテナ側ポート番号 -d イメージ
docker container run --name test_apache -p 8080:80 -d httpd
上記で作成・起動すると、ブラウザでlocalhost:8080にアクセスすると起動しているのがわかる。
起動中のコンテナに入る
docker container exec -it コンテナ名 /bin/bash
docker container exec -it test_apache /bin/bash
コンテナを削除
docker container rm コンテナ名
コンテナ一覧を取得
起動中のコンテナ一覧取得
docker container ls
停止中も含めて全てのコンテナを取得
docker container ls -a
コマンド一覧を見る
ヘルプを参照すれば、だいたいやりたいことはできそう
docker container --help
Docker Compose
複数のコンテナを作成・起動できる機能。
docker container run
で作成・起動するのは、コマンドが長くなったり、複数起動する際、必要回数分実行しないといけないので、Docker Composeを使うのが良い。
実行は簡単で、以下のコマンドを実行するだけ。
-d
はバックグラウンドで実行するという意味で、こちらを指定しないと同じターミナルのWindowで他のコマンドを実行できなくなる。新しくWindowを開けば問題ないが、基本つけておくのが良さそう。
docker compose up -d
停止は下記。
docker compose stop
停止・削除は下記
docker compose down
Docker Composeファイル
docker compose up -d
のコマンドは、コマンドを実行したディレクトリにあるDocker Composeファイルからコンテナを作成・起動する。
Docker Composeファイルの命名は以下が有効らしい。
- compose.yaml
- compose.yml
- docker-compose.yaml
- docker-compose.yml
以前はdocker-compose
という名称だったみたいだが、compose
という名称が推奨されるようになったらしい。
書き方は下記。
services:
# サービス名
web:
# イメージ
image: httpd
# コンテナ名
container_name: test_apache
# ポート番号
ports:
- "8080:80"
コピー
ホストのPCからコンテナにファイルをコピーする
containerとcomposeで少し違いがある。
docker container cp コンテナ名:/usr/local/apache2/htdocs/index.html ./index.html
docker compose cp サービス名:/usr/local/apache2/htdocs/index.html ./index.html
docker compose cp web:/usr/local/apache2/htdocs/index.html ./index.html
docker container cp test_apache:/usr/local/apache2/htdocs/index.html ./index.html
データの永続化
Container内のデータはContainerを削除すると消える。
永続化したい場合は三つの手段がある
- 消す前に、Container内からホストにコピーしておく
- ボリュームを使う
- バインドマウントを使用する
この中でよく使われている(個人的によく見かける)のはボリュームを使う方法。
ボリュームについて
Dockerが管理する記憶領域にデータを永続化する
ボリュームの定義は以下のように二箇所で行う。
services:
db:
image: postgres
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: password
ports:
- 5432:5432
volumes:
- db_volumes:/var/lib/postgresql/data
volumes:
db_volumes:
services
と同じ階層のvolumes
には作成するボリューム名を記載する。
個別のservise(上記で言うとdb
)のvolumesには、上記で定義したボリューム名とcontainer内のパスを指定する。
Container内のパス指定について
なぜ、Container内のパスを指定するのか最初わからなかったが、
ボリュームの実態(ホストPC上の保存領域)と、Container内のフォルダを結びつけるようなイメージみたい
つまり、Container内で指定したパスを参照すると、ホストPC上の保存領域を参照できる
また、パスの指定はイメージごとに決まっているみたい(変えることは可能みたいですが、デフォルト値ではなくなるため、設定変更が必要みたいです)
DockerHubでイメージの公式ページを調べる必要がある
ボリュームの実態の場所
以下が参考になりました。
バインドマウント
ホストOSのフォルダやファイルをマウントする
ホストOS上で、マウントしたファイルを直接変更すると、コンテナ内でも変更が反映される
service内のvolumesにホストOSのパス:コンテナ内のパスで指定する
ホストPC上のフォルダ構成を下記とする。
dir ─ compose.yaml
└ htdocs
└ index.html
下記のように、ホストのPCのhtdocsに、Container内の/usr/local/apache2/htdocs
を定義する。
services:
web:
image: httpd
container_name: test_apache
ports:
- "8080:80"
volumes:
- ./htdocs:/usr/local/apache2/htdocs
すると、ホストPC上のhtdocs/index.htmlを編集すると、Container内でも変更が反映され、Apacheの表示が変わる。
エラー確認
Containerの作成が完了したが、ブラウザなどでアクセスしても表示されない場合は内部でエラーになっている可能性がある。
その場合、docker compose logs コンテナ名
でログが確認可能
docker compose logs web
ビルド
docker compose upでは、イメージがすでにある場合、既存のイメージを使用する。
したがって、再度イメージをビルドしたい場合は下記のコマンドを使う
docker compose build
再ビルドと実行を行う場合は下記
docker compose up -d --build
反映されない時は以下を試す。
docker compose build --no-cache