Ground Sunlight

Windowsで作る - PHPプログラミングの開発環境

ユーザ用ツール

サイト用ツール


サイドバー

メインメニュー

XAMPP アレンジ

IED

WSL2

道具箱

リポジトリ編

フレームワーク編

公開ソフトウェア

メタ
リンク


このページへのアクセス
今日: 1 / 昨日: 2
総計: 292

docker:20:basic

Dcoker コンテナの基本的な利用方法(Run)

Docker 20.10.1

y2sunlight 2020-12-18

Dockerに戻る

関連記事

リンク

Apacheコンテナの例を使ってDockerコンテナの基本的な利用方法を説明します。この例で使うApacheコンテナはDockerHubの公開リポジトリ(パブリックリポジトリ)で配布されているものを使用します。コンテナの作成(Build)とDockerHubついては他の章で説明します。

本章の実行環境

  • Windows10Pro / WSL2
  • Ubuntu 20.04.1 LTS

本章の実行例は WindowsターミナルのUbuntuターミナルで実行しています。dockerの初期設定については、こちらを参照して下さい。


Dockerサービスの管理

サービスの起動と停止

WSL2ではサービス管理に systemd ではなくて sysV init を使っています。従ってサービスの起動/停止は systemctl コマンドはなくて、service コマンドを使います。Macや他のLinux環境とは異なりますので注意して下さい。

Dockerサービスの起動、停止は次のコマンドで行います:

$ sudo service docker status    # 起動確認
$ sudo service docker start     # 開始
$ sudo service docker stop      # 停止
$ sudo service docker restert   # 再起動
WSL2では、通常のLinuxのようなブートシーケンスの中でのデーモンの起動は行われません。従って、Dockerを起動するには、常に上の手順が必要になります。詳しくは、本編「WSL2/Ubuntu に memcached サービス をインストールする:サービスの自動起動」を参照して下さい。


構成情報の確認

Docker のバージョン情報を表示するには docker version コマンドを、構成情報を表示するには docker info コマンドを実行します:

$ docker version  # バージョン情報の表示
$ docker info     # 構成情報の表示


Dockerイメージの取得

イメージのダウンロード

ここでは、DockerがDockerHubで公式に公開しているApacheのイメージを使用します。

docker pull コマンドでApache(httpd)をダウンロードします。

$ docker pull httpd

実行例:

$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
6ec7b7d162b2: Pull complete
17e233bac21e: Pull complete
130aad5bf43a: Pull complete
81d0a34533d4: Pull complete
da240d12a8a4: Pull complete
Digest: sha256:a3a2886ec250194804974932eaf4a4ba2b77c4e7d551ddb63b01068bf70f4120
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest


Dockerイメージとは

ここでダウンロードしたイメージは「Dockerイメージ」と呼ばれ、親子関係のある複数の層(レイヤ)が透過的に重なり1つのファイルシステムを構成しているものです。各レイヤはファイルシステムやメタ情報を保持していて、その中に実行するプログラムやライブラリも含まれます。

この Docker イメージが、Docker エンジンによって Docker コンテナとして実行されると、Linux の提供する名前空間(namespace)や cgroup によって隔離された特別な状態のプロセスとして起動されます。

Dockerイメージについては、以下を参照して下さい。非常に丁寧に解説されています:


イメージのレイヤ情報出力

docker history コマンドは、Docker イメージをどのように構築したかを調べることができます。このコマンドは、Docker イメージの各レイヤの情報を出力します。

上でダウンロードしたhttpdのレイヤの情報を出力すると:

