Dockerfile
からDockerコンテナ
作成Docker Hub
からDockerコンテナ
作成.Dockerfile
を作成Dockerfile
からDocker
イメージを作成Dockerイメージ
からDockerコンテナ
を作成docker create コマンドは、コンテナを停止状態 (stop した状態) で作成する以外は、run コマンドと同等です。オプションは run コマンドを参照してください。
create
で作成したコンテナを起動例) Ubuntu
でApache
を動かす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
の値が新しいバージョンで動作する保証はない。
$ docker image build -t {{image_name}} .
Dockerfile
からDocker
イメージを作成する.
はcontext
を表す-f
でDockerfile
を指定する。省略した場合は、context
を指定(例では.
カレントディレクトリ)-t
でイメージに名前:タグ
形式で名前とタグを指定する-t
で名前:タグ
のタグを省略した場合はlatest
になるDocker イメージは Dockerfile と「コンテクスト」(context)を使って構築します。構築時のコンテクストとは、特定の パス や URL の場所にあるファイルのことです。構築中のステップで、対象コンテクスト内のファイルを参照できます。
https://docs.docker.jp/engine/reference/commandline/build.html
context:前後関係、文脈、環境
例)
app
|
|-- .docker
|
|-- Dockerfile
app
をプロジェクトルートとする。Dockerfile
をapp/.docker
に作成。
$ cd /path/to/app
$ docker build -t myimage:0.0.1 -f .docker/Dockerfile .
上記の場合、context
がカレントディレクトリ(.
)として設定される。Dockerfile
のCOPYコマンドの<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.
COPY
の<dest>
は、コンテナ内の絶対パスまたはイメージのWORKDIRからの相対パスになる。
The
is an absolute path, or a path relative to WORKDIR,
WORKDIR
は、特に指定しなければイメージのデフォルトが使用される。WORKDIR
コマンドで変更することもできる。
(イメージ配布元をまたはソースを見ればWORKDIRは分かる)
$ 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
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.
$ docker run {{image_name}} {{argument(command)}}
docker run
の末尾の引数はDockerfileのCMDコマンドを上書きする。
# ワーキングディレクトリを表示
$ docker run {{image_name}} pwd
# 例 ファイル一覧を表示
$ docker run {{image_name}} ls -al
コンテナが終了したら、コンテナを削除する。
# PHPのインストール済み拡張機能一覧を表示
$ docker run -it --rm {{image_name}} php -m
Docker Hubでホストされているイメージからコンテナ作成する。
$ docker run -d -p 8080:80 --name web-server -v $(pwd):/var/www/html php:7.4-apache
docker run
は以下の順序でイメージを探す。
Docker HubのPublicなイメージはログインしていなくても使用することができる。
$ docker run
で、Docker Hubのイメージを指定(例:php:7.4-apache
)してコンテナを作成する処理は、内部で以下コマンドを実行している。
docker pull
:イメージをDocker Hubから取得docker create
:イメージからコンテナを作成docker start
:コンテナを起動-d, --detach コンテナをバックグラウンドで実行し、コンテナ ID を表示
※ -d
を忘れてもctrl + p
, ctrl + q
でデタッチ可能
http://docs.docker.jp/engine/reference/commandline/exec.html
/bin/bash
/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
でCMD
やEntrypoint
を調べることができる。
$ docker inspect {{image ID}}
$ docker create {{ docker image id }}
コンテナが稼働している最中にコンテナ内のファイルをローカルにコピーする(またはその逆)。
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
コンテナに対する変更から、新しいイメージを作成。
-- https://docs.docker.jp/engine/reference/commandline/commit.html
// イメージ、コンテナ、ネットワークを削除
$ docker system prune
docker system pruneはデフォルトではボリュームを削除しない。
削除する場合は--volume
を使う。
ref. https://docs.docker.jp/config/pruning.html
docker system prune コマンドは、イメージ、コンテナ、ネットワークを削除(prune)するショートカットです。ボリュームはデフォルトでは削除されないため、ボリュームを削除するには docker system prune で --volumes フラグを使う必要があります。
イメージは宙ぶらりんイメージ(dangling image)
のみ削除する。
宙ぶらりんイメージ(dangling image)のみ削除します。宙ぶらりんイメージとは、タグを持たず、他のコンテナからも参照されないイメージです。
ref. https://docs.docker.jp/config/pruning.html
通常、親イメージとして使用される