マニュアル: Docker

投稿日: 更新日:

初期設定

CentOS 7

rootユーザ以外で使用したい場合は、以下のようにする。

  1. /etc/sysconfig/docker を開く。
  2. OPTIONSの最後に-G dockerrootを付ける。
    • -G: Unixソケットのグループを指定するオプション1
  3. 実行したいユーザをdockerrootグループに追加する。

デタッチキーの設定

デフォルトだとCtrl + Pがデタッチキーの一部のため、 .docker/config.jsonに以下のように記載する。 (当初はCtrl + Eにしていたが、これもEmacsキーバインドの1つなので)

{
  "detachKeys": "ctrl-\\"
}

流れ

イメージ

  • イメージのリスト: docker images
  • イメージの削除: docker rmi <IMAGE ID>

イメージを取得

IMAGE_NAME=centos
TAG=7

# タグlatestを取得
docker pull ${IMAGE_NAME}

# タグを指定して取得
docker pull ${IMAGE_NAME}:${TAG}

イメージの内容を表示

ビルド

最後のドットはカレントディレクトリのことです。

IMAGE_NAME=myimage
TAG=1.0

# タグlatestで作成
docker build -t ${IMAGE_NAME} .
docker build -t myimage .

$ タグを指定して作成
docker build -t ${IMAGE_NAME}:${TAG} .
docker build -t myimage:1.0 .
  • オプション
    • --pull: 毎回イメージの最新バージョンがあるかどうかを確認する。

コンテナの実行

NAME=mycontainer
IMAGE_NAME=ubuntu
TAG=18.04
COMMAND=/bin/bash

# タグlatestを実行
docker run -it --name ${NAME} ${IMAGE_NAME}
docker run -it --name mycontainer ubuntu

# タグを指定して実行
docker run -it --name ${NAME} ${IMAGE_NAME}:${TAG}
docker run -it --nane mycontainer ubuntu:18.04

# コマンド(CMD)を上書きして実行
docker run -it --name ${NAME} ${IMAGE_NAME} ${COMMAND}
docker run -it --name mycontainer ubuntu /bin/bash
  • オプション
    • -i: 標準入力の有効化(端末でないと使えないのに注意)
    • -d: バックグラウンドで実行(--detach)
    • -t: 疑似ターミナルの有効化
    • -rm: 終了時に削除
    • -e <名前>=<値>: 環境変数の割り当て
    • -v <ホスト側のパス>:<コンテナ側のパス>: ボリュームを割り当て
      • ホスト側のパスとコンテナ側のパスは両方とも絶対パスの必要があります。
      • 相対パスを指定したいとき
        • ファイル名からパス: $(cd "$(dirname $FILEPATH)"; pwd)
        • ファイル名のみ: $(basename $FILEPATH)
  • プロセスリスト: docker ps
    • docker ps -a: 停止中のもの合わせて表示
  • 入る: docker exec -i -t <コンテナ名> <コマンド(bashなど)>
    • docker exec -u 0: rootで入る
  • 停止: docker stop <コンテナ名>
  • 削除: docker rm <コンテナ名>

ポート割り当て

EXPOSE (incoming ports)

  • -P: 自動割り当て
    • ローカル側のポート番号は空いているポートに割り当てられる。どのポート番号に割り当てられたかは、docker psコマンドで確認可能。
  • -p <ホスト側ポート>:<コンテナ側ポート>: 手動割り当て
    • ホスト側ポートは<ホスト側IPアドレス>:<ホスト側ポート>とすることで、ホスト側のIPアドレスが複数ある場合に割り当てることが可能です。

ログ

特に-d(detached)オプションを使う場合に有効だが、 それ以外でも普通に使える。

docker logs コンテナID

ファイルコピー

cp — Docker-docs-ja 17.06.Beta ドキュメント

以下のようにする。 パスに-を指定すると、標準入力または標準出力を使用する。

docker cp コンテナID:パス ローカルパス
docker cp ローカルパス コンテナID:パス

永続化

Manage data in Docker | Docker Documentation

上の文書によれば、以下の3つが記載されています。

  • ボリューム
  • バインドマウント
  • tmpfsマウント

Data Volume Containerがよく見つかりますが、もういらない子みたいです。

ボリューム

  • 作成: docker volume create ボリューム名
  • リスト: docker volume ls
  • 情報表示: docker volume inspect ボリューム名
  • 削除: docker volume rm ボリューム名
  • 一括削除: docker volume prune

ボリュームの格納場所は /var/lib/docker/volumes/<volume-name>ですが、 macOSやWindowsの場合は仮想PC上で動いているため、以下のようにして入る必要があります。

