Docker 主に開発者とシステム管理者を対象としたオペレーティングシステムレベルの仮想化です。 Dockerを使用すると、分離された環境でのアプリケーションの作成とデプロイが簡単になります。 Dockerfile は、新しいDockerイメージを構築するためにDocker環境で順番に自動的に実行されるコマンドと命令のコレクションを含むスクリプトです。
このチュートリアルでは、dockerfileを使用して独自のDockerイメージを作成する方法を説明します。独自のdockerfileスクリプトを作成できるように、dockerfileスクリプトについて詳しく説明します。
前提条件
- Linuxサーバー-ホストマシンとしてUbuntu16.04を使用し、DockerベースイメージとしてUbuntu16.04を使用します。
- ルート権限。
- Dockerコマンドについて
Dockerfileコマンドの概要
dockerfileは、dockerfileコマンドとオペレーティングシステムコマンド(例:Linuxコマンド)のコレクションを含むスクリプトです。最初のdockerfileを作成する前に、dockerfileコマンドに精通している必要があります。
知っておく必要のあるdockerfileコマンドは次のとおりです。
FROM
新しいイメージを構築するためのベースイメージ。このコマンドは、dockerfileの上に配置する必要があります。
メンテナ
オプションで、画像の管理者の名前が含まれます。
実行
Dockerイメージのビルドプロセス中にコマンドを実行するために使用されます。
追加
ホストマシンから新しいDockerイメージにファイルをコピーします。ファイルにURLを使用するオプションがあり、dockerはそのファイルを宛先ディレクトリにダウンロードします。
ENV
環境変数を定義します。
CMD
Dockerイメージから新しいコンテナーを構築するときにコマンドを実行するために使用されます。
エントリポイント
コンテナの実行時に実行されるデフォルトのコマンドを定義します。
WORKDIR
これは、CMDコマンドを実行するためのディレクティブです。
ユーザー
イメージで作成されたコンテナのユーザーまたはUIDを設定します。
ボリューム
コンテナとホストマシン間のアクセス/リンクディレクトリを有効にします。
それでは、最初のdockerfileの作成を始めましょう。
サーバーにログインして、ソフトウェアリポジトリを更新します。
ssh [email protected]
apt-get update
次のaptコマンドを使用してdocker.ioをインストールします:
apt-get install docker.io
インストールが完了したら、Dockerサービスを開始し、起動時に開始できるようにします。
systemctl start docker
systemctl enable docker
Dockerがインストールされ、システムで実行されています。
このステップでは、dockerfileの新しいディレクトリを作成し、そのdockerfileで何をしたいかを定義します。
新しいディレクトリと、そのディレクトリ内に新しい空のdockerfileを作成します。
mkdir ~/myimages
cd myimages/
touch Dockerfile
次に、新しいカスタムイメージで何をしたいかを定義します。このチュートリアルでは、Ubuntu16.04ドッカーイメージを使用してNginxとPHP-FPM7をインストールします。さらに、Supervisordが必要なので、NginxとPHP-FPM7の両方を1つのコマンドで起動できます。
「Dockerfile」をvimで編集します:
nano Dockerfile
ファイルの先頭に、使用するベースイメージ(Ubuntu 16.04)を含む行を追加します。
#Download base image ubuntu 16.04
FROM ubuntu:16.04
「RUN」コマンドを使用して、dockerfile内のUbuntuソフトウェアリポジトリを更新します。
# Update Ubuntu Software repository
RUN apt-get update
次に、カスタムイメージに必要なアプリケーションをインストールします。 aptを使用してUbuntuリポジトリからNginx、PHP-FPM、Supervisordをインストールします。 NginxおよびPHP-FPMインストール用のRUNコマンドを追加します。
# Install nginx, php-fpm and supervisord from ubuntu repository
RUN apt-get install -y nginx php7.0-fpm supervisor && \
rm -rf /var/lib/apt/lists/*
この段階で、すべてのアプリケーションがインストールされ、それらを構成する必要があります。デフォルトの仮想ホスト構成を編集して、PHPアプリケーションを処理するためにNginxを構成します。新しい構成ファイルに置き換えるか、「sed」コマンドを使用して既存の構成ファイルを編集できます。
このチュートリアルでは、「COPY」dockerfileコマンドを使用して、デフォルトの仮想ホスト構成を新しい構成に置き換えます。
#Define the ENV variable
ENV nginx_vhost /etc/nginx/sites-available/default
ENV php_conf /etc/php/7.0/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}
次に、SupervisordforNginxおよびPHP-FPMを構成します。 'COPY'コマンドを使用して、デフォルトのSupervisord構成を新しい構成に置き換えます。
#Copy supervisor configuration
COPY supervisord.conf ${supervisor_conf}
次に、php-fpm sockファイル用の新しいディレクトリを作成し、/ var / www/htmlディレクトリと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"]
最後に、デフォルトのコンテナコマンド「CMD」を設定し、HTTPおよびHTTPSのポートを開きます。コンテナの起動時に、デフォルトの「CMD」コマンド用に新しいstart.shファイルを作成します。ファイルには「supervisord」コマンドが含まれており、「COPY」dockerfileコマンドを使用してファイルを新しいイメージにコピーします。
# Configure Services and Port
COPY start.sh /start.sh
CMD ["./start.sh"]
EXPOSE 80 443
ファイルを保存して終了します。
これが完全なDockerfileの一部です:
#Download base image ubuntu 16.04
FROM ubuntu:16.04
# Update Software repository
RUN apt-get update
# Install nginx, php-fpm and supervisord from ubuntu repository
RUN apt-get install -y nginx php7.0-fpm supervisor && \
rm -rf /var/lib/apt/lists/*
#Define the ENV variable
ENV nginx_vhost /etc/nginx/sites-available/default
ENV php_conf /etc/php/7.0/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"]
# Configure Services and Port
COPY start.sh /start.sh
CMD ["./start.sh"]
EXPOSE 80 443
これで、「Dockerfile」ディレクトリ内に、「default」という名前の仮想ホスト用の新しい構成ファイル、監視対象の構成ファイル「supervisord.conf」、およびサービス構成スクリプト「start.sh」を作成します。
vim default
デフォルトの仮想ホスト構成を以下に貼り付けます:
server {
listen 80 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.0-fpm.sock;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
監視対象の構成ファイル:
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 ;
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[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
; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[include]
files = /etc/supervisor/conf.d/*.conf
[program:php-fpm7.0]
command=/usr/sbin/php-fpm7.0 -F
numprocs=1
autostart=true
autorestart=true
[program:nginx]
command=/usr/sbin/nginx
numprocs=1
autostart=true
autorestart=true
Start.shファイル。
vim start.sh
以下に構成を貼り付けます:
#!/bin/sh
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
保存して終了
chmodコマンドでstart.shを実行可能にします:
chmod +x start.sh
ファイルを保存して終了します。
Dockerfileと必要なすべての構成ファイルが作成されました。これで、Ubuntu 16.04とdockerfileに基づいて、以下のdockerコマンドを使用して新しいdockerイメージを構築できます。
docker build -t nginx_image .
コマンドが正常に完了すると、以下のdockerコマンドを使用して新しいイメージ'nginx_image'を確認できます。
docker images
次に、nginx_imagesに基づいて新しいコンテナを作成してみます。また、新しいコンテナを作成する前に、ホストマシンにWebルートデータ用の新しいディレクトリを作成できます。
mkdir -p /webroot
次に、以下のコマンドを使用して新しいコンテナを実行します。
docker run -d -v /webroot:/var/www/html -p 80:80 --name hakase nginx_image
次に、「nginx_image」に基づくhakaseという名前の新しいコンテナが実行されていることを確認できます。
docker ps
注:
- -name hakase nginx_image =Dockerイメージ「nginx_images」に基づいて、「hakase」という名前の新しいコンテナを作成します。
- -p 80:80 =ホストマシンのポート80で実行されているhakaseコンテナ。
- -v / webroot:/ var / www / html =ホストマシンの/webrootディレクトリは、コンテナの/ var / www/htmlディレクトリを書き換えます。
nginx_imageに基づく新しいコンテナはエラーなしで実行されています。
echo:
を使用して/webrootディレクトリに新しいindex.htmlファイルを作成してみてください。echo '<h1>Nginx and PHP-FPM 7 inside Docker Container</h1>' > /webroot/index.html
ホストマシンのIPアドレスにアクセスしてcurlコマンドでテストします。
curl 192.168.1.250
curl -I 192.168.1.250
以下の結果が表示されます。
次に、ホストマシンの/ webrootディレクトリに新しいphpinfoファイルを作成して、PHP-FPM7.0が実行されていることをテストします。
echo '<?php phpinfo(); ?>' > /webroot/info.php
Webブラウザーを開き、ホストマシンのIPアドレスを入力します。
http://192.168.1.248/info.php
これで、phpinfoファイルの出力を確認できます。
新しいDockerイメージ「nginx_image」が正常に作成されました。これで、そのイメージに基づいてさらに多くのコンテナを作成できます。