Dockerfileを使用してカスタムDockerイメージを自動的に構築および構成する方法-パート3


このチュートリアルでは、ApacheサービスがインストールされたUbuntuに基づいてカスタムDockerイメージを構築する方法に焦点を当てます。プロセス全体は、Dockerfileを使用して自動化されます。

Dockerイメージは、Dockerfilesという名前のテキストファイルから自動的に作成できます。 Dockerファイルには、Dockerイメージの作成と構成に使用されるステップバイステップの順序付けられた命令またはコマンドが含まれています。

  • Install Docker and Learn Docker Container Manipulation – Part 1
  • Deploy and Run Applications under Docker Containers – Part 2

基本的に、Dockerファイルには、要件に基づいて特定のコンテナーを構築および構成するためのさまざまな命令が含まれています。次の手順が最もよく使用されますが、一部は必須です。

  1. FROM = Mandatory as the first instruction in a Docker file. Instructs Docker to pull the base image from which you are building the new image. Use a tag to specify the exact image from which you are building:
Ex: FROM ubuntu:20.04
  1. MAINTAINER = Author of the build image
  2. RUN = This instruction can be used on multiple lines and runs any commands after a Docker image has been created.
  3. CMD = Run any command when the Docker image is started. Use only one CMD instruction in a Dockerfile.
  4. ENTRYPOINT = Same as CMD but used as the main command for the image.
  5. EXPOSE = Instructs the container to listen on network ports when running. The container ports are not reachable from the host by default.
  6. ENV = Set container environment variables.
  7. ADD = Copy resources (files, directories, or files from URLs).

ステップ1:Dockerfileリポジトリの作成または書き込み

1.まず、将来ファイルを再利用して他のイメージを作成するために、ある種のDockerfileリポジトリを作成しましょう。 /var パーティションのどこかに空のディレクトリを作成します。ここで、新しいDockerイメージのビルドに使用される手順を使用してファイルを作成します。

# mkdir -p /var/docker/ubuntu/apache
# touch /var/docker/ubuntu/apache/Dockerfile

2.次に、次の手順でファイルの編集を開始します。

# vi /var/docker/ubuntu/apache/Dockerfile

Dokerfileの抜粋:

FROM ubuntu
MAINTAINER  your_name  <[email protected]>
RUN apt-get -y install apache2
RUN echo “Hello Apache server on Ubuntu Docker” > /var/www/html/index.html
EXPOSE 80
CMD /usr/sbin/apache2ctl -D FOREGROUND

それでは、ファイルの説明を見てみましょう。

最初の行は、Ubuntuイメージからビルドしていることを示しています。タグが送信されていない場合、たとえば14:10の場合、DockerHubの最新のイメージが使用されます。

2行目に、画像作成者の名前とメールアドレスを追加しました。次の2つのRUN行は、イメージのビルド時にコンテナーで実行され、Apacheデーモンをインストールして、デフォルトのApacheWebページにテキストをエコーします。

EXPOSE行はDockerコンテナにポート80でリッスンするように指示しますが、ポートは外部からは利用できません。最後の行は、コンテナーの開始後にフォアグラウンドでApacheサービスを実行するようにコンテナーに指示します。

3.最後に行う必要があるのは、以下のコマンドを発行してイメージの作成を開始することです。これにより、次に示すように、前に作成したDockerfileに基づいて ubuntu-apache という名前の新しいDockerイメージがローカルに作成されます。この例:

# docker build -t ubuntu-apache /var/docker/ubuntu/apache/

4. Dockerによってイメージが作成されたら、次のコマンドを発行して、使用可能なすべてのイメージを一覧表示し、イメージを識別できます。

# docker images

ステップ2:コンテナーを実行し、LANからApacheにアクセスする

5.コンテナを継続的に(バックグラウンドで)実行し、LAN内のホストまたは他のリモートマシンからコンテナに公開されたサービス(ポート)にアクセスするには、ホスト端末プロンプトで次のコマンドを実行します。

# docker run -d -p 81:80 ubuntu-apache

ここで、 -d オプションは ubuntu-apache コンテナをバックグラウンドで(デーモンとして)実行し、 -p オプションはコンテナポート80をマップしますローカルホストポート81に接続します。Apacheサービスへの外部LANアクセスには、ポート81を介してのみアクセスできます。

Netstatコマンドは、ホストがリッスンしているポートについてのアイデアを提供します。

コンテナーが開始された後、 docker ps コマンドを実行して、実行中のコンテナーのステータスを表示することもできます。

6. Webページは、ポート81のマシンIPアドレス、ローカルホスト、またはdocker netインターフェイスに対してcurlユーティリティを使用して、コマンドラインからホストに表示できます。IPコマンドラインを使用して、ネットワークインターフェイスのIPアドレスを表示します。

# ip addr               [List nework interfaces]
# curl ip-address:81    [System Docker IP Address]
# curl localhost:81     [Localhost]

7.ネットワークからコンテナのWebページにアクセスするには、リモートの場所でブラウザを開き、HTTPプロトコル、コンテナが実行されているマシンのIPアドレス、続いて次の画像に示すポート81を使用します。

http://ip-address:81

8.コンテナ内で実行されているプロセスの内部を取得するには、次のコマンドを発行します。

# docker ps
# docker top <name or ID of the container>

9.コンテナを停止するには、 docker stop コマンドに続けてコンテナIDまたは名前を発行します。

# docker stop <name or ID of the container>
# docker ps

10.コンテナにわかりやすい名前を割り当てる場合は、次の例に示すように、 -name オプションを使用します。

# docker run --name my-www -d -p 81:80 ubuntu-apache
# docker ps

これで、割り当てられた名前を使用するだけで、操作(start、stop、top、statsなど)のためにコンテナーを参照できます。

# docker stats my-www

ステップ3:Dockerコンテナーのシステム全体の構成ファイルを作成する

11. CentOS/RHELでは、他のローカルサービスの場合と同じように、systemd構成ファイルを作成してコンテナーを管理できます。

たとえば、次のコマンドを使用して、たとえば apache-docker.service という名前の新しいsystemdファイルを作成します。

# vi /etc/systemd/system/apache-docker.service

apache-docker.serviceファイルの抜粋:

[Unit]
Description=apache container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a my-www
ExecStop=/usr/bin/docker stop -t 2 my-www

[Install]
WantedBy=local.target

12.ファイルの編集が終了したら、ファイルを閉じ、systemdデーモンをリロードして変更を反映し、次のコマンドを発行してコンテナーを起動します。

# systemctl daemon-reload
# systemctl start apache-docker.service
# systemctl status apache-docker.service

これは、単純なDockerfileで実行できることの単純な例ですが、最小限のリソースと労力でほんの数秒で起動できる非常に高度なアプリケーションを事前に構築できます。

参考文献: