このサイトは、特にやりたいこともなく無気力に生きる汚い中年おじさんデザイナー佐藤文彦のポートフォリオサイトです。
応援よろしくお願いします。

Docker初心者によるDockerfile、Docker Composeのメモ

2023/01/13

DockerFileとDocker Composeについてのメモです。

DockerFileとDocker Composeの違い

DockerFileとdocker-compose.yamlの違いがわからなくなることが多かったので、少しまとめておきます。

DockerFileの役割

DockerFileの役割は、カスタマイズしたDockerイメージを作成することです。

DockerFileを利用した場合、docker container run実行後にコンテナにログインして、あれこれコマンドを実行する手順をまとめることができます。

Docker Composeの役割

複数のコンテナの作成を行うことです。
Docker Image のビルドや各コンテナの起動・停止、ネットワーク接続を行うことができます。

Docker Compose

Docker Compose関連のメモです。
Docker Composeファイルを利用してコンテナを作成します。

Docker Composeファイルを書いてみる

Docker composeはyaml(yml)ファイルで定義します。

◎ docker-compose.yaml

services:          ・・・ 1
 web:              ・・・ 1-A
  image: httpd:2.4 ・・・ 1-B
  ports:
   - "8080:80"     ・・・ 1-C
networks:          ・・・ 2
 net01:
volumes:           ・・・ 3
 vol01:
  • 1: services配下に、コンテナの定義を書きます。
    • 1-A : コンテナ名です。Apache(httpd)を利用したWebServerなのでwebとしています。
    • 1-B : 利用するimage名を記述します。

「httpd:2.4」の場合、Apacheのバージョン2.4を指定してます。

  • 1-C : Dockerホストとコンテナのポート番号の紐付けを文字列で指定します。

「ホストのポート番号:コンテナのポート番号」

  • 2: コンテナで利用するネットワーク設定。

  • 3: データの保存に関する設定

コンテナに環境変数設定する

コンテナでDBを作成した場合、ユーザー名や、パスワードを設定する為に環境変数を利用する為にenviromentを設定します。

例) MariaDBの場合

設定できる環境変数はこちらを参照する。

services:
 db:
  image: mariadb
  environment:
    MARIADB_ROOT_PASSWORD: rootpass
    MARIADB_DATABASE: testdb
    MARIADB_USER: testuser
    MARIADB_PASSWORD: testpass
  volumes:
    - db_data:/var/lib/mysql

複数のコンテナを設定する

例) wordpress + mariadb

services:
 db:
  image: mariadb:10.7
  environment:
    MARIADB_ROOT_PASSWORD: rootpass
    MARIADB_DATABASE: wordpress
    MARIADB_USER: wordpress
    MARIADB_PASSWORD: wordpress
  volumes:
    - db-data:/var/lib/mysql
 wordpress:
  image: wordpress:6.0
  depends_on:
   - db
  environment:
   WORDPRESS_DB_HOST: db
   WORDPRESS_DB_NAME: wordpress
   WORDPRESS_DB_USER: wordpress
   WORDPRESS_DB_PASSWORD: wordpress
  ports:
   - "8080:80"
  volumes:
   - wordpress-data:/var/www/html
volumes:
 data-data:
 wordpress-data:

複数のコンテナを利用する場合は、コンテナの依存関係を指定するdepends_onを利用する。
depends_onにdbを指定すると、db → wordpressの順にコンテナを作成されます。

Docker Composeでコンテナを作成する

docker compose yaml(yml)ファイル配下で以下のコマンドを実行。
-dのオプションを付けることバックグランドで処理を実行することができますので、続けてコマンドを実行することができます。

docker compose up -d

Docker Composeで作成したコンテナを削除する

Docker Composeで作成したコンテナを削除する方法です。

コンテナを削除した場合は、コンテナ内のデータも合わせて削除されます。
データの永続化の方法は後述します。

1. docker compose down

コンテナとそれに紐づくネットワークを削除します。
コンテナ起動中でも実行できます。

