コンテナ

コンテナ

クラウドプラットフォームで使うことが多い、コンテナ作成、起動、停止、削除、コンテナレジストリに登録、docker compose について基本操作を習得します。この後の「マイクロサービス 」でもコンテナがでてきます。

前提

Dockerによるコンテナ体験(要仮想マシン) ( 関連 : 7.8 / 7.9 ) で説明している手順を用いて、Docker (Docker Engine)とDocker Compose をお手元のVM(仮想マシン)にインストールしてください。既にインストール済みの場合は、次に進んでください。

コンテナ

コンテナの開発環境としては、「Docker」が代表的です。コンテナの実行・運用としては、「Docker」の他に「Kubernetes」があります。「Kubernetes」も、Dockerで作成したコンテナを使いますので、コンテナの作り方を知っておくことは重要です。

Dockerfileによるコンテナイメージ作成と起動

コンテナの作成手段は2つ。稼働中のコンテナをイメージとして保存し再利用するか、Dockerfileから生成する方法があります。ここでは、Dockerfileについて説明します。Dockerfileをもとにコンテナイメージを作り、コンテナイメージを起動することで、コンテナが作成され、コンテナを使用できるようになります。

作業用ディレクトリの作成

既に同名のディレクトリ名が存在する場合は、別のディレクトリ名で作成してください。

mkdir work && cd work

Dockerfileの作成

nano Dockerfile

Dockerfileの中身

FROM ubuntu:jammy RUN DEBIAN_FRONTEND=noninteractive apt-get update -y RUN DEBIAN_FRONTEND=noninteractive apt-get install -y curl gcc git make language-pack-ja fontconfig fonts-ipafont RUN DEBIAN_FRONTEND=noninteractive fc-cache -fv RUN DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime RUN dpkg-reconfigure --frontend noninteractive tzdata RUN DEBIAN_FRONTEND=noninteractive apt-get upgrade -y RUN DEBIAN_FRONTEND=noninteractive apt-get install -y nginx CMD ["nginx", "-g", "daemon off;"]

1行目の「FROM ubuntu:jammy」は、Ubuntu 22.04のコンテナを流用するという意味。UbuntuやCentOSなどのLinux関係はコンテナイメージとなっているものが多い。

3~10行目は、VMなどでNginxをセットアップする際に使うコマンド。

12行目は、コンテナ起動時に、nginx を起動するコマンドのこと。

つまり、コンテナのメリットとは、人間が手作業で1つ1つ入力して実施しているコマンドの実行を、実施済みの状態のものを「イメージ(コンテナイメージ)」として構築し、いつでも実施済みの状態を作って共有できることにある。

「DEBIAN_FRONTEND=noninteractive」は、ソフトウェアのインストール時に、ダイアログボックスを表示しようとする場合があり、ダイアログボックスを呼び出さないようにするための処置。

時々、2行目あたりに書いて全体に適用させるようとする書き方もあるが、それは非推奨の書き方。推奨の書き方は、apt install の実行毎に付与する。

Dockerfileからコンテナイメージを作成

docker build -t my-nginx:jammy .

docker buildコマンドは、docker build -t 作成するコンテナイメージ名 : タグ名 . のルールで記述する。上記では、my-nginx までがコンテナイメージ名で、jammy がタグ名となる。

実行結果

[+] Building 91.7s (14/14) FINISHED docker:default

作成したコンテナイメージの確認

docker images

実行結果

REPOSITORY TAG IMAGE ID CREATED SIZE my-nginx jammy 428c5dcd8ca3 42 seconds ago 498MB

ここに出てくる、ubuntu は、Dockerfileで流用することを宣言した、Ubuntu 23.04のイメージのこと。IMAGE ID は人それぞれ違います。従ってコピペしても意味がありません。

作成したコンテナイメージから、コンテナを起動

docker run -itd -p 8080:80 --name my-nginx my-nginx:jammy

起動確認

docker ps -a

実行結果

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5056d0245da8 my-nginx:jammy "nginx -g 'daemon of…" 6 seconds ago Up 6 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp my-nginx

