docker run
最后更新于:2022-04-02 03:04:06
[TOC]
> [docker run 手册](https://docs.docker.com/engine/reference/commandline/run/)
## 概述
操作员可以覆盖Docker运行时本身设置的几乎所有默认设置。操作员具有覆盖映像和Docker运行时默认值的能力
## 语法
```
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
options:
// Foreground
-a=[] : 附加到STDIN,STDOUT或STDERR
--tty , -t : 分配伪TTY
--interactive , -i : 即使未连接STDIN也保持打开状态
// 如 docker run -a stdin -a stdout -i -t ubuntu /bin/bash
// 容器身份
--name : 容器名称
// 网络设置
--dns=[] : 为容器设置自定义dns服务器
默认情况下,您的容器将使用与主机相同的DNS服务器
--network="bridge" : 将容器连接到网络(default)
'none' : 没有网络
'container:': 重用另一个容器的网络堆栈
'host' : 使用Docker主机网络栈
'|': 连接到用户定义的网络
--network-alias=[] : 为容器添加网络范围的别名
--add-host="" : 添加自定义主机到IP的映射(host:ip)
--mac-address="" : 设置容器的以太网设备的MAC地址
--ip="" : 设置容器的以太网设备的IPv4地址
--ip6="" : 设置容器的以太网设备的IPv6地址
--link-local-ip=[] : 设置一个或多个容器的以太网设备的链接本地IPv4/IPv6地址
// 重新启动策略
--restart="no" : 退出时不要自动重启容器。这是默认值
="on-failure[:max-retries]" : 仅当容器以非零退出状态退出时,才重新启动
="always" : 无论退出状态如何,请始终重新启动容器
// 如 docker run --restart=on-failure:10 redis
// 清理
--rm=false : 当容器退出时自动删除它(默认 false)
Docker也将删除与该容器关联的匿名卷
// 资源约束运行
-m, --memory="" : 内存限制(单位:b,k,m,或g),如 4m
-c, --cpu-shares=0 : CPU份额
--cpus=0.000 : CPU数量。数字是小数。0.000表示没有限制
// 运行时特权和Linux功能
--privileged :赋予此容器扩展的特权
// 覆盖Dockerfile映像默认值
--entrypoint : 在运行时执行的默认命令
// 如: docker run -it --entrypoint /bin/bash example/redis
// 如: docker run -it --entrypoint="" mysql bash
// 暴露
--expose=[] : 公开容器内的一个或多个端口。
-P : 将所有公开的端口发布到主机接口
-p=[] : 将容器的端口或端口范围发布到主机
如 -p 88:80 或 -p 1234-1236:1234-1236/tcp 或 -p 127.0.0.1:80:8080/tcp
--link="" : 添加链接到另一个容器 (:alias or )
// ENV(环境变量)
// 创建Windows容器时,Docker不会设置任何环境变量
-e ,--env : 设置环境变量 , 如 "-e PATH" or "-e foo=bar"
--env-file 文件 : 导入文件名
// VOLUME(共享文件系统)
-v, --volume=[host-src:]container-dest[:<[rw|ro], [z|Z]>]: 绑定挂载卷
// 指定用户
-u="", --user="" : 设置指定命令所使用的用户名或UID,root(id = 0)是容器中的默认用户
// 工作目录
// 在容器中运行二进制文件的默认工作目录是根目录(/)
--workdir , -w="" : 容器内的工作目录
// ulimit
--ulimit :Ulimit选项
=[:]
// HEALTHCHECK
--health-cmd Command to run to check health
--health-interval Time between running the check
--health-retries Consecutive failures needed to report unhealthy
--health-timeout Maximum time to allow one check to run
--health-start-period Start period for the container to initialize before starting health-retries countdown
--no-healthcheck Disable any container-specified HEALTHCHECK
```
## 示例
### 完整的容器功能(特权)(--privileged)
```
docker run -t -i --privileged ubuntu bash
```
### 特权启用systemctl (--privileged)
```
docker run -itd --name centos_7 -p 88:80 --privileged centos:7 init
```
### 启动redis (-d)
```
docker run --name my-redis -d redis
```
### 容器连接到同一网络(--network)
可以将多个容器连接到同一网络。一旦连接到用户定义的网络,这些容器就可以仅使用另一个容器的IP地址或名称轻松进行通信
```
docker network create -d bridge my-net
docker run -itd --network=my-net --ip=10.10.9.75 busybox
```
### 三种方式设置环境变量 (--env ,--env-file)
三种方式来改变环境变量
方式一:参数导入
```
$ docker run --env VAR1=value1 --env VAR2=value2 ubuntu env | grep VAR
VAR1=value1
VAR2=value2
```
方式二:读取主机环境变量
```
$ export VAR1=value1
$ export VAR2=value2
$ docker run --env VAR1 --env VAR2 ubuntu env | grep VAR
VAR1=value1
VAR2=value2
```
方式三:文件导入
```
$ cat env.list
# This is a comment
VAR1=value1
VAR2=value2
$ docker run --env-file env.list ubuntu env | grep VAR
VAR1=value1
VAR2=value2
```
### 设置工作目录 (-w)
```
docker run -w /path/to/dir/ -i -t ubuntu pwd
```
如果路径不存在,则会在容器内创建该路径
### 挂载数据卷(--mount or --volume)
挂载可以使用 `--mount` 或 `--volume`,官方中推荐使用 --mount,但是 --volume 比较流行
```
//创建卷
> docker volume create my-vol
// 使用 --mount
> docker run -d -P --name web --mount source=my-vol,target=/usr/share/nginx/html nginx:alpine
// or 使用 --volume
> docker run -d -P --name web -v my-vol:/usr/share/nginx/html nginx:alpine
```
### 挂载主机目录(--mount or -volume)
```
// 使用 --mount
> docker run -d -P --name web --mount ype=bind,source=/src/webapp,target=/usr/share/nginx/html nginx:alpine
// or 使用 --volume
> docker run -d -P --name web -v /src/webapp:/usr/share/nginx/html nginx:alpine
```
### 挂载只读主机目录(--mount or -volume)
```
// 使用 --mount
> docker run -d -P --name web --mount ype=bind,source=/src/webapp,target=/usr/share/nginx/html,readonly nginx:alpine
// or 使用 --volume
> docker run -d -P --name web -v /src/webapp:/usr/share/nginx/html:ro nginx:alpine
```
### 设置容器的存储大小为120G
```
docker run -it --storage-opt size=120G fedora /bin/bash
```
### 在容器上设置元数据(-l,--lable)
```
$ docker run -l my-label --label com.example.foo=bar ubuntu bash
```
### 重新启动策略(--restart)
```
docker run --restart=always redis
```
### 容器链接到另一个redis容器 (--network)
```
> docker run -d --name redis example/redis --bind 127.0.0.1
// --privilegeduse the redis container's network stack to access localhost
> docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1
```
### 容器可访问主机(--add-host)
```
> docker run -it --rm --add-host=docker:192.168.0.229 centos:7
[root@localhost ~]# ping docker
PING docker (192.168.0.229) 56(84) bytes of data.
64 bytes from docker (192.168.0.229): icmp_seq=1 ttl=64 time=0.108 ms
```
### 在容器中设置ulimit(--ulimit)
```
docker run --ulimit nofile=1024:1024 --rm debian sh -c "ulimit -n"
```
';