概要
Dockerfileを利用してDockerコンテナを起動させるためには、
ざっくり以下の手順を行うことになる。
(実際には1-3を繰り返しながらDockerfileを作成していく形になる)
- Dockerfile作成
docker build
コマンドでDockerfileを指定し、Dockerイメージを作成docker container
コマンドでDockerイメージからDockerコンテナを生成/起動
また、Dockerfileに記載する内容についても、ざっくり以下のような流れで記述する。
Dockerfile
# 1. ベースイメージを選択
FROM centos:centos7
# 2. 必要なコマンドがあればインストール
RUN apt-get -y update && apt-get install -y wget
# 3. ソースコードなど必要なファイルのコピー
# 4. 初期設定
# 5. プロセス起動
ベースイメージを選択する
DockerHubから使いたいベースイメージを探す。
Docker
docker search
コマンドを利用しても検索可能。
どちらにしても、Officialのイメージを使うことが大切。
$ docker search python
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
python Python is an interpreted, interactive, objec… 6958 [OK]
pypy PyPy is a fast, compliant alternative implem… 307 [OK]
nikolaik/python-nodejs Python with Node.js 90 [OK]
joyzoursky/python-chromedriver Python with Chromedriver, for running automa… 60 [OK]
arm32v7/python Python is an interpreted, interactive, objec… 58
centos/python-35-centos7 Platform for building and running Python 3.5… 39
centos/python-36-centos7 Platform for building and running Python 3.6… 34
Dockerfileにベースイメージだけ記載して起動してみる
Dockerfile
# Python 3.10をベースイメージとする
FROM python:3.10
docker build
コマンドの書式
docker build -t [生成するイメージ名]:[タグ名] [Dockerfileの場所]
「python-sample」という名前のDockerイメージを1.0のバージョンタグで生成する。
また、Dockerfileの場所はカレンとディレクトリ「.」である。
$ docker build -t python-sample:1.0 .
生成されたイメージを確認する。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
python-sample 1.0 7e4f3985518c 28 hours ago 917MB
コンテナを起動しつつ、コンテナ内に入ってデバッグする
Dockerfileといっても、実態はDockerコンテナ内で実行されるコマンドの列挙である。
そのため、Dockerコンテナ内で実際にコマンドを打って確認したい。
以下のコマンドを使うと、コンテナを起動しつつbashを使ってコンテナ内に入ることができる。
# 「python-sample」というDockerコンテナのタグ1.0を元に、「python-container-sample」というDockerコンテナを起動する
$ docker container run -it --rm --name "python-container-sample" python-sample:1.0 /bin/bash
-it
:コンソールに結果を出す-i
:コンテナの標準入力を開く-t
:端末デバイスを使う
--rm
:コマンド実行完了後にコンテナを自動削除--name
:コンテナ名を指定する- 最後の引数:コンテナ内で
/bin/bash
を起動する
(DockerfileにENTRYPOINT
の記載がある場合は効かない)
例
以下のDockerfileで試してみる。
# Python 3.10をベースイメージとする
FROM python:3.10
# 作業ディレクトリを定義する
WORKDIR workspace
# Dockerイメージをビルド
$ docker build -t python-sample:1.0 .
[+] Building 2.7s (6/6) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 36B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 32B 0.0s
=> [internal] load metadata for docker.io/library/python:3.10 2.5s
=> [1/2] FROM docker.io/library/python:3.10@sha256:a780eec51b47c0684d81315d48524b92e84873f93558f863733333e558d628b6 0.0s
=> => resolve docker.io/library/python:3.10@sha256:a780eec51b47c0684d81315d48524b92e84873f93558f863733333e558d628b6 0.0s
=> CACHED [2/2] WORKDIR workspace 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:915ae1d20fdb6542a97670c765059291e59e7b6da91e0f032e1d678a8649daae 0.0s
=> => naming to docker.io/library/python-sample:1.0
# Dockerコンテナにbashを使って入る
$ docker container run -it --rm --name "python-container-sample" python-sample:1.0 /bin/bash
# 作業ディレクトリにいることがわかる
root@981836d630ff:/workspace# pwd
/workspace
# pythonコマンドとpipコマンドが用意されていることが分かる
root@981836d630ff:/workspace# which python
/usr/local/bin/python
root@981836d630ff:/workspace# which pip
/usr/local/bin/pip
# vimコマンドなど必要ないものは含まれていないことが分かる
root@981836d630ff:/workspace# which vim
root@981836d630ff:/workspace#
打ったコマンドをDockerfileに書き出す
あとは実際に打って試したコマンドを、Dockerfileに書き出せばOK。
作成時のポイントは
&&
を使ってコマンドを一度に複数実行させること\
を使って可読性を上げること- 不要なものはインストールしないこと
apt-get install
などは-y
オプションを使って対話形式にならないようにすること
例えば、apt-get用いてcurlコマンドをインストールしたい場合、以下のようにする。
# 実際に試してみたコマンド
$ apt-get update
$ apt-get install curl
# -yオプションを使って試すことで、途中で「y」とか入力しなくて済む
$ apt-get -y update
$ apt-get install -y curl
# Dockerfileに書き出す場合
# && \ で繋ぐことによって、ワンライナー実行&複数行で書ける
RUN apt-get -y update && \
apt-get install -y curl
Dockerの命令コマンド
詳しい説明は別の記事で行うが、よく使うのはこのあたり。
- RUN命令(コマンドの実行)
- アプリケーションをインストールする、設定する
- 環境構築のためのコマンドを実行する
- CMD命令/ENTRYPOINT命令(デーモンの実行)
- イメージを元に生成したコンテナ内でコマンドを実行する
- 例:インストールしたNginxをデーモンとしてコンテナ内で常時動作させる
- 例:Pythonプログラムの実行コマンド
- COPY命令(ファイルのコピー)
- イメージにホスト上のファイルやディレクトリをコピーする
- ソースコードをコンテナ内に入れたい場合に使う
- VOLUME命令(ボリュームのマウント)
- コンテナが消えた時に削除されると困るようなデータ(DBなど)はCOPYではなくVOLUMEで
まとめ
- Docker環境構築の流れ
- Dockerfile(雛形の作り方)→Dockerイメージ(雛形)→Dockerコンテナ(実態)
- Dockerコンテナ起動時にbashなどのシェルを使って入ることでデバッグ可能