Docker コンテナを動かしてみよう

作成日:2023/01/20

お役立ちコラム

Docker コンテナを動かしてみよう

本連載の第3回 で、コンテナについて解説しました。
今回は実際に Docker コンテナを動かしてみて、コンテナがどんなものか体験してみましょう。

Docker Desktop をインストールしてコンテナの実行環境を用意する

コンテナを動かす方法はいろいろありますが、一番簡単なのが Docker Desktop をインストールする方法です。
コンテナを動かすための各種ソフトウエアをインストールした仮想マシンができますので、すぐにコンテナを実行できます。

基本的な操作は docker コマンドで行いますが、GUIのダッシュボードで動作状況の確認や簡単な操作が行えるのも Docker Desktop のメリットです。
Docker Desktop は有償ライセンス製品ですが、小規模なビジネス用途 (従業員250名未満かつ年間売り上げ1000万ドル未満)、個人利用であれば無償で利用できます。
今回は学習のため個人利用を想定していますが、業務で使用する場合にはライセンスを購入してください。

Docker Desktop の動作環境

Docker Desktop は Windows、macOS、Linux で動作します。
詳細なハードウエアはOSの要件、インストール方法などは公式ドキュメントを確認してください。

仮想マシンのリソース割り当てを変更する

Docker Desktop のコンテナ実行環境は仮想マシンとして用意されメモリが消費されます。
実行するマシンのメモリが少なく、コンテナ用仮想マシンへの割り当てメモリを減らしたい場合には、Docker Desktop のダッシュボードで設定画面に入り、割当量を変更できます。
最低で1GBの割り当てですが、簡単なコンテナ起動だけであれば十分でしょう。

Docker Desktop のリソース設定画面

Docker Desktop を起動

以降はmacOS版 Docker Desktop を使って説明を行います。
ただし、ほとんどがコマンドラインでの実行なので他のOSの場合でも基本的に同じです。
インストールした Docker Desktop を起動すると、バックグラウンドでコンテナ実行用の仮想マシンが起動します。
起動には少し時間が必要です。

手動でコンテナ上の Nginx を動作させてみる

手動でコンテナを実行し、Webサーバーである Nginx を動作してみます。
ターミナルを起動して、コマンドを実行します。
macOS の zsh を使っていますので、実行例の%表記は macOS のシェルプロンプトです。
root ユーザーであるプロンプト#表記はコンテナ内部で実行したコマンドです。

コンテナイメージをダウンロード

docker pull コマンドで、Ubuntu のコンテナイメージをダウンロードします。

---
% docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
6e3729cf69e0: Pull complete
Digest: sha256:27cb6e6ccef575a4698b66f5de06c7ecd61589132d5a91d098f7f3f9285415a9
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
---

コンテナイメージを確認

docker images コマンドで、ダウンロードしたイメージを確認します。

---
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 6b7dfa7e8fdb 11 days ago 77.8MB
---

必要最低限のファイルしか入っていませんので、約80MBと非常にサイズが小さいです。

コンテナを実行

docker run コマンドで、コンテナを実行します。
-itオプションは対話的にコンテナ内でコマンドを実行します。
ここでは /bin/bash を実行します。
nginx という名前で、ubuntu イメージを使ってコンテナを実行します。

---
% docker run -it --name nginx ubuntu /bin/bash
root@721729ce3f47:/#
---

プロンプトが変更されているので分かる通り、#表記のコマンドプロンプトの場合にはコマンドはコンテナ内で実行されます。
コマンドを入力することで bash から別のプロセスが起動され、コンテナ内部で実行されます。

Nginx をインストール

apt-get コマンドで、コンテナに Nginx をインストールします。
動作確認用に curl コマンドもインストールします。

まず、apt-get update コマンドでパッケージリストを更新します。

---
# apt-get update
Get:1 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
(中略)
Get:18 http://archive.ubuntu.com/ubuntu jammy-backports/main amd64 Packages [3520 B]
Fetched 24.9 MB in 6s (4419 kB/s)
Reading package lists... Done
---

次に apt-get install コマンドでパッケージをインストールします。

---
# apt-get install nginx curl -y
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
(中略)
Running hooks in /etc/ca-certificates/update.d...
done.
---

Nginx の動作確認

Nginx を起動し、curlコマンドで動作を確認します。

---
# nginx (バックグラウンド起動するのでプロンプトに戻る)
# curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
(中略)
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
---

サンプルページのHTMLが表示されれば成功です。
このコンテナは外部からアクセスできるように設定していませんので、Webブラウザーからはアクセスできません。

コンテナイメージとして保存する

現在実行しているコンテナを新しいコンテナイメージとして保存できます。

コンテナ内での処理から抜けます。

---
# exit
%
---

プロンプトがホスト側に戻りました。
ただし、実行していたコンテナは動作を停止していますが、消えずに残っています。
docker commitコマンドで、実行していたコンテナ nginx をコンテナイメージ nginx_image として保存します。
保存後、docker images コマンドで確認します。

