コンテンツにスキップ

Dockerの基礎知識

ここでは、簡単な Docker の使い方を説明します。 まずは慣れてみましょう。

基本的な使い方

簡単な例1: Hello world

なにはともあれ、"Hello world"してみましょう。Docker がまさしくインストールされていれば、下のコマンドが動くはずです。

docker run hello-world

それぞれのオプションの詳しい意味は、以下の通りです。

  • docker run:新しいコンテナを作成して起動するコマンド
  • hello-world:使用するDockerイメージ名(「hello-world」イメージ)。このイメージは、Dockerの動作確認用で、実行すると「Hello from Docker!」などのメッセージを表示する

もし、以下のようなメッセージが出て、うまく起動できていなさそうな場合は、本ページの一番下のDockerを一般ユーザで実行するをやってみてください。

$ docker run hello-world
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json: dial unix /var/run/docker.sock: connect: permission denied

初回実行時には以下のようなログが流れるはずです。"hello-world"の Docker イメージをダウンロードしてから実行しています。

[keimiya@akipon ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete 
Digest: sha256:f2266cbfc127c960fd30e76b7c792dc23b588c0db76233517e1891a4e357d519
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/

もう一度、同じコマンドを実行してみると少しログの内容が変わります。 最初の"Unable to find image 'hello-world:latest' locally"から始まる 5 行がなくなって、起動も速くなりました。 これは、"hello-world"のコンテナイメージが 1 回目の実行でダウンロードされており、2 回目の実行ではそれを再利用するからです。

[keimiya@akipon ~]$ docker run hello-world

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/

簡単な例2: Webサーバの起動

次は、以下のコマンドで Web サーバを起動させてみましょう。 -d オプションは、デタッチドモードでコンテナを起動するオプションです。 これを利用した場合、そのイメージはバックグラウンドで常時動き続けます。

docker container run -d --rm --name sono1 -p 8080:80 nginx:latest

仮想マシン上のブラウザで http://127.0.0.1:8080 にアクセスしてみてください。うまく行っていれば、Welcome to nginx! というページが表示されます。

コマンドの説明

このDockerコマンドでは、新しいコンテナをバックグラウンドで実行しています。 具体的には、nginxの最新版(nginx:latest)をバックグラウンド(-d)で実行し、ホストの8080ポートからコンテナの80ポートにアクセスできるように設定(-p 8080:80)し、コンテナが終了したら自動的に削除するように設定(--rm)しています。また、このコンテナはsono1という名前で識別されます(--name sono1)。

それぞれのオプションの詳しい意味は、以下の通りです。

  • docker container run: 新しいDockerコンテナを作成して起動
  • -d: コンテナをバックグラウンドモードで実行
  • --rm: コンテナが終了したときに自動的にコンテナを削除。これは停止したコンテナを残したくないときに付与する
  • --name sono1: コンテナにsono1という名前を付ける
  • -p 8080:80: ポートマッピングを行う。ホストの8080ポートをコンテナの80ポートにマッピング。これでホストマシンの8080ポート経由でコンテナのサービス(nginx)にアクセスできるようになります。
  • nginx:latest: 実行するDockerイメージを指定。ここではnginxlatestタグを持つイメージを使用しています。これは、nginxの最新版を意味します。

簡単な例3: 2つ目のWebサーバの起動

別の Web サーバを起動させてみましょう。新しくコンソールを起動して、以下のコマンドを実行してみてください。-pのあとの数字が違うことに気を付けてください。

docker container run -d --rm --name sono2 -p 8081:80 nginx:1.18

ブラウザで http://127.0.0.1:8081 にアクセスしてみてください。うまく行っていれば、Welcome to nginx! というページが表示されます。

今回は以下の部分を変更して、新しいコンテナをバックグラウンドで実行しています。

  • -p 8081:80: ポートマッピングを行う。ホストの8081ポートをコンテナの80ポートにマッピング
  • nginx:1.18: 実行するDockerイメージを指定。ここではnginx1.18タグを持つイメージを使用

起動しているコンテナの確認

docker ps コマンドで起動しているコンテナを確認してみてください。以下のように、2 つのコンテナが起動しているはずです。 これは、デタッチドモードでコンテナを起動しているためです。 IMAGEPORTSNAMESは一緒なはずですが、それ以外の項目の値は違っても問題ありません。

$ docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                                   NAMES
b5cc738dc030   nginx        "/docker-entrypoint.…"   7 seconds ago    Up 5 seconds    0.0.0.0:8080->80/tcp, :::8080->80/tcp   sono1
269b1c385d68   nginx:1.18   "/docker-entrypoint.…"   30 seconds ago   Up 29 seconds   0.0.0.0:8081->80/tcp, :::8081->80/tcp   sono2

チェックポイント:できたら見せてください

起動しているコンテナの停止

docker stop sono1docker stop sono2のコマンドでコンテナを停止します。
また、docker container rm sono1docker container rm sono2というコマンドでコンテナを破棄します。 ブラウザで http://127.0.0.1:8080http://127.0.0.1:8081 を開き、エラーになることを確認してみてください。 もしかすると、ブラウザのキャッシュの機能で、正しくエラーにならないかもしれません。 その際はプライベートモードでブラウザを起動し、アクセスしてみてください。 また、docker psコマンドで何もコンテナが起動していないことを確認してみてください。

ここまで、Docker とコンテナがなんとなく分かったかなと思います。 それでは、次に Docker とコンテナの概要をざっと説明します。

コンテナの基本的な話

ここでは、次に Docker とコンテナの概要をざっと説明します。

コンテナのライフサイクル

コンテナのライフサイクルと状態、それに関するコマンドの関係を示したものは以下の図です。(教科書 P.36 を少しいじったもの) コンテナはイメージという形で、Docker 社が提供するサーバに保管されています。このサーバを Docker Hub リポジトリと呼びます。

イメージを利用する典型的な手順は、以下のようなものです。

  1. Docker Hub リポジトリから、手元のマシンにイメージがダウンロードされる(ローカルイメージ化)
  2. イメージはrunコマンドにより実行される
  3. 実行が終わったら、もしくは、停止させたい場合は、stopコマンドで停止させる
  4. イメージが不必要になったら、rmpruneコマンドで破棄する

ここでポイントなのは、Docker イメージはスナップショットである、ということです。 単に実行中のコンテナをstopするだけでは、実行データが消えてしまう、ということです。 イメージを変更するには、commitコマンドやmount機能などを利用し、新しいイメージを作成しなければなりません。

Dockerの基本的なコマンド

Docker にはいろいろなコマンドあります。以下に基本的なコマンドを列挙しますので、必要に応じて参照したり実行してみてください。

コンテナ操作

  • Docker コンテナの作成
    docker container run --name sono1 nginx

  • Docker コンテナでコマンドを実行
    docker container run nginx date

  • Docker コンテナの一覧の表示
    docker container ls

  • Docker コンテナ情報の確認
    docker container stats --no-stream

  • Docker コンテナの起動
    docker container start sono1

  • Docker コンテナの停止
    docker container stop sono1

  • Docker コンテナの破棄: コンテナ停止と同時にコンテナを破棄
    docker container rm sono1

イメージ操作

  • ローカルの Docker イメージの一覧表示
    docker image ls

  • イメージの削除
    docker image rm hello-world

  • 名前なしイメージの削除(あまり使わない)
    docker image prune -f

コンテナへのアクセス

  • Docker コンテナをすべて表示
    docker ps -a

  • 稼働しているコンテナへの接続(ログ確認など)
    docker attach sono1

  • 稼働しているコンテナへの接続
    docker exec sono1 date
    docker exec -it sono1 bashdocker start sono1などとして、コンテナを稼働させておくこと

Docker Hubとは

Docker Hubは Docker 社が提供しているクラウドサービスです。Docker Hub はクラウド上のレジストリ・サービスであり、アプリケーションやサービス・コンテナの構築と配信を行います。コンテナ化されたイメージを見付け足り、配布したり、変更の管理、ユーザーやチームのコラボレーション、開発パイプラインを通したワークフローの自動化といったことができます。
 たとえば、プログラミング言語 (Python, Java)、Linux のディストリビューション (Ubuntu, Fedora)、Web サーバ (nginx, Apache)、ホームページ作成環境(Wordpress, drupal)、データベース (PostgreSQL, mongoDB)などが登録されています。

Docker Hubのイメージを探す

Docker Hub のページ上部にある、検索ボックスからイメージを検索をできます。"Python"や"CentOS"など気になるものを検索してみましょう。

また、コマンドを用いて、Docker Hub 上にあるコンテナイメージを検索したり取得できます。 タグの検索を行うコマンドはないので、少し不便ですが。

  • イメージの検索
    docker search python

  • イメージの取得
    docker pull python

Docker Hubへのユーザー登録

  1. Docker Hubの登録画面へ

    • Docker ID: (好きなアカウント名)
    • Email: (大学のとか、Gmail とか)
    • Password: (わかりにくいやつ)

  2. Free プランを選んでください。

  3. 登録したメールに確認メールが来ていることを確認して、リンクをクリックしたら登録完了です。