【Docker】初学者のためのDockerfile作成方法

Dockerロゴ Docker

概要

Dockerfileを利用してDockerコンテナを起動させるためには、
ざっくり以下の手順を行うことになる。
(実際には1-3を繰り返しながらDockerfileを作成していく形になる)

  1. Dockerfile作成
  2. docker buildコマンドでDockerfileを指定し、Dockerイメージを作成
  3. 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 Hub

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などのシェルを使って入ることでデバッグ可能
タイトルとURLをコピーしました