Webブラウザで、Docker環境に割り当てているIPアドレスを用い、http://Docker環境実行中のマシンのIPアドレス:8080 (例 http://192.168.127.20:8080 )にアクセスする。Linux環境でGUIが導入済みであれば、Webブラウザで、http://localhost:8080 でも良い。

コンテナを停止

docker stop my-nginx

不要になったコンテナを停止する。また使うことがあるのであれば、削除せずに残しておいてもよい。

コンテナの削除

docker rm my-nginx

不要なコンテナを削除することで、Docker実行環境の容量を節約。コンテナを削除しても、コンテナイメージは残っているので、docker run で起動し直すことができる。

コンテナレジストリにイメージを登録

Docker Hub の場合

Docker Hub に登録

https://hub.docker.com/ にアクセス、「Docker ID」「Email」 「Password」を入力し、「I agree to the Subscription Service Agreement, Privacy Policy and Data Processing Terms.」と「私はロボットではありません」にチェックした後、「Sign Up」をクリックします。

入力したユーザー名(=Docker ID)もしくはメールアドレスを入力し、「Continue」をクリックします。次に表示される画面で「パスワード」を入力し、ログインします。

利用プランを選びます。無料プランはPersonalプランの「Start now」をクリックします。以下の画面は、https://www.docker.com/pricing/ に直接アクセスすることもできます。無料のPersonalプランで、公開(パブリック)リポジトリを作成することができます。

「[Docker] Please confirm your email address」という件名のメールが届きますので開きます。

メールを開き、「Verify email address」をクリックします。

以後、https://hub.docker.com/ にアクセスする表示される、画面右上の「Sign In」からログインすることができます。

パブリックレポジトリの作成

「dockerhub」の管理画面が表示されます。画面右下の「Create a Repository」をクリックします。

既にレポジトリを作成済みの場合は、https://hub.docker.com/repositories/dockerhubsのユーザー名 とすることで、レポジトリ一覧が表示され、そこから「Create a Repository」を行うこともできます。

「Create a Repository」画面が表示されます。

レポジトリ名を入力します。ここでは、「my-nginx」としています。また、「Public」を選択します。その後、「Create」をクリックします。my-nginxという公開レポジトリを作ることになります。

レポジトリが作成されます。「docker push」を使うことで、作成したコンテナイメージを、dockerhubに登録することができます。

docker login コマンドの実行

次のコマンドを実行し、dockerコマンドを実行可能なターミナルアプリから、dockerhubに接続します。

docker login --username dockerhubのユーザー名(Docker ID)

例 docker login --username myuser1

パスワードの入力が求められますので、dockerhubのパスワードを入力し、Enterキーを押します。

Password:

ログインが成功すると、次のように表示されます。

Login Succeeded

dockerhubにコンテナイメージを登録

登録したいコンテナイメージを名称変更

作成済みのイメージ名が、dockerhubに作成したレポジトリ名を一致している必要があります。例えは、dockerhubのユーザ名が、myuser1 だとすると、イメージ名は、myuser1/レポジトリ名 のようになっていなければなりません。ここでは、コンテナのイメージ名を「my-nginx」、タグ名は「lunar」、dockerhubのレポジトリ名を「dockerhubのユーザー名/my-nginx」となるように名称変更を行います。

docker images

作成済みのイメージIDを取得できます。コンテナのイメージIDは、「IMAGE ID」に表示されます。IMAGE IDは、人によってそれぞれ異なりますので注意してください。

REPOSITORY TAG IMAGE ID CREATED SIZE my-nginx jammy 428c5dcd8ca3 6 minutes ago 498MB

ここでは、my-nginxのIMAGE IDが、428c5dcd8ca3 となっています。IMAGE ID は人それぞれ違いますから、自分のIMAGE IDを使います。コピペしても意味がありません。このIMAGE IDを使用します。docker images コマンドによって取得でき、人によってそれぞれ異なりますので注意してください。

docker tag コマンドを使って、コンテナイメージの名称変更を行います。「dockerhubのユーザー名」の箇所は、それぞれのdockerhubのユーザー名に置き換えてください。

docker tag IMAGE ID dockerhubsのユーザー名/my-nginx:タグ名

例 docker tag 428c5dcd8ca3 myuser1/my-nginx:jammy

