はじめに
普段他の方が用意したDockerfileを使用することはあれど、
いざDockerコンテナに対して何かしら手を加えないといけないシーンに遭遇すると、
さっと手が動かないシーンが多いので、Dockerについてまとめました。
docker container runコマンド
Dockerの起動する
- docker container run -it hello-world
- hello-worldは、イメージ
dockerを起動して、命令を実行
--name
で、名前を付ける--rm
で、停止時に自動でコンテナを削除する- docker container run --name testhoge --rm hello-world
コンテナ一覧を確認する
- dokcer container ls -a
-a
をつけると、起動中以外のコンテナを確認できる
コンテナの停止
- dokcer container stop [コンテナID]
コンテナの削除
- dokcer container rm [コンテナID]
コンテナの強制削除
- dokcer container rm [コンテナID] --force
コンテナのポートを公開する
- docker container run --rm --publish 8080:80 nginx
--publish
は、 ホストマシンのポート番号: コンテナのポート番号 で指定する- ホストマシンから、
http://localhost:8080/
でアクセス可能
環境変数を設定する
- docker container run --name db --rm --env MYSQL_ROOT_PASSWORD=password --publish 3306:3306 mysql
--env
で環境変数をHOGEHOGE=fugafugaで指定する
バックグラウンドで実行
- docker container run -d --rm --publish 8080:80 nginx
-d
でバックグラウンド実行できる
コンテナ出力の確認
- docker container logs [コンテナ名]
--follow
出力の自動更新
起動中のコンテナでコマンドを実行する
イメージの確認
- docker image ls
イメージの取得
- docker image pull ubuntu:23.10
コンテナ起動時にタグを指定する
- docker container run --name db1 --rm -d --env MYSQL_ROOT_PASSWORD=password --publish 3306:3306 mysql:8.0.35
Dockerfile
Dockerfile書き方メモ
Dockerfileのコマンド
- FROM:ベースイメージを指定する
- RUN: コマンドを実行しレイヤとして確定する
- ENV: イメージの環境変数を指定する
- ARG: イメージビルド時の変数を定義する
- COPY: ホストマシンのファイルをイメージにコピーする
- ADD: ホストマシンやインターネットのファイルをイメージに追加する
- ENTTYPOINT: コンテナ起動時に実行するコマンドを指定する
- CMD: コンテナ起動時に実行するコマンドのデフォルト部を指定する
- CMD ["executable", "param1", "param2"]
Dokcerfileでのイメージビルド
- docker image build .
Dockerfileサンプル①
- mysqlの設定ファイルコピー
FROM mysql:8.2.0 ENV TZ=Asia/Tokyo COPY ./my.cnf /etc/my.cnf
Dockerfileサンプル②
- CMDの例
FROM python:3.12.0 CMD ["/usr/local/bin/python3","-m","http.server", "8000"]
- ①ビルド
- docker image build --tag my-python:web
- ②実行
- docker container run --name web --rm -d --publish 8000:8000 my-python:web
ボリュームのコマンド
- ボリュームを利用すると、コンテナを削除した後もデータを残せる
- コマンド例
- 一覧表示: docker volume ls
- 作成:docker volume create [volume名]
- 削除:docker volume rm
- 詳細表示:docker volume inspect
- 作成する
- docker volume create --name my-volume
ボリュームを使用して、ubuntu起動
- docker container run --name ubuntu1 --rm -it --mount type=volume,source=my-volume,destination=/my-work ubuntu:22.04
MySQLのデータをボリュームにする
- docker container run --name db1 --rm -d --env MYSQL_ROOT_PASSWORD=secret --env MYSQL_DATABASE=sample --publish 3306:3306 --mount type=volume,source=db-volume,destination=/var/lib/mysql mysql:8.2.0
マウント
- mountでbindを使って、ローカルファイル(ホストマシン上のファイル)をコンテナ内で使用する
ネットワークのコマンド
- ネットワークを利用すると、コンテナ同士の通信を実現できる
- コマンド例
- 接続: docker network connect
- 切断: docker network disconnect
- 一覧表示: docker network ls
- 作成:docker network create [ネットワーク名]
- 削除:docker network rm [ネットワーク名]
- コンテナ起動時にネットワークに接続する
- コンテナ起動時にmain.phpを実行し、同一ネットワークのmysqlに接続できることを確認する
- ネットワークに接続しているコンテナを確認する
- docker network inspect [ネットワーク名]
Docker compose
- 複数のコンテナをまとめて起動できるやつ
- コマンド
- docker compose up;コンテナの作成と起動
- docker compose down:コンテナの停止と削除
- docker compose downで停止すると、コンテナも自動で削除される(
docker run --rm ・・・
と同じ動きになる)
- docker compose downで停止すると、コンテナも自動で削除される(
- docker compose ps:コンテナ一覧を確認
- docker compose exec:起動中のコンテナでコマンドを実行
- YAMLファイルの名前
- compose.yml ←通常はこれ
- docker-compose.yml
- docker-compose.yaml
- サンプル
```
services:
app:
ports:
db: environment:- "8000:8000" volume: - type: bind source: ./src target: /my-work build: ./docker/app
mail: environment:- MYSQL_ROOT_PASSWORD=secret - MYSQL_USER=app - MYSQL_PASSWORD=pass1234 - MYSQL_DATABASE=sample - TZ=Asia/Tokyo ports: - "3306:3306" volumes: - type: volume source: db-compose-volume target: /var/lib/mysql - type: bind source: ./docker/db/init target: /docker-entrypoint-initdb.d image: mysql:8.2.0
- TZ=Asia/Tokyo - MP_DATA_FILE=/data/mailpit.db ports: - "8025:8025" volume: - type: volume source: mail-compose-volume target: /data image: axllent/mailpit:v1.10.1
volumes: db-compose-volume: mail-compose-volume: ```
- docker compose up -d --build
- -dで、バックグラウンド実行
- --buildで、コンテナ起動する前にイメージをビルドする(Dockerfileの変更を反映する)
- docker compose exec app bash
- 起動中のコンテナでbashを実行する
- docker compose down