コンテナ仮想化Dockerの使い方 & 実体

Docker Container

以下のナレッジにて、コンテナ仮想化技術を用いたプラットフォームであるDockerの始め方を記載した。

これにより、Dockerが利用できる状態となっているため、本ナレッジではコンテナ仮想化技術を用いたプラットフォームであるDockerの使い方として主要コマンドを、その実体としてイメージやコンテナ等の実ファイル格納場所などを記載する。
本ナレッジは、前述のナレッジの通り、Dockerをインストールおよび起動された状態が前提となる記載である。

Sponsored Links

Dockerの主要コマンド

  • 現在のローカルホストに保存している、Dockerのイメージ一覧を表示
    • 下記の通り、イメージが存在する場合はイメージが表示される
      • 下記ではリポジトリ名hello-world、タグ名latestである、IDがXXXXXXXXXXXのイメージが一つ存在している
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              XXXXXXXXXXX       2 months ago        1.85kB
  • docker pull にてDocker Hub公式のubuntuイメージの最新版をダウンロード
    • pullコマンドは「docker pull myregistrydomain:port/aaa/bbb:latest」といったコマンド例にて、レジストリとして”myregistrydomain”のポートである”port”経由で、名前空間”aaa”にあるリポジトリ”bbb”で、タグ”latest”のイメージをダウンロードする。
      • 下記例では、レジストリ、ポート、名前空間が指定されていないが、指定がなくデフォルトの場合は、レジストリはDocker Hubである”docker.io”、ポートは”5000″、名前空間は”library”となる
$ docker pull ubuntu:latest
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu

XXXXXXXXXX: Pull complete
     ~~~
  • docker runにて、イメージから新規のコンテナを作成して、コマンドを実行
    • 下記例では、”ubuntu:lastest”イメージを利用して、”ddd”という名前のコンテナを作成。作成したコンテナを起動し、コンテナ内で”/bin/bash”を実行し、コンテナに接続してログインしている。
    • 下記例のように、root@Contaner IDでコンテナ内にログインできていることが確認できる。
$ docker run -it --name ddd ubuntu:latest /bin/bash
root@4e0b0bd218e2:/#
  • コンテナ内にログインした状況のため、一旦ログアウトして、コンテナを停止。
root@4e0b0bd218e2:/# exit
  • 現在のコンテナ一覧を表示
    • 下記例では先ほど作成したdddという名前で、IDが”4e0b0bd218e2″のコンテナが存在していることが確認できる。
    • “STATUS”が”Exited”でコンテナが停止していることが確認できる
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
4e0b0bd218e2        ubuntu              "/bin/bash"         18 minutes ago      Exited (0) 4 minutes ago                           ddd
  • 作成済みコンテナを起動
    • そして、再度コンテナ状況を確認すると、”STATUS”が”UP”となっており、コンテナが起動していることが確認できる。
$ docker start ddd
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4e0b0bd218e2        ubuntu              "/bin/bash"         25 minutes ago      Up 2 minutes                            ddd
  • 作成済みコンテナを再起動
$ docker restart ddd
  • “docker exec”コマンドで”/bin/bash”を実行し、起動済みコンテナにログインする
$ docker exec -i -t ddd /bin/bash
root@4e0b0bd218e2:/#
  • コンテナから”exit”コマンドでログアウト
    • そして、コンテナ状況を確認すると、起動したままであることが確認できる。
      • “docker exec”コマンドでコンテナにログインした場合”exit”でログアウトしてもコンテナは継続して起動し続ける。
root@4e0b0bd218e2:/# exit
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4e0b0bd218e2        ubuntu              "/bin/bash"         26 minutes ago      Up 3 minutes                            ddd
  • 今度は、”docker attach”コマンドで、起動済みコンテナにログイン
    • 本コマンドでもコンテナにログイン可能
docker attach ddd
root@4e0b0bd218e2:/#
  • “docker attach”コマンドでログインした状態から、コンテナを停止せずにログアウトする場合、下記キーを入力する
    • その後コンテナ状態を確認すると、”STATUS”が”UP”の状態を維持し、起動したままであることが確認できる。