dockerhubにコンテナイメージを送信

次のコマンドを実行します。

docker push dockerhubsのユーザー名/my-nginx:タグ名

例 docker push myuser1/my-nginx:jammy

Web画面で確認

dockerhubのWeb画面で作成済みのレポジトリにアクセスします。URLで直接アクセスする場合は、https://hub.docker.com/repository/docker/dockerhubsユーザ名/レポジトリ名/general でアクセスすることができます。 「Tags」に、「jammy」というタグがあることがわります。「jammy」をクリックしましょう。

スクリーンショット 2024-07-09 9.05.27.png

コンテナイメージが送信され登録された公開レポジトリに、作成したコンテナイメージが登録されていることがわかります。

dockerhubで公開したコンテナイメージを削除したい場合

docker rmi dockerhubsのユーザー名/my-nginx:タグ名

例 docker rmi myuser1/my-nginx:jammy

他のひとが公開しているコンテナイメージをのぞいてみよう

dockerhubには、様々なアプリケーションのコンテナイメージがあり、またdockeriflle等のコンテナ作成に必要なファイルが公開されていますから、コンテナ作成やコンテナイメージの作成のために、真似をすることができます。

技術力の向上手段として、昔ながらの伝統的な手法は、真似や写経です。プログラミングスクールや大学が一般的ですらなかった頃から、技術力を手軽に無料で向上させる手段として、今なお活用されています。

たとえば、Redmineの場合 >> https://hub.docker.com/_/redmine

表示されている英語のドキュメントを読めば、内部構造を把握する糸口になります。

「Supported tags and respective Dockerfile links」下に表示されているタグ名をクリックすることで、Dockerfileを参照することができます。

Docker Compose による起動制御

ホームディレクトリに移動

cd /home/user1/

user1 はLinuxで使っているユーザー名です。各自のユーザー名に読み替えてください。

作業ディレクトリの作成

work1について、既に同名のディレクトリ名が存在する場合は、別のディレクトリ名で作成してください。

mkdir work1 && cd work1 mkdir src mkdir -p nginx/conf.d

Nginxの設定ファイルの作成

nano nginx/conf.d/default.conf

default.confの中身は、次の内容になります。Nginxの設定ファイルのことで、docker-compose.yml を実行し、コンテナを起動する際に読み込みます。起動するコンテナで、実行します。

server { listen 80; server_name localhost; location / { root /var/www/html; index index.html index.htm; } }

Nginxで読み込むHTMLファイルの作成

以下のコマンドは、Linux環境上で実行することを想定しているので、MacやWindows上で作成する場合は、Visaul Studio Codeなどのエディタを使い、作業ディレクトリ下に、src ディレクトリを作り、その下に、index.html を保存するようにしましょう。以下のコマンドを使って作業した場合と同じになります。

nano src/index.html

index.htmlの中身は、次の内容になります。docker-compose.yml を実行し、起動するコンテナで、HTMLファイルを実行します

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Hello Container</title> </head> <body> <div>Hello World!</div> </body> </html>

docker-compose.yml の作成

コンテナを制御するための定義ファイルです。

nano docker-compose.yml

docker-compose.ymlの中身は、次の内容になります。

version: "3.8" services: nginx: image: dockerhubのユーザー名/my-nginx:タグ名(例 my-nginx:jammy) container_name: my-nginx2 hostname: localhost ports: - 8080:80 volumes: - ./nginx/log:/var/log/nginx - ./nginx/conf.d:/etc/nginx/conf.d - ./src:/var/www/html

4行目のimage のところは、自分のdockerhubのユーザー名に書き換えること。

11行目で、nginx/conf.dディレクトリ に作成したnginxの設定ファイルを読み込み、コンテナ内の/etc/nginx/conf.d に配置している。

12行目で、srcディレクトリに作成した、HTMLファイルを読み込み、コンテナ内の/var/www/html に配置している。

Docker Composeを使って、コンテナ起動

次のコマンドを実行します。

コンテナの起動

docker compose up -d

もし、docker-compose.ymlのファイル名が別のファイル名で、docker-compose-test.yml のような場合は、次のコマンドを実行することで、コンテナを起動することができる。-f をつけることで、docker-compose.ymlに相当する定義ファイルを指定している。

