Dockerコンテナの使用

Dockerコンテナは、アプリケーションを実行するための軽量で移植可能な自己完結型のソフトウェア環境です。

Dockerコンテナは、アプリケーションとそのすべての依存関係(ライブラリ、設定ファイル、システムツールなどを含む)を標準化されたパッケージにカプセル化し、アプリケーションをどこでも一貫して実行できるようにします。

コンテナはOSレベルの仮想化であり、完全なOSを実行する必要がないため、起動と実行がより効率的です。

イメージとコンテナの関係

  • イメージ(Image):コンテナの静的テンプレートであり、アプリケーションの実行に必要なすべての依存関係とファイルを含みます。イメージは不変です。
  • コンテナ(Container):イメージの実行インスタンスであり、独自のファイルシステム、プロセス、ネットワークなどを持ち、動的です。コンテナはイメージから起動し、実行中は変更可能な状態を保ちます。


Dockerクライアント

Dockerクライアントは、Dockerデーモン(Docker Daemon)と対話するコマンドラインツールです。

docker クライアントは非常にシンプルで、docker コマンドを直接入力することで、Dockerクライアントのすべてのコマンドオプションを確認できます。

サンプル@サンプル:~# docker

コマンドを使ってdocker command --help指定したDockerコマンドの使用方法をより深く理解できます。

例えば、確認したいのはdocker statsコマンドの具体的な使用方法:

サンプル@サンプル:~# docker stats --help

以下はよく使われるDockerクライアントコマンドです:

コマンド機能例
docker run新しいコンテナを起動してコマンドを実行するdocker run -d ubuntu
docker ps現在実行中のコンテナを一覧表示するdocker ps
docker ps -aすべてのコンテナを一覧表示する(停止中のコンテナを含む)docker ps -a
docker buildDockerfileを使用してイメージを構築するdocker build -t my-image .
docker imagesローカルに保存されているすべてのイメージを一覧表示するdocker images
docker pullDockerリポジトリからイメージを取得するdocker pull ubuntu
docker pushイメージをDockerリポジトリにプッシュするdocker push my-image
docker exec実行中のコンテナでコマンドを実行するdocker exec -it container_name bash
docker stop1つまたは複数のコンテナを停止するdocker stop container_name
docker start停止したコンテナを起動するdocker start container_name
docker restartコンテナを再起動するdocker restart container_name
docker rm1つまたは複数のコンテナを削除するdocker rm container_name
docker rmi1つまたは複数のイメージを削除するdocker rmi my-image
docker logsコンテナのログを表示するdocker logs container_name
docker inspectコンテナまたはイメージの詳細情報を取得するdocker inspect container_name
docker exec -itコンテナの対話型ターミナルに入るdocker exec -it container_name /bin/bash
docker network lsすべてのDockerネットワークを一覧表示するdocker network ls
docker volume lsすべてのDockerボリュームを一覧表示するdocker volume ls
docker-compose upマルチコンテナアプリケーションを起動する(docker-compose.ymlファイル)docker-compose up
docker-compose down停止して削除する(docker-composeによって起動されたコンテナ、ネットワークなど)docker-compose down
docker infoDockerシステムの詳細情報を表示するdocker info
docker versionDockerクライアントとデーモンのバージョン情報を表示するdocker version
docker statsコンテナのリアルタイムリソース使用状況を表示するdocker stats
docker loginDockerリポジトリにログインするdocker login
docker logoutDockerリポジトリからログアウトするdocker logout

よく使うオプションの説明:

  • -d:コンテナをバックグラウンドで実行する。例:docker run -d ubuntu。
  • -it:対話型ターミナルでコンテナを実行する。例:docker exec -it container_name bash。
  • -t:イメージにタグを指定する。例:docker build -t my-image .。

コンテナの使用

イメージの取得

ローカルにubuntuイメージがない場合は、docker pull コマンドを使用してubuntuイメージを読み込むことができます:

$ docker pull ubuntu

コンテナの起動

次のコマンドは ubuntu イメージを使用してコンテナを起動します。パラメータはコマンドラインモードでそのコンテナに入るためのものです:

$ docker run -it ubuntu /bin/bash

