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 is hyperv 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 container

      PS 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 の基本コマンド