背景:
イメージの作成につき、docker commitとか、docker export ⇒ docker importとか、docker save ⇒ docker loadなどのコマンドは利用できますが、
実は多くの場面ではDockerFileの利用は一般的ですね。
今回はDockerFileの説明と使用について話してみます。
1. DockerFile簡単紹介
1-1. DockerFile公式サイト
https://docs.docker.com/engine/reference/builder/
1-2. DockerFileはなんですか
Dockerfileは、イメージを構築するためのテキストファイルであり、ファイルには構築するために必要な命令と説明が含まれています。Dockerは、Dockerfileの命令を読み取ってイメージを自動的に生成します。Dockerfileは、コマンドラインで使用できる任意のコマンドを実行することができます。一般的に、Dockerfileは、基本イメージ情報、メンテナー情報、イメージ操作命令、およびコンテナの起動時に実行される命令の4つのセクションに分かれます。
1-3. Dockerファイル ⇒ イメージ ⇔ コンテナの関係図
2. Dockerfileの基本的な構文
2-1. 基本ルール
-
①Dockerfileは、
テキストファイル
である必要があります。 -
②Dockerfileの最初の行には、ベースとなるDockerイメージを指定する
FROM命令
が必要です。例えば、FROM ubuntu:latestと書かれることがあります。 -
③Dockerfileの中では、
#記号
を使ってコメント
を記述できます。 -
④Dockerfileの命令は、
大文字で始まる
必要があります。小文字で始まる場合は無視されます。 -
⑤Dockerfileの命令は、改行で区切る必要があります。1つの行に複数の命令を記述することはできません。
-
⑥Dockerfileの命令は、バックスラッシュ(\)を使用して複数行にまたがることができます。
-
⑦Dockerfileの命令は、引用符(")で囲むことができます。
-
⑧Dockerfileの命令は、前の命令で生成されたコンテキストに対して実行されます。
-
⑨Dockerfileの命令は、イメージの作成に必要なファイルをコピーすることができます。コピー先のディレクトリが存在しない場合は自動的に作成されます。
-
⑩Dockerfileの命令は、変数や環境変数を定義することができます。
ENV命令
を使用することが一般的です。
2-2. Dockerfileの実行流れ
- ①Dockerは、ベースイメージからコンテナを実行
⇩ - ②1つのコマンドを実行し、コンテナに変更を加えます
⇩ - ③その後、Docker commitのような操作を実行して新しいイメージレイヤを提出
⇩ - ④そして、Dockerは、commitされたイメージをベースにして新しいコンテナを実行
⇩ - ⑤Dockerfileで指定された次のコマンドを実行し、すべてのコマンドが完了するまで続けます
3. Dockerfileでdockerイメージを作成
3-1. 目標
vim+ifconfig+jdk8を含んでいるubuntuイメージを作成
※jdk8のダウンロード場所
https://www.oracle.com/java/technologies/downloads/#java8
3-2. Dockerfileを編集
[root@localhost myflie]# pwd
/home/myflie
[root@localhost myflie]# ls -l
合計 135516
-rw-r--r--. 1 root root 743 3月 8 20:49 Dockerfile
-rw-r--r--. 1 root root 138762230 1月 31 21:14 jdk-8u361-linux-x64.tar.gz
[root@localhost myflie]#
[root@localhost myflie]# cat Dockerfile // 以下はDockerfileの内容
FROM ubuntu
MAINTAINER tin<tinxxxxx@gmail.com> # 自分のメールアドレス
ENV MYPATH /usr/local
WORKDIR $MYPATH
# vimエディターをインストール
RUN apt-get update
RUN apt-get -y install vim
# ifconfigをインストール
RUN apt-get -y install net-tools
# java8
RUN mkdir /usr/local/java
# ADD jdk-8u361-linux-x64.tar.gzをコンテナに入れる
ADD jdk-8u361-linux-x64.tar.gz /usr/local/java/
# java環境変数を設定
ENV JAVA_HOME /usr/local/java/jdk1.8.0_361
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD /bin/bash # CMDは、Dockerコンテナが起動した際に自動的に実行されるコマンドを指定するための命令
[root@localhost myflie]#
3-3. Dockerfileを実行
docker build -t myubuntu:1.1 .
⇒ dockerイメージmyubuntu:1.1が生まれた
[root@localhost myflie]# pwd
/home/myflie
[root@localhost myflie]# ls
Dockerfile jdk-8u361-linux-x64.tar.gz
[root@localhost myflie]#
[root@localhost myflie]# docker build -t myubuntu:1.1 .
[+] Building 29.1s (12/12) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 841B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 0.0s
=> [1/7] FROM docker.io/library/ubuntu 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 109B 0.0s
=> [2/7] WORKDIR /usr/local 0.0s
=> [3/7] RUN apt-get update 7.4s
=> [4/7] RUN apt-get -y install vim 10.5s
=> [5/7] RUN apt-get -y install net-tools 3.4s
=> [6/7] RUN mkdir /usr/local/java 0.5s
=> [7/7] ADD jdk-8u361-linux-x64.tar.gz /usr/local/java/ 4.4s
=> exporting to image 2.7s
=> => exporting layers 2.6s
=> => writing image sha256:fdf54cd0d246200b93c63b33ea5eded8d78c0b22f8b4b5290dbea0f68d3cecd7 0.0s
=> => naming to docker.io/library/myubuntu:1.1 0.0s
[root@localhost myflie]#
[root@localhost myflie]# docker images | grep myubuntu //生成したdockerイメージ
myubuntu 1.1 fdf54cd0d246 2 minutes ago 522MB
3-4. Dockerfileによる作成したイメージでコンテナを起動
docker run -it myubuntu:1.1 bash
⇒ javaとifconfigを検証
[root@localhost myflie]# docker run -it myubuntu:1.1 bash
root@2f5701a3aeb1:/usr/local#
root@2f5701a3aeb1:/usr/local# ls
bin etc games include java lib man sbin share src
root@2f5701a3aeb1:/usr/local# java -version
java version "1.8.0_361"
Java(TM) SE Runtime Environment (build 1.8.0_361-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.361-b09, mixed mode)
root@2f5701a3aeb1:/usr/local#
root@2f5701a3aeb1:/usr/local# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.6 netmask 255.255.0.0 broadcast 172.17.255.255
コメント欄