docker compose -f docker-compose-test.yml up -d

コンテナ起動の確認

docker ps -a

実行結果

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6d1965ec0367 dockerhubsのあなたのユーザ名/my-nginx:lunar "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp, :::8080->80/tcp my-nginx2

Webブラウザで、Docker環境に割り当てているIPアドレスを用い、http://Docker環境実行中のマシンのIPアドレス:8080 (例 http://192.168.127.20:8080 )にアクセスする。Linux環境でGUIが導入済みであれば、Webブラウザで、http://localhost:8080 でも良い。

Docker Composeで起動した場合のコンテナ停止

docker-compose.yml があるディレクトリで、次のコマンドを実行します。

docker compose stop

不要になったコンテナを停止する。また使うことがあるのであれば、削除せずに残しておいてもよい。再起動する場合は、「docker compose start」 を実行する。

なお、コンテナ起動に使用した定義ファイルが、docker-compose-test.yml のように、docker-compose.yml とは異なる場合は、定義ファイルを指定しないとコンテナの停止ができない。

docker compose -f docker-compose-test.yml stop

Docker Composeで起動した場合のコンテナ削除

次のコマンドを実行します。

docker compose down

なお、コンテナ起動に使用した定義ファイルが、docker-compose-test.yml のように、docker-compose.yml とは異なる場合は、定義ファイルを指定しないとコンテナの停止ができない。

docker compose -f docker-compose-test.yml down

コンテナイメージの確認

次のコマンドを実行します。

docker images

実行結果

REPOSITORY TAG IMAGE ID CREATED SIZE my-nginx lunar 428c5dcd8ca3 About an hour ago 498MB dockerhubsのあなたのユーザ名/my-nginx lunar 428c5dcd8ca3 About an hour ago 498MB

dockerhubから取得したコンテナイメージがあることがわかります。IMAGE ID は人それぞれ違います。

コンテナ運用環境としてDockerを使うか、Kubernetesを使うか

これはいくつかの基準があります。以下は、Kubernetesの代表的なメリットを示したものです。自動スケール、ローリングアップデート、自動復旧、マルチクラウド構成のいずれかが必要であれば、Dockerを使ってコンテナ運用するよりも、Kubernetesを使う方が良いです。

コンテナ運用環境としての利用

自動スケールが必要 ( 急なアクセスが増えても耐えられるようにするかどうか )

ローリングアップデートが必要 ( メンテナンス時間を設けず、動かしながらバージョンアップ )

自動復旧が必要 ( 問題が起きてコンテナがダウンしても、人がいなくても自動で元の状態に戻る )

マルチクラウド構成を行う

新しい機能を頻繁に提供する ( ゲームやECサイト、フリマアプリなどはありがち )

シングルインスタンス (運用に使えるサーバー1台のみ)

組織内に数年以上担当できるインフラ管理運用の専用家がいない

コンテナ運用環境としての利用

自動スケールが必要 ( 急なアクセスが増えても耐えられるようにするかどうか )

ローリングアップデートが必要 ( メンテナンス時間を設けず、動かしながらバージョンアップ )

自動復旧が必要 ( 問題が起きてコンテナがダウンしても、人がいなくても自動で元の状態に戻る )

マルチクラウド構成を行う

新しい機能を頻繁に提供する ( ゲームやECサイト、フリマアプリなどはありがち )

シングルインスタンス (運用に使えるサーバー1台のみ)

組織内に数年以上担当できるインフラ管理運用の専用家がいない

Kubernetes

-

Docker / Docker Compose

-

-

-

-

-

ハンズオン

以下を実施せよ

  1. Dockerfileをもとに、nginxが動くコンテナイメージを作る。

  2. 1で作成したコンテナイメージをDockerHubに登録する。

  3. HTMLコンテンツを作成する。CSSやJavaScript等を含めるかは貴方次第。含めれば評価は高まるかもしれない。

  4. Docker Composeを使って、2と3をもとにコンテナを起動する。

  5. Webブラウザで、HTMLコンテンツにアクセスし、表示されていることを確認する。