diff --git a/src/development/docker/docker-compose/README.md b/src/development/docker/docker-compose/README.md index a3c1a3b2..951abc88 100644 --- a/src/development/docker/docker-compose/README.md +++ b/src/development/docker/docker-compose/README.md @@ -12,16 +12,17 @@ prior_knowledge: docker ## 事前準備 -* この講義では ```docker compose (docker-compose)```はコマンドを使います。 -* 環境ごとに インストール方法が異なるので、 以下の通り導入しておいてください。 -* インストールが完了したら下記コマンドを実際に入力し、コマンドが実行できるか確認してください。 - -```bash -$ docker compose version -``` +この講義では ```docker compose (docker-compose)```はコマンドを使います。 +従って講義を受けるにあたり、**docker comose(docker-compose)**のインストールを済ませておいてください +- 環境ごとに インストール方法が異なるので、自身の環境に合わせて導入してください。 +- インストールが完了したら下記コマンドを実際に入力し、コマンドが実行できるか確認してください。 + ```bash + $ docker compose version + ``` ### Windows, macOS向け + * [ハンズオン事前準備](https://iij.github.io/bootcamp/init/hello-bootcamp/) で Docker Desktop for Windowsや、Docker Desktop for Mac を導入済みであれば、すでにインストールされているはずです。 ### Linux向け @@ -32,18 +33,44 @@ $ docker compose version ## Docker Compose 概要 -Docker Compose とは、複数のコンテナから構成されるようなアプリケーションの管理をしやすくしたものです。 -Docker Compose を利用することで、各コンテナの起動・停止が一括して行えたり、後述する1つの設定ファイルに各コンテナの情報を記述するため可視性が高くなり管理もしやすくなります。 -また、各コンテナ間のネットワークや依存関係も設定ファイルとして管理することが出来る点も利点です。 - -例えば、以下の2つのコンポーネントから構成されるWebサービスをDockerコンテナを用いた場合を想定してみましょう。 +Docker composeは、Dockerコンテナを管理し、複数のコンテナから成るアプリケーションを定義、実行、管理するためのツールです。 +Docker composeを使用することで、複数のDockerコンテナを1つのアプリケーションとして簡単に扱うことができます。 +Docker composeの主な機能は以下の通りです。 + +- アプリケーションの定義 + - docker-composeでは、YAML形式のファイルである`docker-compose.yml`を使用して、アプリケーションの構成やサービスの定義を行います。 + - このファイルには、各コンテナのイメージ、ポートマッピング、環境変数、ボリュームのマウントなど、アプリケーションの構成情報が含まれます。 +- 複数コンテナの一括管理 + - docker-composeは、複数のコンテナを一括して管理するためのコマンドを提供します。 + - 例えば`docker-compose up`コマンドを実行すると、`docker-compose.yml`に定義されたすべてのコンテナが起動します。 + - 同様に`docker-compose stop`コマンドを使用すると、`docker-compose.yml`に定義されたすべてのコンテナが停止されます。 +- サービス間の依存関係の管理 + - docker-composeでは、複数のコンテナ間の依存関係を簡単に管理することができます。 + - 例えば、アプリケーションがデータベースコンテナとWebサーバーコンテナから成る場合、データベースが正しく起動した後にWebサーバーが起動するようにする、といったことができます +- 環境変数とシークレットの管理 + - docker-composeでは、環境変数やシークレットの値を`docker-compose.yml`ファイルに定義することができます + - これにより、アプリケーションの設定情報や機密情報を簡単かつ安全に管理することができます。 +- スケーリングと更新 + - docker-composeを使用すると、アプリケーションのスケーリングや更新も簡単に行うことができます。 + - 例えば、`docker-compose scale`コマンドを使用すると、特定のサービスのコンテナ数をスケールアップまたはスケールダウンすることができます。また、新しいイメージのビルドや既存のコンテナの更新もdocker-composeコマンドで行うことができます。 + +このようにdocker-composeを使用することで、開発、テスト、本番環境など、さまざまな環境でアプリケーションを簡単かつ一貫して管理することができます。 + +### 依存関係を用いたDocker compose の使い方 + +前項で説明したように以下の2つのコンポーネントから構成されるWebサービスをDockerコンテナを用いた場合を想定してみましょう。 - フロントエンド(Flask) - バックエンド(Rails) 通常、この構成のWeb サービスを起動する際、各コンテナを立ち上げるため、`docker run` コマンドを2回実行する必要がでてきます。従って停止する際も同様に2回の操作が必要です。 -しかし、Docker Compose を用いて管理を行うと、各コンテナの定義をした設定ファイルである「**docker-compose.yml**」に基づいて一括管理することが可能となります。具体的には、上記の各コンテナの起動・停止などは、`docker compose` コマンドを1回実行するだけで済みます。また、コンテナの起動順序も適切な順番で起動することが可能となります。特に開発する際やテストなどの際には、サービスの起動停止は複数回繰り返したりすることも考えられるため効率化につながります。 +しかし、Docker Compose を用いて管理を行うと、各コンテナの定義をした設定ファイルである「**docker-compose.yml**」に基づいて一括管理することが可能となります。 +具体的には、上記の各コンテナの起動・停止などは、`docker compose` コマンドを1回実行するだけで済みます。 + +また、コンテナの起動順序も先にデータベースを起動し、後からWebサーバを起動する、といったように適切な順番で起動することが可能となります。 + +これらは特に開発やテストなどの際に、サービスの起動停止は複数回繰り返したりする為、作業の効率化につながります。 本講義では、実際に複数コンテナをDocker Composeを用いて管理を行っていきます。Docker Composeを使ったアプリケーションを実行するまでの一般的な流れは以下の通りです。 @@ -53,13 +80,13 @@ Docker Compose を利用することで、各コンテナの起動・停止が そこで本講義でも上記の流れに沿って講義を進めていきます。 -## Docker Compose 演習 +## Docker Compose 演習1 本章では、実際に`docker compose` コマンドを使って複数コンテナの立ち上げや停止などをしていただきます。 今回題材のサービスは、Python製のWebAPIフレームワークとしてFlask を利用したWebアプリケーションです。 Webアプリケーション自体の作成は本質ではないので、サンプルコードをそのまま利用していただきます。Web アプリケーションの機能は以下の2点です。 -それぞれファイルは以下のように配置してください +作業の過程で作成・取得するそれぞれのファイルは以下のように配置してください ```bash . @@ -69,66 +96,42 @@ Webアプリケーション自体の作成は本質ではないので、サン └── requirements.txt ``` -### サンプルアプリケーションの作成 - -テキストエディタを開き `app.py` というpythonコードを書きます - -```python -import time - -import redis -from flask import Flask - -app = Flask(__name__) -cache = redis.Redis(host="redis", port=6379) - - -def get_hit_count(): - retries = 5 - while True: - try: - return cache.incr("hits") - except redis.exceptions.ConnectionError as exc: - if retries == 0: - raise exc - retries -= 1 - time.sleep(0.5) +### 1-1. サンプルアプリケーションの作成 +今回は Docker composeの項であるため Pythonアプリケーションについては言及しません。 +アプリケーションはそれぞれ以下から取得してください。 -@app.route("/") -def hello(): - count = get_hit_count() - return "Hello IIJBootcamp ! I have been seen {} times.\n".format(count) +```bash + curl https://raw.githubusercontent.com/iij/bootcamp/master/src/development/docker/docker-compose/solution/app.py -O app.py ``` -続いてアプリケーションの実行に必要なモジュールリストファイル `requirements.txt` を作ります。 - -```text -flask -redis +```bash + curl https://raw.githubusercontent.com/iij/bootcamp/master/src/development/docker/docker-compose/solution/requirements.txt -O requirements.txt ``` -### Dockerfile の作成 +### 1-2. Dockerfile の作成 -この節では、前述したコンテナのDockerfile を作成します。Dockerfile の作成については、前講義「Docker を触ってみよう」で行いましたので、各命令などの詳細な説明は割愛します。 +この節では、前述したコンテナのDockerfile を作成します。 +Dockerfile の作成については、前講義「Docker を触ってみよう」で行いましたので、各命令などの詳細な説明は割愛します。 以下の内容をファイル名「Dockerfile」で作成してください。 ```Dockerfile -# syntax=docker/dockerfile:1 -FROM python:3.7-alpine +FROM python:3.11-slim WORKDIR /code + ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 -RUN apk add --no-cache gcc musl-dev linux-headers + COPY requirements.txt requirements.txt RUN pip install -r requirements.txt + EXPOSE 5000 -COPY . . +COPY app.py app.py CMD ["flask", "run"] ``` -### 2.2 docker-compose.yml の作成と解説 +### 1-3. docker-compose.yml の作成と解説 次に、以下の内容をファイル名「docker-compose.yml」で新規作成してください。 @@ -138,11 +141,31 @@ services: web: container_name: iijbootcamp-flask build: . + # networks: + # - iijbootcamp ports: - "8088:5000" + # volumes: + # - ./index /app/index + logging: + driver: "json-file" # defaults if not specified + options: + max-size: "1m" + max-file: "30" redis: container_name: iijbootcamp-backend image: "redis:alpine" + # networks: + # - iijbootcamp + logging: + driver: "json-file" # defaults if not specified + options: + max-size: "1m" + max-file: "30" + +# networks: +# iijbootcamp: +# external: true ``` では、ファイルの各設定について見ていきたいと思います。 @@ -165,7 +188,7 @@ services: その他詳しい機能について知りたい方は、[公式のリファレンス](https://docs.docker.com/compose/compose-file/)をご参照ください。 -### 2.4 docker compose コマンド +### 1-4. docker compose コマンドを用いて起動する では、必要なものはすべて揃ったので、「docker-compose.yml」が存在するディレクトリで、以下のコマンドを入力してください。 @@ -176,61 +199,100 @@ $ docker compose up 初回実行時は必要な image の取得や Dockerfile.backend を利用した docker build などが実行されるため、時間がかかります。 -また、もし プロキシ 環境下で 正常に go get が成功しない場合は 以下のように ```docker compose build``` してから試してみてください。 +また、もし プロキシ 環境下で 正常に apk 等が成功しない場合は 以下のように ```docker compose build``` してから試してみてください。 ```bash $ docker compose build --build-arg https_proxy=http://: $ docker compose up ``` - - -`docker compose up` コマンドは、docker-compose.yml ファイルに基づきコンテナを新規作成し、起動するコマンドです。`-d` オプションを利用することで、デーモンとして起動することも可能です。デーモンで起動している際は、ログが表示されなくなってしまうので、見たい場合は`docker compose logs` コマンドで閲覧可能です。また、`-f` オプションを渡すことで、ログを流し続けることができます。 +`docker compose up` コマンドは、docker-compose.yml ファイルに基づきコンテナを新規作成し、起動するコマンドです。 +`-d` オプションを利用することで、デーモンとして起動することが可能です。 +デーモンで起動している際は、ログが表示されなくなってしまうので、見たい場合は`docker compose logs` コマンドで閲覧可能です。 +また、`-f` オプションを渡すことで、ログを流し続けることができます。 別のターミナル環境を開いて、「docker-compose.yml」が存在するディレクトリ で以下のコマンドを入力してください。 ```bash $ docker compose ps +``` + +
実行例 + +``` NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS iijbootcamp-backend redis:alpine "docker-entrypoint.s…" redis 8 seconds ago Up 7 seconds 6379/tcp iijbootcamp-flask solution-web "flask run" web 8 seconds ago Up 7 seconds 0.0.0.0:8088->5000/tcp, :::8088->5000/tcp ``` +
`docker compose ps` コマンドでは、Docker Compose で管理してる各コンテナの状態を一覧で見ることができます。「State」が「Up」になっていれば立ち上がっている状態です。その他のカラムは`docker ps` の意味と同様です。 -#### Webアプリケーションの動作確認方法 +#### 1-5. Webアプリケーションの動作確認方法 無事に起動できたならば `http://localhost:8088`にて画面が表示される為、ブラウザでアクセスしてみてください。 内部では表示回数をカウントしているため、リロードなどをする度に数が増える事でしょう。 -## 3. Docker のネットワーク +## 演習2 Docker のネットワークを確認する -前章では、Docker Composeでコンテナ間接続を体験しました。本章では、Docker がどのようにしてネットワークを構築し、ホストとコンテナやコンテナ間を接続しているのかをご紹介します。まずは、以下のコマンドを実行してみてください。 +前章では、Docker Composeでコンテナ間接続を体験しました。 +本章では、Docker がどのようにしてネットワークを構築し、ホストとコンテナやコンテナ間を接続しているのかをご紹介します。 + +### 2-1. docker network ls + +`docker network` コマンドは、Docker ネットワークを管理するためのコマンドです。 +`ls` サブコマンドは、Docker が把握しているすべてのネットワーク一覧を表示するコマンドです。 +Docker をインストールすると、自動的に以下の名前の3つのネットワークを作成します。 + +1. bridge +2. none +3. host + +`docker run` コマンドを実行する際に、`--net` オプションで、これらの値を設定することができます。 +デフォルト値では、`bridge` になっています。Docker がインストールされた今回の環境では、ホストに「**docker0**」というブリッジネットワークが表れます。 +これが「bridge」に接続されており、Docker はデフォルトでこのネットワークにコンテナを接続します。 +そのため、ホストからコンテナへの接続やコンテナ間の接続が可能となります。`none` は、ネットワークの接続を必要としないコンテナを作成する際に利用します。 +`host` は、コンテナがホストと同じインタフェースやIPアドレスを持たせたい際に利用します。 + +上記結果の中で、「default」で終わるネットワークは、`docker compose` コマンドによって自動的に作成されたネットワークのことです。「default」の前には、プロジェクト名(docker-compose.ymlファイルが存在するディレクトリ名)が利用されます。 + +それでは、以下のコマンドを実行してみてください。 ```bash $ docker network ls +``` + +
実行例 + +``` NETWORK ID NAME DRIVER SCOPE 420d7b4e475a bridge bridge local 24bd91406a30 docker-compose_default bridge local 7b99e3f7a971 host host local f70accdb164f none null local ``` +
-`docker network` コマンドは、Docker ネットワークを管理するためのコマンドです。`ls` サブコマンドは、Docker が把握しているすべてのネットワーク一覧を表示するコマンドです。 -Docker をインストールすると、自動的に以下の名前の3つのネットワークを作成します。 -1. bridge -2. none -3. host -`docker run` コマンドを実行する際に、`--net` オプションで、これらの値を設定することができます。デフォルト値では、`bridge` になっています。Docker がインストールされた今回の環境では、ホストに「**docker0**」というブリッジネットワークが表れます。これが「bridge」に接続されており、Docker はデフォルトでこのネットワークにコンテナを接続します。そのため、ホストからコンテナへの接続やコンテナ間の接続が可能となります。`none` は、ネットワークの接続を必要としないコンテナを作成する際に利用します。`host` は、コンテナがホストと同じインタフェースやIPアドレスを持たせたい際に利用します。 +### 2-2. docker networkの詳細を知る + +では、それぞれのネットワークがどのような空間・アドレスレンジを持っているのか確認するにはどうすればいいでしょうか。 +`docker network`には`inspect`というサブコマンドがあり、詳細を確認することができるようになっています。 + +`inspect` サブコマンドでは、引数に取ったネットワークやコンテナの情報を表示できます。本コマンドによって、サブネットやゲートウェイといった情報などが閲覧できます。 +割愛しますが、`docker compose` コマンドによって生成されたbridgeネットワークと各コンテナのIPアドレスを`inspect` サブコマンドで確認してみると同一ネットワークにいることが確認できると思います。 -上記結果の中で、「default」で終わるネットワークは、`docker compose` コマンドによって自動的に作成されたネットワークのことです。「default」の前には、プロジェクト名(docker-compose.ymlファイルが存在するディレクトリ名)が利用されます。 以下のコマンドを入力してください。 ```bash $ docker network inspect bridge +``` + +
実行例 + +```json [ { "Name": "bridge", @@ -269,11 +331,14 @@ $ docker network inspect bridge } ] ``` +
-`inspect` サブコマンドでは、引数に取ったネットワークやコンテナの情報を表示できます。本コマンドによって、サブネットやゲートウェイといった情報などが閲覧できます。割愛しますが、`docker compose` コマンドによって生成されたbridgeネットワークと各コンテナのIPアドレスを`inspect` サブコマンドで確認してみると同一ネットワークにいることが確認できると思います。 ## 4. まとめ -本講義では、Docker Compose を紹介し、実際に`docker compose` コマンドを使って、複数のサービスを管理していただきました。複数のDocker コンテナを管理する場合、Docker Compose を用いるとDocker単独で利用するよりも効率的に管理することができるためぜひ利用してください。また、OSS の中ではDocker イメージを始め、`docker-compose.yml` を公開しているものも多いため、それらを使って簡単に検証作業や環境構築などを行うことができます。ぜひ有効活用してみてください。 +本講義では、Docker Compose を紹介し、実際に`docker compose` コマンドを使って、複数のサービスを管理していただきました。 +複数のDocker コンテナを管理する場合、Docker Compose を用いるとDocker単独で利用するよりも効率的に管理することができるためぜひ利用してください。 +また、OSS の中ではDocker イメージを始め、`docker-compose.yml` を公開しているものも多いため、それらを使って簡単に検証作業や環境構築などを行うことができます。 +ぜひ有効活用してみてください。 diff --git a/src/development/docker/docker-compose/solution/Dockerfile b/src/development/docker/docker-compose/solution/Dockerfile index 5f76ae0f..2f7ac259 100644 --- a/src/development/docker/docker-compose/solution/Dockerfile +++ b/src/development/docker/docker-compose/solution/Dockerfile @@ -1,11 +1,12 @@ -# syntax=docker/dockerfile:1 -FROM python:3.7-alpine +FROM python:3.11-slim WORKDIR /code + ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 -RUN apk add --no-cache gcc musl-dev linux-headers + COPY requirements.txt requirements.txt RUN pip install -r requirements.txt + EXPOSE 5000 -COPY . . +COPY app.py app.py CMD ["flask", "run"] diff --git a/src/development/docker/docker-compose/solution/docker-compose.yml b/src/development/docker/docker-compose/solution/docker-compose.yml index 7b800660..64f6b81a 100644 --- a/src/development/docker/docker-compose/solution/docker-compose.yml +++ b/src/development/docker/docker-compose/solution/docker-compose.yml @@ -3,8 +3,28 @@ services: web: container_name: iijbootcamp-flask build: . + # networks: + # - iijbootcamp ports: - "8088:5000" + # volumes: + # - ./index /app/index + logging: + driver: "json-file" # defaults if not specified + options: + max-size: "1m" + max-file: "30" redis: container_name: iijbootcamp-backend image: "redis:alpine" + # networks: + # - iijbootcamp + logging: + driver: "json-file" # defaults if not specified + options: + max-size: "1m" + max-file: "30" + +# networks: +# iijbootcamp: +# external: true diff --git a/src/development/docker/docker/BUILD.md b/src/development/docker/docker/BUILD.md index 83f7868e..ceeb26ce 100644 --- a/src/development/docker/docker/BUILD.md +++ b/src/development/docker/docker/BUILD.md @@ -18,7 +18,13 @@ Docker では、「**Dockerfile**」というファイルを用いて、Docker 今回は、ubuntu というDocker イメージを元にカスタマイズしながら、nginx によるWeb サーバのDocker イメージを作成します。また、作成したDocker イメージを使ってDocker コンテナを立ち上げ、HTML ファイルがレスポンスされることを確認します。 -では、実際にDockerfile を作成し、Docker イメージを作成していきましょう。以下の内容をファイル名「Dockerfile」として作成してください。 +### 演習7. DockerFileを記述し、コンテナを作る + +では、実際にDockerfile を作成し、Docker イメージを作成していきましょう。 + +#### 7-1 DockerFile作成 + +以下の内容をファイル名「Dockerfile」として作成してください。 ```Dockerfile FROM ubuntu @@ -34,6 +40,7 @@ EXPOSE 80 ENTRYPOINT ["nginx", "-g", "daemon off;"] ``` +#### 7-2 index.html作成 また、`COPY` コマンドで利用する「index.html」を以下のように作成してください(あくまで一例です)。 ```html @@ -61,6 +68,8 @@ ENTRYPOINT ["nginx", "-g", "daemon off;"] その他詳しい機能について知りたい方は、[公式のリファレンス](https://docs.docker.com/engine/reference/builder/)をご参照ください。 +#### 7-3. イメージのビルド + では、先ほど作成したDockerfileが存在するディレクトリ内で以下のコマンドを実行してください。 ```bash @@ -73,13 +82,21 @@ $ docker build -t iijbootcamp . ```bash $ docker images +``` + +
実行例 + +``` REPOSITORY TAG IMAGE ID CREATED SIZE iijbootcamp latest 417ab982faaa 6 days ago 170MB ubuntu latest 93fd78260bd1 6 days ago 86.2MB ``` +
「REPOSITORY」がubuntu とiijbootcamp の2つのイメージが新たに作られていると思います。ubuntu は`FROM` で指定したDocker イメージです。iijbootcamp は、ubuntu のDocker イメージを元にnginx やHTML ファイルを追加して今回作成したDocker イメージです。 +#### 7-4. コンテナの起動 + では、実際にこのコンテナを起動してアクセスしてみましょう。次のコマンドを実行してください。 ```bash @@ -92,9 +109,17 @@ $ docker run -d -p 8888:80 iijbootcamp ```bash $ docker ps +``` + +
実行例 + +``` CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 171c3b25c75e iijbootcamp:latest "nginx -g 'daemon of…" 15 minutes ago Up 15 minutes 0.0.0.0:8888->80/tcp condescending_wilson ``` +
+ +#### 7-5. コンテナへのアクセス では、実際にコンテナに対してアクセスしてみましょう。お好きな方法(Webブラウザでもcurlコマンド等でも)で「 http://localhost:8888 」にアクセスしてみましょう。以下にcurl コマンドを用いた例を示します。 @@ -120,9 +145,9 @@ $ curl http://localhost:8888 $ curl --noproxy localhost http://localhost:8888 ``` -**curlコマンドによってHTMLが取得できることを確認してください** +## 参考情報 -## Docker イメージの共有方法 +### Docker イメージの共有方法 皆さんが作成したDocker イメージなどを他の人に共有したい場合、Dockerfile をファイルサーバやGitHub 等で共有する以外に、[Docker Hub](https://hub.docker.com/)を始めとする「**Docker イメージレジストリ**」で公開し、それを利用してもらうことが可能です。例えば、本講義で利用した「getting-started」や「ubuntu」のDocker イメージは、Docker Hubで公開されているものを利用しています。 diff --git a/src/development/docker/docker/GETSTART.md b/src/development/docker/docker/GETSTART.md index 2ac113bb..29ebe7ee 100644 --- a/src/development/docker/docker/GETSTART.md +++ b/src/development/docker/docker/GETSTART.md @@ -1,7 +1,7 @@ --- footer: CC BY-SA Licensed | Copyright (c) 2022, Internet Initiative Japan Inc. title: Dockerを触ってみよう -description: Docker の概要を学び、コンテナ操作を体験します +description: Dockerコンテナで仮想環境プラットフォームを構築する time: 1h prior_knowledge: 仮想化、CUI 操作 --- @@ -10,8 +10,8 @@ prior_knowledge: 仮想化、CUI 操作 ## おさらい -それでは実際にDockerを使って仮想環境プラットフォームを作る前にまずは環境の確認をしましょう。 - +それでは実際にDockerを使って仮想環境プラットフォームを作ってみましょう。 +事前準備の項を済ませているならばDocker環境は構築されているはずです。 下記コマンドを入力し、コマンドが実行できるか確認してください。 ```bash @@ -20,136 +20,91 @@ $ docker version 上記コマンドが実行できない方は事前にDocker(及びコマンド)のインストールが終わっているか否か確認し、未完了の人は、Docker のインストールを行ってください。 -## Dockerコンテナで仮想環境プラットフォームを構築する - -本章では、**Dockerイメージ**を取得し、実際に**Dockerコンテナ**を使って仮想環境プラットフォームを構築します。 +## Docker コンテナを起動する -Dockerコンテナを使って仮想環境プラットフォームを構築するためには、以下の作業が必要になります。 +Dockerコンテナを使って仮想環境プラットフォームを構築するには、大きく分けて以下のステップを踏む必要があります。 - Dockerイメージのビルド - Dockerコンテナの作成 - Dockerコンテナの起動 -## Docker イメージのビルド - -Dockerコンテナを使って仮想環境プラットフォームを作成するためには、Dockerイメージが必要となります。 - -通常であれば、`Dockerfile`を使用して自分のアプリケーションのDockerイメージを作成します。 -`Dockerfile`は、アプリケーションの依存関係や設定、実行コマンドなどを指定するためのテキストファイルです。 -`DockerFile`が作成できたらDockerイメージをビルドして作成します。その際に使うコマンドは`docker build`になります。 - -通常であればテキストエディタを開いて`DockerFile`を作成しますが、完全にゼロの状態から`DockerFile`を作成するのは難しい為、先ずはチュートリアル用に公開されている物を使用すると良いでしょう +従って、Dockerコンテナを起動する為に最初にすべきことは**Dockerコンテナイメージ**を取得する事になります。 -### 基本演習 +Dockerコンテナイメージは、自分で作成(ビルド)して取得する方法と、作成済みのDockerコンテナイメージを取得する方法の2種類があります。 +まずは、作成済みのイメージを利用してコンテナを起動することを試してみましょう。 -基本演習では予め作成済みである`DockerFile`を使用してDockerイメージを作成します。 - -1. DockerFileの取得 - ```bash - git clone https://github.com/docker/getting-started.git - ``` -2. イメージのビルド - ```bash - cd getting-started - docker build -t iijbootcamp_docker01 . - ``` -3. コンテナの起動 - ```bash - docker run --rm --name iijbootcamp_docker01-tutorial iijbootcamp_docker01 - ``` +### 演習1 Dockerコンテナを起動する -ここまでできた方は、プロンプトに以下のように出力されているはずです。 +- **docker run**コマンドを使用して**getting-started**コンテナを起動する + ```bash + docker run --rm -p 80:80 docker/getting-started + ``` +
実行中のログ ``` -/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ -/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh -10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf -10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf -/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh -/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh -/docker-entrypoint.sh: Configuration complete; ready for start up -2022/06/17 04:10:18 [notice] 1#1: using the "epoll" event method -2022/06/17 04:10:18 [notice] 1#1: nginx/1.21.6 -2022/06/17 04:10:18 [notice] 1#1: built by gcc 10.3.1 20211027 (Alpine 10.3.1_git20211027) -2022/06/17 04:10:18 [notice] 1#1: OS: Linux 4.18.0-348.2.1.el8_5.x86_64 -2022/06/17 04:10:18 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 -2022/06/17 04:10:18 [notice] 1#1: start worker processes -2022/06/17 04:10:18 [notice] 1#1: start worker process 32 +Unable to find image 'docker/getting-started:latest' locally +latest: Pulling from docker/getting-started +c158987b0551: Pull complete +1e35f6679fab: Pull complete +cb9626c74200: Pull complete +b6334b6ace34: Pull complete +f1d1c9928c82: Pull complete +9b6f639ec6ea: Pull complete +ee68d3549ec8: Pull complete +33e0cbbb4673: Pull complete +4f7e34c2de10: Pull complete +Digest: sha256:d79336f4812b6547a53e735480dde67f8f8f7071b414fbd9297609ffb989abc1 +Status: Downloaded newer image for docker/getting-started:latest +89e2c9780f5caf3b5250013e002e8aaf9f8ea74c2e940eca49b890dfc019ab5e ``` +
-ここまでできたらDockerコンテナによる仮想環境プラットフォームの構築は完了です。 -とりあえずここでは **Ctrl+C** で停止してください。 - -#### ビルドがうまくいかない人の為に - -`git clone` できない、 `docker build` ができないという方は以下を試してみましょう。 -getting-startedでは予めビルド済みイメージを公開している為、ビルド済みのイメージを使って起動することが可能です。 - - -```bash - docker run --rm --name iijbootcamp_docker01-tutorial docker/getting-started -``` - -また、 この ```docker/getting-started``` image を ```iijbootcamp_docker01``` と呼べるようにしておきましょう - -``` -docker tag docker/getting-started iijbootcamp_docker01 -``` - -```docker images``` コマンドで今 pull してあったり build して用意した image が確認できます。 - -```bash -$ docker images - -REPOSITORY TAG IMAGE ID CREATED SIZE -docker/getting-started latest 3e4394f6b72f 6 months ago 47MB -iijbootcamp_docker01 latest 3e4394f6b72f 6 months ago 47MB -``` +- 起動の確認 + - ブラウザを開き、以下のURLを入力します + ``` + http://localhost:80 + ``` + - 以下のような画面が表示されれば成功です + ![getting-started](./images/getting-started.png) +- コンテナの終了 + **Ctrl + c** を押す +- ターミナルが戻ってくる -### 発展課題 +### 発展課題1 先ほどの作業ではフォアグラウンドで実行している為、ターミナルが占有されてしまいます。 また、このような起動では例えばssh等で接続している場合はセッション切断と共にコンテナが停止してしまう為、発展課題ではこれを永続化する事をやってみましょう。 デーモン起動をすると、ターミナルは返ってきてしまうため起動確認は `docker ps`を使って確認します。 -1. コンテナのデーモン起動 - ```bash - docker run -d --name iijbootcamp_docker01-tutorial iijbootcamp_docker01 +- コンテナのデーモン起動 + ```bash + docker run --rm -p 80:80 docker/getting-started + ``` +- コンテナの起動確認 + ```bash + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 38ebcf110f45 docker/getting-started "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp fervent_shaw + ``` + - ここで**NAMES**に表示されている値を記憶、若しくは記録しておいてください +- 起動の確認 + - ブラウザを開き、以下のURLを入力します ``` -2. コンテナの起動確認 - ```bash - CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES - 41ee2d91a50a iijbootcamp_docker01 "/docker-entrypoint.…" 3 minutes ago Up 3 seconds 80/tcp iijbootcamp_docker01-tutorial + http://localhost:80 ``` -3. コンテナの停止 - ```bash - docker stop iijbootcamp_docker01-tutorial + - 以下のような画面が表示されれば成功です + ![getting-started](./images/getting-started.png) +- コンテナの終了 + - **docker stop**コマンドを用いてdockerコンテナを停止します + ``` + docker stop + ``` +- コンテナが停止したことの確認 + - ブラウザにて **http://localhost**にアクセスし、アクセスできないことを確認する + - **docker ps**コマンドを用いて、何も表示されないことを確認する + ``` + docker ps + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ``` -4. コンテナの再起動 - - 先ほど停止したコンテナを再起動してみましょう。 -5. コンテナの削除 - - 停止したコンテナを削除してみましょう - -#### 発展課題Tips - -4. 5. は発展自己学習です。以下のコマンドを使うことで実現可能です。 -他にもコマンドがあるので調べながら色々やってみましょう。 - - - `docker start` - - `docker ps -a` - - `docker rm` - - -## まとめ - -さて、ここまでやってみて作業が面倒だと感じたことは無いでしょうか。 -また、事前準備ではdockerの動作確認で`docker run`を実行したのでは無いかと思います。 -実は`docker run`はこれらのコマンドを包含した物となっています。 - -従って、ここまでの作業であれば通常は`docker run docker/getting-started`とする事になります。 - -しかしながら、場合によってはイメージのみを予め取得しておきたい、 -取得済みのイメージを起動したい、など順を踏んで実行する事もあるためそれぞれの動作について理解して頂ければと思います。 diff --git a/src/development/docker/docker/OPERATION.md b/src/development/docker/docker/OPERATION.md index 5da9f9dd..dfc72128 100644 --- a/src/development/docker/docker/OPERATION.md +++ b/src/development/docker/docker/OPERATION.md @@ -12,72 +12,124 @@ prior_knowledge: 仮想化、CUI 操作 ## Dockerコンテナの管理 前回は、Dockerコンテナのイメージの取得からコンテナの構築までを行いました。 -しかし、先ほどの講義では取得したイメージがきちんと取得できているのか? -起動したコンテナが間違いなく起動しているのか?といった事の確認ができていません。 -コンテナの活用にはこういったDockerコンテナの管理が必要不可欠になります。 +しかし、先ほどの講義では以下の項目についての確認には言及していません。 + +- 取得したイメージがきちんと取得できているのか? +- 起動したコンテナが間違いなく起動しているのか? +- 作業完了後に後片付け・余計なリソースやプロセスが残っていないか? + +実際のコンテナの活用にはこういったDockerコンテナの管理が必要不可欠になります。 従って本講では、Dockerコンテナを管理する為のコマンドを学習します。 -### docker images +### 演習3 docker images + +`docker images` コマンドは、ローカル環境に存在するDocker イメージの一覧を表示するコマンドです。 +これを用いることでコンテナの元となるイメージファイルの有無を確認することができます。 + +なお、Dockerイメージには、名前の他に「TAG」を付けることができます。 +TAGとして使われる文字列にはバージョンを記載することが一般的です。 +今回表示されている「latest」は最新版であることを意味しています。 -`docker images` コマンドは、ローカル環境に存在するDocker イメージの一覧を表示するコマンドです。現状では、「getting-started」イメージのみが存在すると思います。 +コマンドを実行し、手元にどんなイメージがあるか確認してみてください ```bash $ docker images +``` + +
実行例 + +``` REPOSITORY TAG IMAGE ID CREATED SIZE docker/getting-started latest cb90f98fd791 2 months ago 28.8MB ``` +
+ -Dockerイメージには、名前の他に「TAG」を付けることができます。TAGでは、主にバージョンを管理していることが多いです。今回表示されている「latest」は最新版であることを意味しています。 -### docker ps +### 演習4 docker ps -`docker ps` コマンドは、ローカル環境に存在するDockerコンテナに関する情報を表示してくれます。現在起動しているコンテナは`docker ps` と入力すると表示されます。 -しかしながら今の状態で本コマンドを実行してもヘッダー情報だけで何も表示されないと思います。 -と言うのも`docker ps`コマンドのデフォルトの動作で表示されるのは永続的に稼働しているコンテナだけだからです。 -既に終了してしまったり、エラーで起動できていないコンテナを確認するためには、オプションで`-a` を付けることで表示可能です。 +`docker ps` コマンドは、ローカル環境に存在するDockerコンテナに関する情報を表示してくれます。 +現在起動しているコンテナは`docker ps` と入力すると表示されます。 +こちらもコマンドを実行してみましょう。 + +`docker ps`コマンドのデフォルトの動作で表示されるのは永続的に稼働しているコンテナのみ表示されるため、 +本講義に従って実行した場合は何も表示されないと思います。 +既に終了してしまったり、エラーで起動できていないコンテナを確認するためには、 +オプションで`-a` を付けることで表示可能です。 ```bash $ docker ps -a +``` + +
実行例 + +``` CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f908c593f036 docker/getting-started "/docker-entrypoint.…" 2 seconds ago Created getting-started ``` +
-### docker start、stop +### 演習5 docker start、stop -`docker start` は、コンテナの起動を行うコマンドで、`docker stop` は、コンテナを停止するコマンドです。これらのコマンドでは、起動・停止対象のコンテナを選択する必要があるため、引数として`docker ps` の表示結果にあった「CONTAINER ID」を設定します。 +`docker start` は、コンテナの起動を行うコマンドで、`docker stop` は、コンテナを停止するコマンドです。 +これらのコマンドでは、起動・停止対象のコンテナを選択する必要があるため、引数として`docker ps` の表示結果にあった「CONTAINER ID」を設定します。 -先ほどの項では`docker/getting-started`コンテナの起動に`docker start`を使用していました。 -従って、`docker/getting-started`コンテナの停止したい時は`docker stop`を使う事になります。 +先ほどの項では`docker/getting-started`コンテナの起動に`docker run`を使用していましたが、`docker run`と`docker start`には大きな違いがあります。 -では、実際に`docker stop`を使う演習をしてみましょう。 -先ほどは、`docker/getting-started`をそのまま起動していましたが今回は、daemon動作として簡単なコンテナを作り、それを停止してみましょう。 +`docker run`は、`docker start`だけでなく、`docker create`を兼ねるコマンドとなっており、実行対象のコンテナが存在しない場合はイメージからコンテナ化を試みるようになっています。 -#### コンテナの起動 +このように大変便利なコマンドですが、既にコンテナ化されており停止しているだけの物を起動したいと思った時に`docker run`を使用すると、既にコンテナ化されていものがあるにも関わらず新たにイメージからコンテナを作り出そうとするなど、思わぬ動作を引き起こすことがあります。 + +従って、`docker run`は初回起動時に使う物として考え、 +`docker stop`で停止しただけのコンテナを再び起動させたい場合は`docker start`を用いましょう。 + +では、実際に`docker stop`と`docker start`を使う演習をしてみましょう。 + +#### 5-1. コンテナの起動 ```bash - $ docker run -d -p 8080:80 docker/getting-started + $ docker run --name iij-bootcamp_docker01 -d -p 8080:80 docker/getting-started ``` -#### 起動確認 +
実行例 ```bash $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6d868b858fd7 docker/getting-started "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp interesting_darwin ``` +
+ -#### コンテナの停止 +#### 5-2. コンテナの停止 + +先ほど実行したコンテナを停止します。 ****については先ほどの演習で行った`docker ps`等を用いて確認してください ```bash $ docker stop ``` -### docker rm、rmi +#### 5-3. コンテナの開始(再開) + +```bash + $ docker start +``` + +### 演習6 docker rm、rmi -`docker rm` と`docker rmi` は、それぞれDocker コンテナ、Docker イメージの削除を行うコマンドです。それぞれ引数に「CONTAINER ID」や「IMAGE ID」を設定する必要があります。また、削除したいDocker イメージを元に作成したDocker コンテナが存在する場合削除できません。その際は、事前にDocker コンテナを削除した後に、Docker イメージを削除してください。 +`docker rm` と`docker rmi` は、それぞれDocker コンテナ、Docker イメージの削除を行うコマンドです。 +軽量であるとは言え、コンテナイメージも一定の容量を持つため作成するだけで削除を行わないといずれディスクを圧迫し、溢れてしまいます。 +従って、不要なコンテナやイメージは削除するよう心がけましょう。 +ただし、削除したいDocker イメージを元に作成したDocker コンテナが存在する場合削除できません。 +その際は、事前にDocker コンテナを削除した後に、Docker イメージを削除してください。 + +なお、削除には`docker stop`等と同様に引数に「CONTAINER ID」や「IMAGE ID」を設定する必要があります。 + +```bash +$ docker rm iij-bootcamp_docker01 +iij-bootcamp_docker01 +``` ```bash -$ docker rm docker/getting-started -docker/getting-started $ docker rmi docker/getting-started docker/getting-started ``` diff --git a/src/development/docker/docker/README.md b/src/development/docker/docker/README.md index 7fc5894a..05e25076 100644 --- a/src/development/docker/docker/README.md +++ b/src/development/docker/docker/README.md @@ -12,36 +12,43 @@ prior_knowledge: 仮想化、CUI 操作 ## はじめに -### Docker とは - -Docker は、Docker 社が開発しているコンテナ型の仮想環境プラットフォームです。 -コンテナとは仮想マシンのような1台のコンピュータの上で、仮想的に複数のコンピュータを動作させる技術の1つのしくみです。 +Docker は、Docker, Incが開発しているコンテナ型の仮想環境プラットフォームです。 +コンテナとは仮想マシンのように1台のコンピュータの上で、仮想的に複数のアプリケーションを動作させる技術・仕組みの1つです。 Docker(コンテナ仮想化プラットフォーム)を使用すると、アプリケーションやその依存関係をコンテナと呼ばれる独立した環境にパッケージ化することができます。 +では、コンテナと仮想マシンは何が異なるのでしょう? + +一般的に、仮想マシンと呼ばれるソフトウェアでは、ホストOS上で仮想マシン用のソフトウェア(VirtualBox等)を動かすことでホストOSとは異なるOSを起動します。 +一方、コンテナによる仮想化は、ホストOS上にアプリケーション実行用の専用領域を作成し、その中で実行する仕組みとなっています。 + +### 本講義の目的 -しかしながら、コンテナは従来の仮想化とは異なる仕組みの下、動作しています。 +- Dockerについて正しい基礎知識と理解を得る +- DockerFile および dockerコマンドを用いてdocker containerを作成・操作できるようにする -一般的な仮想マシンと呼ばれるソフトウェア(VirtualBox など)では、ホストOS上で仮想マシン用のソフトウェアを動かすことでホストOSとは異なるOSを起動します。 -これにはメリットもありますがデメリットもあります。即ちOS の中で別のOSを起動するため、起動やデプロイに時間を要する事、ハードウェアにアクセスする際もオーバーヘッドが大きく、効率が落ちたり、時間がかかる。などが挙げられるでしょう。 +#### 本講義で扱わないこと -一方、コンテナによる仮想化は、ホストOS 上に専用のアプリケーション実行用の領域を作成しその中で実行するしくみとなっています。 -そのため、従来の仮想化と比較してアプリケーションや環境の起動が高速なだけで無くメモリやディスクの使用量も大幅に削減することが可能です。 +- dockerコマンドのオプション・細かい操作に対する解説 +- コンテナイメージレイヤーの細かい解説 -これらは開発環境で作成したアプリケーションを他の環境や本番環境に移す際、アプリケーションの実行に必要な環境ごと配布する事が可能になり、メンバー全員が同じ環境で開発を行うことが容易になります。 +### 本講義の目標 + +- dockerコマンドを利用してコンテナの取得・起動・停止ができるようになる +- DockerFileの読み方・書き方を知り、自分で作成もしくは加筆修正するなど、自分の目的に沿ったコンテナを作成できるようになる ### "Docker" とは -これまでは Docker = コンテナ仮想プラットフォーム、として説明しましたが、本講義で扱う"Docker"は、コンテナ仮想プラットフォームを扱う上での技術的な概念やコマンド等を示します。 +**はじめに** で Docker = コンテナ型仮想環境プラットフォーム、として説明しましたが、本講義で扱う"Docker"は、コンテナ仮想プラットフォームを扱う上での技術的な概念やコマンド等を示します。 以下にDockerを扱う上で重要となる概念を記載します。 - Docker コンテナ - Dockerは、アプリケーションとその依存関係をコンテナと呼ばれる軽量な仮想環境にパッケージ化します。コンテナは、ホストマシンとは独立して実行され、一貫した動作を提供します。コンテナはポータブルであり、異なる環境やプラットフォームで実行できます。 - Docker イメージ - - Dockerコンテナは、Dockerイメージから作成されます。イメージは、アプリケーションの実行に必要なすべての依存関係と設定を含むファイルシステムのスナップショットです。イメージは、Dockerfileと呼ばれるテキストファイルに定義され、ビルドコマンドを使用して作成されます。 + - Dockerコンテナは、Dockerイメージから作成されます。イメージは、アプリケーションの実行に必要なすべての依存関係と設定を含むファイルシステムのスナップショットです。イメージは、**Dockerfile**と呼ばれるテキストファイルに定義され、ビルドコマンドを使用して作成されます。 - コンテナオーケストレーション - - Dockerは、コンテナのデプロイメントと管理を容易にするための機能を提供します。複数のコンテナを管理するためのツールとして、Docker ComposeやKubernetes(*)などがあります。これらのツールを使用すると、複雑なマルチコンテナ環境を構築し、スケーリングやロードバランシングなどの機能を実現することができます。 + - Dockerは、コンテナのデプロイメントと管理を容易にするための機能を提供します。複数のコンテナを管理するためのツールとして、**Docker Compose**や**Kubernetes**(*)などがあります。これらのツールを使用すると、複雑なマルチコンテナ環境を構築し、スケーリングやロードバランシングなどの機能を実現することができます。 - イメージの共有 - Docker HubやDocker Registryなどのオンラインリポジトリを使用することで、Dockerイメージを共有および配布することができます。これにより、他の開発者との協力や、既存のイメージを再利用することが容易になります。 @@ -54,18 +61,30 @@ Docker(コンテナ仮想化プラットフォーム)を使用すると、アプ 本講義では、予めDockerがインストールされていることを前提としています。 Dockerのインストールが完了していない方は、「ハンズオン事前準備」を済ませてください。 - ## Chapters - [Dockerコンテナで仮想環境プラットフォームを構築する](./GETSTART.md) +- [Dockerコンテナイメージを作成して起動する](./RUN_AS_IMAGE.md.md) - [Dockerコンテナの管理](./OPERATION.md) - [Dockerイメージの作成](./BUILD.md) ## 参考 +### 仮想マシン vs コンテナ +仮想マシンとコンテナ、どちらが優れており、どちらを使うべきなのでしょう? + +それは一概にどちらが優れているからそうすべき、といった類いの物ではありません。 +コンテナは仮想マシンと比べて後発であるため、仮想マシンが抱えていた問題を解決しているのは確かですが、上位互換という事ではありません。 +コンテナには仮想マシンには無いメリットもありますがデメリットもあります。 +コンテナは仮想マシンと異なり、OS の中で別のOSを起動するという事が無いため、セットアップや起動時においてもOSに関わる処理を必要としない為、時間を大幅に短縮することが可能です。また、ハードウェアにアクセスする際もゲストOSを介することが無いため、オーバーヘッドが少なく高速な動作が期待できます。 + +しかし、その一方で仮想マシンと比べてホストOSとの独立性が少ないため、ホストOSとアーキテクチャが大きく異なるコンテナを共存させることはできません。 + +例)Linux 上で Windows コンテナを起動・実行する + + ### Docker のアーキテクチャ -![Docker Image](https://matsuand.github.io/docs.docker.jp.onthefly/engine/images/architecture.svg) -(https://matsuand.github.io/docs.docker.jp.onthefly/get-started/overview/) +![Docker Image](https://docs.docker.com/guides/images/docker-architecture.webp) diff --git a/src/development/docker/docker/RUN_AS_IMAGE.md b/src/development/docker/docker/RUN_AS_IMAGE.md new file mode 100644 index 00000000..2ab2fe16 --- /dev/null +++ b/src/development/docker/docker/RUN_AS_IMAGE.md @@ -0,0 +1,104 @@ +--- +footer: CC BY-SA Licensed | Copyright (c) 2022, Internet Initiative Japan Inc. +title: Dockerを触ってみよう +description: Docker イメージを作り、コンテナ化する +time: 1h +prior_knowledge: 仮想化、CUI 操作 +--- + + + +## おさらい + +前回ではコンテナの起動に作成済みのイメージを使ってコンテナを起動していました。 +今回は作成済みのコンテナイメージを使ってコンテナを起動するのではなく、コンテナイメージの作成から行ってみましょう。 + +### 演習2 Dockerコンテナイメージを作成する + +Dockerコンテナイメージの作成には予め作成済みである`DockerFile`を使用します + +- DockerFileの取得 + ```bash + git clone https://github.com/docker/getting-started.git + ``` +- イメージのビルド + ```bash + cd getting-started + docker build -t iijbootcamp_docker01 . + ``` +- コンテナの起動 + ```bash + docker run --rm -p 80:80 --name iijbootcamp_docker01-tutorial iijbootcamp_docker01 + ``` +
実行中のログ + +``` +/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ +/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh +10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf +10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf +/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh +/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh +/docker-entrypoint.sh: Configuration complete; ready for start up +2022/06/17 04:10:18 [notice] 1#1: using the "epoll" event method +2022/06/17 04:10:18 [notice] 1#1: nginx/1.21.6 +2022/06/17 04:10:18 [notice] 1#1: built by gcc 10.3.1 20211027 (Alpine 10.3.1_git20211027) +2022/06/17 04:10:18 [notice] 1#1: OS: Linux 4.18.0-348.2.1.el8_5.x86_64 +2022/06/17 04:10:18 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 +2022/06/17 04:10:18 [notice] 1#1: start worker processes +2022/06/17 04:10:18 [notice] 1#1: start worker process 32 +``` + +
+ +- ここまでできたらDockerコンテナによる仮想環境プラットフォームの構築は完了です。 + - とりあえずここでは **Ctrl+C** で停止してください。 + +### 発展課題2 + +前回同様、演習. 2の通り実施するとターミナルが占有されていまいます。 +従って、今回もバックグラウンドで起動し、ターミナルが占有されないように実行してみましょう + +- コンテナのデーモン起動 + ```bash + docker run --rm -p 80:80 -d --name iijbootcamp_docker01-tutorial iijbootcamp_docker01 + ``` +- コンテナの起動確認 + ```bash + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 38ebcf110f45 docker/getting-started "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp fervent_shaw + ``` + - ここで**NAMES**に表示されている値を記憶、若しくは記録しておいてください +- 起動の確認 + - ブラウザを開き、以下のURLを入力します + ``` + http://localhost:80 + ``` + - 以下のような画面が表示されれば成功です + ![getting-started](./images/getting-started.png) +- コンテナの終了 + - **docker stop**コマンドを用いてdockerコンテナを停止します + ``` + docker stop + ``` +- コンテナが停止したことの確認 + - ブラウザにて **http://localhost**にアクセスし、アクセスできないことを確認する + - **docker ps**コマンドを用いて、何も表示されないことを確認する + ``` + docker ps + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + ``` + +## 参考 + +### Docker イメージのビルド + +Dockerコンテナを使って仮想環境プラットフォームを作成するためには、Dockerイメージが必要となります。 + +通常であれば、`Dockerfile`を使用して自分のアプリケーションのDockerイメージを作成します。 +`Dockerfile`は、アプリケーションの依存関係や設定、実行コマンドなどを指定するためのテキストファイルです。 +`DockerFile`が作成できたらDockerイメージをビルドして作成します。その際に使うコマンドは`docker build`になります。 + +通常であればテキストエディタを開いて`DockerFile`を作成しますが、完全にゼロの状態から`DockerFile`を作成するのは難しい為、先ずはチュートリアル用に公開されている物を使用すると良いでしょう + + diff --git a/src/development/docker/docker/images/getting-started.png b/src/development/docker/docker/images/getting-started.png new file mode 100644 index 00000000..9f0ead34 Binary files /dev/null and b/src/development/docker/docker/images/getting-started.png differ