コンテナ

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

前提

で説明している手順を用いて、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:lunar 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:focal」は、Ubuntu 23.04のコンテナを流用するという意味。UbuntuやCentOSなどのLinux関係はコンテナイメージとなっているものが多い。

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

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

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

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

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

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

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

実行結果

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

実行結果

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

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

起動確認

実行結果

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

コンテナを停止

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

コンテナの削除

不要なコンテナを削除することで、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 myuser1

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

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

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

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

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

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

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

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

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

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

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

例 docker push myuser1/my-nginx:lunar

Web画面で確認

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

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

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

例 docker rmi myuser1/my-nginx:lunar

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

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

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

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

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

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

Docker Compose による起動制御

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

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

作業ディレクトリの作成

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

Nginxの設定ファイルの作成

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

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

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

docker-compose.yml の作成

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

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

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

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

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

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

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

コンテナの起動

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

コンテナ起動の確認

実行結果

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 start」 を実行する。

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

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

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

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

コンテナイメージの確認

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

実行結果

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コンテンツにアクセスし、表示されていることを確認する。