あめがえるのITブログ

頑張りすぎない。ほどほどに頑張るブログ。

DockerFileからカスタムイメージを作成してみた

コンテナビルドのパイプラインと作ろうと思ったけどその前にいろいろ覚えなければいけないことがあったので、まずはDockerfileの作り方を勉強(*´ω`*)

DockerFileとは

DockerイメージがらカスタムDockerイメージを作成するための設計書ファイル。

使い方

dockerfileという名前のファイルを作成し、docker buildコマンドを実行する。

DockerFileのパラメータ

  • FROM:ベースとなるイメージを選択する。
  • RUN:Imageを作成するときにコマンドが実行される。インストール系のコマンドが使用される。
  • CMD:Imageからコンテナを作成するときに実行される。コンテナの実行などに使用される。
  • MAINTAINER(非推奨):イメージの作者を指定する。Docker 1.13以降はLABELを使用することが推奨されている。
  • LABEL:イメージに作者、バージョン情報などのメタデータを設定する。
  • ENTRYPOINT:CMDと同様の使われ方をするが、CMDとの違いは上書きができなくなる。
  • COPY:Dockerfileがあるディレクトリ内のファイルをImageにコピーする。
  • ADD:COPY同様ファイルをコピーできるが、ADDはファイルが圧縮ファイルであった場合解凍+コピーを行う。
  • ENV:環境変数を設定する。
  • WORKDIR:作業用ディレクトリを変更する。
  • EXPOSE:指定したポート番号でコンテナを公開する。
  • VOLUME:ホスト側の/var/lib/docker/volumesなどにボリュームが作成され、コンテナに永続ボリュームを割り当てる。
  • SHELL:RUN、CMD、ENTRYPOINTで使用されるシェルを指定する。デフォルトではLinuxは["/bin/sh","-c"]、Windowsでは["cmd","/S","/C"]。
  • USER:RUN、CMD、ENTRYPOINTで実行されるコマンドの実行ユーザを指定する。
Dockerfile記載例)

FROM ubuntu:23.10
SHELL ["/bin/sh","-c"]
LABEL version="1.0"
RUN mkdir /tmp/sample_dir
CMD ["/bin/bash"]
CMD nginx -g 'daemon off;'
ENTRYPOINT ["ls","-la"]
CMD [">> /tmp/test.txt"]
COPY sample.txt /tmp/sample_dir
ADD sample.zip /tmp/sample_dir
ENV key1 value
WORKDIR /tmp/sample_dir
EXPOSE 80
VOLUME /var/disk1


実践!

1.Dockerfile作成

# docker version | grep Version
 Version:           23.0.1
 
# vi dockerfile
FROM ubuntu:23.10
SHELL ["/bin/sh","-c"]
RUN mkdir /sample
RUN touch /sample/test.txt
ENTRYPOINT ["ls","-la"]
CMD ["/sample"]
ENV key1 value
ENTERPOINT []
CMD ["bash"]

2.Dockerイメージ作成

# pwd
/root

### docker build -t <イメージ名> <dockerfile保存先>
# docker build -t test .
[+] Building 6.9s (6/6) FINISHED
 => [internal] load build definition from dockerfile                       0.0s
 => => transferring dockerfile: 181B                                       0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest           2.0s
 => [1/2] FROM docker.io/library/ubuntu:latest@sha256:dfd64a3b4296d8c9b62  4.6s
 => => resolve docker.io/library/ubuntu:latest@sha256:dfd64a3b4296d8c9b62  0.0s
 => => sha256:dfd64a3b4296d8c9b62aa3309984f8620b98d87e474 1.13kB / 1.13kB  0.0s
 => => sha256:ca5534a51dd04bbcebe9b23ba05f389466cf0c190f1f8f1 424B / 424B  0.0s
 => => sha256:3b418d7b466ac6275a6bfcb0c86fbe4422ff6ea0af4 2.30kB / 2.30kB  0.0s
 => => sha256:dbf6a9befcdeecbb8813406afbd62ce81394e3869 29.53MB / 29.53MB  4.1s
 => => extracting sha256:dbf6a9befcdeecbb8813406afbd62ce81394e3869d84599f  0.4s
 => [2/2] RUN mkdir /tmp/sample_dir                                        0.2s
 => exporting to image                                                     0.0s
 => => exporting layers                                                    0.0s
 => => writing image sha256:5299165384649f26938119f9e21ef6a06fd5c3889193c  0.0s
 => => naming to docker.io/library/test                                    0.0s
 
# docker image ls
REPOSITORY     TAG       IMAGE ID       CREATED         SIZE
test           latest    529916538464   9 seconds ago   77.8MB

3.Dockerコンテナ起動

# docker run test
total 8
drwxr-xr-x 1 root root 4096 May 22 22:07 .
drwxr-xr-x 1 root root 4096 May 22 22:07 ..
-rw-r--r-- 1 root root    0 May 22 22:07 test.txt

# docker run -it test /bin/bash
containerid:/# 
containerid:/# printenv | grep key1
key1=value



感想

これで自由にコンテナImageが作れるのでいろいろ遊んでみますー