Ubuntu 18.04 LTS でドッカーファイルを使用してドッカーイメージを作成する方法

Docker は、主に開発者とシステム管理者を対象としたオペレーティング システム レベルの仮想化です。Docker を使用すると、分離環境でアプリケーションを簡単に作成およびデプロイできます。

Dockerfile は、新しい Docker イメージを構築するためにドッカー環境で順番に自動的に実行されるコマンドと命令のコレクションを含むスクリプトです。

このチュートリアルでは、Dockerfile を使用して独自の Docker イメージを作成する方法を説明します。独自の Docker イメージを構築できるように、Dockerfile に関連する詳細を説明します。

前提 条件

このガイドでは、1GB の RAM、25 GB の空きディスク領域、および 2 つの CPU を搭載した Ubuntu 18.04 を使用します。また、カスタム Docker イメージを構築する基本イメージとして Ubuntu 18.04 を使用します。

ドッカーファイル コマンドの概要

Docker ファイルは、Docker イメージを構築するためのすべてのコマンドを含むスクリプトです。Docker ファイルには、’docker ビルド’ コマンドを使用して Docker イメージを作成するために使用されるすべての命令が含まれています。

最初の Dockerfile を作成する前に、Dockerfile 命令について理解しておく必要があります。あなたが知っている必要があるいくつかのDockerfile命令の下に。

FROM

作成する新しいイメージのベースイメージを設定します。FROM 命令は新しいビルド ステージを初期化し、Dockerfile の先頭に配置する必要があります。

LABEL

この命令を使用すると、バージョン、説明、メンテナンスなど、Docker イメージに関する追加情報を追加できます。LABEL 命令は、複数のラベルと複数行の値を追加できるキーと値のペアです。

RUN

この命令は、docker イメージのビルドプロセス中にコマンドを実行するために使用されます。Docker イメージに必要な追加パッケージをインストールできます。

ADD

ADD 命令は、ファイル、ディレクトリ、またはリモート ファイルを URL から Docker イメージにコピーするために使用されます。また、ファイルのデフォルトの所有権を設定することもできます。

ENV

ENV 命令は、ビルド・ステージで使用できる環境変数を定義するために使用され、インラインで多くの場合も置き換えることができます。

CMD

CMD 命令は、コンテナーの実行時に実行するデフォルト・コマンドを定義するために使用されます。Dockerfile には CMD 命令が 1 つだけ含まれ、複数の CMD がある場合は最後の CMD 命令が実行されます。

EXPOSE

この命令は、実行時に特定のネットワーク ポート上のコンテナー ポートを公開するために使用されます。公開される既定のプロトコルは TCP ですが、TCP と UDP のどちらを指定できます。

ARG

ARG 命令は、ユーザーが組み込み時に渡すことができる変数を定義するために使用されます。ビルド時にこの命令を使用するには、ビルド時に ‘–build-arg 変数=value’ オプションを使用し、Dockerfile を通過できます。また、ドッカーファイルで複数の ARG を使用することもできます。

ENTRYPOINT

ENTRYPOINT 命令は、コンテナーの実行時に実行される最初のデフォルト・コマンドを定義するために使用されます。ENTRYPOINT 命令を使用してアプリケーションを開始するコマンドを定義します。

WORKDIR

WORKDIR 命令は、Docker イメージのデフォルトの作業ディレクトリを定義するために使用されます。実行命令、CMD 命令、エントリーポイント、および追加命令は、WORKDIR 命令に従います。ドッカーファイルに複数の WORKDIR 命令を追加することができ、存在しない場合は自動的に作成されます。

USER

USER 命令は、イメージの実行時にデフォルトのユーザーまたは gid を定義するために使用されます。実行、CMD、およびエントリポイントは、ドッカーファイルのユーザー命令に従います。

VOLUME

コンテナとホスト マシン間のアクセス/リンクされたディレクトリを有効にするために使用される VOLUME 命令広告。

それでは、最初の Docker ファイルの作成を開始します。

