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"]
#!/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ファイルの例です。
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
- デタッチ・モード。バックグラウンドでコンテナを実行します。