初期設定
CentOS 7
rootユーザ以外で使用したい場合は、以下のようにする。
/etc/sysconfig/docker
を開く。OPTIONS
の最後に-G dockerroot
を付ける。-G
: Unixソケットのグループを指定するオプション1。
- 実行したいユーザを
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}
イメージの内容を表示
- docker inspectを使う。
ビルド
最後のドットはカレントディレクトリのことです。
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 <コンテナ名>
ポート割り当て
-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は&&でつなげる
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と連携しておく。 連携および作成手順は簡単なので省略。
ただし、初回ビルドは自動で行われないので、以下のようにする。
- リポジトリを選択
- Build Settingsタブを開く
- 対象ブランチのTriggerボタンをクリックする。
手動でpushする場合
事前準備として、アカウントを作成する。
- Docker Hubでリポジトリを作成する。
- タグを作成する。
docker tag 元のイメージ名[:タグ] リポジトリのイメージ名[:タグ]
- 元のイメージ名は
docker images
で出てくるREPOSITORY - リポジトリのイメージ名は作成したもの。
- ログインする。
docker login
- プロンプトでユーザ名、パスワードを入力する。
- プッシュする。
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で定義する。
- docker-compose.override.yml というファイルで上書き定義が可能。一時的に環境変数を変更するなど。
- トップレベルには以下の4つが定義できる。
- version(文字列): ‘3’とか'3.6’とかのファイルフォーマットを指定
- services: コンテナのこと。
- networks: ネットワーク
- volumes: ボリューム
services
ハッシュで定義する。キーがサービス名。 指定可能なものの例。
- build: ビルド情報。ハッシュか、単なる文字列か。文字列の場合はcontextになる。
- 例:
build: .
→docker build .
- context: ビルドするパス
- dockerfile: Dockerfileのファイル名
- 例:
- image: ビルドするイメージの名前
- container_name: コンテナ名
- depends_on: サービスの依存関係
- https://docs.docker.com/compose/compose-file/#depends_on
- サービスの起動順番は制御できるが、サービスがReadyになったかどうかは制御できない(ラッパーが必要)。
- ports(Array):
-p
オプションと同じ - volumes(Array):
-v
オプションと同じ - environment(Hash):
-e
オプションと同じ - links: サービスをリンクする
- レガシー機能らしい。
起動順番を制御
例えば、Webを起動するときに先にDBが起動していることを保証したい場合。
以下のように、Web側に wait-for-it
を入れて、待機させる。
なお、この wait-for-it
はDebianパッケージがある(README.mdに記載されている)。
- Control startup and shutdown order in Compose | Docker Documentation
- vishnubob/wait-for-it: Pure bash script to test and wait on the availability of a TCP host and port
コマンドがない場合の対応
psコマンド
- Ubuntu: procps, iputils-ping, net-tools
- CentOS: procps-ng
Node.js
まだまとまってないのでリンクだけ。
コンテナレジストリ
公式サイト
外部サイト
- Docker ドキュメント日本語化プロジェクト — Docker-docs-ja 17.06.Beta ドキュメント
- docker コマンド チートシート - Qiita
- 効率的に安全な Dockerfile を作るには - Qiita
- 私家版 Dockerfile Pattern
- Docker の Volume plugin で NFS や Glusterfs を利用する - Qiita
- Dockerfileのベストプラクティス Top 20 – Sysdig
- 社内のDockerfileのベストプラクティスを公開します│FORCIA CUBE│フォルシア株式会社
関連項目
逆引きマニュアル
- DockerでOracleデータベースを使用する方法
- Docker: httpdの使用方法
- 【未完了】CentOS 7 VMのディスクイメージからDockerコンテナを作成して動かす
- Docker: コンテナからSSHログインしたときにLANGを引き継がないようにする
- Docker: Alpine Linuxの使い方
- Dockerでマウントしたファイルにアクセスできない
- DockerでRubyを使う方法
- Dockerでタイムゾーンを設定する方法
- Jenkins: Dockerの使用方法
- Docker: CentOS 7イメージの使い方
- DockerでMavenを使う方法
- Docker: ADDで追加したファイルが変更されない
- Docker: Debianイメージの使い方
- DockerでMariaDB/MySQLを使う方法
- DockerでJenkinsを動かす方法
- Jenkins: 初期設定