docker run
読む時間の目安: 33 分
説明
新たなコンテナー内でコマンドを実行します。
利用方法
$ docker run [オプション] IMAGE [COMMAND] [ARG...]
追加説明
docker run
コマンドは、指定されたイメージの上に書き込み可能コンテナーレイヤーを create
(生成)します。
そして指定されたコマンドを使ってコンテナーを start
(起動)します。
docker run
は API で言うと、/containers/create
の実行後に/containers/(id)/start
を起動することと同じです。
停止しているコンテナーの場合は、以前からの変更をすべて考慮してdocker start
によって起動されます。
コンテナーの全一覧はdocker ps -a
により確認できます。
The docker run
command can be used in combination with docker commit
to
change the command that a container runs. There is additional detailed information about docker run
in the Docker run reference.
コンテナーからネットワークへの接続方法については “Docker ネットワーク概要” を参照してください。
本コマンドの利用例については、以下に示す 利用例の節 を参照してください。
オプション
名前/省略形 | デフォルト | 説明 |
--add-host |
ホスト-IP マッピングのカスタム設定を追加します。(ホスト名:ip) | |
--attach , -a |
STDIN、STDOUT、STDERR にアタッチします。 | |
--blkio-weight |
ブロック I/O。(相対的な重みづけ)、10 から 1000、0 は無効化。(デフォルトは 0) | |
--blkio-weight-device |
ブロック I/O 重みづけ。(相対的なデバイス重みづけ) | |
--cap-add |
Linux ケーパビリティーを追加します。 | |
--cap-drop |
Linux ケーパビリティーを削除します。 | |
--cgroup-parent |
任意に指定するコンテナーの親 cgroup。 | |
--cgroupns |
API 1.41 以上 利用する cgroup 名前空間(host|private)。 'host': Dockerホストのcgroup名前空間内でコンテナーを起動。 'private': プライベートなcgroup名前空間内でコンテナーを起動。 '': デーモンのdefault-cgroupns-modeオプションによって 設定されるcgroup名前空間を利用(デフォルト)。 |
|
--cidfile |
コンテナー ID をファイルに書き出します。 | |
--cpu-count |
CPU カウント。(Windows のみ) | |
--cpu-percent |
CPU パーセント。(Windows のみ) | |
--cpu-period |
CPU の CFS(Completely Fair Scheduler)間隔を制限します。 | |
--cpu-quota |
CPU の CFS(Completely Fair Scheduler)クォータを制限します。 | |
--cpu-rt-period |
API 1.25 以上 CPU へのリアルタイムアクセス時間をマイクロ秒で制限します。 |
|
--cpu-rt-runtime |
API 1.25 以上 CPU へのリアルタイムアクセスランタイムをマイクロ秒で制限します。 |
|
--cpu-shares , -c |
CPU 配分。(相対的な重みづけ) | |
--cpus |
API 1.25 以上 CPU 数。 |
|
--cpuset-cpus |
利用を許容する CPU 数。(0-3、0,1) | |
--cpuset-mems |
利用を許容するメモリ数。(0-3、0,1) | |
--detach , -d |
コンテナーをバックグラウンド実行し、コンテナー ID を出力します。 | |
--detach-keys |
コンテナーデタッチ時のキーシーケンスをオーバーライドします。 | |
--device |
ホストのデバイスをコンテナーに追加します。 | |
--device-cgroup-rule |
cgroup がアクセス可能なデバイスリストにルールを追加します。 | |
--device-read-bps |
デバイスからの読み込み割合(秒あたりのバイト数)を制限します。 | |
--device-read-iops |
デバイスからの読み込み割合(秒あたりの I/O)を制限します。 | |
--device-write-bps |
デバイスへの書き込み割合(秒あたりのバイト数)を制限します。 | |
--device-write-iops |
デバイスへの書き込み割合(秒あたりの I/O)を制限します。 | |
--disable-content-trust |
true |
イメージの検証を省略します。 |
--dns |
カスタム DNS サーバーを設定します。 | |
--dns-opt |
DNS オプションを設定します。 | |
--dns-option |
DNS オプションを設定します。 | |
--dns-search |
カスタム DNS 検索ドメインを設定します。 | |
--domainname |
コンテナーの NIS ドメイン名。 | |
--entrypoint |
イメージのデフォルト ENTRYPOINT をオーバーライドします。 | |
--env , -e |
環境変数を設定します。 | |
--env-file |
環境変数ファイルを読み込みます。 | |
--expose |
ポートまたはポート範囲を公開します。 | |
--gpus |
API 1.40 以上 コンテナーに追加する GPU デバイスを指定します。('all' により全 GPU) |
|
--group-add |
新たに参加するグループを追加します。 | |
--health-cmd |
ヘルスチェックを実行するコマンド。 | |
--health-interval |
ヘルスチェックの実行間隔。(ms|s|m|h) (デフォルトは 0s) | |
--health-retries |
不健康(unhealthy)であると報告するのに必要な連続失敗回数。 | |
--health-start-period |
API 1.29 以上 ヘルスチェックのリトライを数え始める前の、コンテナー初期化を行う開始時間。(ms|s|m|h) (デフォルトは 0s) |
|
--health-timeout |
1 つのチェック処理実行に許容する最大時間。(ms|s|m|h) (デフォルトは 0s) | |
--help |
Print usage | |
--hostname , -h |
Container host name | |
--init |
API 1.25 以上 コンテナー内部にて、シグナル送信と子プロセス管理を行う初期化処理を実行します。 |
|
--interactive , -i |
アタッチされていなくても STDIN は開放し続けます。 | |
--io-maxbandwidth |
システムデバイスの I/O 帯域幅の上限。(Windows のみ) | |
--io-maxiops |
システムデバイスの IOps の上限。(Windows のみ) | |
--ip |
IPv4 アドレス。(たとえば 172.30.100.104) | |
--ip6 |
IPv6 アドレス。(たとえば 2001:db8::33) | |
--ipc |
利用する IPC モード。 | |
--isolation |
コンテナーの分離技術(isolation technology)方式。 | |
--kernel-memory |
カーネルメモリ上限。 | |
--label , -l |
コンテナーに対してメタデータを設定します。 | |
--label-file |
行ごとにラベルが記述されたファイルを読み込みます。 | |
--link |
別コンテナーへのリンクを追加します。 | |
--link-local-ip |
コンテナーの IPv4/IPv6 によるリンクローカルアドレス。 | |
--log-driver |
コンテナーにおけるログドライバー。 | |
--log-opt |
ログドライバーオプション。 | |
--mac-address |
コンテナーの MAC アドレス。(たとえば 92:d0:c6:0a:29:33) | |
--memory , -m |
メモリ上限。 | |
--memory-reservation |
メモリのソフトリミット。 | |
--memory-swap |
メモリとスワップの総量を制限します。'-1' 設定時はスワップ無制限。 | |
--memory-swappiness |
-1 |
コンテナーのスワップ割合を調整します。(0 から 100) |
--mount |
ファイルシステムマウントをコンテナーにアタッチします。 | |
--name |
コンテナーに名前を割り当てます。 | |
--net |
コンテナーをネットワークに接続します。 | |
--net-alias |
ネットワーク範囲内のエイリアスをコンテナーに追加します。 | |
--network |
コンテナーをネットワークに接続します。 | |
--network-alias |
ネットワーク範囲内のエイリアスをコンテナーに追加します。 | |
--no-healthcheck |
コンテナー固有の HEALTHCHECK を無効にします。 | |
--oom-kill-disable |
OOM キラーを無効にします。 | |
--oom-score-adj |
ホストの OOM に対する優先順位を設定します。(-1000 から 1000) | |
--pid |
利用する PID 名前空間。 | |
--pids-limit |
コンテナーの PID 制限を調整します。(-1 により無制限) | |
--platform |
API 1.32 以上 サーバーがマルチプラットフォームに対応している場合に、プラットフォームを指定します。 |
|
--privileged |
コンテナーに拡張権限を付与します。 | |
--publish , -p |
ホストに対してコンテナーのポートを公開します。 | |
--publish-all , -P |
公開されたポートをランダムポートとして公開します。 | |
--pull |
missing |
イメージ生成前にプルを行います("always"|"missing"|"never")。 |
--read-only |
コンテナーのルートファイルシステムを読み込み専用としてマウントします。 | |
--restart |
no |
コンテナー終了時に適用する再起動ポリシー。 |
--rm |
終了時に中間コンテナーを自動的に削除します。 | |
--runtime |
このコンテナー向けに利用するランタイム。 | |
--security-opt |
セキュリティオプション。 | |
--shm-size |
/dev/shm のサイズ。 | |
--sig-proxy |
true |
受信シグナルをすべてプロセスにプロキシーします。 |
--stop-signal |
SIGTERM |
コンテナーを停止するシグナル。 |
--stop-timeout |
API 1.25 以上 コンテナー停止時の中断時間(秒単位)。 |
|
--storage-opt |
コンテナーにおけるストレージドライバーのオプション。 | |
--sysctl |
sysctl オプション。 | |
--tmpfs |
tmpfs ディレクトリのマウント。 | |
--tty , -t |
擬似 TTY を割り当てます。 | |
--ulimit |
ulimit オプション。 | |
--user , -u |
ユーザー名または UID。(記述書式t: <name|uid>[:<group|gid>]) | |
--userns |
User namespace to use | |
--uts |
利用する UTS 名前空間。 | |
--volume , -v |
ボリュームをバインドマウントします。 | |
--volume-driver |
任意に指定するボリュームドライバー。 | |
--volumes-from |
指定されたコンテナーからボリュームをマウントいます。 | |
--workdir , -w |
コンテナー内部のワーキングディレクトリ。 |
利用例
Assign name and allocate pseudo-TTY (--name, -it)
$ docker run --name test -it debian
root@d6c0fe130dba:/# exit 13
$ echo $?
13
$ docker ps -a | grep test
d6c0fe130dba debian:7 "/bin/bash" 26 seconds ago Exited (13) 17 seconds ago test
This example runs a container named test
using the debian:latest
image. The -it
instructs Docker to allocate a pseudo-TTY connected to
the container’s stdin; creating an interactive bash
shell in the container.
In the example, the bash
shell is quit by entering
exit 13
. This exit code is passed on to the caller of
docker run
, and is recorded in the test
container’s metadata.
Capture container ID (--cidfile)
$ docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"
This will create a container and print test
to the console. The cidfile
flag makes Docker attempt to create a new file and write the container ID to it.
If the file exists already, Docker will return an error. Docker will close this
file when docker run
exits.
Full container capabilities (--privileged)
$ docker run -t -i --rm ubuntu bash
root@bc338942ef20:/# mount -t tmpfs none /mnt
mount: permission denied
This will not work, because by default, most potentially dangerous kernel
capabilities are dropped; including cap_sys_admin
(which is required to mount
filesystems). However, the --privileged
flag will allow it to run:
$ docker run -t -i --privileged ubuntu bash
root@50e3f57e16e6:/# mount -t tmpfs none /mnt
root@50e3f57e16e6:/# df -h
Filesystem Size Used Avail Use% Mounted on
none 1.9G 0 1.9G 0% /mnt
The --privileged
flag gives all capabilities to the container, and it also
lifts all the limitations enforced by the device
cgroup controller. In other
words, the container can then do almost everything that the host can do. This
flag exists to allow special use-cases, like running Docker within Docker.
ワーキングディレクトリの設定 (-w)
$ docker run -w /path/to/dir/ -i -t ubuntu pwd
-w
は、コマンド実行を指定されたディレクトリ内において行います。
上の例では /path/to/dir/
です。
そのパスが存在しなかった場合、コンテナー内部に生成されます。
コンテナーごとのストレージドライバーオプションの設定
$ docker run -it --storage-opt size=120G fedora /bin/bash
This (size) will allow to set the container rootfs size to 120G at creation time.
This option is only available for the devicemapper
, btrfs
, overlay2
,
windowsfilter
and zfs
graph drivers.
For the devicemapper
, btrfs
, windowsfilter
and zfs
graph drivers,
user cannot pass a size less than the Default BaseFS Size.
For the overlay2
storage driver, the size option is only available if the
backing fs is xfs
and mounted with the pquota
mount option.
Under these conditions, user can pass any size less than the backing fs size.
tmpfs のマウント (--tmpfs)
$ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image
The --tmpfs
flag mounts an empty tmpfs into the container with the rw
,
noexec
, nosuid
, size=65536k
options.
Mount volume (-v, --read-only)
$ docker run -v `pwd`:`pwd` -w `pwd` -i -t ubuntu pwd
The -v
flag mounts the current working directory into the container. The -w
lets the command being executed inside the current working directory, by
changing into the directory to the value returned by pwd
. So this
combination executes the command using the container, but inside the
current working directory.
$ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash
When the host directory of a bind-mounted volume doesn’t exist, Docker
will automatically create this directory on the host for you. In the
example above, Docker will create the /doesnt/exist
folder before starting your container.
$ docker run --read-only -v /icanwrite busybox touch /icanwrite/here
Volumes can be used in combination with --read-only
to control where
a container writes files. The --read-only
flag mounts the container’s root
filesystem as read only prohibiting writes to locations other than the
specified volumes for the container.
$ docker run -t -i -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/static-docker-binary:/usr/bin/docker busybox sh
By bind-mounting the docker unix socket and statically linked docker binary (refer to get the linux binary), you give the container the full access to create and manipulate the host’s Docker daemon.
On Windows, the paths must be specified using Windows-style semantics.
PS C:\> docker run -v c:\foo:c:\dest microsoft/nanoserver cmd /s /c type c:\dest\somefile.txt
Contents of file
PS C:\> docker run -v c:\foo:d: microsoft/nanoserver cmd /s /c type d:\somefile.txt
Contents of file
The following examples will fail when using Windows-based containers, as the destination of a volume or bind mount inside the container must be one of: a non-existing or empty directory; or a drive other than C:. Further, the source of a bind mount must be a local directory, not a file.
net use z: \\remotemachine\share
docker run -v z:\foo:c:\dest ...
docker run -v \\uncpath\to\directory:c:\dest ...
docker run -v c:\foo\somefile.txt:c:\dest ...
docker run -v c:\foo:c: ...
docker run -v c:\foo:c:\existing-directory-with-contents ...
For in-depth information about volumes, refer to manage data in containers
Add bind mounts or volumes using the --mount flag
The --mount
flag allows you to mount volumes, host-directories and tmpfs
mounts in a container.
The --mount
flag supports most options that are supported by the -v
or the
--volume
flag, but uses a different syntax. For in-depth information on the
--mount
flag, and a comparison between --volume
and --mount
, refer to
the service create command reference.
Even though there is no plan to deprecate --volume
, usage of --mount
is recommended.
Examples:
$ docker run --read-only --mount type=volume,target=/icanwrite busybox touch /icanwrite/here
$ docker run -t -i --mount type=bind,src=/data,dst=/data busybox sh
Publish or expose port (-p, --expose)
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
This binds port 8080
of the container to TCP port 80
on 127.0.0.1
of the host
machine. You can also specify udp
and sctp
ports.
The Docker User Guide
explains in detail how to manipulate ports in Docker.
Note that ports which are not bound to the host (i.e., -p 80:80
instead of
-p 127.0.0.1:80:80
) will be accessible from the outside. This also applies if
you configured UFW to block this specific port, as Docker manages its
own iptables rules. Read more
$ docker run --expose 80 ubuntu bash
This exposes port 80
of the container without publishing the port to the host
system’s interfaces.
Set the pull policy (--pull)
Use the --pull
flag to set the image pull policy when creating (and running)
the container.
The --pull
flag can take one of these values:
Value | Description |
---|---|
missing (default) |
Pull the image if it was not found in the image cache, or use the cached image otherwise. |
never |
Do not pull the image, even if it’s missing, and produce an error if the image does not exist in the image cache. |
always |
Always perform a pull before creating the container. |
When creating (and running) a container from an image, the daemon checks if the image exists in the local image cache. If the image is missing, an error is returned to the cli, allowing it to initiate a pull.
The default (missing
) is to only pull the image if it is not present in the
daemon’s image cache. This default allows you to run images that only exist
locally (for example, images you built from a Dockerfile, but that have not
been pushed to a registry), and reduces networking.
The always
option always initiates a pull before creating the container. This
option makes sure the image is up-to-date, and prevents you from using outdated
images, but may not be suitable in situations where you want to test a locally
built image before pushing (as pulling the image overwrites the existing image
in the image cache).
The never
option disables (implicit) pulling images when creating containers,
and only uses images that are available in the image cache. If the specified
image is not found, an error is produced, and the container is not created.
This option is useful in situations where networking is not available, or to
prevent images from being pulled implicitly when creating containers.
The following example shows docker run
with the --pull=never
option set,
which produces en error as the image is missing in the image-cache:
$ docker run --pull=never hello-world
docker: Error response from daemon: No such image: hello-world:latest.
環境変数の設定 (-e, --env, --env-file)
$ docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash
Use the -e
, --env
, and --env-file
flags to set simple (non-array)
environment variables in the container you’re running, or overwrite variables
that are defined in the Dockerfile of the image you’re running.
You can define the variable and its value when running the container:
$ docker run --env VAR1=value1 --env VAR2=value2 ubuntu env | grep VAR
VAR1=value1
VAR2=value2
You can also use variables that you’ve exported to your local environment:
export VAR1=value1
export VAR2=value2
$ docker run --env VAR1 --env VAR2 ubuntu env | grep VAR
VAR1=value1
VAR2=value2
このコマンドが実行されると、Docker CLI クライアントはローカル環境内でのその変数値を確認して、コンテナーに受け渡します。
=
が実行されず、ローカル環境内にてその変数がエクスポートされていなければ、その変数はコンテナー内で設定されません。
環境変数はファイルからロードすることができます。
このファイルでは <変数>=値
という文法を用います(これは変数に設定値を代入します)。
これに加えて <variable>
という記述(これはローカル環境から値を取得します)と、コメントを表わす #
を用いることができます。
$ cat env.list
# This is a comment
VAR1=value1
VAR2=value2
USER
$ docker run --env-file env.list ubuntu env | grep -E 'VAR|USER'
VAR1=value1
VAR2=value2
USER=jonzeolla
コンテナーのメタデータ設定 (-l, --label, --label-file)
ラベルは キー=値
というペアとして記述され、これを使ってメタデータをコンテナーに適用します。
以下はコンテナーに対して 2 つのラベルを設定します。
$ docker run -l my-label --label com.example.foo=bar ubuntu bash
my-label
キーには値が設定されていないため、このラベルはデフォルトとして空文字列 (""
) が設定されます。
ラベルを複数追加する場合は、ラベル設定のフラグ (-l
or --label
) を繰り返し指定します。
キー=値
の設定は、ラベル設定が重複しないように固有なものでなければなりません。
キーが同一であって値が異なるラベル指定を複数行った場合、記述順の後にあるものが上書きされ設定されます。
つまり最後に指定された キー=値
を Docker は採用します。
--label-file
フラグを使うと、複数ラベルをファイルからロードすることができます。
ファイル内において各ラベルの区切りは EOL 文字です。
以下はカレントディレクトリにあるラベル設定のファイルを用いて、ラベルをロードする例です。
$ docker run --label-file ./labels ubuntu bash
ラベル設定のファイルの書式は、環境変数をロードするファイルと似ています。 (ただし環境変数の場合と違って、ラベルはコンテナー内で稼動するプロセスから見えるものではありません。) 以下は、ラベル設定ファイルの記述書式を示す例です。
com.example.label1="a label"
# この行はコメントです。
com.example.label2=another\ label
com.example.label3
ラベル設定のファイルを複数ロードする場合は、--label-file
フラグを複数用いて指定します。
For additional information on working with labels, see Labels - custom metadata in Docker in the Docker User Guide.
ネットワークへのコンテナーの接続 (--network)
コンテナーを起動する際には、--network
フラグを用いることでネットワークに接続することができます。
以下の例では、busybox
コンテナーを my-net
ネットワークに接続します。
$ docker run -itd --network=my-net busybox
You can also choose the IP addresses for the container with --ip
and --ip6
flags when you start the container on a user-defined network.
$ docker run -itd --network=my-net --ip=10.10.9.75 busybox
If you want to add a running container to a network use the docker network connect
subcommand.
You can connect multiple containers to the same network. Once connected, the
containers can communicate easily using only another container’s IP address
or name. For overlay
networks or custom plugins that support multi-host
connectivity, containers connected to the same multi-host network but launched
from different Engines can also communicate in this way.
Note
Service discovery is unavailable on the default bridge network. Containers can communicate via their IP addresses by default. To communicate by name, they must be linked.
You can disconnect a container from a network using the docker network
disconnect
command.
Mount volumes from container (--volumes-from)
$ docker run --volumes-from 777f7dc92da7 --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd
The --volumes-from
flag mounts all the defined volumes from the referenced
containers. Containers can be specified by repetitions of the --volumes-from
argument. The container ID may be optionally suffixed with :ro
or :rw
to
mount the volumes in read-only or read-write mode, respectively. By default,
the volumes are mounted in the same mode (read write or read only) as
the reference container.
Labeling systems like SELinux require that proper labels are placed on volume content mounted into a container. Without a label, the security system might prevent the processes running inside the container from using the content. By default, Docker does not change the labels set by the OS.
To change the label in the container context, you can add either of two suffixes
:z
or :Z
to the volume mount. These suffixes tell Docker to relabel file
objects on the shared volumes. The z
option tells Docker that two containers
share the volume content. As a result, Docker labels the content with a shared
content label. Shared volume labels allow all containers to read/write content.
The Z
option tells Docker to label the content with a private unshared label.
Only the current container can use a private volume.
Attach to STDIN/STDOUT/STDERR (-a)
The -a
flag tells docker run
to bind to the container’s STDIN
, STDOUT
or STDERR
. This makes it possible to manipulate the output and input as
needed.
$ echo "test" | docker run -i -a stdin ubuntu cat -
This pipes data into a container and prints the container’s ID by attaching
only to the container’s STDIN
.
$ docker run -a stderr ubuntu echo test
This isn’t going to print anything unless there’s an error because we’ve
only attached to the STDERR
of the container. The container’s logs
still store what’s been written to STDERR
and STDOUT
.
$ cat somefile | docker run -i -a stdin mybuilder dobuild
This is how piping a file into a container could be done for a build.
The container’s ID will be printed after the build is done and the build
logs could be retrieved using docker logs
. This is
useful if you need to pipe a file or something else into a container and
retrieve the container’s ID once the container has finished running.
Add host device to container (--device)
$ docker run --device=/dev/sdc:/dev/xvdc \
--device=/dev/sdd --device=/dev/zero:/dev/nulo \
-i -t \
ubuntu ls -l /dev/{xvdc,sdd,nulo}
brw-rw---- 1 root disk 8, 2 Feb 9 16:05 /dev/xvdc
brw-rw---- 1 root disk 8, 3 Feb 9 16:05 /dev/sdd
crw-rw-rw- 1 root root 1, 5 Feb 9 16:05 /dev/nulo
It is often necessary to directly expose devices to a container. The --device
option enables that. For example, a specific block storage device or loop
device or audio device can be added to an otherwise unprivileged container
(without the --privileged
flag) and have the application directly access it.
By default, the container will be able to read
, write
and mknod
these devices.
This can be overridden using a third :rwm
set of options to each --device
flag. If the container is running in privileged mode, then the permissions specified
will be ignored.
$ docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdc
Command (m for help): q
$ docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk /dev/xvdc
You will not be able to write the partition table.
Command (m for help): q
$ docker run --device=/dev/sda:/dev/xvdc:rw --rm -it ubuntu fdisk /dev/xvdc
Command (m for help): q
$ docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc
fdisk: unable to open /dev/xvdc: Operation not permitted
Note
The
--device
option cannot be safely used with ephemeral devices. Block devices that may be removed should not be added to untrusted containers with--device
.
For Windows, the format of the string passed to the --device
option is in
the form of --device=<IdType>/<Id>
. Beginning with Windows Server 2019
and Windows 10 October 2018 Update, Windows only supports an IdType of
class
and the Id as a device interface class
GUID.
Refer to the table defined in the Windows container
docs
for a list of container-supported device interface class GUIDs.
If this option is specified for a process-isolated Windows container, all devices that implement the requested device interface class GUID are made available in the container. For example, the command below makes all COM ports on the host visible in the container.
PS C:\> docker run --device=class/86E0D1E0-8089-11D0-9CE4-08003E301F73 mcr.microsoft.com/windows/servercore:ltsc2019
Note
The
--device
option is only supported on process-isolated Windows containers. This option fails if the container isolation ishyperv
or when running Linux Containers on Windows (LCOW).
Using dynamically created devices (--device-cgroup-rule)
Devices available to a container are assigned at creation time. The assigned devices will both be added to the cgroup.allow file and created into the container once it is run. This poses a problem when a new device needs to be added to running container.
One of the solutions is to add a more permissive rule to a container
allowing it access to a wider range of devices. For example, supposing
our container needs access to a character device with major 42
and
any number of minor number (added as new devices appear), the
following rule would be added:
$ docker run -d --device-cgroup-rule='c 42:* rmw' -name my-container my-image
Then, a user could ask udev
to execute a script that would docker exec my-container mknod newDevX c 42 <minor>
the required device when it is added.
Note: initially present devices still need to be explicitly added to the
docker run
/docker create
command.
Access an NVIDIA GPU
The --gpus
flag allows you to access NVIDIA GPU resources. First you need to
install nvidia-container-runtime.
Visit Specify a container’s resources
for more information.
To use --gpus
, specify which GPUs (or all) to use. If no value is provied, all
available GPUs are used. The example below exposes all available GPUs.
$ docker run -it --rm --gpus all ubuntu nvidia-smi
Use the device
option to specify GPUs. The example below exposes a specific
GPU.
$ docker run -it --rm --gpus device=GPU-3a23c669-1f69-c64e-cf85-44e9b07e7a2a ubuntu nvidia-smi
The example below exposes the first and third GPUs.
$ docker run -it --rm --gpus '"device=0,2"' nvidia-smi
Restart policies (--restart)
Use Docker’s --restart
to specify a container’s restart policy. A restart
policy controls whether the Docker daemon restarts a container after exit.
Docker supports the following restart policies:
Policy | Result |
---|---|
no |
Do not automatically restart the container when it exits. This is the default. |
on-failure[:max-retries] |
Restart only if the container exits with a non-zero exit status. Optionally, limit the number of restart retries the Docker daemon attempts. |
unless-stopped |
Restart the container unless it is explicitly stopped or Docker itself is stopped or restarted. |
always |
Always restart the container regardless of the exit status. When you specify always, the Docker daemon will try to restart the container indefinitely. The container will also always start on daemon startup, regardless of the current state of the container. |
$ docker run --restart=always redis
This will run the redis
container with a restart policy of always
so that if the container exits, Docker will restart it.
More detailed information on restart policies can be found in the Restart Policies (--restart) section of the Docker run reference page.
Add entries to container hosts file (--add-host)
You can add other hosts into a container’s /etc/hosts
file by using one or
more --add-host
flags. This example adds a static address for a host named
docker
:
$ docker run --add-host=docker:93.184.216.34 --rm -it alpine
/ # ping docker
PING docker (93.184.216.34): 56 data bytes
64 bytes from 93.184.216.34: seq=0 ttl=37 time=93.052 ms
64 bytes from 93.184.216.34: seq=1 ttl=37 time=92.467 ms
64 bytes from 93.184.216.34: seq=2 ttl=37 time=92.252 ms
^C
--- docker ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 92.209/92.495/93.052 ms
Sometimes you need to connect to the Docker host from within your
container. To enable this, pass the Docker host’s IP address to
the container using the --add-host
flag. To find the host’s address,
use the ip addr show
command.
The flags you pass to ip addr show
depend on whether you are
using IPv4 or IPv6 networking in your containers. Use the following
flags for IPv4 address retrieval for a network device named eth0
:
$ HOSTIP=`ip -4 addr show scope global dev eth0 | grep inet | awk '{print $2}' | cut -d / -f 1 | sed -n 1p`
$ docker run --add-host=docker:${HOSTIP} --rm -it debian
For IPv6 use the -6
flag instead of the -4
flag. For other network
devices, replace eth0
with the correct device name (for example docker0
for the bridge device).
Set ulimits in container (--ulimit)
コンテナーにおいて ulimit
設定を行うには、デフォルトコンテナーでは利用できない追加の権限が必要となります。
そこでこれを行うために --ulimit
フラグを利用します。
--ulimit
では以下のように、ソフトリミット(soft limit)とハードリミット(hard limit)を <type>=<soft limit>[:<hard limit>]
のようにして指定します。
たとえば以下のとおりです。
$ docker run --ulimit nofile=1024:1024 --rm debian sh -c "ulimit -n"
1024
メモ
hard limit
を指定しなかった場合、soft limit
が両方の値として採用されます。ulimits
の指定がなければ、デーモンにおいて設定されているデフォルトのulimits
が継承されます。as
オプションは利用できなくなっています。 つまり以下のようなスクリプトはサポートされません。$ docker run -it --ulimit as=1024 fedora /bin/bash
値を設定すると、その値が適切な syscall
に送信されます。
Docker はバイト列に関して何か変換を行うようなことはしません。
このことを考慮して値を設定してください。
For nproc
usage
Be careful setting nproc
with the ulimit
flag as nproc
is designed by Linux to set the
maximum number of processes available to a user, not to a container. For example, start four
containers with daemon
user:
$ docker run -d -u daemon --ulimit nproc=3 busybox top
$ docker run -d -u daemon --ulimit nproc=3 busybox top
$ docker run -d -u daemon --ulimit nproc=3 busybox top
$ docker run -d -u daemon --ulimit nproc=3 busybox top
The 4th container fails and reports “[8] System error: resource temporarily unavailable” error.
This fails because the caller set nproc=3
resulting in the first three containers using up
the three processes quota set for the daemon
user.
Stop container with signal (--stop-signal)
The --stop-signal
flag sets the system call signal that will be sent to the
container to exit. This signal can be a signal name in the format SIG<NAME>
,
for instance SIGKILL
, or an unsigned number that matches a position in the
kernel’s syscall table, for instance 9
.
The default is SIGTERM
if not specified.
Optional security options (--security-opt)
On Windows, this flag can be used to specify the credentialspec
option.
The credentialspec
must be in the format file://spec.txt
or registry://keyname
.
Stop container with timeout (--stop-timeout)
The --stop-timeout
flag sets the number of seconds to wait for the container
to stop after sending the pre-defined (see --stop-signal
) system call signal.
If the container does not exit after the timeout elapses, it is forcibly killed
with a SIGKILL
signal.
If --stop-timeout
is set to -1
, no timeout is applied, and the daemon will
wait indefinitely for the container to exit.
The default is determined by the daemon, and is 10 seconds for Linux containers, and 30 seconds for Windows containers.
コンテナーへの分離技術方式の指定 (--isolation)
このオプションは Docker コンテナーを Windows 上において稼動させる場合に役立ちます。
--isolation <value>
オプションは、コンテナーの分離技術方式を設定します。
Linux の場合にサポートされているのは default
オプションだけであり、これは Linux 名前空間を利用するものです。
以下の 2 つのコマンドは Linux 上においてはまったく同じことです。
$ docker run -d busybox top
$ docker run -d --isolation default busybox top
On Windows, --isolation
can take one of these values:
Value | Description |
---|---|
default |
Use the value specified by the Docker daemon’s --exec-opt or system default (see below). |
process |
Shared-kernel namespace isolation. |
hyperv |
Hyper-V hypervisor partition-based isolation. |
The default isolation on Windows server operating systems is process
, and hyperv
on Windows client operating systems, such as Windows 10. Process isolation is more
performant, but requires the image to
On Windows server, assuming the default configuration, these commands are equivalent
and result in process
isolation:
PS C:\> docker run -d microsoft/nanoserver powershell echo process
PS C:\> docker run -d --isolation default microsoft/nanoserver powershell echo process
PS C:\> docker run -d --isolation process microsoft/nanoserver powershell echo process
If you have set the --exec-opt isolation=hyperv
option on the Docker daemon
, or
are running against a Windows client-based daemon, these commands are equivalent and
result in hyperv
isolation:
PS C:\> docker run -d microsoft/nanoserver powershell echo hyperv
PS C:\> docker run -d --isolation default microsoft/nanoserver powershell echo hyperv
PS C:\> docker run -d --isolation hyperv microsoft/nanoserver powershell echo hyperv
Specify hard limits on memory available to containers (-m, --memory)
These parameters always set an upper limit on the memory available to the container. On Linux, this
is set on the cgroup and applications in a container can query it at /sys/fs/cgroup/memory/memory.limit_in_bytes
.
On Windows, this will affect containers differently depending on what type of isolation is used.
-
With
process
isolation, Windows will report the full memory of the host system, not the limit to applications running inside the containerPS C:\> docker run -it -m 2GB --isolation=process microsoft/nanoserver powershell Get-ComputerInfo *memory* CsTotalPhysicalMemory : 17064509440 CsPhyicallyInstalledMemory : 16777216 OsTotalVisibleMemorySize : 16664560 OsFreePhysicalMemory : 14646720 OsTotalVirtualMemorySize : 19154928 OsFreeVirtualMemory : 17197440 OsInUseVirtualMemory : 1957488 OsMaxProcessMemorySize : 137438953344
-
With
hyperv
isolation, Windows will create a utility VM that is big enough to hold the memory limit, plus the minimal OS needed to host the container. That size is reported as “Total Physical Memory.”PS C:\> docker run -it -m 2GB --isolation=hyperv microsoft/nanoserver powershell Get-ComputerInfo *memory* CsTotalPhysicalMemory : 2683355136 CsPhyicallyInstalledMemory : OsTotalVisibleMemorySize : 2620464 OsFreePhysicalMemory : 2306552 OsTotalVirtualMemorySize : 2620464 OsFreeVirtualMemory : 2356692 OsInUseVirtualMemory : 263772 OsMaxProcessMemorySize : 137438953344
Configure namespaced kernel parameters (sysctls) at runtime
The --sysctl
sets namespaced kernel parameters (sysctls) in the
container. For example, to turn on IP forwarding in the containers
network namespace, run this command:
$ docker run --sysctl net.ipv4.ip_forward=1 someimage
Note
Not all sysctls are namespaced. Docker does not support changing sysctls inside of a container that also modify the host system. As the kernel evolves we expect to see more sysctls become namespaced.
Currently supported sysctls
IPC Namespace:
kernel.msgmax
,kernel.msgmnb
,kernel.msgmni
,kernel.sem
,kernel.shmall
,kernel.shmmax
,kernel.shmmni
,kernel.shm_rmid_forced
.- Sysctls beginning with
fs.mqueue.*
- If you use the
--ipc=host
option these sysctls are not allowed.
Network Namespace:
- Sysctls beginning with
net.*
- If you use the
--network=host
option using these sysctls are not allowed.
上位コマンド
コマンド | 説明 |
---|---|
docker | Docker CLI の基本コマンド |