---
% docker commit nginx nginx_image
sha256:b2fb8a434e8754227c7c4e52081105a4bf6706c12ce5109c4de11c0fa7ef3b53
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx_image latest b2fb8a434e87 5 seconds ago 174MB
ubuntu latest df5de72bdb3b 11 days ago 77.8MB
---

新たに nginx_image というコンテナイメージが作成されました。
Nginx と curl コマンドをインストールした分、100MBほど増加したのが分かります。

コンテナを外部からアクセスできるようにする

コンテナで Nginx を起動し、ホスト側からアクセスできるようにしてみます。
ホストとコンテナをネットワークで接続するには、-pオプションを指定してホストのTCPポートからコンテナのTCPポートに対してポート転送が行えるように指定します。

---
% docker run -d -p 8080:80 --name=web1 nginx_image nginx -g "daemon off;"
---

Nginx は通常起動するとデーモンとしてバックグラウンド実行されます。
コンテナはフォアグラウンドで実行されているプロセスが存在しませんと、コンテナとしての動作自体が停止します。
そこで Nginx の起動時オプションとして「-g "daemon off;"」を指定してフォアグラウンド起動して動き続けるようにしています。

コンテナにアクセスしてみる

ホストのポート番号8080を、コンテナのポート番号80に転送します。
ホスト上でWebブラウザーを起動して、「localhost:8080」にアクセスしてみますと、Nginx のテストページが表示されます。

Nginx のサンプルページ

イメージとコンテナの変移

Dockerfile でコンテナイメージの作成を自動化

手動によるコンテナイメージ作成のめどがたったら、Dockerfile を記述してコンテナイメージの作成を自動化します。
自動化することで、簡単に新しいコンテナイメージを再作成できます。

Dockerfile を作成する

Dockerfile を作成します。
Dockerfile はホームディレクトリに作成できませんので、適当なディレクトリを作成して、以下の内容の Dockerfile をテキストファイルとして作成します。

---
% mkdir docker
% cd docker
% vi Dockerfile
(Dockerfileの内容を記述)
---

Dockerfile の内容は以下の通りです。

---
FROM ubuntu:latest
RUN apt-get update -y && apt-get install nginx -y
ENTRYPOINT /usr/sbin/nginx -g "daemon off;"
---

FROM 命令はベースとして使用するイメージを指定します。
RUN 命令はコンテナイメージ構築時にコンテナ内で実行するコマンドを指定します。
&&でつないでいますので、apt-get update コマンドが失敗した場合には apt-get install は実行されません。
ENTRYPOINT 命令は、作成したコンテナイメージを使ってコンテナを実行した際に自動的に実行するコマンドを指定します。

コンテナイメージをビルドします

docker build コマンドで、新しいコンテナイメージをビルドします。

---
% docker build -t nginx_dockerfile .
[+] Building 16.9s (6/6) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 36B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 0.0s
=> [1/2] FROM docker.io/library/ubuntu:latest 0.0s
=> [2/2] RUN apt-get update -y && apt-get install nginx -y 16.2s
=> exporting to image 0.7s
=> => exporting layers 0.7s
=> => writing image sha256:e6937e91aa4b657c00b295d1030e89a02d6f91a974bf8 0.0s
=> => naming to docker.io/library/nginx_dockerfile 0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
---

docker images コマンドで作成したイメージを確認します

---
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx_dockerfile latest e6937e91aa4b 29 seconds ago 174MB
nginx_image latest af0fb4d64980 2 minutes ago 178MB
ubuntu latest 6b7dfa7e8fdb 11 days ago 77.8MB
---

ビルドしたコンテナイメージを実行する

ビルドで作成したコンテナイメージを使ってコンテナを実行してみます。
ENTRYPOINT 命令で Nginx の起動を指定しましたので、起動するコマンドラインなしで実行できます。
ローカルのポート番号8081を使って、web2 という名前で実行します。

---
% docker run -d -p 8081:80 --name=web2 nginx_dockerfile
---

Webブラウザーで localhost:8081 にアクセスしてみると、Nginx のテストページが表示されます。

まとめ

コンテナの代表格である Docker コンテナを作成、実行してみました。
必要に応じてコンテナイメージ内の構成を変更できますので、さまざまな目的にコンテナを使用できます。
また、開発環境から本番環境までを同じコンテナイメージで統一することで、環境によっての差異を最小化することなど、コンテナにはいろいろなメリットがあります。
まずは開発環境など手近なところから使い始めて、コンテナに慣れていくとよいでしょう。

執筆者

宮原 徹(みやはら とおる)
1972年、神奈川県生まれ。
中央大学 法学部 法律学科卒。日本オラクルでLinux版Oracleのマーケティングに従事後、2001年に株式会社びぎねっとを設立し、Linuxをはじめとするオープンソースの普及活動を積極的に行い、IPA「2008年度 OSS貢献者賞」を受賞。
2006年に日本仮想化技術株式会社を設立し、仮想化技術に関する情報発信とコンサルティングを行っている。
現在は主にエンタープライズ分野における DevOps について調査・研究を行っており、成果はブログや勉強会などでも発信している。

お問い合わせ

お気軽にお問い合わせください

ページの先頭に戻る