Docker
コンテナの運行
サーチ…
構文
- docker run [オプション]イメージ[コマンド] [ARG ...]
コンテナの実行
docker run hello-world
Docker Hubから最新のhello-worldイメージを取得します(まだ持っていない場合)。新しいコンテナを作成して実行します。インストールが正しく動作しているようだというメッセージが表示されます。
コンテナ内で別のコマンドを実行する
docker run docker/whalesay cowsay 'Hello, StackExchange!'
このコマンドは、Dockerに、 docker/whalesay
イメージからコンテナを作成し、 cowsay 'Hello, StackExchange!'
コマンドを実行するよう指示しcowsay 'Hello, StackExchange!'
その中に。 Hello, StackExchange!
という鯨の絵が印刷されるはずHello, StackExchange!
あなたの端末に。
イメージ内のエントリポイントがデフォルトの場合、イメージで使用可能なコマンドを実行できます。
docker run docker/whalesay ls /
画像の作成中に変更されている場合は、デフォルトに戻す必要があります
docker run --entrypoint=/bin/bash docker/whalesay -c ls /
コンテナを実行後に自動的に削除する
通常、Dockerコンテナは終了後も保持されます。これにより、コンテナを再度実行したり、ファイルシステムを検査したりすることができます。ただし、コンテナを実行して終了した直後にコンテナを削除したい場合があります。たとえば、コマンドを実行したり、ファイルシステムからファイルを表示するなどです。 Dockerはこの目的のために--rm
コマンドラインオプションを提供しています:
docker run --rm ubuntu cat /etc/hosts
これは、 "ubuntu"イメージからコンテナを作成し、 / etc / hostsファイルの内容を表示し、終了直後にコンテナを削除します。これは、実験を終えた後にコンテナをクリーンアップする必要を防ぐのに役立ちます。
注: --
--rm
フラグは、--detach
<1.13.0の-d
(----detach
)フラグと連動しません。
--rm
フラグが設定されている場合、Dockerは、コンテナが削除されたときにコンテナに関連付けられたボリュームも削除します。これはdocker rm -v my-container
を実行するのと同様です。 名前なしで指定されたボリュームだけが削除されます。
たとえば、 docker run -it --rm -v /etc -v logs:/var/log centos /bin/produce_some_logs
と、 /etc
のボリュームは削除され/var/log
が、 /var/log
ボリュームは削除されません。 --volumes-fromを介して継承されたボリュームは、同じ論理で削除されます。元のボリュームに名前が指定されていれば、削除されません。
名前の指定
デフォルトでは、 small_roentgen
docker run
作成されたコンテナにはsmall_roentgen
やmodest_dubinsky
ようなランダムな名前が与えられます。これらの名前は、コンテナの目的の特定には特に役立ちません。 --name
コマンドラインオプションを渡すことで、コンテナの名前を指定することができます:
docker run --name my-ubuntu ubuntu:14.04
名前は一意でなければなりません。別のコンテナが既に使用している名前を渡すと、Dockerはエラーを出力し、新しいコンテナは作成されません。
名前を指定すると、Dockerネットワーク内のコンテナを参照するときに便利です。これは、背景と前景のDockerコンテナの両方で機能します。
既定のブリッジネットワーク上のコンテナは、名前で通信するためにリンクする必要があります。
コンテナポートをホストにバインドする
docker run -p "8080:8080" myApp
docker run -p "192.168.1.12:80:80" nginx
docker run -P myApp
ホスト上のポートがイメージに露出されている( EXPOSE
Dockerfileディレクティブまたは--expose
docker run
用の--expose
コマンドラインオプションを使用)ためには、それらのポートを-p
または-P
コマンドを使用してホストにバインドする必要がありますラインオプション。 -p
を使用するには、特定のポート(およびオプションのホストインタフェース)を指定する必要があります。大文字の-P
コマンドラインオプションを使用すると、Dockerはコンテナのイメージ内に公開されているすべてのポートを強制的にホストにバインドします。
コンテナの再起動ポリシー(起動時にコンテナを開始する)
docker run --restart=always -d <container>
デフォルトでは、Dockerデーモンが再起動したとき(ホストシステムの再起動後など)にDockerはコンテナを再起動しません。 Dockerは、--restartコマンドラインオプションを--restart
して、コンテナの再起動ポリシーを提供します。 --restart=always
すると、Dockerデーモンが再起動された後、コンテナが常に再起動されます。 ただし 、そのコンテナを手動で停止した場合(たとえば、 docker stop <container>
)、再起動ポリシーはコンテナに適用されません。
複数のオプションは、要件( --restart=[policy]
)に基づいて--restart
オプションに指定できます。これらのオプションは、起動時にコンテナがどのように起動するかに影響します。
ポリシー | 結果 |
---|---|
いいえ | デフォルト値。コンテナが停止しているときに自動的にコンテナを再起動しません。 |
失敗時[:max-retries] | コンテナが失敗して終了する場合にのみ再起動します( non-zero exit status )。無期限に再起動しないようにするには(何らかの問題が発生した場合)、Dockerデーモンが再試行する再起動の回数を制限することができます。 |
常に | 終了ステータスにかかわらず常にコンテナを再起動してください。 always を指定すると、Dockerデーモンはコンテナを無期限に再起動しようとします。コンテナは、コンテナの現在の状態に関係なく、常にデーモンの起動時に開始されます。 |
限りなく止められた | 終了状態にかかわらず常にコンテナを再起動しますが、コンテナが以前に停止状態になっている場合はデーモンの起動時に起動しないでください。 |
バックグラウンドでコンテナを実行する
コンテナをバックグラウンドで実行し続けるには、コンテナの起動時に-d
コマンドラインオプションを指定します。
docker run -d busybox top
-d
オプションは、デタッチ・モードでコンテナを実行します。また、 -d=true
と同等-d=true
。
分離モードのコンテナは、停止すると自動的に削除することはできません。つまり、-rmオプションを-dオプションと組み合わせて使用することはできません。
コンテナにボリュームを割り当てる
Dockerボリュームは、コンテナの存続期間を超えて持続するファイルまたはディレクトリです。ホストファイルまたはディレクトリを(UnionFSを迂回して)ボリュームとしてコンテナにマウントすることは可能です。
-v
コマンド行オプションを指定してボリュームを追加します。
docker run -d -v "/data" awesome/app bootstrap.sh
これにより、ボリュームが作成され、コンテナ内のパス/data
マウントされます。
- 注:--
--rm
フラグを使用して、コンテナが取り外されたときにボリュームを自動的に削除することができます。
ホストディレクトリのマウント
ホストファイルまたはディレクトリをコンテナにマウントするには:
docker run -d -v "/home/foo/data:/data" awesome/app bootstrap.sh
- ホストディレクトリを指定するときは、絶対パスを指定する必要があります。
これは、ホストディレクトリにマウントされます/home/foo/data
上に/data
コンテナの内部。この "バインドマウントされたホストディレクトリ"ボリュームは、Linuxのmount --bind
- バインドと同じものであるため、ホストディレクトリを一時的にコンテナの存続期間中、指定されたコンテナパスにマウントします。ホストまたはコンテナからのボリュームの変更は、ディスク上の同じ宛先であるため、他方のボリュームにすぐに反映されます。
相対的なフォルダをマウントするUNIXの例
docker run -d -v $(pwd)/data:/data awesome/app bootstrap.sh
ボリュームの命名
ボリュームは、ホストディレクトリパスの代わりに文字列を指定することで命名できます。ドッカーはその名前を使ってボリュームを作成します。
docker run -d -v "my-volume:/data" awesome/app bootstrap.sh
名前付きボリュームを作成すると、その名前を使用して他のコンテナとボリュームを共有することができます。
環境変数の設定
$ docker run -e "ENV_VAR=foo" ubuntu /bin/bash
-e
と--env
両方を使用して、コンテナ内の環境変数を定義できます。テキストファイルを使用して多くの環境変数を指定することができます。
$ docker run --env-file ./env.list ubuntu /bin/bash
環境変数ファイルの例:
# This is a comment
TEST_HOST=10.10.0.127
--env-file
フラグは引数としてファイル名をとり、各行がVARIABLE=VALUE
形式になることを期待し、-- --env
渡された引数を模倣します。コメント行の先頭には#
付ける必要があります。
これらの3つのフラグの順序にかかわらず、 --env-file
が最初に処理され、次に-e
/ --env
フラグが処理され--env-file
。このように、 -e
または--env
個別に-e
された環境変数は、-- --env-var
テキストファイルで指定された変数を上書きします。
ホスト名の指定
デフォルトでは、docker runで作成されたコンテナにはランダムなホスト名が与えられます。 --hostnameフラグを渡すことによって、コンテナに別のホスト名を与えることができます:
docker run --hostname redbox -d ubuntu:14.04
対話的にコンテナを実行する
対話的にコンテナを実行するには、 -it
オプションを渡します。
$ docker run -it ubuntu:14.04 bash
root@8ef2356d919a:/# echo hi
hi
root@8ef2356d919a:/#
-i
はSTDINを開いたままにしますが、 -t
は疑似TTYを割り当てます。
メモリ/スワップ制限付きコンテナの実行
メモリ制限を設定し、スワップ制限を無効にする
docker run -it -m 300M --memory-swap -1 ubuntu:14.04 /bin/bash
メモリとスワップの両方の制限を設定します。この場合、コンテナは300Mメモリと700Mスワップを使用できます。
docker run -it -m 300M --memory-swap 1G ubuntu:14.04 /bin/bash
実行中の(分離した)コンテナへのシェルの取得
実行中のコンテナにログインする
ユーザーはexec
コマンドを使用して新しい対話式bashシェルに実行中のコンテナーを入力できます。
コンテナがjovial_morse
と呼ばれているとすると、 jovial_morse
を実行して対話型の擬似TTY bashシェルを取得できます。
docker exec -it jovial_morse bash
特定のユーザーと実行中のコンテナにログインする
コンテナを特定のユーザーとして入力する場合は、 -u
または--user
パラメーターを使用してコンテナを設定できます。ユーザー名はコンテナに存在する必要があります。
-u, --user
ユーザー名またはUID(形式:<name|uid>[:<group|gid>]
)
このコマンドは、 dockeruser
ユーザーとjovial_morse
ログインします
docker exec -it -u dockeruser jovial_morse bash
実行中のコンテナにrootとしてログインする
rootでログインする場合は、単に-u root
パラメータを使用します。ルートユーザーは常に存在します。
docker exec -it -u root jovial_morse bash
画像にログインする
run
コマンドでイメージにログインすることもできますが、これにはコンテナ名ではなくイメージ名が必要です。
docker run -it dockerimage bash
中間イメージにログインする(debug)
Dockerfileビルド中に作成された中間イメージにもログインできます。
docker build .
出力docker build .
$ docker build .
Uploading context 10240 bytes
Step 1 : FROM busybox
Pulling repository busybox
---> e9aa60c60128MB/2.284 MB (100%) endpoint: https://cdn-registry-1.docker.io/v1/
Step 2 : RUN ls -lh /
---> Running in 9c9e81692ae9
total 24
drwxr-xr-x 2 root root 4.0K Mar 12 2013 bin
drwxr-xr-x 5 root root 4.0K Oct 19 00:19 dev
drwxr-xr-x 2 root root 4.0K Oct 19 00:19 etc
drwxr-xr-x 2 root root 4.0K Nov 15 23:34 lib
lrwxrwxrwx 1 root root 3 Mar 12 2013 lib64 -> lib
dr-xr-xr-x 116 root root 0 Nov 15 23:34 proc
lrwxrwxrwx 1 root root 3 Mar 12 2013 sbin -> bin
dr-xr-xr-x 13 root root 0 Nov 15 23:34 sys
drwxr-xr-x 2 root root 4.0K Mar 12 2013 tmp
drwxr-xr-x 2 root root 4.0K Nov 15 23:34 usr
---> b35f4035db3f
Step 3 : CMD echo Hello world
---> Running in 02071fceb21b
---> f52f38b7823e
---> Running in 02071fceb21b
出力---> Running in 02071fceb21b
、これらのイメージにログインできます:
docker run -it 02071fceb21b bash
stdinをコンテナに渡す
データベースダンプを復元する場合や、ホストからパイプ経由で情報をプッシュしたい場合は、 -i
フラグをdocker run
またはdocker exec
引数として使用できます。
たとえば、コンテナ化されたmariadbクライアントに、ローカルdump.sql
ファイルのホスト上にあるデータベースダンプを配置する場合は、次のコマンドを実行できます。
docker exec -i mariadb bash -c 'mariadb "-p$MARIADB_PASSWORD" ' < dump.sql
一般に、
docker exec -i container command < file.stdin
または
docker exec -i container command <<EOF
inline-document-from-host-shell-HEREDOC-syntax
EOF
コンテナからの切り離し
(割り当てられたPTYと実行中のコンテナに取り付けたもののdocker run -it ...
デタッチするコントロール Q - )、あなたがコントロール Pを押すことができます。
イメージエントリポイントディレクティブのオーバーライド
docker run --name="test-app" --entrypoint="/bin/bash" example-app
このコマンドは、コンテナtest-app
が作成されたときのexample-app
イメージのENTRYPOINT
ディレクティブを上書きします。特に指定しないかぎり、イメージのCMD
ディレクティブは変更されません。
docker run --name="test-app" --entrypoint="/bin/bash" example-app /app/test.sh
上記の例では、イメージのENTRYPOINT
とCMD
両方がオーバーライドされています。このコンテナプロセスは/bin/bash /app/test.sh
ます。
コンテナにホストエントリを追加する
docker run --add-host="app-backend:10.15.1.24" awesome-app
このコマンドは、 --add-host <name>:<address>
の形式に従ったエントリをコンテナの/etc/hosts
ファイルに追加/etc/hosts
ます。この例では、名前app-backend
は10.15.1.24
解決され10.15.1.24
。これは、異種のアプリケーションコンポーネントをプログラムで結びつける場合に特に便利です。
コマンドが実行されていないときにコンテナが停止しないようにする
フォアグラウンドでコマンドが実行されていない場合、コンテナは停止します。 -t
オプションを使用すると、 -d
オプションで切り離しても、コンテナが停止しないようになります。
docker run -t -d debian bash
コンテナの停止
docker stop mynginx
さらに、コンテナーIDは、名前の代わりにコンテナーを停止するために使用することもできます。
これにより、必要に応じてSIGTERM信号とSIGKILL信号を送信して、実行中のコンテナを停止します。
さらに、killコマンドを使用して、 -s
オプションを使用してSIGKILLまたは他の指定されたシグナルをただちに送信することができます。
docker kill mynginx
指定信号:
docker kill -s SIGINT mynginx
コンテナを停止しても、コンテナは削除されません。停止したコンテナを見るには、 docker ps -a
を使用してください。
実行中のコンテナで別のコマンドを実行する
必要に応じて、 exec
コマンドを使用して、すでに実行中のコンテナに対して追加のコマンドを実行するようDockerに指示できます。 docker ps
取得できるコンテナのIDが必要です。
docker exec 294fbc4c24b3 echo "Hello World"
-it
オプションを使用すると、対話シェルをアタッチできます。
docker exec -it 294fbc4c24b3 bash
LinuxコンテナでのGUIアプリケーションの実行
デフォルトでは、DockerコンテナはGUIアプリケーションを実行できません。
その前に、X11ソケットを最初にコンテナに転送する必要があります。そのため、直接使用することができます。 DISPLAY環境変数も転送する必要があります。
docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY <image-name>
Xサーバのホストにアクセス権を設定していないので、最初は失敗します:
cannot connect to X server unix:0
最も速い(ただし安全ではない)方法は、次のもので直接アクセスを許可することです。
xhost +local:root
コンテナで仕上げた後、次のように元の状態に戻ることができます。
xhost -local:root
別の(より安全な)方法は、Xサーバーにアクセスするためにユーザーの資格情報を使用する新しいイメージを作成するDockerfileを準備することです。
FROM <iamge-name>
MAINTAINER <you>
# Arguments picked from the command line!
ARG user
ARG uid
ARG gid
#Add new user with our credentials
ENV USERNAME ${user}
RUN useradd -m $USERNAME && \
echo "$USERNAME:$USERNAME" | chpasswd && \
usermod --shell /bin/bash $USERNAME && \
usermod --uid ${uid} $USERNAME && \
groupmod --gid ${gid} $USERNAME
USER ${user}
WORKDIR /home/${user}
コマンドラインからdocker build
を呼び出すときは、Dockerfileに表示されるARG変数を渡さなければなりません:
docker build --build-arg user=$USER --build-arg uid=$(id -u) --build-arg gid=$(id -g) -t <new-image-with-X11-enabled-name> -f <Dockerfile-for-X11> .
新しいコンテナを作成する前に、アクセス許可を持つxauthファイルを作成する必要があります。
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f /tmp/.docker.xauth nmerge -
このファイルは、作成/実行時にコンテナにマウントする必要があります。
docker run -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /tmp/.docker.xauth:/tmp/.docker.xauth:rw -e XAUTHORITY=/tmp/.docker.xauth