パラメータの説明:

  • -i: 対話的操作。
  • -t: ターミナル。
  • ubuntu: ubuntu イメージ。
  • /bin/bash:イメージ名の後にあるのはコマンドです。ここでは対話型シェルを希望するため、/bin/bash を使用します。

ターミナルを終了するには、直接exit:

root@ed09e4490c57:/# exit

停止したコンテナの起動

すべてのコンテナを確認するコマンドは次のとおりです:

$ docker ps -a

画像をクリックすると拡大表示されます:

停止したコンテナを docker start で起動します:

$ docker start b750bbbcfd88 

バックグラウンド実行

ほとんどの場合、docker のサービスをバックグラウンドで実行したいので、私たちは-dでコンテナの実行モードを指定できます。

$ docker run -itd --name ubuntu-test ubuntu /bin/bash

画像をクリックすると拡大表示されます:

注:を追加すると-dパラメータはデフォルトではコンテナに入らず、コンテナに入るにはコマンドを使用する必要があります docker exec(後述します)。

コンテナの停止

コンテナを停止するコマンドは次のとおりです:

$ docker stop <容器 ID>

停止したコンテナは docker restart で再起動できます:

$ docker restart <容器 ID>

コンテナに入る

を使用して-dパラメータでコンテナを起動すると、コンテナはバックグラウンドで実行されます。その際、コンテナに入りたい場合は、次のコマンドで入ることができます:

  • docker attach:コンテナの標準入力(stdin)、標準出力(stdout)、標準エラー(stderr)と対話できるようにします。

  • docker exec:docker exec コマンドの使用をお勧めします。このコマンドはコンテナのターミナルを終了しても、コンテナの停止にはつながらないためです。

attach コマンド

docker attach コマンドの使用例:

$ docker attach 1e560fca3906 

注意:このコンテナから終了すると、コンテナが停止します。

exec コマンド

docker exec コマンドの使用例:

docker exec -it 243c32535da7 /bin/bash

注意:このコンテナから終了しても、コンテナは停止しません。これが docker exec を使用することが推奨される理由です。docker exec。

その他のパラメータの説明は、を使用してくださいdocker exec --helpコマンドで確認してください。

コンテナのエクスポートとインポート

コンテナのエクスポート

ローカルのコンテナをエクスポートする場合は、を使用できますdocker exportコマンド。

$ docker export 1e560fca3906 > ubuntu.tar

コンテナ 1e560fca3906 のスナップショットをローカルファイル ubuntu.tar にエクスポートします。

これでコンテナのスナップショットがローカルファイルにエクスポートされます。

コンテナスナップショットのインポート

docker import を使用すると、コンテナのスナップショットファイルからイメージとしてインポートできます。次の例では、スナップショットファイル ubuntu.tar をイメージ test/ubuntu:v1 にインポートします:

$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1

さらに、URLまたはディレクトリを指定してインポートすることもできます。例:

$ docker import http://example.com/exampleimage.tgz example/imagerepo

コンテナの削除

コンテナの削除には、を使用しますdocker rmコマンド:

$ docker rm -f 1e560fca3906

次のコマンドで、終了状態にあるすべてのコンテナをクリーンアップできます。

$ docker container prune

Webアプリケーションの実行

先ほど実行したコンテナには特に特別な用途はありませんでした。

次に、docker を使用してWebアプリケーションを構築してみましょう。

dockerコンテナ内でPython Flaskアプリケーションを実行して、Webアプリケーションを起動します。

サンプル@サンプル:~# docker pull training/webapp  # 载入镜像
サンプル@サンプル:~# docker run -d -P training/webapp python app.py

パラメータの説明:

  • -d:コンテナをバックグラウンドで実行させます。

  • -P:コンテナ内部で使用するネットワークポートを、使用中のホストにランダムにマッピングします。


WEBアプリケーションコンテナの確認

docker ps を使用して、実行中のコンテナを確認します:

サンプル@サンプル:~#  docker ps
CONTAINER ID        IMAGE               COMMAND             ...        PORTS                 
d3d5e39ed9d3        training/webapp     "python app.py"     ...        0.0.0.0:32769->5000/tcp

ここにはポート情報も表示されています。

PORTS
0.0.0.0:32769->5000/tcp

