Docker容器
镜像-类– -只读
容器-容器-可写(带有运行时需要的可写文件层)
实例
运行bash应用
运行bash应用,执行打印“Hello World”命令:
$ docker run -it ubuntu:18.04 bash
root@65663247040f:/# echo "Hello World"
Hello World
root@65663247040f:/# exit
容器操作
create-新建容器
使用docker [container] create
命令新建的容器处于停止状态,可以使用docker [container] start
命令来启动它:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create --help
例子
:
docker create -it ubuntu:latest
$ docker create -it ubuntu:latest
af8f4f922dafee22c8fe6cd2ae11d16e25087d61f1b1fa55b36e94db7ef45178
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af8f4f922daf ubuntu:latest "/bin/bash" 17 seconds ago Created silly_euler
选项-列表-全
-
--add-host list
: Add a custom host-to-IP mapping (host:ip) 添加自定义主机到IP的映射在容器内添加一个主机名到IP地址的映射关系(通过/etc/hosts文件)
-
-a, --attach list
:--attach=[]
Attach to STDIN, STDOUT or STDERR
是否绑定到标准输入、输出和错误
-
--blkio-weight uint16
: Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) 块IO(相对权重),介于10到1000之间,或者为0禁用(默认为0)容器读写块设备的I/O性能权重,默认为0
-
--blkio-weight-device list
: Block IO weight (relative device weight) (default []) 块IO权重(相对设备权重)(默认为[])指定各个块设备的I/O性能权重
-
--cap-add list
: Add Linux capabilities增加容器的 Linux指定安全能力
-
--cap-drop list
: Drop Linux capabilities移除容器的 Linux指定安全能力
-
--cgroup-parent string
: Optional parent cgroup for the container 容器的可选父cgroup容器 groups限制的创建路径
--cgroupns string
: Cgroup namespace to use (host|private) 要使用的Cgroup命名空间(host|private)'host'
:
Run the container in the Docker host’s cgroup namespace 在Docker主机的cgroup命名空间中运行容器'private'
: Run the container in its own private cgroup namespace 在自己的私有cgroup命名空间中运行容器''
:
Use the cgroup namespace as configured by the default-cgroupns-mode option on the daemon (default) 使用守护程序上default-cgroupns-mode选项配置的cgroup命名空间(默认)
-
--cidfile string
: Write the container ID to the file 将容器ID写入文件指定容器的进程ID号写到文件
-
--cpu-period int
: Limit CPU CFS (Completely Fair Scheduler) period Limit CPU CFS(完全公平的调度程序)period限制容器在CFS调度器下的CPU占用时间片
-
--cpu-quota int
: Limit CPU CFS (Completely Fair Scheduler) quota Limit CPU CFS(完全公平的调度程序)配额限制容器在CFS调度器下的CPU配额
-
--cpu-rt-period int
: Limit CPU real-time period in microseconds 限制CPU实时时间(以微秒为单位) -
--cpu-rt-runtime int
: Limit CPU real-time runtime in microseconds 限制CPU实时运行时间(以微秒为单位) -
-c, --cpu-shares int
: CPU shares (relative weight) CPU份额(相对重量)允许容器使用CPU资源的相对权重,默认一个容器能用满一个核的CPU
-
--cpus decimal
: Number of CPUs CPU数量 -
--cpuset-cpus string
: CPUs in which to allow execution (0-3, 0,1) 允许执行的CPU(0-3,0,1)限制容器能使用哪些CPU核心
-
--cpuset-mems string
: MEMs in which to allow execution (0-3, 0,1) 允许执行的MEM(0-3,0,1)NUMA架构下使用哪些核心的内存??
-
--device list
: Add a host device to the container 将主机设备添加到容器映射物理机上的设备到容器内
-
--device-cgroup-rule list
: Add a rule to the cgroup allowed devices list 将规则添加到cgroup允许的设备列表中 -
--device-read-bps list
: Limit read rate (bytes per second) from a device (default []) 限制从设备读取的速率(每秒字节数)(默认为[])挂载设备的读吞吐率(以bps为单位)限制
-
--device-read-iops list
: Limit read rate (IO per second) from a device (default []) 限制从设备读取的速率(每秒IO)(默认[])挂载设备的读速率(以每秒i/o次数为单位)限制
-
--device-write-bps list
: Limit write rate (bytes per second) to a device (default []) 将写入速率(每秒的字节数)限制为设备(默认为[])挂载设备的写吞吐率(以bps为单位)限制
-
--device-write-iops list
: Limit write rate (IO per second) to a device (default []) 将写入速率(每秒的IO)限制为设备(默认为[])挂载设备的写速率(以每秒i/o次数为单位)限制
-
--disable-content-trust
: Skip image verification (default true) 跳过容器验证(默认为true) -
--dns list
: Set custom DNS servers 设置自定义DNS服务器自定义的DNS服务器
-
--dns-option list
: Set DNS options 设定DNS选项自定义的DNS选项
-
--dns-search list
: Set custom DNS search domains 设置自定义DNS搜索域DNS搜索域
-
--domainname string
: Container NIS domain name 容器NIS域名 -
--entrypoint string
: Overwrite the default ENTRYPOINT of the image 覆盖容器的默认ENTRYPOINT镜像存在入口命令时,覆盖为新的命令
-
-e, --env list
: Set environment variables 设置环境变量指定容器内环境变量
-
--env-file list
: Read in a file of environment variables 读入环境变量文件从文件中读取环境变量到容器内
-
--expose list
: Expose a port or a range of ports 公开一个或多个端口指定容器会暴露出来的端口或端口范围
-
--gpus gpu-request
: GPU devices to add to the container (‘all’ to pass all GPUs) 要添加到容器中的GPU设备('all'
指定所有GPU) -
--group-add list
: Add additional groups to join 添加其他群组加入运行容器的用户组
-
--health-cmd string
: Command to run to check health 运行命令以检查运行状况指定检查容器健康状态的命令
-
--health-interval duration
: Time between running the check (ms|s|m|h) (default 0s) 运行检查之间的时间间隔(ms | s | m | h
)(默认为0s)执行健康检查的间隔时间,单位可以为ms、s、m或h
-
--health-retries int
: Consecutive failures needed to report unhealthy 需要报告不健康的连续失败数健康检查失败重试次数,超过则认为不健康
-
--health-start-period duration
: Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s) 开始运行状况重试倒计时之前,容器初始化的开始时间(毫秒|秒|米|小时)(默认为0秒)容器启动后进行健康检查的等待时间,单位可以为ms、s、m或h
-
--health-timeout duration
: Maximum time to allow one check to run (ms|s|m|h) (default 0s) 允许执行一次检查的最大时间(ms | s | m | h)(默认为0s)健康检查的执行超时,单位可以为ms、s、m或h
-
--help
: Print usage -
-h, --hostname string
: Container host name 容器主机名指定容器内的主机名
-
--init
: Run an init inside the container that forwards signals and reaps processes 在容器内运行一个初始化程序,以转发信号并获取进程在容器中执行一个init进程,来负责响应信号和处理僵尸状态子进程
-
-i, --interactive
: Keep STDIN open even if not attached 即使未被连接STDIN也保持打开状态保持标准输入打开,默认为false
-
--ip string
: IPv4 address (e.g., 172.30.100.104) IPv4地址指定容器的IPv4地址
-
--ip6 string
: IPv6 address (e.g., 2001:db8::33) IPv6地址指定容器的IPv6地址
-
--ipc string
: IPC mode to use 使用的IPC模式容器IPC命名空间,可以为其他容器或主机
-
--isolation string
: Container isolation technology 容器隔离技术容器使用的隔离机制,如”default”
-
--kernel-memory bytes
: Kernel memory limit 内核内存限制限制容器使用内核的内存大小,单位可以是b、k、m或g
-
-l, --label list
: Set meta data on a container 在容器上设置元数据以键值对方式指定容器的标签信息;
-
--label-file list
: Read in a line delimited file of labels 读入行分隔的标签文件从文件中读取标签信息
-
--link list
: Add link to another container 将链接添加到另一个容器链接到其他容器(name or id)
-
--link-local-ip list
: Container IPv4/IPv6 link-local addresses 容器IPv4 / IPv6链接本地地址容器的本地链接地址列表
-
--log-driver string
: Logging driver for the container 容器的日志记录驱动程序指定容器的日志驱动类型,可以为json-file、syslog、journald、 gelf、fluentd、awslogs、splunk、etwlogs、gcplogs或 none
-
--log-opt list
: Log driver options 日志驱动程序选项传递给日志驱动的选项
-
--mac-address string
: Container MAC address (e.g., 92:d0:c6:0a:29:33) 容器MAC地址指定容器的Mac地址
-
-m, --memory bytes
: Memory limit 内存限制限制容器内应用使用的内存,单位可以是b、k、m或g
-
--memory-reservation bytes
: Memory soft limit 内存软限制当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值
-
--memory-swap bytes
: Swap limit equal to memory plus swap: ‘-1’ to enable unlimited swap 交换限制等于内存加交换:“-1”以启用无限交换限制容器使用内存和交换区的总大小
-
--memory-swappiness int
: Tune container memory swappiness (0 to 100) (default -1) 调优容器内存交换(0到100)(默认-1)调整容器的内存交换区参数
-
--mount mount
: Attach a filesystem mount to the container 将文件系统挂载附加到容器 -
--name string
: Assign a name to the container 为容器分配一个名称指定容器的别名
-
--network network
: Connect a container to a network 将容器连接到网络指定容器网络模式,包括bridge、none、其他容器内网络、host的网络或某个现有网络等
-
--network-alias list
:Add network-scoped alias for the container 为容器添加网络范围的别名
-
--no-healthcheck
: Disable any container-specified HEALTHCHECK 禁用任何容器指定的健康检查是否禁用健康检查
-
--oom-kill-disable
: Disable OOM Killer 禁用OOM Killer内存耗尽时是否杀死容器
-
--oom-score-adj int
: Tune host’s OOM preferences (-1000 to 1000) Tune host’s OOM 首选项(-1000至1000)调整容器的内存耗尽参数
-
--pid string
: PID namespace to use 使用的PID名称空间容器的PID命名空间
-
--pids-limit int
: Tune container pids limit (set -1 for unlimited) Tune容器pids限制(将-1设置为无限制)限制容器的pid个数
-
--platform string
: Set platform if server is multi-platform capable 如果服务器支持多平台,则设置平台 -
--privileged
: Give extended privileges to this container 赋予此容器扩展的特权💫是否给容器高权限,这意味着容器内应用将不受权限的限制.一般不推荐
-
-p, --publish list
: Publish a container’s port(s) to the host 将容器的端口发布到主机指定如何映射到本地主机端口,例如-p 11234-12234:1234-2234
-
-P, --publish-all
: Publish all exposed ports to random ports 将所有公开的端口发布到随机端口通过NAT机制将容器标记暴露的端口自动映射到本地主机的临时端口
-
--pull string
: Pull image before creating (“always”|”missing”|”never”) (default “missing”) 创建前拉取镜像 -
--read-only
: Mount the container’s root filesystem as read only 将容器的根文件系统挂载为只读是否让容器内的文件系统只读
-
--restart string
: Restart policy to apply when a container exits (default “no”) 容器退出时重新启动策略以应用(默认为“否”)容器的重启策略,包括no、on-failure [:max-retry]、always、 unless-stopped 等
-
--rm
: Automatically remove the container when it exits 退出时自动删除容器容器退出后是否自动删除,不能跟
-d
同时使用 -
--runtime string
: Runtime to use for this container 用于此容器的运行时 -
--security-opt list
: Security Options 安全选项指定一些安全参数,包括权限、安全能力、 apparmor等
-
--shm-size bytes
: Size of /dev/shmdev/shm的大小
-
--stop-signal string
: Signal to stop a container (default “SIGTERM”) 停止容器的信号指定停止容器的系统信号
-
--stop-timeout int
: Timeout (in seconds) to stop a container 停止容器的超时时间(以秒为单位) -
--storage-opt list
: Storage driver options for the container 容器的存储驱动程序选项 -
--sysctl map
: Sysctl options (default map[]) Sysctl选项(默认映射[]) -
--tmpfs list
: Mount a tmpfs directory 挂载tmpfs目录挂载临时文件系统到容器
-
-t, --tty
: Allocate a pseudo-TTY 分配伪TTY是否分配一个伪终端,默认为false
-
--ulimit ulimit
: Ulimit options (default []) Ulimit选项(默认[])通过ulimit来限制最大文件数、最大进程数等
-
-u, --user string
: Username or UID (format: <name|uid>[:<group|gid>]) 用户名或UID指定在容器内执行命令的用户信息
-
--userns string
: User namespace to use 要使用的用户名称空间指定用户命名空间
-
启用userns-remap时配置用户命名空间的模式
-
--uts string
: UTS namespace to use 使用的UTS名称空间容器的UTS命名空间
-
-v, --volume list
:--volume [=[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]]
Bind mount a volume 绑定挂载卷
-
--volume-driver string
: Optional volume driver for the container 容器的可选卷驱动器挂载文件卷的驱动类型
-
--volumes-from list
: Mount volumes from the specified container(s) 从指定的容器挂载卷 -w, --workdir string
: Working directory inside the container 容器内的默认工作目录
其他地方查到的
-
--sig-proxy=true|false
:是否代理收到的信号给应用,默认为true,不能代理 SIGCHLD、SIGSTOP和 SIGKILL信号
是否代理收到的系统信号给应用进程,默认为true。
选项-表格-分类
运行模式相关
create命令与容器运行模式相关的选项
选 项 | 说 明 |
---|---|
-a, --attach list |
是否绑定到标准输入、输出和错误 |
-d, --detach |
是否在后台运行容器,默认为否 |
--detach-keys string |
从attach模式退出的快捷键 |
--entrypoint string |
镜像存在入口命令时,覆盖为新的命令 |
--expose list |
指定容器会暴露出来的端口或端口范围 |
--group-add list |
运行容器的用户组 |
-i, --interactive |
保持标准输入打开,默认为false |
--ipc string |
容器IPC命名空间,可以为其他容器或主机 |
--isolation string |
容器使用的隔离机制,如”default” |
--log-driver string |
指定容器的日志驱动类型,可以为json-file、syslog、journald、 gelf、fluentd、awslogs、splunk、etwlogs、gcplogs或 none |
--log-opt list |
传递给日志驱动的选项 |
--network network |
指定容器网络模式,包括bridge、none、其他容器内网络、host的 网络或某个现有网络等 |
--net-alias list |
容器在网络中的别名 |
-P, --publish-all |
通过NAT机制将容器标记暴露的端口自动映射到本地主机的临时端口 |
-p, --publish list |
指定如何映射到本地主机端口,例如-p 11234-12234:1234-2234 |
--pid string |
容器的PID命名空间 |
--userns string |
启用userns-remap时配置用户命名空间的模式 |
--uts string |
容器的UTS命名空间 |
--restart string |
容器的重启策略,包括no、on-failure [:max-retry]、always、 unless-stopped 等 |
--rm |
容器退出后是否自动删除,不能跟-d同时使用 |
-t, --tty |
是否分配一个伪终端,默认为false |
--tmpfs list |
挂载临时文件系统到容器 |
--volume [=[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]] |
挂载主机上的文件卷到容器内 |
--volume-driver string |
挂载文件卷的驱动类型 |
--volumes-from list |
从其他容器挂载卷 |
-w, --workdir string |
容器内的默认工作目录 |
环境和配置相关
create命令与容器环境和配置相关的选项
选 项 | 说 明 |
---|---|
--add-host list |
在容器内添加一个主机名到IP地址的映射关系(通过/etc/hosts文件) |
--device list |
映射物理机上的设备到容器内 |
--dns-search list |
DNS搜索域 |
--dns-option list |
自定义的DNS选项 |
--dns list |
自定义的DNS服务器 |
-e, --env list |
指定容器内环境变量 |
--env-file list |
从文件中读取环境变量到容器内 |
-h, --hostname string |
指定容器内的主机名 |
--ip string |
指定容器的IPv4地址 |
--ip6 string |
指定容器的IPv6地址 |
--link list |
链接到其他容器 |
--link-local-ip list |
容器的本地链接地址列表 |
--mac-address string |
指定容器的Mac地址 |
--name string |
指定容器的别名 |
资源限制和安全保护相关
create命令与容器资源限制和安全保护相关的选项
选 项 | 说 明 |
---|---|
--blkio-weight uint16 |
容器读写块设备I/O性能权重,默认为0 |
--blkio-weight-device list |
指定各个块设备的I/O性能权重 |
-c, --cpu-shares int |
允许容器使用CPU资源的相对权重,默认一个容器能用满一个核的CPU |
--cap-add list |
增加綷器的Linux桁矩安全能力 |
--cap-drop list |
移除容器的 Linux指定安全能力 |
--cgroup-parent string |
容器 groups限制的创建路径 |
--cidfile string |
指定容器的进程ID号写到文件 |
--cpu-period int |
限制容器在CFS调度器下的CPU占用时间片 |
--cpuset-cpus string |
限制容器能使用哪些CPU核心 |
--cpuset-mems string |
NUMA架构下使用哪些核心的内存?? |
--cpu-quota int |
限制容器在CFS调度器下的CPU配额 |
--device-read-bps list |
挂载设备的读吞吐率(以bps为单位)限制 |
--device-write-bps list |
挂载设备的写吞吐率(以bps为单位)限制 |
--device-read-iops list |
挂载设备的读速率(以每秒i/o次数为单位)限制 |
--device-write-iops list |
挂载设备的写速率(以每秒i/o次数为单位)限制 |
--health-cmd string |
指定检查容器健康状态的命令 |
--health-interval duration |
执行健康检查的间隔时间,单位可以为ms、s、m或h |
--health-retries int |
健康检查失败重试次数,超过则认为不健康 |
--health-start-period duration |
容器启动后进行健康检查的等待时间,单位可以为ms、s、m或h |
--health-timeout duration |
健康检查的执行超时,单位可以为ms、s、m或h |
--no-healthcheck |
是否禁用健康检查 |
--init |
在容器中执行一个init进程,来负责响应信号和处理僵尸状态子进程 |
--kernel-memory bytes |
限制容器使用内核的内存大小,单位可以是b、k、m或g |
-m, --memory bytes |
限制容器内应用使用的内存,单位可以是b、k、m或g |
--memory-reservation bytes |
当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值 |
--memory-swap bytes |
限制容器使用内存和交换区的总大小 |
--oom-kill-disable |
内存耗尽时是否杀死容器 |
--oom-score-adj int |
调整容器的内存耗尽参数 |
--pids-limit int |
限制容器的pid个数 |
--privileged |
是否给容器高权限,这意味着容器内应用将不受权限的限制.一般不推荐 |
--read-only |
是否让容器内的文件系统只读 |
--security-opt list |
指定一些安全参数,包括权限、安全能力、 apparmor等 |
--stop-signal string |
指定停止容器的系统信号(default “SIGTERM”) |
--shm-size bytes |
dev/shm的大小 |
--sig-proxy=true|false |
是否代理收到的信号给应用,默认为true,不能代理 SIGCHLD、SIGSTOP和 SIGKILL信号 |
--memory-swappiness int |
调整容器的内存交换区参数(0到100)(默认-1) |
-u, --user string |
指定在容器内执行命令的用户信息 |
--userns string |
指定用户命名空间 |
--ulimit ulimit |
通过ulimit来限制最大文件数、最大进程数等 |
start-启动容器
可以使用docker [container] start
命令来启动处于停止状态的容器:
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker start --help
例子
:启动刚创建的ubuntu容器af:
$ docker start af
af
此时,通过docker ps命令,可以查看到一个运行中的容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af8f4f922daf ubuntu:latest "/bin/bash" 2 minutes ago Up 7 seconds silly_euler
选项
-
-a, --attach
: Attach STDOUT/STDERR and forward signals -
--detach-keys string
: Override the key sequence for detaching a container从attach模式退出的快捷键
-
-i, --interactive
: Attach container’s STDIN
run-新建并启动容器
除了创建容器后通过start命令来启动,也可以直接新建并启动容器。
所需要的命令主要为docker[container]run
,等价于先执行docker[container]create
命令,再执行docker[container]start
命令。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
参数和create一致,直接看上面部分即可。
docker run --help
例子
:输出一个“HelloWorld”,之后容器自动终止:
docker run busybox:latest /bin/echo 'Hello world'
run暗地里的操作
当利用docker[container]run来创建并启动容器时,Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
- 利用镜像创建一个容器,并启动该容器;
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
- 从网桥的地址池配置一个IP地址给容器;
- 执行用户指定的应用程序;
- 执行完毕后容器被自动终止。
-it 交互
下面的命令启动一个bash终端,允许用户进行交互:
$ docker run -it busybox
root@af8bae53bdd3:/#
# 或
$ docker run -it busybox:latest /bin/sh
root@af8bae53bdd3:/#
# 可以根据之前镜像知识得到
virhuiaivirhuiai@virhuiaideMBP RamDisk % docker inspect busybox:latest -f .ContainerConfig.Cmd
[/bin/sh -c #(nop) CMD ["sh"]]
virhuiaivirhuiai@virhuiaideMBP RamDisk % docker inspect busybox:latest -f .Config.Cmd
[sh]
其中:
-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上-i
则让容器的标准输入保持打开。
退出的错误代码
对于所创建的bash容器,当用户使用exit命令退出bash进程之后,容器也会自动退出。这是因为对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的必要了。
可以使用docker container wait CONTAINER[CONTAINER…]子命令来等待容器退出,并打印退出返回结果。
某些时候,执行docker[container]run时候因为命令无法正常执行容器会出错直接退出,此时可以查看退出的错误代码。
默认情况下,常见错误代码包括:
- 125:Docker daemon执行出错,例如指定了不支持的Docker命令参数;
- 126:所指定命令无法执行,例如权限出错;
- 127:容器内命令无法找到。
命令执行后出错,会默认返回命令的退出错误码。
-d 守护态运行
需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。
例如
:下面的命令会在后台运行容器:
docker run -d busybox /bin/sh -c "while true; do echo hello world; sleep 1; done"
容器启动后会返回一个唯一的id,也可以通过docker ps或docker container ls命令来查看容器信息
logs=查看容器输出信息
docker container logs --help
例子
:查看某容器的输出:
先运行一个不断输出hello world的容器
$docker run --name dtest -d busybox /bin/sh -c "while true; do echo hello world; sleep 1; done"
再用logs命令查看
$ docker logs dtest
hello world
. . .
效果如图:
logs选项
--details
: Show extra details provided to logs 打印详细信息;-f, --follow
: Follow log output 持续保持输出;--since string
: Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) 输出从某个时间开始的日志;-n, --tail string
: Number of lines to show from the end of the logs (default “all”) 输出最近的若干日志;-t, --timestamps
: Show timestamps 显示时间戳信息;--until string
: Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) 输出某个时间之前的日志。
停止容器
pause-暂停容器
docker run --name test --rm -it ubuntu bash
docker pause test
docker ps
$ docker run --name test --rm -it ubuntu bash
$ docker pause test
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
893c811cf845 ubuntu "bash" 2 seconds ago Up 12 seconds (Paused) test
unpause-恢复暂停容器
处于paused状态的容器,可以使用docker [container]unpause CONTAINER [CONTAINER…]命令来恢复到运行状态。
stop终止容器,变为停止状态
该命令会首先向容器发送SIGTERM信号,等待一段超时时间后(默认为10秒),再发送SIGKILL信号来终止容器:
$ docker stop ce5
ce5
当Docker容器中指定的应用终结时,容器也会自动终止。
例如,只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。
处于终止状态的容器,可以通过docker [container] start命令来重新启动,这个看前面的介绍:start-启动容器。
restart重启容器
docker [container] restart命令会将一个运行态的容器先终止,然后再重新启动:
$ docker restart ce554267d7a4
ce554267d7a4
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce554267d7a4 ubuntu:latest "/bin/sh -c 'while t 5 minutes ago Up 14 seconds
determined_pike
prune清除掉所有处于停止状态的容器
执行docker container prune
命令,会自动清除掉所有处于停止状态的容器。
prune - 必应词典
美[prun]英[pruːn]
v.精简;修剪(树木的枝叶);修枝;删去
n.【食】梅干;西梅脯
网络李子;剪除;剪枝
kill强行终止容器
可以通过docker [container] kill直接发送SIGKILL信号来强行终止容器。
进入容器
exec -it命令,推荐
可以在运行中容器内直接执行任意命令
比较重要的参数有:
- -d, –detach:在容器中后台执行命令;
- –detach-keys=”“:指定将容器切回后台的按键;
- -e, –env=[]:指定环境变量列表;
-
-i, –interactive=true false:打开标准输入接受用户输入命令,默认值为false; -
–privileged=true false:是否给执行命令以高权限,默认值为false; -
-t, –tty=true false:分配伪终端,默认值为false; - -u, –user=”“:执行命令的用户名或ID。
例如
$ docker exec -it 243c32535da7 /bin/bash
root@243c32535da7:/#
可以看到会打开一个新的bash终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。注意通过指定-it
参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式。
attach命令-不推荐
这个命令支持三个主要选项:
- –detach-keys[=[]]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q;
-
–no-stdin=true false:是否关闭标准输入,默认是保持打开; -
–sig-proxy=true false:是否代理收到的系统信号给应用进程,默认为true。
docker run -itd ubuntu
docker ps
docker attach nostalgic_hypatia
缺点:
- 同步显示:多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示;
- 命令阻塞:当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
rm删除容器
docker [container] rm
主要支持的选项包括:
- -f, –force=false:是否强行终止并删除一个运行中的容器;
- -l, –link=false:删除容器的连接,但保留容器;
- -v, –volumes=false:删除容器挂载的数据卷。
例如,查看处于终止状态的容器,并删除:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce554267d7a4 ubuntu:latest "/bin/sh -c 'while t 3 minutes agoExited (-1)
13 seconds ago determined_pike
d58050081fe3 ubuntu:latest "/bin/bash" About an hour ago
Exited (0) About an hour ago berserk_brattain
e812617b41f6 ubuntu:latest "echo 'hello! I am h 2 hours ago Exited (0)
3 minutes ago
$ docker rm ce554267d7a4
ce554267d7a4
默认情况下,docker rm命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。
如果要直接删除一个运行中的容器,可以添加-f参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。
导出容器
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用docker [container]export命令,该命令格式为:
docker [container] export [-o|--output[=""]] CONTAINER
其中,可以通过-o选项来指定导出的tar文件名,也可以直接通过重定向来实现。
首先,查看所有的容器,如下所示:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce554267d7a4 ubuntu:latest "/bin/sh -c 'while t" 3 minutes ago
Exited (-1) 13 seconds ago determined_pike
d58050081fe3 ubuntu:latest "/bin/bash" About an hour ago
Exited (0) About an hour ago berserk_brattain
e812617b41f6 ubuntu:latest "echo 'hello! I am h" 2 hours ago
Exited (0) 3 minutes ago silly_leakey
分别导出ce554267d7a4容器和e812617b41f6容器到文件test_for_run.tar文件和test_for_stop.tar文件:
$ docker export -o test_for_run.tar ce5
$ ls
test_for_run.tar
$ docker export e81 >test_for_stop.tar
$ ls
test_for_run.tar test_for_stop.tar
之后,可将导出的tar文件传输到其他机器上,然后再通过导入命令导入到系统中,实现容器的迁移。
导入容器
导出的文件又可以使用docker [container] import命令导入变成镜像,该命令格式为:
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]]
用户可以通过-c, –change=[]选项在导入的同时执行对容器进行修改的Dockerfile指令(可参考后续相关章节)。
下面将导出的test_for_run.tar文件导入到系统中:
$ docker import test_for_run.tar - test/ubuntu:v1.0
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
导入镜像和导入容器的区别
导入镜像文件命令docker load,与docker [container] import命令十分类似。
实际上,既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker [container] import命令来导入一个容器快照到本地镜像库。这两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
与导入 镜像的load命令对比 - 容器快照文件仅保存容器当时的快照状 - 镜像存储文件将保存完整记录,体积更大 - 此外,从容器快照文件导入时可以重新指定标签等元数据信息
查看容器详情
查看容器详情可以使用docker container inspect [OPTIONS]CONTAINER [CONTAINER…]子命令。
例如,查看某容器的具体信息,会以json格式返回包括容器Id、创建时间、路径、状态、镜像、配置等在内的各项信息:
$ docker container inspect test
[
{
"Id": "2d4be6a584ec23e2a0b3eabb8909fd51960c11031df09513c6ba863c919bf2e8",
"Created": "2018-02-21T05:04:17.089267701Z",
"Path": "/portainer",
"Args": [],
"State": {
"Status": "running",
...
}
]
top查看容器内进程
查看容器内进程可以使用docker [container] top [OPTIONS]CONTAINER [CONTAINER…]子命令。
这个子命令类似于Linux系统中的top命令,会打印出容器内的进程信息,包括PID、用户、时间、命令等。例如,查看某容器内的进程信息,命令如下:
$ docker top test
PID USER TIME COMMAND
5730 0 0:00 /portainer
stats查看统计信息
查看统计信息可以使用docker [container] stats [OPTIONS] [CONTAINER...]
子命令,会显示CPU、内存、存储、网络等使用情况的统计信息。
支持选项包括:
- -a, -all:输出所有容器统计信息,默认仅在运行中;
- -format string:格式化输出信息;
- -no-stream:不持续输出,默认会自动更新持续实时结果;
- -no-trunc:不截断输出信息。
例如,查看当前运行中容器的系统资源使用统计:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
2d4be6a584ec test 0.00% 3.164MiB / 1.952GiB 0.16% 2.37kB / 0B 0B / 65.5kB 4
复制文件
container cp命令支持在容器和主机之间复制文件。命令格式为
docker [container] cp [OPTIONS] CONTAINER:SRC_PATHDEST_PATH|
支持的选项包括:
- -a, -archive:打包模式,复制文件会带有原始的uid/gid信息;
- -L, -follow-link:跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容。
例如,将本地的路径data复制到test容器的/tmp路径下:
docker [container] cp data test:/tmp/
查看变更
container diff查看容器内文件系统的变更。命令格式为
docker[container] diff CONTAINER
例如,查看test容器内的数据修改:
$ docker container diff test
C /root
A /root/.bash_history
C /tmp
A /tmp/Dockerfile
A /tmp/etcd-test
查看端口映射
container port命令可以查看容器的端口映射情况。命令格式为docker container port CONTAINER[PRIVATE_PORT[/PROTO]]。例如,查看test容器的端口映射情况:
$ docker container port test
9000/tcp -> 0.0.0.0:9000
更新配置
container update命令可以更新容器的一些运行时配置,主要是一些资源限制份额。命令格式为docker [container] update[OPTIONS] CONTAINER [CONTAINER…]。
支持的选项包括:
- -blkio-weight uint16:更新块IO限制,10~1000,默认值为0,代表着无限制;
- -cpu-period int:限制CPU调度器CFS(CompletelyFair Scheduler)使用时间,单位为微秒,最小1000;
- -cpu-quota int:限制CPU调度器CFS配额,单位为微秒,最小1000;
- -cpu-rt-period int:限制CPU调度器的实时周期,单位为微秒;
- -cpu-rt-runtime int:限制CPU调度器的实时运行时,单位为微秒;
- -c, -cpu-shares int:限制CPU使用份额;
- -cpus decimal:限制CPU个数;
- -cpuset-cpus string:允许使用的CPU核,如0-3,0,1;
- -cpuset-mems string:允许使用的内存块,如0-3,0,1;
- -kernel-memory bytes:限制使用的内核内存;
- -m, -memory bytes:限制使用的内存;
- -memory-reservation bytes:内存软限制;
- -memory-swap bytes:内存加上缓存区的限制,-1表示为对缓冲区无限制;
- -restart string:容器退出后的重启策略。
例如,限制总配额为1秒,容器test所占用时间为10%,代码如下所示:
$ docker update --cpu-quota 1000000 test
test
$ docker update --cpu-period 100000 test
test