2 つのイメージ作成方法
Docker イメージの作成方法には、大きく下記の 2 つの方法があります。
Dockerfile
にイメージの作成手順を記載しておき、docker image build
で作成- OS イメージをインタラクティブモードで起動し、各種設定を行った後に
docker container commit
で作成
再現性、ポータビリティといった観点から、Dockerfile
を扱うアプローチが推奨されています。
docker image build アプローチ
Dockerfile
という、Docker イメージ作成のための手順書を作成しておくと、docker image build
(あるいは docker build
)コマンドを使って自動的にイメージを作成することができます。
下記は、Debian のイメージをベースにして、Python 3 をインストールしたイメージを作成する場合の Dockerfile
の例です。
この Dockerfile
を元に Docker イメージを作成するには、下記のように docker image build
を実行します。
-t
の後ろに指定するイメージ名は <user>/<repo>:<tag>
という構成で指定します。
末尾のタグ名 (:<tag>
) を省略すると、自動的に latest
というタグが付けられます。
カレントディレクトリに Dockerfile
ファイルがある場合は次のような感じでイメージをビルドします。
$ docker build -t maku77/python3:v1 .
debian:wheezy
のイメージファイルが既に docker pull
コマンドなどでローカルにキャッシュされている場合は、そのイメージが利用されるため、イメージ構築はより早く終わります。
docker image ls
(あるいは docker images
)コマンドで、作成された Docker イメージを確認することができます。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
maku77/python3 v1 c3d5556730a9 4 minutes ago 93.88 MB
debian wheezy d5570ef1464a 4 days ago 84.98 MB
...
作成された Docker イメージ (maku77/python3:v1
) からコンテナを起動し、python3
コマンドを実行してみます。
$ docker container run -it maku77/python3:v1 python3
Python 3.2.3 (default, Feb 20 2013, 14:44:27)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
(おまけ)GitHub 上の Dockerfile からイメージを作成する
docker image build
コマンドで Dockerfile
のあるディレクトリを指定するときに、GitHub のリポジトリを指定することができます。
$ docker mage build -t maku77/sample:v1 git@github.com:maku77/sample
docker container commit アプローチ
docker container commit
(あるいは docker commit
)コマンドによるアプローチでは、Docker のコンテナイメージをインタラクティブに作成していくことができます。
コンテナ上でソフトウェアのインストールなどを行い、最後に docker container commit
コマンドを実行することにより、コンテナイメージを作成します。
まずは、ベースとなるイメージを指定して Docker コンテナを起動します。
$ docker container run -it ubuntu:14.04 /bin/bash
コンテナ上の bash プロンプトが表示されたら、その中で apt-get
やファイルの作成などを行い、コンテナイメージの構築作業を進めていきます。
下記の例では、Hello と表示するだけのシェルスクリプト (/greet
) を作成しています。
root@c338a2f4c60e:/# cat > greet
#!/bin/bash
echo Hello
(ここで Ctrl-D で終了)
root@c338a2f4c60e:/# chmod +x greet
root@c338a2f4c60e:/# exit
起動元のシェルに戻ってきたら、docker ps
コマンドで、最新のコンテナ ID(あるいは名前)を確認します。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c338a2f4c60e ubuntu:14.04 /bin/bash 3 minutes ago Exited (0) About a minute ago loving_torvalds
これで、先ほどインタラクティブに構成した Docker コンテナの ID が c338a2
、名前が loving_torvalds
だということが分かるので、docker container commit
コマンドを実行して、コンテナからイメージを生成します。
docker container commit
コマンドのフォーマットは下記のようになっています。
docker container commit -a <作者> -c <コメント> <コンテナ> <リポジトリ名>:<タグ名>
<コンテナ>
には、docker ps
コマンドで確認したコンテナ ID か名前を指定します。
リポジトリ名は、Docker Hub の流儀に合わせて、<アカウント名>/<イメージ名>
という形で指定します。
例えば、Docker Hub アカウントが maku77
で、sample
という名前のイメージを作成する場合は次のようにします。
$ docker commit -a 'Maku <maku77@example.com>' -m 'First commit' c338a2 maku77/sample:v1
8a6608d7d353d966f5cdc044b48b89158943c2dc9fd08b7a4832b43a21b5df41
コンテナイメージの作成に成功すると、上記のように作成されたイメージの ID が表示されます。
docker image ls
コマンドで、実際に新しくイメージが作成されたことを確認できます。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
maku77/sample v1 8a6608d7d353 7 minutes ago 188.3 MB
ubuntu 14.04 2103b00b3fdf 43 hours ago 188.3 MB
...
この Docker イメージを使って、先ほど作成した /greet
コマンドを実行してみます。
$ docker container run maku77/sample:v1 /greet
Hello