Dockerは5000番ポート(Python Flaskのデフォルトポート)をホストのポート32769にマッピングしています。

このとき、ブラウザでWEBアプリケーションにアクセスできます。

-p パラメータを使用して、別のポートを設定することもできます:

サンプル@サンプル:~$ docker run -d -p 5000:5000 training/webapp python app.py

docker ps実行中のコンテナを確認する

サンプル@サンプル:~#  docker ps
CONTAINER ID        IMAGE                             PORTS                     NAMES
bf08b7f2cd89        training/webapp     ...        0.0.0.0:5000->5000/tcp    wizardly_chandrasekhar
d3d5e39ed9d3        training/webapp     ...        0.0.0.0:32769->5000/tcp   xenodochial_hoov

コンテナ内部の5000番ポートが、ローカルホストの5000番ポートにマッピングされています。


ネットワークポートのショートカット

を通じてdocker psコマンドでコンテナのポートマッピングを確認できます。dockerまた、別のショートカットも提供されています。docker port、を使用するとdocker port指定した(IDまたは名前)コンテナの特定のポートがホストのどのポート番号にマッピングされているかを確認できます。

上記で作成したWebアプリケーションコンテナのIDはbf08b7f2cd89名前はwizardly_chandrasekhar。

次を使用できますdocker port bf08b7f2cd89 或 docker port wizardly_chandrasekharコンテナポートのマッピング状況を確認できます。

サンプル@サンプル:~$ docker port bf08b7f2cd89
5000/tcp -> 0.0.0.0:5000
サンプル@サンプル:~$ docker port wizardly_chandrasekhar
5000/tcp -> 0.0.0.0:5000

WEBアプリケーションログの確認

docker logs [IDまたは名前] でコンテナ内部の標準出力を確認できます。

サンプル@サンプル:~$ docker logs -f bf08b7f2cd89
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.239.1 - - [09/May/2016 16:30:37] "GET / HTTP/1.1" 200 -
192.168.239.1 - - [09/May/2016 16:30:37] "GET /favicon.ico HTTP/1.1" 404 -

-f: 让 docker logsのように使用してtail -fコンテナ内部の標準出力を出力できます。

上記から、アプリケーションが5000ポートを使用しており、アプリケーションのアクセスログを確認できることがわかります。


WEBアプリケーションコンテナのプロセスを確認する

docker top を使用してコンテナ内部で実行中のプロセスを確認することもできます

サンプル@サンプル:~$ docker top wizardly_chandrasekhar
UID     PID         PPID          ...       TIME                CMD
root    23245       23228         ...       00:00:00            python app.py

WEBアプリケーションを検査する

使用してdocker inspectDockerの基本情報を確認できます。Dockerコンテナの設定と状態情報を記録したJSONファイルが返されます。

サンプル@サンプル:~$ docker inspect wizardly_chandrasekhar
[
    {
        "Id": "bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85",
        "Created": "2018-09-17T01:41:26.174228707Z",
        "Path": "python",
        "Args": [
            "app.py"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 23245,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-09-17T01:41:26.494185806Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
......

WEBアプリケーションコンテナを停止する

サンプル@サンプル:~$ docker stop wizardly_chandrasekhar   
wizardly_chandrasekhar

WEBアプリケーションコンテナを再起動する

停止済みのコンテナは、docker start コマンドで起動できます。

サンプル@サンプル:~$ docker start wizardly_chandrasekhar
wizardly_chandrasekhar

docker ps -l で最後に作成したコンテナを確認:

#  docker ps -l 
CONTAINER ID        IMAGE                             PORTS                     NAMES
bf08b7f2cd89        training/webapp     ...        0.0.0.0:5000->5000/tcp    wizardly_chandrasekhar

実行中のコンテナは、次を使用してdocker restartコマンドで再起動できます。


WEBアプリケーションコンテナを削除する

docker rm コマンドを使用して不要なコンテナを削除できます

サンプル@サンプル:~$ docker rm wizardly_chandrasekhar  
wizardly_chandrasekhar

コンテナを削除する際は、コンテナが停止状態である必要があります。そうでない場合は次のエラーが発生します

サンプル@サンプル:~$ docker rm wizardly_chandrasekhar
Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove
その他の拡張