Docker for Macのvolumesの場所 - Qiita

バックアップが目的なら、以下の方法でも良さそうです。 要はバックアップ用にコンテナを作ってマウントすると。

ネットワーク

  • DNSサーバを明示的に指定: --dns=IPアドレス

Dockerfile

Linter

まだ使ったことないですが、こういうのが便利そう。

レイヤ数は最大127

例えば、以下のようなRUNの行がたくさんあるDockerfileがあったとします。

FROM centos:7

RUN dd if=/dev/urandom of=/root/foo bs=128 count=1 # この行が延々と続く

これを実行すると、125回目のRUNで、以下のようなエラーになりました。

max depth exceeded

しかし、ENVではレイヤが作られないため(下記)、 以下のようなDockerfileではエラーが出ません。 docker historyでは出ます。

FROM centos:7

ENV FOO foo # この行が延々と続く

RUNは&&でつなげる

Minimize the number of layers

RUN/COPY/ADDを使うと、レイヤが追加されます。 特にRUNは分けて書くとレイヤが増えやすいので、&&でつなげるのが基本です。

yum/apt-getのように、パッケージをインストールする際は、 差分を分かりやすくするために、 1行1パッケージで、アルファベット順に並べると良いです。

規約はないようですが、&&は行の先頭に付けることが多いようです。

CMDとENTRYPOINTの使い分け

ENTRYPOINTにメインのコマンドを書いて、 CMDはオプションとして使うと良いと書かれている2

例えば、hugoコマンドの場合、ヘルプコマンドは--helpとなるため、 以下のように指定するとよいかもしれません。 (この場合引数なしができないっぽいので良くないかも。。。)

ENTRYPOINT ["/opt/hugo"]
CMD ["--help"]

ENVとARGの使い分け

  • ENV: 環境変数。Dockerfile以外でも使える。
    • 書式
      • ENV <key> <value>
      • ENV <key1>=<value1> <key2>=<value2>
  • ARG: ビルド時の変数。Dockerfileのみで使える。
    • 書式
      • ARG <name>[=<default value>]

Docker Hubへのpush

自動ビルドの場合

事前準備として、GitHubまたはBitBucketと連携しておく。 連携および作成手順は簡単なので省略。

ただし、初回ビルドは自動で行われないので、以下のようにする。

  1. リポジトリを選択
  2. Build Settingsタブを開く
  3. 対象ブランチのTriggerボタンをクリックする。

手動でpushする場合

事前準備として、アカウントを作成する。

  1. Docker Hubでリポジトリを作成する。
  2. タグを作成する。
    • docker tag 元のイメージ名[:タグ] リポジトリのイメージ名[:タグ]
    • 元のイメージ名はdocker imagesで出てくるREPOSITORY
    • リポジトリのイメージ名は作成したもの。
  3. ログインする。
    • docker login
    • プロンプトでユーザ名、パスワードを入力する。
  4. プッシュする。
    • docker push リポジトリのイメージ名

Docker Compose

Compose file version 3 reference | Docker Documentation

以下で確認している。

  • Docker 18.03.1-ce
  • docker-compose 1.21.1

概要

  • ファイル名はdocker-compose.yml。YAMLで定義する。
  • トップレベルには以下の4つが定義できる。
    • version(文字列): ‘3’とか'3.6’とかのファイルフォーマットを指定
    • services: コンテナのこと。
    • networks: ネットワーク
    • volumes: ボリューム

services

ハッシュで定義する。キーがサービス名。 指定可能なものの例。

  • build: ビルド情報。ハッシュか、単なる文字列か。文字列の場合はcontextになる。
    • 例: build: .docker build .
    • context: ビルドするパス
    • dockerfile: Dockerfileのファイル名
  • image: ビルドするイメージの名前
  • container_name: コンテナ名
  • depends_on: サービスの依存関係
  • ports(Array): -p オプションと同じ
  • volumes(Array): -v オプションと同じ
  • environment(Hash): -e オプションと同じ
  • links: サービスをリンクする
    • レガシー機能らしい。

起動順番を制御

例えば、Webを起動するときに先にDBが起動していることを保証したい場合。

以下のように、Web側に wait-for-it を入れて、待機させる。 なお、この wait-for-it はDebianパッケージがある(README.mdに記載されている)。

コマンドがない場合の対応

psコマンド

Node.js

まだまとまってないのでリンクだけ。

コンテナレジストリ

公式サイト

外部サイト

逆引きマニュアル