前回はDockerの基本的な動作と操作方法をご説明しました。今回はもう少し実践的な使い方を紹介していきます。
前回はDockerレジストリ(Docker Hub)上にあるイメージをそのまま実行しましたが、今回はコンテナイメージを作成してみます。コンテナイメージを作成するには次の情報が必要になります。
Dockerfileとは、コンテナを作成する手順が記載されているファイルで、Dockerfileに記載された手順に沿って、イメージが作成されます。
今回作成するイメージは、Docker Hubで配布されているUbuntuイメージに次の2つの対応を実施した新たなイメージを作成してみます。
コンテナイメージに格納するファイルとDockerfileは1つのディレクトリに置く必要がありますので、新しくフォルダを作成して、HelloWorld.txtを作成します。
❯ mkdir docker_demo
❯ cd docker_demo/
❯ echo "Hello World !!!" > HelloWorld.txt
同じディレクトリにDockerfileを作成します。
vim Dockerfile
中身は以下のように記述します。
FROM ubuntu:16.04
# HelloWorld.txtのコピー
COPY ./HelloWorld.txt /
# opensshのインストール
RUN apt-get update && apt-get install -y openssh-server
# SSH用ディレクトリ作成
RUN mkdir /var/run/sshd
# chpasswd コマンドでパスワード設定をする。root ユーザーに password というパスワードを設定。
RUN echo 'root:password' | chpasswd
# ssh設定ファイルの書き換え
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# /etc/pam.d/sshd の設定を書き換え。これをやらないとログイン後にキックされてしまう。
RUN sed 's@session\srequired\spam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
# 環境変数を設定
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
# SSH接続用のポート設定
EXPOSE 22
# SSHサーバーを起動する
CMD ["/usr/sbin/sshd", "-D"]
FROM命令は、ベースとなるイメージを指定します。今回はUbuntuのイメージをしていしています。
COPY命令は、任意のファイルをコンテナイメージ内にコピーします。今回はカレントディレクトリにHelloWorld.txtファイルをコピーしています。
RUN命令は、ベースのイメージ上でコマンドを実行し、その結果をコミットする命令です。今回はopensshのインストールとインストール後の設定やファイルの書き換えを実施しています。
ENV命令は、環境変数を設定しています。Dockerの仕様として、sshdサービスがシェルを起動する前に環境変数をクリアしてしまうため、環境変数を/etc/profileに受け渡す必要があるようです。
EXPOSE命令は、コンテナ実行時にリッスンする特定のポートを設定します。今回はSSHなので22番ポートを指定しています。
CMD命令 は、 コンテナ実行時のデフォルト値を設定します。今回はsshdデーモンを起動しています。Dockerfile内でCMD命令は一度だけ指定できます。複数の CMD がある場合、最も後ろの CMD のみ有効です。
ここまでで準備が整いましたので、イメージを作成します。コマンドはdocker buildコマンドです。「-t」オプションでイメージにタグ(名前)を付与できます。最後の「.」はDockerfileの場所を指定しています。
❯ docker build -t docker_demo .
Sending build context to Docker daemon 9.216kB
Step 1/11 : FROM ubuntu:16.04
16.04: Pulling from library/ubuntu
3386e6af03b0: Pull complete
49ac0bbe6c8e: Pull complete
d1983a67e104: Pull complete
1a0f3a523f04: Pull complete
Digest: sha256:181800dada370557133a502977d0e3f7abda0c25b9bbb035f199f5eb6082a114
Status: Downloaded newer image for ubuntu:16.04
---> c6a43cd4801e
Step 2/11 : COPY ./HelloWorld.txt /
---> 20e1ab53736a
Step 3/11 : RUN apt-get update && apt-get install -y openssh-server
---> Running in bea48c1e96fc
〜省略〜
Successfully built cd226ad8e4c1
Successfully tagged docker_demo:latest
docker image lsコマンドでイメージが作成されているか確認してみます。
❯ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker_demo latest cd226ad8e4c1 2 minutes ago 204MB
以上でDockerイメージの作成は完了です。
それでは作成したイメージを実行してみます。
前回は、docker container createコマンドを使って、イメージから停止状態のコンテナを作成し、docker container startコマンドで起動していました、今回はコンテナの作成から起動までは一発で実施できるdocker runコマンドを利用してみます。
❯ docker run -d -t -i -p 2022:22 docker_demo
上記コマンドでは、「-p」オプションで、ホストの1022ポートに、コンテナの22番ポートをマッピングしコンテナを起動しています。
実際に試してみると分かりますが、仮想マシンに比べて起動が非常に高速です。それではコンテナにssh接続してみます。
❯ ssh root@localhost -p 2022
The authenticity of host '[localhost]:2022 ([::1]:2022)' can't be established.
ECDSA key fingerprint is SHA256:pY99pu/ETx9pGeUxMhjdhvffnYfSWZ1CqAn+JrCeK3Y.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:2022' (ECDSA) to the list of known hosts.
root@localhost's password:
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.9.184-linuxkit x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
root@e8f255e735f2:~#
Dockerfileで指定した「HelloWorld.txt」も格納されていることが分かります。
root@e8f255e735f2:~# cd /
root@e8f255e735f2:/# ll
total 76
drwxr-xr-x 1 root root 4096 Jan 8 10:54 ./
drwxr-xr-x 1 root root 4096 Jan 8 10:54 ../
-rwxr-xr-x 1 root root 0 Jan 8 10:54 .dockerenv*
-rw-r--r-- 1 root root 16 Jan 8 09:49 HelloWorld.txt
drwxr-xr-x 2 root root 4096 Dec 12 01:51 bin/
drwxr-xr-x 2 root root 4096 Apr 12 2016 boot/
drwxr-xr-x 5 root root 360 Jan 8 10:54 dev/
drwxr-xr-x 1 root root 4096 Jan 8 10:54 etc/
drwxr-xr-x 2 root root 4096 Apr 12 2016 home/
drwxr-xr-x 1 root root 4096 Sep 13 2015 lib/
drwxr-xr-x 2 root root 4096 Dec 12 01:51 lib64/
drwxr-xr-x 2 root root 4096 Dec 12 01:51 media/
drwxr-xr-x 2 root root 4096 Dec 12 01:51 mnt/
drwxr-xr-x 2 root root 4096 Dec 12 01:51 opt/
dr-xr-xr-x 187 root root 0 Jan 8 10:54 proc/
drwx------ 1 root root 4096 Jan 8 10:58 root/
drwxr-xr-x 1 root root 4096 Jan 8 10:58 run/
drwxr-xr-x 1 root root 4096 Dec 19 04:24 sbin/
drwxr-xr-x 2 root root 4096 Dec 12 01:51 srv/
dr-xr-xr-x 13 root root 0 Jan 8 10:54 sys/
drwxrwxrwt 1 root root 4096 Jan 8 10:40 tmp/
drwxr-xr-x 1 root root 4096 Dec 12 01:51 usr/
drwxr-xr-x 1 root root 4096 Dec 12 01:51 var/
root@e8f255e735f2:/# more HelloWorld.txt
Hello World !!!