ステップ 1 – Docker CE (コミュニティエディション) のインストール

Docker ファイルを作成する前に、私たちの Ubuntu 18.04 システムに Docker CE をインストールします。

Ubuntuパッケージインデックスを更新し、以下のaptコマンドを使用していくつかのパッケージをインストールしてください。

sudo apt update
sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

次に、公式 Docker リポジトリの GPG キーを追加します。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

次に、次のコマンドを使用して、Docker CE コミュニティ エディションリポジトリを追加します。

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

このコマンドは、パッケージインデックスを再度自動的に更新します。

次に、以下の apt コマンドを使用して Docker CE パッケージをインストールします。

sudo apt install docker-ce docker-ce-cli containerd.io

すべてのインストールが完了したら、Docker サービスを起動し、システム ブートに追加します。

systemctl start docker
systemctl enable docker

Docker サービスが起動して実行されている場合は、以下の docker コマンドを実行してインストールが正しいことを確認します。

docker run hello-world

以下はあなたが得る結果です。

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

見ることができるように、Docker から hello-world メッセージが表示され、Docker CE のインストールが正常に完了しました。

ステップ 2 – Dockerfile とその他の構成を作成する

この手順では、Dockerfile を使用してアプリケーション用のカスタム Docker イメージを構築する方法を示します。PHP-FPM と Nginx サービス用の Ubuntu 18.04 イメージに基づいて新しいカスタム Docker イメージを作成し、単純な phpinfo スクリプトを使用して新しいコンテナを実行します。

まず、新しいプロジェクト ディレクトリを作成し、空の Dockerfile を作成します。

mkdir -p nginx-image; cd nginx-image/
touch Dockerfile

ここで、独自のエディタを使用して ‘Dockerfile’ スクリプトを編集します (この例では vim を使用しています)。

vim Dockerfile

行の上部に、以下のように FROM 命令を使用して、ベースイメージ Ubuntu 18.04 イメージを追加します。

#Download base image ubuntu 18.04
FROM ubuntu:18.04

ここで、LABEL 命令を使用して、カスタム イメージに関する詳細情報を追加します。

# LABEL about the custom image
LABEL maintainer="[email protected]"
LABEL version="0.1"
LABEL description="This is custom Docker Image for \
the PHP-FPM and Nginx Services."

apt パッケージのインストールでは、環境変数 ‘DEBIAN_FRONTEND=非対話型’ を使用して、対話型のインストール後のステップをスキップします。

# Disable Prompt During Packages Installation
ARG DEBIAN_FRONTEND=noninteractive

次に、パッケージをインストールする前に’apt update’ コマンドを実行します。

# Update Ubuntu Software repository
RUN apt update

次に、Nginx、PHP-FPM、およびスーパーバイザパッケージをインストールします。すべてのインストールが完了したら、すべてのパッケージキャッシュを削除して、カスタムイメージのサイズを小さくします。