$ docker image history httpd
IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT
dd85cdbb9987   6 days ago   /bin/sh -c #(nop)  CMD ["httpd-foreground"]     0B
<missing>      6 days ago   /bin/sh -c #(nop)  EXPOSE 80                    0B
<missing>      6 days ago   /bin/sh -c #(nop) COPY file:c432ff61c4993ecd…   138B
<missing>      6 days ago   /bin/sh -c #(nop)  STOPSIGNAL SIGWINCH          0B
<missing>      6 days ago   /bin/sh -c set -eux;   savedAptMark="$(apt-m…   60.9MB
<missing>      6 days ago   /bin/sh -c #(nop)  ENV HTTPD_PATCHES=           0B
<missing>      6 days ago   /bin/sh -c #(nop)  ENV HTTPD_SHA256=740eddf6…   0B
<missing>      6 days ago   /bin/sh -c #(nop)  ENV HTTPD_VERSION=2.4.46     0B
<missing>      6 days ago   /bin/sh -c set -eux;  apt-get update;  apt-g…   7.38MB
<missing>      6 days ago   /bin/sh -c #(nop) WORKDIR /usr/local/apache2    0B
<missing>      6 days ago   /bin/sh -c mkdir -p "$HTTPD_PREFIX"  && chow…   0B
<missing>      6 days ago   /bin/sh -c #(nop)  ENV PATH=/usr/local/apach…   0B
<missing>      6 days ago   /bin/sh -c #(nop)  ENV HTTPD_PREFIX=/usr/loc…   0B
<missing>      7 days ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      7 days ago   /bin/sh -c #(nop) ADD file:3a7bff4e139bcacc5…   69.2MB
  • 出力順は、降順で新しいレイヤ先になります。
  • 各行のCREATED BY がレイヤが作成された時に実行されたコマンドです。
  • CREATED BY を省略無しで出力するには –no-trunc=true を指定しますが、大量に表示されるので、ファイルにリダイレクトして見た方が良いです。


イメージの詳細情報の表示

イメージに関する全ての情報を取得するには、docker inspect コマンドを利用します。

$ docker inspect httpd

上の例は、全ての詳細情報を表示しますが、次の例のように情報の一部を検索することも出来ます。下の例では、イメージの持つコマンドを検索しています。

docker inspect httpd --format='{{.Config.Cmd}}'
[httpd-foreground]

この例から、httpd イメージのコンテナを実行すると httpd-foreground が起動されるのが分かります。


イメージの操作

Dockerイメージの一覧を表示するには docker images を使用します。

実行例:

$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
httpd         latest    dd85cdbb9987   6 days ago      138MB
hello-world   latest    bf756fb1ae65   11 months ago   13.3kB

Dockerイメージを削除するには docker rmi を使用します。

実行例:

$ docker rmi httpd
Untagged: httpd:latest
Untagged: httpd@sha256:a3a2886ec250194804974932eaf4a4ba2b77c4e7d551ddb63b01068bf70f4120
Deleted: sha256:dd85cdbb99877b73f0de2053f225af590ab188d79469eebdb23ec2d26d0d10e8
Deleted: sha256:bc2085990715d2d1ac2179131969b293821dbcf7f0538eaeb3bc3bb6d5645a13
Deleted: sha256:a11bf2367d443697ca6267194a18b31289b59b677133e6482779851fa33992df
Deleted: sha256:388a801aa9f7953143fc154e7bc16dd5b696d2f3578a054b0b804557a8d89d74
Deleted: sha256:37495edb13f558e001fba79f653b38ac3cad5e29f189c1e20501f3f6d5326fdc
Deleted: sha256:87c8a1d8f54f3aa4e05569e8919397b65056aa71cdf48b7f061432c98475eee9

その他、Dockerのイメージ用のコマンドは、以下を参照して下さい。


コンテナの起動

コンテナの起動は docker run コマンドで行います。以下は、先にダウンロードしたapacheイメージをコンテナとして実行した例です:

$ docker run -d -p 8080:80 httpd:latest
fec87985e9846942efee7de5d80b4a8aee83de7276b69b7e97c6425410afeb70
  • -d — コンテナをバックグラウンドで実行
  • -p — ポートフォワードの指定(左がホスト側:8080、右がコンテナ側:80)
  • イメージの指定は「イメージID」または「リポジトリ:タグ名」で指定

docker run コマンドはDockerイメージからコンテナを作成し開始するコマンドです。似たようにコマンドに、コンテナを作成だけをする docker create コマンド、コンテナを開始する docker start コマンドがあります。

netstat コマンドを実行し、apache が動作しているか確認します:

$ netstat -an|grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN

curl で apache にアクセスしてみます:

$ curl http://localhost:8080/
<html><body><h1>It works!</h1></body></html>

次に、WindowsターミナルでPowerShellを開き、netstat コマンドを使って、同じポート番号(8080)がWindows側で開いているか確認します:

>netstat -an|Select-String "8080"
  TCP         [::1]:8080             [::]:0                 LISTENING

Windows側のブラウザを開き、以下のURLにアクセスしてすると、お馴染みの「It works!」が表示されます。

http://localhost:8080/

