Open6

Docker

haseyuyhaseyuy

Docker操作の基本的な流れ

  1. イメージを探す
  2. イメージの確認
  3. 起動する
  4. 実行状態の確認
  5. コンテナの停止と再開
  6. ログの確認
  7. コンテナの破棄
  8. イメージの破棄

イメージを探す

  • DockerHubから探す
  • docker searchコマンドを使う
  • docker pull イメージ名 でDokcerイメージを取得する
  • タグ名を省略したときはlatestタグが指定されたものとしてpullする
$ docker search centos
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                            The official build of CentOS.                   7002      [OK]
ansible/centos7-ansible           Ansible on Centos7                              135                  [OK]
consol/centos-xfce-vnc            Centos container with "headless" VNC session…   135                  [OK]

# 公式のDockerイメージを検索する
$ docker search centos --filter is-official=true
NAME      DESCRIPTION                     STARS     OFFICIAL   AUTOMATED
centos    The official build of CentOS.   7002      [OK]

イメージの確認

  • docker imagesコマンドを使う
  • docker inspect コマンドでイメージの詳細情報を確認
$ docker images
REPOSITORY              TAG       IMAGE ID       CREATED        SIZE
nginx                   latest    2e7e2ec411a6   6 days ago     134MB
httpd                   2.4       b03352b171b7   6 days ago     136MB

$ docker insepct nginx
[
    {
        "Id": "sha256:2e7e2ec411a6fdeee34c78b4d41d9a7f6d4cd311f320f03bcec11a239f524341",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2022-01-26T05:02:41.260830926Z",
        "Container": "759f1b94f6a49945eecb185036762311b091fcbca4a3fe58db55b823a61532f6",
        "ContainerConfig": {
            "Hostname": "759f1b94f6a4",
 .
 .
 .
  • フォーマットオプション(--format)はGoテンプレートを使い出力を見やすくする
IDとRepositoryのエントリをコロン区切りで表示
docker images --format "{{.ID}}: {{.Repository}}"
2e7e2ec411a6: nginx
b03352b171b7: httpd

起動する

  • docker runコマンドで、コンテナを実行する
  • docker runコマンドは、docker pull, docker create, docker startの一連のコマンドをまとめて実行する
  • docker createコマンドは、コンテナを停止状態で作成する

--nameオプション

  • コンテナ名を指定する
  • --nameオプションを付けないと、ランダムなコンテナ名が付与される

ボリュームのマウント-vオプション

  • -vフラグはコンテナの特定のディレクトリに、ホストのディレクトリをマウント設定する
  • - v ホストのディレクトリ:コンテナのディレクトリ

-d(--detach)オプション

  • コンテナ作成後、コンテナプロセスの標準入出力をコンソールからデタッチする
  • -dがないとアタッチモードで起動する
$ docker run --name hogehoge -d -p 8080:80 nginx

4d29b586c8774231ff9fd64554a68760596332474837b0c2a690684cf7954114

-pオプション

  • ホストのポート番号とコンテナ番号をマッピングする
  • -p 8080:80は、DockerホストのTCPポート8080番を、コンテナの80番にマッピングする
  • マッピングの状態はdocker port コマンドで確認できる
$ docker port hoge
80/tcp -> 0.0.0.0:8080

環境変数の設定 -e(--env)オプション, --env-file

  • コンテナの環境変数を設定
$ docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash

再起動ポリシー--restartオプション

  • 再起動ポリシーを指定する
# :終了コードの状態に関わらず、常に再起動する
$ docker run --restart=always redis

#  失敗したら (on-failure) 10回カウントするまで再起動を行う
$ docker run --restart=on-failure:10 redis

実行状態の確認

  • docker ps コマンドで実行中のコンテナの一覧が表示される

コンテナの停止と再開

  • docker stopコマンドで停止できる
  • docker startコマンドで再開できる

ログの確認

  • docker logsコマンドでログを確認できる
  • docker logs コンテナ名 -fでログを出し続ける

コンテナの廃棄

  • docker stopで停止状態にしてから、docker rmコマンドでコンテナを廃棄する
  • docker ps -aコマンドで完全に削除されたかどうか確認できる

イメージの廃棄

  • docker image rmコマンドでイメージを削除できる
haseyuyhaseyuy

コンテナの操作

停止中もしくはまだ作られていないとき

  • docker run の引数に bin/shbin/bashなどのシェルを指定する、-itオプションもつける

動作中のとき

  • docker exec -it コンテナ名 /bin/bash
haseyuyhaseyuy

PID 1 Problem

  • 一般的にはPID1はinitプロセスで、システムが起動した際に最初に起動するプロセス
  • initプロセスの役割は、ゾンビプロセスの除去とサブプロセスへのシグナル伝播
  • 何の対策もしないと、アプリケーションの起動プロセスがコンテナ上の最初のプロセスとなる為、
    ゾンビプロセスが残ったり、シグナルが正しく処理されないという問題が発生する
  • 回避策として、「明示的にシグナルをハンドリングする」、または「PID1で実行されないようにする」の方法がある

https://github.com/krallin/tini

https://speakerdeck.com/superbrothers/pid1-ha-kanerukara-te-bie-xi-isareterututeben-dang-desuka

haseyuyhaseyuy

DockerホストとDocerコンテナ間のファイルをコピーする

ホスト->コンテナの向きにコピーする場合

docker cp my.cnf <コンテナID>:/etc/my.cnf

コンテナ->ホストの向きにコピーする場合

docker cp <コンテナID>:/etc/my.cnf my.cnf

haseyuyhaseyuy

Docker Compose

  • あらかじめコンテナの起動方法やボリュームなどを書いた定義ファイルを用意して、まとめて実行する方法
  • 定義ファイルはdocker-compose.yml