# Install nginx, php-fpm and supervisord from ubuntu repository
RUN apt install -y nginx php-fpm supervisor && \
    rm -rf /var/lib/apt/lists/* && \
    apt clean

カスタム イメージに渡すことができる新しい環境変数を定義します。

#Define the ENV variable
ENV nginx_vhost /etc/nginx/sites-available/default
ENV php_conf /etc/php/7.2/fpm/php.ini
ENV nginx_conf /etc/nginx/nginx.conf
ENV supervisor_conf /etc/supervisor/supervisord.conf

次に、Nginx のデフォルト設定を ‘nginx_vhost’ 変数にコピーし、PHP の構成 ‘cgi.fix_pathinfo=1’ を php.ini 構成ファイルの ‘cgi.fix_pathinfo=0′ に置き換えてから、’デーモンオフ’ オプションをデフォルトの ‘nginx_conf’ 変数に追加します。

# Enable PHP-fpm on nginx virtualhost configuration
COPY default ${nginx_vhost}
RUN sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' ${php_conf} && \
    echo "\ndaemon off;" >> ${nginx_conf}

カスタム スーパーバイザ構成を ‘supervisor_conf’ 変数にコピーします。

#Copy supervisor configuration
COPY supervisord.conf ${supervisor_conf}

PHP-FPM sock ファイル用の新しいディレクトリを作成し、ウェブルートディレクトリ ‘/var/www/html’ と PHP-FPM ディレクトリ ‘/run/php’ の所有権をデフォルトユーザーの「www-data」に変更します。

RUN mkdir -p /run/php && \
    chown -R www-data:www-data /var/www/html && \
    chown -R www-data:www-data /run/php

すべてのディレクトリをホストマシンにマウントできるように、カスタムイメージのボリュームを定義します。

# Volume configuration
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

次に、’start.sh’スクリプトを追加し、以下のようにCMD命令を使用してデフォルトのコンテナコマンドを定義します。

# Copy start.sh script and define default command for the container
COPY start.sh /start.sh
CMD ["./start.sh"]

最後に、EXPOSE 命令を使用して、コンテナーの既定の HTTP ポートと HTTPS ポートを開きます。

# Expose Port for the Application 
EXPOSE 80 443

保存して閉じます。

以下は、作成した完全な Dockerfile スクリプトです。

# Download base image ubuntu 18.04
FROM ubuntu:18.04

# LABEL about the custom image
LABEL maintainer="[email protected]"
LABEL version="0.1"
LABEL description="This is custom Docker Image for \
the PHP-FPM and Nginx Services."

# Disable Prompt During Packages Installation
ARG DEBIAN_FRONTEND=noninteractive

# Update Ubuntu Software repository
RUN apt update

# Install nginx, php-fpm and supervisord from ubuntu repository
RUN apt install -y nginx php-fpm supervisor && \
    rm -rf /var/lib/apt/lists/* && \
    apt clean
    
# Define the ENV variable
ENV nginx_vhost /etc/nginx/sites-available/default
ENV php_conf /etc/php/7.2/fpm/php.ini
ENV nginx_conf /etc/nginx/nginx.conf
ENV supervisor_conf /etc/supervisor/supervisord.conf

# Enable PHP-fpm on nginx virtualhost configuration
COPY default ${nginx_vhost}
RUN sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' ${php_conf} && \
    echo "\ndaemon off;" >> ${nginx_conf}
    
# Copy supervisor configuration
COPY supervisord.conf ${supervisor_conf}

RUN mkdir -p /run/php && \
    chown -R www-data:www-data /var/www/html && \
    chown -R www-data:www-data /run/php
    
# Volume configuration
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

# Copy start.sh script and define default command for the container
COPY start.sh /start.sh
CMD ["./start.sh"]

# Expose Port for the Application 
EXPOSE 80 443

次に、Nginx、スーパーバイザー、およびstart.shスクリプト用の新しい追加設定を作成します。

‘デフォルト’ Nginx 仮想ホストの構成には PHP-FPM のセクションが含まれます。実際には、カスタムイメージを使用してPHPスクリプトを実行できます。

エディタで新しい Nginx ‘default’ 仮想ホスト構成を作成します。

vim default

次の構成を貼り付けます。

server {
    listen 80 default_server;
 
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;
 
    server_name _;
 
    location / {
        try_files $uri $uri/ =404;
    }
 
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }
}

保存して閉じます。

次に、自動的に実行される Nginx と PHP-FPM プログラムの両方を含む ‘監視 rod.conf’ 構成を作成します。

エディタを使用して ‘監視ロド.conf’ ファイルを作成します。

vim supervisord.conf

次の構成を貼り付けます。

[unix_http_server]
file=/dev/shm/supervisor.sock   ; (the path to the socket file)
 
[supervisord]
logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)
user=root             ;

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
 
[supervisorctl]
serverurl=unix:///dev/shm/supervisor.sock ; use a unix:// URL  for a unix socket
 
[include]
files = /etc/supervisor/conf.d/*.conf
 
[program:php-fpm7.2]
command=/usr/sbin/php-fpm7.2 -F
numprocs=1
autostart=true
autorestart=true
 
[program:nginx]
command=/usr/sbin/nginx
numprocs=1
autostart=true
autorestart=true

保存して閉じます。

t=あなたのエディタを使用して’start.sh’スクリプトを作成すると、起動するスーパーバイザコマンドが含まれます。

vim start.sh

次の構成を貼り付けます。

#!/bin/sh
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf

保存して閉じます。

「start.sh」スクリプトを実行可能にします。

start.sh

その結果、カスタム Docker イメージのすべての構成が作成されました。

tree .

これで、これらの構成の新しいカスタム イメージ ベースを作成する準備ができました。

ステップ 3 – 新しいカスタムをビルドし、新しいコンテナーを実行します。

Docker カスタム イメージを作成するには、プロジェクト ディレクトリ ‘nginx-image’ に移動し、以下のように ‘docker ビルド’ コマンドを実行します。

docker build -t nginx-image .

このコマンドは、ベースイメージUbuntu 18.04をダウンロードし、’nginx-imageという名前の新しいカスタムイメージを作成します。

すべてのプロセスが完了したら、次のコマンドを使用して、システム上で使用可能な Docker イメージのリストを確認します。

docker image ls

以下はあなたが得る結果です。

見ることができるように、新しいカスタム Docker イメージ ‘nginx-image’ が作成されました。

次に、’nginx-image’ に基づいて新しい Docker コンテナーを実行します。

ローカルマシン上に、すべてのWebファイルを保存するために使用される「webroot」という名前の新しいディレクトリを作成します。

mkdir -p /webroot

次に、以下の docker run コマンドを使用して test-container という名前の新しいコンテナーを作成します。

docker run -d -v /webroot:/var/www/html -p 8080:80 --name test-container nginx-image

注記:

  • –name テストコンテナー nginx-image = ドッカーイメージ ‘nginx-image’ に基づいて、’test-container’ という名前の新しいコンテナを作成します。
  • -p 8080:80 = ホスト マシン上のポート 8080 で実行されているテスト コンテナー コンテナー。
  • -v /webroot:/var/www/html = ホストマシン上の /webroot ディレクトリは、コンテナ上の /var/www/html ディレクトリを書き換えます。

その後、次のコマンドを使用して、システム上のすべての実行中のコンテナーを確認します。

docker ps

以下はあなたが得る結果です。

その結果、’nginx-image’ に基づいて ‘test-container’ という名前の新しいコンテナが起動し、ポート 8080 を公開します。

ステップ 4 – テスト

コンテナが正しく動作していることを確認するために、ホストマシンのルートディレクトリに新しい index.html ファイルと phpinfo ファイルを作成します。’/webroot’ ディレクトリがコンテナディレクトリ ‘/var/www/html’ にマウントされているためです。

次のコマンドを使用して、’/webroot’ ディレクトリに index.html ファイルを作成します。

echo '<h1>Nginx and PHP-FPM 7.2 inside Docker Container with Ubuntu 18.04 Base Image</h1>' > /webroot/index.html

次に、ポート 8080 で curl コマンドを使用してコンテナにアクセスします。

curl server-ip:8080
curl -I server-ip:8080

その結果、先ほど作成したデフォルトの index.html ページが表示されます。

次に、’/webroot’ ディレクトリに新しい PHP ファイル ‘info.php’ を作成して、PHP-FPM サービスが実行されていることを確認します。

次のコマンドを使用して’info.php’ ファイルを作成します。

echo '<?php phpinfo(); ?>' > /webroot/info.php

次に、ウェブブラウザを開き、’info.php’ファイルのパスの後に続くポート’8080’を使用してサーバーのIPアドレスを入力します。

http://server-ip:8080/info.php

次のように phpinfo ページを取得します。

見ることができるように、’test-container’は正常にPHPスクリプトをロードされます。

その結果、新しいカスタム Docker イメージが正常に作成され、新しいコンテナーが実行され、エラーが発生します。

ソース