この例で分かるように、コンテナで起動しているApacheのポート(80)は、ホスト側(Ubuntu)のポート(8080)にフォワードされ、そのフォワードされたポートは、WSL2の仮想ネットワークを通して、Windows側のlocalhostでリスニングできるような仕組みになっています。結局、WSL2では、コンテナ側からホスト側にフォワードしたのと同じポード番号がWindowsのlocalhostで開いていることになります。


コンテナの操作

docker ps コマンドは稼働中のコンテナの一覧を表示します。-a オプションを付けると、停止中のコンテナも含めて全てのコンテナの一覧を表示します。

$ docker ps     # 稼働中のコンテナの一覧
$ docker ps -a  # 全てのコンテナの一覧

実行例:

docker ps -a
CONTAINER ID   IMAGE          COMMAND              CREATED          STATUS                      PORTS     NAMES
fec87985e984   httpd:latest   "httpd-foreground"   47 minutes ago   Exited (0) 48 seconds ago             objective_mahavira

以下のコマンドは、コンテナの開始、停止、強制終了、削除を行います:

実行例:

$ docker start fec87985e984  # 開始
$ docker stop  fec87985e984  # 停止
$ docker kill  fec87985e984  # 強制終了
$ docker rm    fec87985e984  # 削除

その他、Dockerのコンテナ用のコマンドは、以下を参照して下さい。


バインドマウントの利用

バインドマウントとは

バインドマウントとは、ホストマシン上のファイルやディレクトリをコンテナー内にマウントする機能です。そのファイルやディレクトリは、ホストマシン上の絶対パスにより参照できます。バインドマウントは非常に性能の良いものですが、ホストマシンのファイルシステムに依存するものとなります。新たに Docker アプリケーションを開発する場合は、バインドマウントにかわって 名前つきボリュームの利用を考えるのも良いかもしれません。


バインドマウントの例

バインドマウント(bind mounts)の例として、Apache コンテナのドキュメントルートをホスト側にマウントします。

まず、準備としてホスト側で ホームディレクトリ下に新しいディレクトリ(htdocs)を作成し、そこをマウント元にします。

$ cd ~
$ mkdir htdocs
$ cd htdocs

新しいディレクトリ(~/htdocs)に移動して、index.html を作成します:

index.html
<html>
<body>
  <h1>Hello from Docker!</h1>
</body>
</html>

今度は、apache の DocumentRoot を探すために、httpd コンテナを開始して bash を実行します:

$ docker run -it httpd bash
  • -i — コンテナの STDIN にアタッチ
  • -t — 疑似ターミナルの割り当て

コンテナ内で httpd.conf から DocumentRoot の設定を検索します:

# cat /usr/local/apache2/conf/httpd.conf|grep "^DocumentRoot"
DocumentRoot "/usr/local/apache2/htdocs"

コンテナ内での操作が終了したら exit で終了します。

Apacheコンテナの起動

Apache のドキュメントルート( /usr/local/apache2/htdocs )をホスト側の( ~/htdocs )にマウントしてコンテナを開始します(ディレクトリは ~/htdocs で作業しているものをします):

$ docker run -d -p 8080:80 -v $(pwd):/usr/local/apache2/htdocs httpd
  • -d — コンテナをバックグラウンドで実行
  • -p — ポートフォワードの指定(左がホスト側:8080、右がコンテナ側:80)
  • -v — ホスト側の現在のカレントディレクトリ($(pwd))をコンテナの /usr/local/apache2/htdocs にバインドマウント

この例では、-v フラグを使ってバインドマウントを行っています。この習慣は長らく Docker で使用されて来ましたが、最近は –mount の利用が推奨されています。以下の例は、上の -vフラグによる例と同一の結果になります。

$ docker run -d -p 8080:80 --mount type=bind,source=$(pwd),target=/usr/local/apache2/htdocs httpd

両者の違いは次の通りです。

  • -vフラグを使ってファイルやディレクトリをバインドマウントした際に、それがホスト上に存在していなかった場合、そのマウントエンドポイントが常にディレクトリとして生成されます。
  • –mount を使ってバインドマウントした時は、それが存在していなかった場合、ディレクトリの自動生成は発生せず、エラーが出力されます。


コメント

コメントを入力. Wiki文法が有効です:
 
docker/20/basic.txt · 最終更新: 2020/12/23 22:18 by y2sunlight