初心者向け学習方法一覧はこちら
はじめに
前回の記事では、Dockerのインストール方法について学習しました。
この記事では、Dockerの基本となる概念(イメージ/コンテナ)ついて解説します。また、実際に自分でイメージの作成・コンテナの起動する方法についても解説します。
DockerイメージとDockerコンテナの基本
Dockerを利用するにあたり、DockerイメージとDockerコンテナの関係性について知っておく必要があります。これらの役割・関係をシンプルにまとめると以下のようになります。
名称 | 役割 |
Dockerイメージ | Dockerコンテナを構成するファイルシステムや、実行するアプリケーションや設定をまとめたもので、コンテナを作成するために利用されるテンプレートとなるもの。 |
Dockerコンテナ | Dockerイメージを基に作成され、具現化されたファイルシステムとアプリケーションが実行されている状態。 |
これらの詳細について次項以降で解説します。
Dockerイメージ
Dockerイメージは、コンテナとして実行するアプリケーションやそれが依存するファイル群、コンテナ環境自体の設定などを含めた「コンテナの素」となるものです。Dockerイメージを作成する操作のことを「build(ビルド)する」といいます。
Dockerイメージの作成にあたり、Dockerにその材料となる情報を与える必要があります。
- Dockerfile: コンテナの作成手順書
- コンテキスト: コンテナに格納するプログラムなどのファイル群
これらをDockerにわたすと、Dockerfileに記された手順に沿って、与えられたコンテキストに含まれるファイル郡が適宜用いられながら、それらが1つのイメージにまとめあげられます。
以下にサンプルを示しています。
FROM ubuntu:21.10
COPY ./sample.sh /sample.sh
ENTRYPOINT ["/sample.sh"]
こちらのDockerfileでは以下の手順でイメージをビルドするように、という手順書になっています。
- Docker Hubで公開されている「Ubuntu 21.10」というイメージを土台として新しいイメージを作成する。
- ローカルにある「
sample.sh
」というファイル(=コンテキスト)を、コンテナ内の「/sample.sh
」にコピーする。 - コンテナを起動したら
sample.sh
を実行する。
Dockerコンテナ
Dockerコンテナは、Dockerイメージを基に実際にアプリケーションが実行されている状態、またはその実行プロセスのことです。
1つのDockerイメージから複数のコンテナを生成することができます。
上記ではDockerfileからDockerイメージを作成しましたが、コンテナが作成されるときにはじめてアプリケーションとして具現化され、コンテナの中ではコンテナ内のUbuntuのファイルシステム上でアプリケーションが実行されます。
コンテナでアプリケーションを実行するには、コンテナとして具現化するためのテンプレートとなるDockerイメージを作成する作業から始める必要があるということになります。
Dockerで簡単なアプリケーションを実行する
Dockerを用いて、簡単なアプリケーションを起動してみます。コマンドを記載していますので、実際に手元で動かしてみてください。
Docker Hubからイメージを取得する
Docker Hubにすでに存在しているイメージをそのまま利用してみます。
Docker Hubとは、Docker社が管理しているDockerレジストリです。Dockerレジストリとは、たくさんのDockerイメージを集権的に管理するためのホスティングサービスです。ユーザーはDocker Hubにサインアップすれば、自分で作成したDockerイメージをDocker Hubを通じて公開し、世界中のユーザーに利用してもらうことが可能になります。
それでは、以下のコマンドを実行してみてください。
docker run hello-world
以下のような結果が表示されるかと思います。
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
ここでは、Docker Hubにアップロードされている「hello-world」というイメージをダウンロード(pull)してそのまま実行、という操作を行いました。「hello-world」イメージはDocker社が公開している、サンプル用のDockerイメージです。
次に、以下のコマンドを実行してみてください。
docker run -it ubuntu:21.10 /bin/bash
すると以下のような結果が表示されるかと思います。また、root@xxxxxx
というようなユーザー名・ホスト名が表示されているかと思います(ホスト名は実行する環境・タイミングによって変わります)。
Unable to find image 'ubuntu:21.10' locally
21.10: Pulling from library/ubuntu
54b8fda3c9de: Pull complete
Digest: sha256:ff46b78279f207db3b8e57e20dee7cecef3567d09489369d80591f150f9c8154
Status: Downloaded newer image for ubuntu:21.10
root@0916b7ac5c7c:/#
このコマンドでは、ubuntu:21.10
というイメージをpullし、それをコンテナとして実行、さらにそのコンテナの中に入り込んでいます。
そのため、ユーザーやOS情報を確認すると、UbuntuOSの中で操作できていることがわかります。
root@0916b7ac5c7c:/# uname -a
Linux 0916b7ac5c7c 5.10.25-linuxkit #1 SMP Tue Mar 23 09:27:39 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
root@0916b7ac5c7c:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=21.10
DISTRIB_CODENAME=impish
DISTRIB_DESCRIPTION="Ubuntu 21.10"
このように、実行したコンテナの中に入ってコマンド操作することが可能です。これは、作成したアプリケーションが想定外の動作をした際のログの調査をしたり、ちょっとした設定変更を試してみたい、といったときに利用できます。
Dockerイメージを自分で作成する
Dockerfileを自分で作成して、アプリケーションを動かしてみましょう。
ここではPythonのbottleというフレームワークを用いてWebサーバを構築してみます。コードの詳細についてはここでは解説しません。
# ディレクトリを作成&移動
$ mkdir sample; cd sample
# ファイルを作成
$ cat <<EOF > ./server.py
from bottle import route, run
@route('/')
def hello():
return "Hello World!!!!!!!\nThank you for reading protogram."
run(host='0.0.0.0', port=8080, debug=True)
EOF
$ cat <<EOF > Dockerfile
FROM python:3.10.5
RUN groupadd web
RUN useradd -d /home/bottle -m bottle
ADD server.py /home/bottle/server.py
RUN pip install bottle
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/python", "/home/bottle/server.py"]
USER bottle
EOF
$ docker build -t sample-app .
$ docker run -d -p 127.0.0.1:8080:8080 sample-app
ここまでのコマンドを実行し終えたら、ブラウザで http://127.0.0.1:8080/ にアクセスしてみてください。以下のような画面が表示されたら成功です。
このようにDockerfileを用いてアプリケーションの実行に必要な手順やコンテキストを揃え、実行することができました。
この記事の通りにファイルを用意することで、皆さんのPCでも同じWebページを作成することができました。こういったポータビリティ(コンテナイメージの軽量さと、その挙動の再現性)の高さがDocker(コンテナ技術)のメリットの一つとなっています。
最後に、上記で起動したコンテナは停止しておきます。以下の手順で停止・削除してください。
$ docker rm -f `docker ps -q`
まとめ
Dockerイメージ・Dockerコンテナとは何かについて、実際にDockerfileを作成してアプリケーションを起動する方法について解説しました。
最後に、実際にアプリケーションを実装する際、Dockerfileの作り方としていくつかの注意点・ベストプラクティスがあります。
これについてはドキュメントにまとめられていますので、ご自身のアプリケーションを実装する際には参考にしてください。
次回は、Dockerでよく使うコマンドについて学習しましょう。
プログラミングスクールの選び方
転職を検討中の方向け
フリーランス・副業で活躍したい方向け
教養・キャリアアップしたい方向け
給付金について詳しく知りたい方向け
学習方法一覧
- はじめに
- DockerイメージとDockerコンテナの基本
- Dockerイメージ
- Dockerコンテナ
- Dockerで簡単なアプリケーションを実行する
- Docker Hubからイメージを取得する
- Dockerイメージを自分で作成する
- まとめ
- プログラミングスクールの選び方
- 学習方法一覧