GNU/Linux >> Linux の 問題 >  >> Ubuntu

Ubuntu20.04LTSでDockerfileを使用してDockerイメージを作成する方法

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

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

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

前提条件

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

Dockerfileコマンドの概要

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

最初のDockerfileを作成する前に、Dockerfile命令に精通している必要があります。知っておく必要のあるDockerfile命令の下。

FROM

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

ラベル

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

>

実行

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

追加

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

ENV

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

CMD

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

公開

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

ARG

ARG命令は、ユーザーがビルド時に渡すことができる変数を定義するために使用されます。この命令は、ビルド時に「--build-arg variable =value」オプションを使用して、dockerの「buildcommand」で使用でき、Dockerfileをパススルーできます。また、Dockerfileで複数のARGを使用できます。

エントリポイント

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

WORKDIR

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

ユーザー

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

ボリューム

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

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

ステップ1-Ubuntu20.04にDockerをインストールします

Dockerfileを作成する前に、UbuntuFocalFossaリポジトリでデフォルトで利用可能なUbuntu20.04システムにDockerをインストールします。

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

sudo apt update
sudo apt install docker.io

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

systemctl start docker
systemctl enable docker

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

systemctl status docker

DockerサービスはUbuntu20.04で稼働しています。

次に、以下の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メッセージが表示され、Ubuntu20.04へのDockerのインストールが正常に完了しました。

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

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

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

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

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

vim Dockerfile

行の先頭に、以下のようにFROM命令を使用して、ベースイメージのUbuntu20.04イメージを追加します。

#Download base image ubuntu 20.04
FROM ubuntu:20.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=noninteractive」を使用したインタラクティブなインストール後の手順をスキップします。

# Disable Prompt During Packages Installation
ARG DEBIAN_FRONTEND=noninteractive

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

# 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.4/fpm/php.ini
ENV nginx_conf /etc/nginx/nginx.conf
ENV supervisor_conf /etc/supervisor/supervisord.conf

次に、Nginxのデフォルト構成を「nginx_vhost」変数にコピーし、php.ini構成ファイルでPHP構成「cgi.fix_pathinfo=1」を「cgi.fix_pathinfo=0」に置き換えてから、「daemonoff」オプションを追加します。デフォルトの「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ファイル用の新しいディレクトリを作成し、web-rootディレクトリ'/ 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 20.04
FROM ubuntu:20.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.4/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、supervisord、およびstart.shスクリプトの新しい追加構成を作成します。

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

エディターを使用して、新しいNginxの「デフォルト」仮想ホスト構成を作成します。

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.4-fpm.sock;
    }
}

保存して閉じます。

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

エディタを使用して「supervisrod.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.4]
command=/usr/sbin/php-fpm7.4 -F
numprocs=1
autostart=true
autorestart=true
 
[program:nginx]
command=/usr/sbin/nginx
numprocs=1
autostart=true
autorestart=true

保存して閉じます。

次に、t =youreditorを使用して「start.sh」スクリプトを作成します。このスクリプトには、開始するためのsupervisordコマンドが含まれています。

vim start.sh

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

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

保存して閉じます。

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

chmod +x start.sh

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

tree .

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

ステップ3-新しいカスタムを作成して新しいコンテナを実行する

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

docker build -t nginx-image .

このコマンドは、ベースイメージのUbuntu 20.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 test-container nginx-image =docker image'nginx-image'に基づいて、'test-container'という名前の新しいコンテナーを作成します。
  • -p 8080:80=ホストマシンのポート8080で実行されているテストコンテナコンテナ。
  • -v / webroot:/ var / www / html=ホストマシンの/webrootディレクトリは、コンテナの/ var / www/htmlディレクトリを書き換えます。

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

docker ps

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

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

ステップ4-テスト

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

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

echo '<h1>Nginx and PHP-FPM 7.4 inside Docker Container with Ubuntu 20.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

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

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

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

ご覧のとおり、「test-container」はPHPスクリプトを正常にロードしています。

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


Ubuntu
  1. Dockerfileを使用してDockerイメージを作成する方法

  2. Ubuntu 22.04 /20.04LTSにDockerをインストールする方法

  3. Ubuntu16.04LTSでDockerfileを使用してDockerイメージを作成する方法

  1. UbuntuでDockerを使用してONLYOFFICE8.9.0をインストールする方法

  2. Ubuntu18.04LTSにDockerを使用してGitlabサーバーをインストールする方法

  3. Ubuntu18.04LTSでDockerfileを使用してDockerイメージを作成する方法

  1. Ubuntu20.04LTSにDockerを使用してGitLabをインストールする方法

  2. Ubuntu18.04LTSサーバーにDockerをインストールする方法

  3. Ubuntu18.04LTSでISOファイルを作成する方法