コンテナ実行の代表格「Docker」とは

【連載コラム:仮想化技術をしっかり解説します(6)】
さまざまな場面でよく聞くようになったDockerについて、インストールから使用に至るまでを解説します。

最終更新日:2022年08月05日

前回は、Linuxカーネルの機能を使った仮想マシンソフトウェアであるKVMについて解説しました。今回はコンテナを実行するソフトウェアであるDockerについて解説します。


Dockerはコンテナソフトウェアの代表格

コンテナも仮想化技術の一種であることは本連載でも解説しました。また、コンテナを実現するソフトウェアも複数あることも紹介しました。

【連載コラム第3回】仮想化技術「コンテナ」はどうしてWebアプリ開発に向いている?またコンテナの学習方法は??

今回は、コンテナを動かしてみるということで、コンテナを実行するソフトウェアの代表格であるDockerを使ってみようと思います。

Dockerのインストール

Dockerは各種OS、ディストリビューションに対応しているので、かなり幅広く実行環境を準備することができます。Linuxはもちろん、WindowsであればDocker Desktopをインストールし、コンテナはWSL2(Windows Subsystem for Linux)をバックエンドにして、Linux上で動作するコンテナを実行することもできます。
ご自身の環境に合わせて、Dockerのインストールを行ってください。

Dockerのインストール情報

とにかく動かしてみよう

Dockerのインストールが終わったら、早速コンテナを起動してみましょう。

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

まず、コンテナの元となるイメージをダウンロードします。docker pullコマンドを実行します。ここではUbuntuのコンテナイメージをダウンロードします。

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
57d0418fe9dc: Pull complete
Digest: sha256:bea6d19168bbfd6af8d77c2cc3c572114eb5d113e6f422573c93cb605a0e2ffb
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

コンテナを起動する

コンテナを起動します。docker runコマンドを実行します。コンテナ内でbashを起動します。

$ docker run -it ubuntu bash
root@96459b0c213d:/# id
uid=0(root) gid=0(root) groups=0(root)

idコマンドを実行すると、ユーザーrootで動作しているのが分かります。

動作しているコンテナを確認する

動作しているコンテナを確認するには、docker psコマンドを実行します。
現在使っているコンソールはコンテナ内のbashを実行するのに使っているので、別のターミナルを起動するなどして、Dockerのホスト側でコマンドを実行します。

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
96459b0c213d   ubuntu    "bash"    3 minutes ago   Up 3 minutes             distracted_cartwright

コンテナIDはユニークなIDが割り振られます。先ほどのbashのコマンドプロンプトにも同じIDが表示されていたので、コンテナのホスト名にコンテナIDが割り当てられているのが分かります。NAMESは明示的にコンテナ名を指定しなかった場合、適当な名前が割り振られています。

コンテナにWebサーバーを入れてみる

コンテナにWebサーバーとしてNGINXをインストールしてみます。

パッケージリストの更新

まず、apt updateでパッケージリストを更新します。

root@96459b0c213d:/# apt update
(略)
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.

NGINXのインストール

NGINXのパッケージをインストールします。
インストールの途中でタイムゾーンの設定が要求されるので、Asia-Tokyoを選択してください。

root@96459b0c213d:/# apt install nginx
(略・依存関係のあるパッケージが選択される)
0 upgraded, 40 newly installed, 0 to remove and 0 not upgraded.
Need to get 15.2 MB of archives.
After this operation, 59.4 MB of additional disk space will be used.
Do you want to continue? [Y/n] ※Enterキーを入力
(略・パッケージのダウンロードとインストールが行われる)
Configuring tzdata
------------------

Please select the geographic area in which you live. Subsequent configuration questions will narrow this down
by presenting a list of cities, representing the time zones in which they are located.

  1. Africa   3. Antarctica  5. Arctic  7. Atlantic  9. Indian    11. SystemV  13. Etc
  2. America  4. Australia   6. Asia    8. Europe    10. Pacific  12. US
Geographic area: 6 ※6. Asiaを選択

Please select the city or region corresponding to your time zone.

(略・都市名が表示される)
Time zone: 79 ※79. Tokyoを選択
(略・パッケージのインストールが続行される)
Setting up nginx (1.18.0-0ubuntu1.2) ...
Processing triggers for libc-bin (2.31-0ubuntu9.7) ...
root@96459b0c213d:/# 

NGINXの起動と動作テスト

コンテナ内でNGINXを起動します。

root@96459b0c213d:/# nginx

