#
ドキュメント

Document

自分のための備忘録です。

Docker 基礎

コンテナ作成方法

  • DockerfileからDockerコンテナ作成
  • Docker HubからDockerコンテナ作成

DockerfileからDockerコンテナ作成

  1. .Dockerfileを作成
  2. build: DockerfileからDockerイメージを作成
  3. run/create: DockerイメージからDockerコンテナを作成

    docker create コマンドは、コンテナを停止状態 (stop した状態) で作成する以外は、run コマンドと同等です。オプションは run コマンドを参照してください。

    https://www.tohoho-web.com/docker/docker_run.html

  4. start:createで作成したコンテナを起動

1. Dockerfileを作成

例) UbuntuApacheを動かすDockerfileの例。

# ubuntu
FROM ubuntu:latest

RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install apache2

EXPOSE 80

COPY index.html /var/www/html

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2


CMD ["apachectl", "-D", "FOREGROUND"]

※ 実運用ではubuntu:latestではなくバージョンを固定することを推奨。
latestにした場合、新たしいバージョンが出たときに、DockerfileのRUNや環境変数ENVの値が新しいバージョンで動作する保証はない。

2. build(イメージ作成)

$ docker image build -t {{image_name}} .
  • DockerfileからDockerイメージを作成する
  • コンド末尾の.contextを表す
  • -fDockerfileを指定する。省略した場合は、contextを指定(例では.カレントディレクトリ)
  • -tでイメージに名前:タグ形式で名前とタグを指定する
  • -t名前:タグのタグを省略した場合はlatestになる

buildとcontext

Docker イメージは Dockerfile と「コンテクスト」(context)を使って構築します。構築時のコンテクストとは、特定の パス や URL の場所にあるファイルのことです。構築中のステップで、対象コンテクスト内のファイルを参照できます。

https://docs.docker.jp/engine/reference/commandline/build.html

context:前後関係、文脈、環境

例)

app
  |
  |-- .docker
      |
      |-- Dockerfile

appをプロジェクトルートとする。
Dockerfileapp/.dockerに作成。

$ cd /path/to/app
$ docker build -t myimage:0.0.1 -f .docker/Dockerfile .

上記の場合、contextがカレントディレクトリ(.)として設定される。
DockerfileCOPYコマンドの<src>(コピー元)はcontextからの相対パスとして解釈される。

Multiple resources may be specified but the paths of files and directories will be interpreted as relative to the source of the context of the build.

https://docs.docker.com/engine/reference/builder/#copy

COPY<dest>は、コンテナ内の絶対パスまたはイメージのWORKDIRからの相対パスになる。

The is an absolute path, or a path relative to WORKDIR,

https://docs.docker.com/engine/reference/builder/#copy

WORKDIRは、特に指定しなければイメージのデフォルトが使用される。WORKDIRコマンドで変更することもできる。
(イメージ配布元をまたはソースを見ればWORKDIRは分かる)

3. run(イメージからコンテナ作成・・・起動した状態)

$ docker run --name {{container_name}} -p 8000:80 -v path/to/host:path/to/docker {{image_name}}

例)

$ docker run -d --name my-httpd -p 8000:80 -v $(pwd):/usr/local/apache2/htdocs/ httpd:latest

runとcreateの違い

