Dockerとは -Dockerの基本的な使い方-

前回はDockerの基本的な動作と操作方法をご説明しました。今回はもう少し実践的な使い方を紹介していきます。

コンテナイメージの作成(Build)

前回はDockerレジストリ(Docker Hub)上にあるイメージをそのまま実行しましたが、今回はコンテナイメージを作成してみます。コンテナイメージを作成するには次の情報が必要になります。

  • Dockerfile
  • コンテナに格納するプログラムなどのファイル

Dockerfileとは、コンテナを作成する手順が記載されているファイルで、Dockerfileに記載された手順に沿って、イメージが作成されます。

今回作成するイメージは、Docker Hubで配布されているUbuntuイメージに次の2つの対応を実施した新たなイメージを作成してみます。

  • opensshをインストールして、SSH接続できるようにする
  • 「HelloWorld.txt」というファイルを1つ追加する

コンテナイメージに格納するファイルと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イメージの作成は完了です。

コンテナの実行(Run)

それでは作成したイメージを実行してみます。

前回は、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 !!!

 

関連記事