docker compose down

2. docker compose rm

コンテナのみ削除します。コンテナに紐づくネットワークは削除されません。
コンテナ起動中は実行できないです。

docker compose rm

イメージも合わせて削除する場合は、rmi オプションを利用します。

docker compose down --rmi all

※ 削除するイメージを利用しているコンテナが他にもある場合はエラーになります。

コンテナのデータを永続化する

コンテナ内に作成されファイルは、コンテナが削除されると合わせて削除されます。
データを維持するには以下の、ボリュームとバイマウントの2つの方法があります。

公式ではボリューム方式を推奨しているようです。

① ボリューム方式

ボリューム機能は、ホストマシーン内のDockerの管理領域をコンテナにマウントします。
Docker composeファイルの大項目のvolumesに記述した内容が永続化されます。

services:
  コンテナ名:
    image: イメージ
    volumes:
      - 大項目のvolumesに定義したボリューム名:コンテナ内のパス
volumes:
  ボリューム名:

例 ) MariaDBの場合

services:
 db:
  image: mariadb:10.7
  environment:
    MARIADB_ROOT_PASSWORD: rootpass
    MARIADB_DATABASE: wordpress
    MARIADB_USER: wordpress
    MARIADB_PASSWORD: wordpress
  volumes:
    - db-data:/var/lib/mysql
volumes:
  db-data:

② バイマウント方式

ホストマシーン上のディレクトリやファイルをコンテナにマウントして永続化します。

services:
  コンテナ名:
    image: イメージ
    volumes:
      - ホストOSのフォルダー:コンテナ内のパス

例 ) MariaDBの場合

services:
 db:
  image: mariadb:10.7
  environment:
    MARIADB_ROOT_PASSWORD: rootpass
    MARIADB_DATABASE: wordpress
    MARIADB_USER: wordpress
    MARIADB_PASSWORD: wordpress
  volumes:
    - ./db-data:/var/lib/mysql

コンテナ作成コマンド

コマンドイメージのビルドコンテナの作成コンテナの実行
build
start
up対象のイメージがない場合はビルドを実行
up --build
run (特定のコンテナのみが操作対象)対象のイメージがない場合はビルドを実行

コンテナの停止、削除コマンド

コマンドコンテナの停止コンテナの削除イメージの削除
stop
rm
rm -s
down
down --rm all

Dockerfile

Python用のアプリケーションフレームワークflask を利用したコンテナを作成してみます。

構成は以下。

.
├── Dockerfile
├── compose.yaml
└── src
    └── app.py

手順

  1. Flaskをインストール
  2. アプリケーションファイル(app.py)をコンテナ内にコピー
  3. Flaskに組み込まれているWebサーバーを実行

◎ Dockerfile

FROM python:3.10 ・・・イメージを指定
WORKDIR /usr/src/app ・・・作業ディレクトリを指定
RUN pip install flask==2.1.0 ・・・イメージのビルド時にコマンドを実行
CMD ["flask","run","--host=0.0.0.0"] ・・・コンテナ起動時にコマンドを実行

CMDはflask run --host=0.0.0.0のようにも書けるが、[]で囲んでカンマ区切りにするのが推奨されている。

◎ compose.yaml pythonコンテナの定義を書きます。

services:
  web:
    build: . 
    environment:
      FLASK_ENV: development
    ports:
      - "5000:5000"  ・・・Flaskのデフォルトのポート番号
    volumes:
      - ./src:/usr/src/app ・・・バイマウント方式

build: .とドットを指定すると、カレントフォルダーにあるDockerfileを利用してイメージが作成されます。

◎ app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_flask():
  return 'Hello Flask!'

docker compose up -dを実行してコンテナを立ち上げ、http://localhost:5000でアクセスすると画面に「Hello Flask!」が表示されます。

もしページが表示されない場合はdocker compose logs コンテナ名でログを確認すると原因がわかるかもしれません。

カテゴリ

新規記事