技術っぽいことを書いてみるブログ

PythonとかVue.jsとか技術的なことについて書いていきます。

Dockerについてまとめました。

はじめに

普段他の方が用意したDockerfileを使用することはあれど、
いざDockerコンテナに対して何かしら手を加えないといけないシーンに遭遇すると、
さっと手が動かないシーンが多いので、Dockerについてまとめました。

docker container runコマンド

Dockerの起動する

  • docker container run -it hello-world
    • hello-worldは、イメージ

dockerを起動して、命令を実行

  • --nameで、名前を付ける

    • docker container run --name testubuntu -it ubuntu bash
      • ubuntuイメージでコンテナを起動し、コンテナ上でbashを実行する
  • --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

バックグラウンドで実行

  • docker container run -d --rm --publish 8080:80 nginx
    • -dでバックグラウンド実行できる

コンテナ出力の確認

  • docker container logs [コンテナ名]
    • --follow 出力の自動更新

起動中のコンテナでコマンドを実行する

  • docker container exec -it db bash
    • -itオプションで対話型にする
    • dbがコンテナ名
    • bashがコマンド

イメージの確認

  • 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 container run --name ruby --rm -it --mount type=bind,source="$(pwd)",target=/my-work ruby:3.2.2 bash

ネットワークのコマンド

  • ネットワークを利用すると、コンテナ同士の通信を実現できる
  • コマンド例
    • 接続: docker network connect
    • 切断: docker network disconnect
    • 一覧表示: docker network ls
    • 作成:docker network create [ネットワーク名]
    • 削除:docker network rm [ネットワーク名]
  • コンテナ起動時にネットワークに接続する
    • docker container run --network my-network my-php:ping ping -c 3 -t 1 db
      • コンテナ起動時にmy-networkのネットワークに接続し、別のコンテナ(nameがdb)に対してpingしている
  • コンテナ起動時にmain.phpを実行し、同一ネットワークのmysqlに接続できることを確認する
    • docker container run --rm --mount type=bind,source="$(pwd)",target=/my-work --network my-network my-php:pdo_mysql php /my-work/main.php
  • ネットワークに接続しているコンテナを確認する
    • docker network inspect [ネットワーク名]

Docker compose

  • 複数のコンテナをまとめて起動できるやつ
  • コマンド
    • docker compose up;コンテナの作成と起動
    • docker compose down:コンテナの停止と削除
      • docker compose downで停止すると、コンテナも自動で削除される(docker run --rm ・・・と同じ動きになる)
    • docker compose ps:コンテナ一覧を確認
    • docker compose exec:起動中のコンテナでコマンドを実行
  • YAMLファイルの名前
    • compose.yml ←通常はこれ
    • docker-compose.yml
    • docker-compose.yaml
    • サンプル ``` services: app: ports:
        - "8000:8000"
      volume:
        - type: bind
          source: ./src
          target: /my-work
      build: ./docker/app
      
      db: 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
      
      mail: environment:
        - 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

compose.ymlの環境変数

  • compose.ymlと同階層に.envを設定することで、環境変数を別だしできる
  • .env APP_HOST_MACHINE_PORT=8000 PASSORD=secret
  • compose.yml ``` services: app: ports:
       - "${APP_HOST_MACHINE_PORT}:8000"
    

    ```

  • docker compose convertコマンドにて、環境変数ファイルからの書き換えを確認できる