Docker · 4 min read · Nov 02, 2025

Ubuntu 22.04 LTSでDockerfileを使用してDockerイメージを作成する方法

Dockerは、主に開発者やシステム管理者を対象としたオペレーティングシステムレベルの仮想化です。Dockerは、隔離された環境でアプリケーションを構築およびデプロイするのを容易にします。

Dockerfileは、Docker環境内で自動的に1つずつ実行されるコマンドと指示のコレクションを含むスクリプトです。これにより、新しいDockerイメージが作成されます。

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

前提条件

このガイドでは、1GBのRAM、25GBの空きディスクスペース、2つのCPUを備えたUbuntu 22.04を使用します。また、カスタムDockerイメージを構築するためのベースイメージとしてUbuntu 22.04を使用します。

Dockerfileコマンドの紹介

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

最初のDockerfileを作成する前に、Dockerfileの指示に慣れておく必要があります。以下は、知っておくべきいくつかのDockerfileの指示です。

FROM

作成したい新しいイメージのベースイメージを設定します。FROM指示は新しいビルドステージを初期化し、Dockerfileの最上部に配置する必要があります。

LABEL

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

RUN

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

ADD

ADD指示は、ファイル、ディレクトリ、またはURLからのリモートファイルをDockerイメージにコピーするために使用されます。’src’から絶対パス’dest’にコピーします。また、ファイルのデフォルトの所有権を設定できます。

ENV

ENV指示は、ビルドステージ中に使用できる環境変数を定義し、多くの場所でインラインで置き換えることができます。

CMD

CMD指示は、コンテナを実行する際に実行されるデフォルトのコマンドを定義します。Dockerfileには1つのCMD指示のみを含める必要があり、複数のCMDがある場合は、最後のCMD指示が実行されます。

EXPOSE

この指示は、実行時に特定のネットワークポートでコンテナポートを公開します。公開されるデフォルトのプロトコルはTCPですが、TCPまたはUDPのいずれかを指定できます。

ARG

ARG指示は、ユーザーがビルド時に渡すことができる変数を定義するために使用されます。この指示を使用して、ビルド時に’–build-arg variable=value’オプションを使用してDockerの’build command’で使用できます。また、Dockerfileで複数のARGを使用できます。

ENTRYPOINT

ENTRYPOINT指示は、コンテナが実行されるときに実行される最初のデフォルトのコマンドを定義するために使用されます。ENTRYPOINT指示を使用してアプリケーションを起動するコマンドを定義します。

WORKDIR

WORKDIR指示は、Dockerイメージのデフォルトの作業ディレクトリを定義するために使用されます。RUN、CMD、ENTRYPOINT、およびADD指示はWORKDIR指示に従います。Dockerfileに複数のWORKDIR指示を追加できます。存在しない場合は、自動的に作成されます。

USER

USER指示は、イメージを実行する際のデフォルトのユーザーまたはgidを定義するために使用されます。RUN、CMD、およびENTRYPOINTはDockerfileのUSER指示に従います。

VOLUME

VOLUME指示は、コンテナとホストマシンの間でアクセス/リンクされたディレクトリを有効にするために使用されます。

それでは、最初のDockerfileを作成しましょう。

ステップ1 - Ubuntu 22.04にDockerをインストール

Dockerfileを作成する前に、Ubuntu 22.04システムにDockerをインストールします。これは、Ubuntuリポジトリにデフォルトで用意されています。

Ubuntuリポジトリのすべてのパッケージリストを更新し、以下のaptコマンドを使用してDockerをインストールします。

sudo apt update  
sudo apt install docker.io

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

systemctl start docker  
systemctl enable docker

次に、以下のコマンドを使用してDockerサービスを確認します。

systemctl status docker

Dockerサービスは、Ubuntu 22.04で稼働しています。

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メッセージが表示され、Ubuntu 22.04でのDockerインストールが正常に完了しました。

ステップ2 - Dockerfileとその他の設定を作成

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

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

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

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

nano Dockerfile

行の先頭に、FROM指示を使用してベースイメージUbuntu 22.04イメージを追加します。

# Download base image ubuntu 22.04  
FROM ubuntu:22.04

次に、LABEL指示を使用してカスタムイメージに関する詳細情報を追加します。

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

