コンテナ
クラウドプラットフォームで使うことが多い、コンテナ作成、起動、停止、削除、コンテナレジストリに登録、docker compose について基本操作を習得します。この後の「マイクロサービス 」でもコンテナがでてきます。
- 1 前提
- 2 コンテナ
- 2.1 Dockerfileによるコンテナイメージ作成と起動
- 2.1.1 作業用ディレクトリの作成
- 2.1.2 Dockerfileの作成
- 2.1.2.1 Dockerfileの中身
- 2.1.3 Dockerfileからコンテナイメージを作成
- 2.1.4 作成したコンテナイメージの確認
- 2.1.5 作成したコンテナイメージから、コンテナを起動
- 2.1.6 コンテナを停止
- 2.1.7 コンテナの削除
- 2.2 コンテナレジストリにイメージを登録
- 2.2.1 Docker Hub の場合
- 2.2.1.1 Docker Hub に登録
- 2.2.1.2 パブリックレポジトリの作成
- 2.2.1.3 docker login コマンドの実行
- 2.2.1.4 dockerhubにコンテナイメージを登録
- 2.2.1.4.1 登録したいコンテナイメージを名称変更
- 2.2.1.4.2 dockerhubにコンテナイメージを送信
- 2.2.1.4.3 Web画面で確認
- 2.2.1.5 dockerhubで公開したコンテナイメージを削除したい場合
- 2.2.1.6 他のひとが公開しているコンテナイメージをのぞいてみよう
- 2.2.1 Docker Hub の場合
- 2.3 Docker Compose による起動制御
- 2.3.1 ホームディレクトリに移動
- 2.3.2 作業ディレクトリの作成
- 2.3.3 Nginxの設定ファイルの作成
- 2.3.4 Nginxで読み込むHTMLファイルの作成
- 2.3.5 docker-compose.yml の作成
- 2.3.6 Docker Composeを使って、コンテナ起動
- 2.3.6.1 コンテナの起動
- 2.3.7 Docker Composeで起動した場合のコンテナ停止
- 2.3.8 Docker Composeで起動した場合のコンテナ削除
- 2.3.9 コンテナイメージの確認
- 2.1 Dockerfileによるコンテナイメージ作成と起動
- 3 コンテナ運用環境としてDockerを使うか、Kubernetesを使うか
- 4 ハンズオン
前提
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: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台のみ) | 組織内に数年以上担当できるインフラ管理運用の専用家がいない |
---|---|---|---|---|---|---|---|
Kubernetes | 〇 | 〇 | 〇 | 〇 | 〇 | △ | - |
Docker / Docker Compose | - | - | - | - | - | 〇 | 〇 |
ハンズオン
以下を実施せよ
Dockerfileをもとに、nginxが動くコンテナイメージを作る。
1で作成したコンテナイメージをDockerHubに登録する。
HTMLコンテンツを作成する。CSSやJavaScript等を含めるかは貴方次第。
Docker Composeを使って、2と3をもとにコンテナを起動する。
Webブラウザで、HTMLコンテンツにアクセスし、表示されていることを確認する。