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