動作テストを行うためにcurlをインストールして、localhostとして接続してみます。

root@96459b0c213d:/# apt install curl
root@96459b0c213d:/# curl localhost
(HTMLが表示される)

これで無事にコンテナ内でWebサーバーを動かすことができました。

NGINXが起動するコンテナイメージを作成する

コンテナ内でNGINXが動作するようになったので、このコンテナを外部からもアクセスできるようにします。そのためには、現在のコンテナからコンテナイメージを作成し、起動する際に外部からの接続を受け付けるように設定します。

NGINXをフォアグラウンド実行するように変更する

コンテナ内でNGINXを手動起動すると、デーモンとしてバックグラウンドで実行されます。コンテナを起動した際に、バックグラウンド実行になるとコンテナ自体が停止してしまうので、NGINXをフォアグラウンド実行されるように設定を変更しておきます。コンテナ内で、nginx.confファイルに「daemon off;」と設定を書き込んでおきます。

root@96459b0c213d:/# echo "daemon off;" >> /etc/nginx/nginx.conf

コンテナを停止する

現在実行しているコンテナを停止します。まず、コンテナ内でのbashの操作からexitコマンドで抜けだし、さらにdocker stopコマンドでコンテナを停止します。

root@96459b0c213d:/# exit
exit
$ docker stop 96459b0c213d
96459b0c213d

docker stopコマンドには引数としてコンテナIDまたはコンテナ名を指定します。

コンテナイメージを作成する

停止しているコンテナから、新しいコンテナイメージを作成します。docker commitコマンドを実行します。

$ docker commit 96459b0c213d nginx
sha256:3dcb75f1dfcc0e5e1cf5d41c83e02fd1c4abeb9a35cf6a67461c8fa6adbb4209

コンテナイメージを確認する

作成されたコンテナイメージを確認します。docker imagesコマンドを実行します。

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        latest    3dcb75f1dfcc   24 seconds ago   162MB
ubuntu       latest    e784f03641c9   5 days ago       65.6MB

新しくnginxイメージが作成されています。NGINXをインストールした分、約100MBサイズが増加しています。

外部からの接続を受け付けるようにコンテナを実行する

新しく作成したコンテナイメージを使ってコンテナを実行します。外部からの接続を受け付けるには、dockr runコマンド実行時に-pオプションでポートを割り当てます。

$ docker run -d -p 8080:80 nginx nginx

-dオプションは、コンテナに接続せずに実行するためのオプションです。-pオプションでは、コンテナホスト側のポート番号8080を、起動するコンテナの80番ポートに紐付けます。
nginxの指定が2つありますが、最初のnginxはコンテナイメージを指定、後ろのnginxはそのコンテナで実行するコマンド、すなわちnginxをフォアグラウンドで実行するように指定しています。

アクセスして確認してみる

それでは、コンテナに接続してみましょう。コンテナホスト側でcurlコマンドを実行し、localhostの8080番ポートにアクセスしてみます。

$ curl localhost:8080
(HTMLが表示される)

無事、HTMLが表示されれば、コンテナへのアクセスは成功です。

コンテナ独特の動作を理解する

コンテナにWebサーバーをインストールし、イメージの作成、外部からの接続を受け付けるように実行する方法を解説しました。一部、NGINXをフォアグラウンド実行するようにしたり、コンテナホストのポート番号との紐付けなど、コンテナに独特な動作を理解する必要がある部分が難しかったのではないでしょうか。まずは上記手順を1つずつしっかりと実行して動作確認をしてみてください。


筆者紹介
宮原 徹 氏

宮原 徹 氏

株式会社びぎねっと

Linux標準教科書、Linuxサーバー構築標準教科書などの監修者。LinuCレベル1/レベル2 Version10.0の改訂作業にも協力。また、幅広いOSSに関する情報提供の場として「オープンソースカンファレンス(OSC)」の企画運営も。


バックナンバー

第10回:クラウド利用の留意点

第9回:オンプレミスのクラウド環境

第8回:たくさんあるぞ!クラウドサービス

第7回:クラウド〜仮想化技術の活用系〜

第6回:コンテナ実行の代表格「Docker」とは

第5回:仮想化を実現するソフトウェア|KVM

第4回:仮想化を実現するソフトウェア|VirtualBox

第3回:第3のサーバー環境「コンテナ」

第2回:仮想化の種類と特徴

第1回:仮想化技術ってなんだろう?なぜ必要なの??

ページトップへ