Dockerfileを使ったイメージとコンテナの作成

DockerfileはDockerイメージをビルドするための設定ファイルです。以下は基本的なDockerファイルの書き方です。

Dockerfileの書き方

命令 内容の形式で記述をします。以下は一般的なDockerfileの例とその説明です。

# ベースイメージの指定
FROM base_image:tag

# 作業ディレクトリの設定
WORKDIR /app

# ファイルやディレクトリのコピー
COPY source destination

# 必要なパッケージのインストールなどのコマンド実行
RUN apt-get update \\
    && apt-get upgrade \\
    && apt install -y python3

# コンテナ起動時に実行されるコマンド
CMD ["command"]
命令 説明
FROM ベースイメージを指定する。イメージのビルドに使用するベースとなるDockerイメージ。先頭に記述する
WORKDIR 作業ディレクトリを指定する。後続のコマンドが実行される場所となる
ディレクトリが存在しない場合は生成する
COPY ローカルのファイルやディレクトリをコンテナ内にコピーする
RUN コマンドを実行する。イメージのビルド時に実行され、パッケージのインストールや環境の設定などに使用される
CMD コンテナが起動した際に実行されるコマンドを指定する。通常は実行するアプリケーションのエントリーポイントとなる
ディレクトリコピー時は、コピー先ディレクトリ名を指定しないと、現在のワークディレクトリにコピー元ディレクトリのファイルがディレクトリ構成を無視してコピーされます。

起動後にShellを実行するDockerfile

FROM jrottenberg/ffmpeg:2.8-ubuntu
WORKDIR /home/app
COPY image2.sh .
RUN chmod +x image2.sh
ENTRYPOINT ["/home/app/image2.sh"]
image2.sh
#!/bin/bash

rm -f ./images/*
ffmpeg -i ./video/input.mp4 -f image2 ./images/%05d.jpg

RUN命令の \ && について

RUN pip install fastapi \\
    && pip install "uvicorn[standard]"

&&は、Dockerfile内のRUN命令で使用されるシェルコマンドのチェーンを表す演算子です。この演算子を使用することで、複数のコマンドを1つのRUN命令で実行することができます。

具体的には、&&の前のコマンドが成功した場合にのみ、次のコマンドが実行されます。一つ前のコマンドが正常に終了しない場合、後続のコマンドは実行されません。

&&を使用することで、Dockerイメージのビルドプロセスを効率化し、イメージのサイズを最小限に抑えることができます。また、エラーチェックやデバッグを容易にするための手段としても利用されます。

Dockerfileからイメージをビルドする

docker buildコマンドはDockerfileからイメージをビルドします。

docker build -t [Dockerイメージ名][:タグ] [Dockerfileが存在するディレクトリ]

# 例
docker build -t my-image .
# タグあり例
docker build -t my-image:v1.0.0 .

キャッシュを利用せずにビルドする

イメージをビルドする際、ベース環境などは以前ビルド時にダウンロードしたキャッシュが利用されます。
キャッシュを利用せずに、ダウンロードから行う場合は、以下のコマンドを実行します。

docker build --no-cache -t [Dockerイメージ名] [Dockerfileが存在するディレクトリ]

イメージからコンテナを起動する

docker container run -i -d --name [コンテナ名] --restart=always -p 8080:8080 [Dockerイメージ名][:タグ]

または

docker container create -i --name [コンテナ名] --restart always -p 8080:8080 [Dockerイメージ名][:タグ]
docker container start [コンテナ名]

一時的な作業用で起動したい場合は、次のようにrun-it --rmを指定する。

docker container run -it --rm --mount type=bind,source=/home/user/docker/images,target=/home/app/images -p 8000:8000 --dns=8.8.8.8 [Dockerイメージ名][:タグ] bash

オプション

よく使うオプション。

名前 説明
-d コンテナーをバックグラウンド実行する(runのみ)
--dns カスタムDNSサーバーを設定する
--gpus コンテナーに追加する GPU デバイスを指定する
-i アタッチされていなくてもSTDINを開放する
--mount ファイルシステムをマウントする
-p ポートを公開する
--restart コンテナー終了時に適用する再起動ポリシー
--runtime 利用するランタイム

マウントの指定例

--mount type=bind,source=/home/user/images,target=/home/app/images

GPU使用の指定例

--runtime=nvidia --gpus all

DNSサーバの指定例

コンテナ内でモジュールのダウンロードに失敗する場合などに指定します。

--dns=8.8.8.8

コンテナの停止

docker container stop [コンテナ名]

停止したコンテナの起動

docker container start [コンテナ名]

Docker Composeを使った起動

Docker Composeは、複数のDockerコンテナを簡単に定義、起動、および管理するためのツールで、特に複雑なアプリケーションのデプロイメントやマルチコンテナアプリケーションの設定を容易にします。
以下は一般的なdocker-compose.ymlファイルの例です。

docker-compose.yml
version: '3'

services:
  webapp:
    build: ./nodeapp
    container_name: node_test1
    tty: true
    ports:
      - 8000:8000
    dns:
      - 8.8.8.8
    volumes:
      - /home/user/video:/home/app/video
      - /home/user/images:/home/app/images
    environment:
      - DEBUG=1

  database:
    image: postgres:latest
    restart: always
    environment:
      POSTGRES_PASSWORD: example_password

version

Docker Composeファイルの書式のバージョンを設定します。

services

サービス(コンテナ)定義セクション。コンテナごとに1つのサービスを指定します。

配下に任意のサービス名(Dockerコンテナ)を指定します。コンテナごとに指定する要素については以下のとおりです。

要素 内容
build Dockerファイルを使ってイメージをビルドする際に、Dockerファイルのあるディレクトリを指定する
image - 使用するDockerイメージを指定する
- buildが指定されているときは、ビルドしたイメージのイメージ名の指定となる。Dockerイメージ名[:タグ]で指定が可能
container_name 任意のコンテナ名を指定する
environment 環境変数の設定
restart コンテナが停止した場合に自動的に再起動するように設定するためのオプション
ports ホストとコンテナのポートのマッピング。ホストのポートとコンテナのポートを関連付けて、外部からWebアプリにアクセスできるようにする
ホストのポート:コンテナのポートで指定する
dns カスタムDNSサーバーを設定する
tty trueにすることで、コンテナを起動し続ける
volumes ボリュームのマウント。ホストとコンテナ間でファイルを共有するために使用する
ホストのディレクトリ:コンテナのディレクトリで指定する

環境変数の設定について

環境変数はマップ形式または配列形式で指定できます。

  • マップ形式
    environment:
      DEBUG: 1
      POSTGRES_USER: postgres
      USER_INPUT:
      SHOW: "true"
  • 配列形式
    environment:
      - DEBUG=1
      - POSTGRES_USER=postgres
      - USER_INPUT
      - SHOW=true

docker-compose.yml を使ったデプロイ

docker composeコマンドは、設定に従ってコンテナを起動し、アプリケーションを実行します。

docker compose up

または

docker compose up -d

-d - デタッチ・モード。バックグラウンドでコンテナを実行します。

このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

スポンサードリンク

関連コンテンツ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です