ctrl-p ctrl-q

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4e0b0bd218e2        ubuntu              "/bin/bash"         27 minutes ago      Up 4 minutes                            ddd
  • 続いて、再度”docker attach”コマンドで、起動済みコンテナにログインし、そこで”exit”でログアウト
    • この場合、前述の”docker exec”でログインした状態から”exit”した場合と違い、ログアウトとあわせてコンテナが停止する
    • 以下の通り、”STATUS”が”Exited”であることを確認できる。
docker attach ddd
root@4e0b0bd218e2:/# exit

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
4e0b0bd218e2        ubuntu              "/bin/bash"         37 minutes ago      Exited (0) 2 minutes ago                           ddd

Dockerのファイル実体・構造

Dockerはその仕組み上、ホスト側にDokcer関連の実体ファイルが格納されている。
コンテナのディスク使用量が増加したら、その分ホスト側のディスク使用量も圧迫する。
そのため、実体ファイルの場所を把握し、増加対象のディレクトリを踏まえてディスクのリソース管理をする必要がある。
そのため、Dockerで利用されているファイルの場所等をナレッジとして記載する。

  • 基本的にDocker関連のファイルは下記ディレクトリ内に格納されている。
/var/lib/docker

$ sudo ls /var/lib/docker
builder  buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes
  • Dockerのイメージおよびコンテナのファイル実体としてはホスト上の下記ディレクトリとなる。
    • Dockerの仕組み上、単純に一つのディレクトリ、一つのファイルにまとまっているわけではなく、多層のレイヤに分かれており、レイヤ毎のディレクトリが存在する。
    • ディレクトリ配下のdiffディレクトリ内を確認すると、コンテナ内で更新された差分の実体ファイルが確認できる
/var/lib/docker/overlay2/

$ sudo ls /var/lib/docker/overlay2
$ sudo ls /var/lib/docker/overlay2/XXXXXXXXXXXXX/diff

Dockerのログファイルは2種類ある。Dockerで動作させているコンテナ内のログと、Dockerサービス・Dockerデーモン自体のログである。

  • Dockerで動作させているコンテナ内のログファイル実体について記載する。ホスト上の下記ディレクトリにファイルは格納されている。
    • ディレクトリおよびログファイルの名前が、対応するコンテナIDを含んだ名前となっている。 
    • これは各コンテナ内で出力されたSTDOUTとSTDERRが記載されたものである。
/var/lib/docker/containers/

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
4e0b0bd218e2        ubuntu              "/bin/bash"         43 minutes ago      Exited (0) 1 minutes ago                           ddd
$ sudo ls /var/lib/docker/containers/
4e0b0bd218e2xxxxxxxxxxxxxxxxxxxxxxxx
$ sudo ls /var/lib/docker/containers/4e0b0bd218e2xxxxxxxxxxxxxxxxxxxxxxxx/
4e0b0bd218e2xxxxxxxxxxxxxxxxxxxxxxxx-json.log
  • また、上記は実体となるが、下記のようにコンテナ名を指定したコマンドでもログは確認可能である。
$ docker logs ddd
  • 一方で、Dockerサービス、Dockerデーモン自体のログについては、下記コマンドにて確認可能となる。
    • Linuxディストリビューションや環境により格納先や確認方法は異なるが、最近のLinuxで良く使われている環境であるsystemdによりdocker serviceが管理されている環境のケースについて言及する (直近のUbuntuやCentOSなどが該当する)
    • Dockerサービスを管理している”systemd”はログシステムである”journal”を保持している。そのため、Dockerサービス自体のログは”journal”を利用することで確認可能である。
    • 本ケースとは異なるケースの一例をあげると” /var/log/messages | grep docker”や”/var/log/docker.log”で確認可能な場合もある。
$ journalctl -u docker.service
  • また、上記の実体ファイルは下記となるが、jounalファイルはバイナリとなるため、ログを確認する際は上記のコマンド対応が必要となる。
/var/log/journal

$ ls /var/log/journal
Sponsored Links