Docker for MacでさくっとDockerfile

Contents


はじめに

前回は各種設定を行ったコンテナからDockerイメージを作成する方法を試したが、今回はDockerfileを使ったDockerイメージの作成を試してみる。細かいことはあまりやらないでさくっと試してみるのが目的。

 

Dockerfileとは

DockerはDocker Hubのイメージを使ってコンテナを作成できるが、Dockerfileを用意して実行することによって、イメージにさらに必要な設定を追加して、新たにイメージを作成することができる。Dockerイメージの変更をコード化したもの。

 

DockerfileでどんなDockerイメージを作る?

前回と同様にDocker HubのCentOS 7イメージにApache入れて、コンテナ起動時にApacheが起動するDockerイメージを作ってみる。

 

Dockerfile作成

作業用の任意のディレクトリを作成して移動しておき、Dockerfileを作成します。Dockerfile内の命令はシェル形式とexec形式(json配列で記述)ができます。「CMD」はexec形式が推奨されているようなので、RUNのところもexec形式にして今回は実行してみます。

[シェル形式]

$ vi dockerfile
FROM centos:7
RUN yum install -y httpd
CMD /usr/sbin/httpd -DFOREGROUND

[exec形式]

$ vi dockerfile
FROM centos:7
RUN ["yum", "install", "-y", "httpd"]
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

 

命令 形式 用途
FROM - 元になるDockerイメージを指定する。
RUN シェル形式とexec形式2つある。 OSコマンドを実行する。
CMD シェル形式とexec形式(推奨)、ENTRYPOINT のデフォルト・パラメータ コンテナ起動時に実行するコマンドを指定する。Dockerfile で一度だけ指定できる。

CMDとENTRYPOINTの違いは省略します。Dockerfile リファレンスあたりを参照してみてください。

 

DockerfileからDockerイメージ作成

「docker build」コマンドでDockerfileを指定して、Dockerイメージを作成します。
-t <イメージ名>[:<タグ>] を指定し、最後にDockerfileを置いているディレクトリを指定。

$ docker build -t myhttpd:1.0 .

以下は実行内容

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM centos:7
7: Pulling from library/centos
256b176beaff: Pull complete
Digest: sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf
Status: Downloaded newer image for centos:7
 ---> 5182e96772bf
Step 2/3 : RUN ["yum", "install", "-y", "httpd"]
 ---> Running in 8309b7fad586
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-80.el7.centos.1 will be installed
--> Processing Dependency: httpd-tools = 2.4.6-80.el7.centos.1 for package: httpd-2.4.6-80.el7.centos.1.x86_64
--> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-80.el7.centos.1.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-80.el7.centos.1.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-80.el7.centos.1.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-80.el7.centos.1.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-3.el7_4.1 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed
---> Package httpd-tools.x86_64 0:2.4.6-80.el7.centos.1 will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved
:
:
(省略)
:
:
Complete!
Removing intermediate container 8309b7fad586
 ---> 41fb67fbc698
Step 3/3 : CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
 ---> Running in 1596d95cd0f2
Removing intermediate container 1596d95cd0f2
 ---> 22d6a1aa7355
Successfully built 22d6a1aa7355
Successfully tagged myhttpd:1.0

新しくDockerイメージができたことを確認する。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
myhttpd             1.0                 22d6a1aa7355        About a minute ago   319MB
centos              7                   5182e96772bf        6 days ago           200MB

 

作成したDockerイメージでコンテナ起動

もうだいぶ慣れたdocker runでコンテナ起動。

$ docker run -it -d --name myapache -p 8080:80 myhttpd:1.0

コンテナができていることを確認。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
747778d1985c        myhttpd:1.0         "/usr/sbin/httpd -D …"   12 seconds ago      Up 11 seconds       0.0.0.0:8080->80/tcp   myapache

http://127.0.0.1:8080/ でApacheの画面が表示されればOK。

 

Dockerを使ってInfrastructure as Code!

 

参考

https://knowledge.sakura.ad.jp/15253/
http://pppurple.hatenablog.com/entry/2016/07/11/051626
http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
http://docs.docker.jp/engine/reference/builder.html