aptパッケージのインストール中に対話式のポストインストールステップをスキップするために、環境変数’DEBIAN_FRONTEND=noninteractive’を使用します。

# Disable Prompt During Packages Installation  
ARG DEBIAN_FRONTEND=noninteractive

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

# Update Ubuntu Software repository  
RUN apt update

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

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

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

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

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

# 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 "
daemon off;" >> ${nginx_conf}

カスタムsupervisord設定を’supervisor_conf’変数にコピーします。

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

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

RUN mkdir -p /run/php  
RUN chown -R www-data:www-data /var/www/html  
RUN 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 22.04  
FROM ubuntu:22.04  
  
# LABEL about the custom image  
LABEL maintainer="[email protected]"  
LABEL version="0.1"  
LABEL description="This is a custom Docker Image for PHP-FPM and Nginx."  
  
# Disable Prompt During Packages Installation  
ARG DEBIAN_FRONTEND=noninteractive  
  
# Update Ubuntu Software repository  
RUN apt update  
RUN apt upgrade -y  
  
# Install nginx, php-fpm and supervisord from ubuntu repository  
RUN apt install -y nginx php-fpm supervisor  
RUN rm -rf /var/lib/apt/lists/*  
RUN apt clean  
   
# Define the ENV variable  
ENV nginx_vhost /etc/nginx/sites-available/default  
ENV php_conf /etc/php/8.1/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 "
daemon off;" >> ${nginx_conf}  
   
# Copy supervisor configuration  
COPY supervisord.conf ${supervisor_conf}  
  
RUN mkdir -p /run/php  
RUN chown -R www-data:www-data /var/www/html  
RUN 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、supervisord、およびstart.shスクリプトの追加設定を作成します。

‘default’ Nginx仮想ホスト設定には、PHP-FPM用のセクションが含まれます。実際には、カスタムイメージを使用してPHPスクリプトを変更なしで実行できます。

エディタを使用して新しいNginx ‘default’仮想ホスト設定を作成します。

nano 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/php8.1-fpm.sock;  
    }  
}

保存して閉じます。

次に、NginxとPHP-FPMプログラムの両方を自動的に実行する’supervisord.conf’設定を作成します。

エディタを使用して’supervisord.conf’ファイルを作成します。

nano 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-fpm8.1]  
command=/usr/sbin/php-fpm8.1 -F  
numprocs=1  
autostart=true  
autorestart=true  
  
[program:nginx]  
command=/usr/sbin/nginx  
numprocs=1  
autostart=true  
autorestart=true

保存して閉じます。

次に、supervisordコマンドを開始する’start.sh’スクリプトを作成します。

nano start.sh

以下の設定を貼り付けます。

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

保存して閉じます。

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

chmod +x start.sh

その結果、カスタムDockerイメージのすべての設定が作成されました。以下は、作成したすべての設定です。

ls -la

これで、これらの設定に基づいて新しいカスタムイメージを作成する準備が整いました。

Dockerファイルのリスト

ステップ3 - 新しいカスタムをビルドし、新しいコンテナを実行

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

docker build -t nginx-image .

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

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

docker image ls

以下は、得られる結果です。

Dockerイメージの確認

ご覧のとおり、新しいカスタムDockerイメージ’nginx-image’が作成されました。

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

ローカルマシンで、すべてのウェブファイルを保存するために使用される新しいディレクトリ’/var/webroot’を作成します。

mkdir -p /var/webroot

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

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

注意:

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

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

docker ps

以下は、得られる結果です。

実行中のコンテナの確認

その結果、’nginx-image’に基づく新しいコンテナ’test-container’がポート8080を公開して稼働しています。

ステップ4 - テスト

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

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

echo '

Nginx and PHP-FPM 8.1 inside Docker Container with Ubuntu 22.04 Base Image

' > /var/webroot/index.html

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

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

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

Dockerイメージのテスト

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

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

echo '' > /var/webroot/info.php

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

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

これで、以下のようなphpinfoページが表示されます。

phpinfo

ご覧のとおり、’test-container’がPHPスクリプトを正常に読み込んでいます。

その結果、私たちは新しいカスタムDockerイメージを作成し、それに基づいて新しいコンテナをエラーなしで実行することに成功しました。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。