FROM php:7.4.6
COPY ./test.sh /usr/local/bin
RUN chmod +x /usr/local/bin/test.sh
CMD ["php", "--version`]

/usr/local/bin/test.sh

#! /bin/bash

echo 'hello'

hello:1.0.0というイメージを作成済みとする。 docker runはhelloと表示される。

$ docker run hello:1.0.0 /usr/local/bin/test.sh
// hello

createは、コンテナを停止した状態で作成するので以下はエラーになる

$ docker create hello:1.0.0 /usr/local/bin/test.sh

createの場合は、コンテナを起動するには、createした後にstartする必要がある。

※ ちなみに /user/local/bin/test.shは、引数としてコンテナに渡されてCMDコマンドを上書きする。

If the user specifies arguments to docker run then they will override the default specified in CMD.

https://docs.docker.com/engine/reference/builder/#cmd

CMDの上書き

$ docker run {{image_name}} {{argument(command)}}

docker runの末尾の引数はDockerfileのCMDコマンドを上書きする。

# ワーキングディレクトリを表示
$ docker run {{image_name}} pwd
# 例 ファイル一覧を表示
$ docker run {{image_name}} ls -al

--rm

コンテナが終了したら、コンテナを削除する。

CMDの上書き例

# PHPのインストール済み拡張機能一覧を表示
$ docker run -it --rm {{image_name}} php -m

2. Docker HubからDockerコンテナを作成

Docker Hubでホストされているイメージからコンテナ作成する。

$ docker run -d -p 8080:80 --name web-server -v $(pwd):/var/www/html php:7.4-apache

docker runは以下の順序でイメージを探す。

  1. ローカル
  2. Docker Hub

Docker HubのPublicなイメージはログインしていなくても使用することができる。

$ docker runで、Docker Hubのイメージを指定(例:php:7.4-apache)してコンテナを作成する処理は、内部で以下コマンドを実行している。

  1. docker pull:イメージをDocker Hubから取得
  2. docker create:イメージからコンテナを作成
  3. docker start:コンテナを起動

d/detachオプション

-d, --detach コンテナをバックグラウンドで実行し、コンテナ ID を表示

http://docs.docker.jp/engine/reference/commandline/run.html

-dを忘れてもctrl + p, ctrl + qでデタッチ可能

コンテナにログイン(docker exec -it)

http://docs.docker.jp/engine/reference/commandline/exec.html

  • Debian/Ubuntu系は/bin/bash
  • Alpine系は/bin/sh
$ docker exec -it {{container_name}} /bin/bash

docker execのオプションは以下のとおり。

-d, --detach=false デタッチド・モード: コマンドをバックグラウンドで実行
--detach-keys デタッチド・コンテナに特定のエスケープ・キー・シーケンスを設定
--help=false 使い方の表示
-i, --interactive=false アタッチしていなくても STDIN をオープンにし続ける
--privileged=false コマンドに拡張 Linux ケーパビリティの追加
-t, --tty=false 疑似ターミナル (pseudo-TTY) の割り当て
-u, --user= ユーザ名か UID (書式: <名前|uid>[:<グループ|gid>])

http://docs.docker.jp/engine/reference/commandline/exec.html

※ tty:teletypewriter

docker inspect {{image ID}}

docker inspectCMDEntrypointを調べることができる。

$ docker inspect {{image ID}}

docker create

$ docker create {{ docker image id }}

docker cp

コンテナが稼働している最中にコンテナ内のファイルをローカルにコピーする(またはその逆)。

ref. http://docs.docker.jp/v19.03/engine/reference/commandline/cp.html

# コンテナ内の/path/to/sourceをローカルの./path/to/destinationにコピー
$ docker cp コンテナID:/path/to/container ./path/to/local
// 例
docker cp symfony-micro-app:/etc/apache2/sites-available/000-default.conf ./000-default.conf

通常のcpコマンドの挙動。

project
    |
    |- src
        |
        |-- text1.txt
        |
        |-- text2.txt
    |
    |- dst
$ cd /path/to/project
$ cp -r src/. ./dst
project
    |
    |- src
        |
        |-- text1.txt
        |
        |-- text2.txt
    |
    |- dst
        |
        |-- text1.txt
        |
        |-- text2.txt

docker commit

コンテナに対する変更から、新しいイメージを作成。

-- https://docs.docker.jp/engine/reference/commandline/commit.html

docker system prune

// イメージ、コンテナ、ネットワークを削除
$ docker system prune

docker system prune 注意1

docker system pruneはデフォルトではボリュームを削除しない。
削除する場合は--volumeを使う。
ref. https://docs.docker.jp/config/pruning.html

docker system prune コマンドは、イメージ、コンテナ、ネットワークを削除(prune)するショートカットです。ボリュームはデフォルトでは削除されないため、ボリュームを削除するには docker system prune で --volumes フラグを使う必要があります。

docker system prune 注意2

イメージは宙ぶらりんイメージ(dangling image)のみ削除する。

宙ぶらりんイメージ(dangling image)のみ削除します。宙ぶらりんイメージとは、タグを持たず、他のコンテナからも参照されないイメージです。

ref. https://docs.docker.jp/config/pruning.html

Appendix

Official Image

通常、親イメージとして使用される

Docker for Macのディスク使用