1 - Docker容器命令概述

Docker容器命令概述

容器类的Docker命令:

命令 命令描述
create 根据镜像生成一个新的容器
start 启动一个新的容器
run 创建、启动容器并执行相应的命令
rename 重命名容器名
ps 查看运行中的容器
top 显示容器的运行进程
stop 关闭容器
kill 强制关闭容器
restart 重启容器
pause 暂停容器
unpause 恢复暂停的容器
exec 在已运行的容器中执行命令
attach 进入运行中的容器, 显示该容器的控制台界面。
logs 打印容器的控制台输出内容
port 容器端口映射列表
rm 删除已停止的容器
diff 展示容器相对于构建它的镜像内容所做的改变
export 导出容器到本地快照文件
cp 在容器和宿主机之间复制文件
wait 阻塞当前命令直到对应的容器被关闭, 容器关闭后打印结束代码

2 - Docker的create命令

Docker的create命令

介绍

https://docs.docker.com/engine/reference/commandline/create/

根据镜像生成一个新的容器

docker create命令在指定的映像上创建可写容器层,并准备运行指定的命令。 然后将容器ID打印到STDOUT。 这类似于docker run -d,但容器从未启动过。 然后,您可以使用 docker start <container_id> 命令在任何位置启动容器。

当您想要提前设置容器配置,以便在需要时启动容器已经准备好,这非常有用。 新容器的初始状态已经创建。

使用

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

常用的命令行参数:

参数 描述
–attach , -a Attach to STDIN, STDOUT or STDERR
–env , -e Set environment variables
–env-file Read in a file of environment variables
–expose Expose a port or a range of ports
–interactive , -i Keep STDIN open even if not attached
–label , -l Set meta data on a container
–label-file Read in a line delimited file of labels
–mount Attach a filesystem mount to the container
–name Assign a name to the container
–publish , -p Publish a container’s port(s) to the host
–read-only Mount the container’s root filesystem as read only
–rm Automatically remove the container when it exits
–tty , -t Allocate a pseudo-TTY
–user , -u Username or UID (format: <name|uid>[:<group|gid>])
–volume , -v Bind mount a volume
–volumes-from Mount volumes from the specified container(s)
–workdir , -w Working directory inside the container

3 - Docker的启停命令

Docker的启停命令,包括start / stop / kill / restart / pause / unparse

start命令

https://docs.docker.com/engine/reference/commandline/start/

启动一个或者多个停止的容器

docker start [OPTIONS] CONTAINER [CONTAINER...]

命令行参数:

参数 描述
–attach , -a Attach to STDIN, STDOUT or STDERR
–interactive , -i Keep STDIN open even if not attached
date: 2019-01-27T07:30:00+08:00
title: start命令
weight: 342
menu:
  main:
    parent: "command-container"
description : "Docker的start命令"

stop命令

https://docs.docker.com/engine/reference/commandline/stop

停止一个或者多个运行的容器

容器内的主进程将先接收到 SIGTERM 信号,并在优雅关闭限期后,接收到 SIGKILL 信号。

docker stop [OPTIONS] CONTAINER [CONTAINER...]

命令行参数:

参数 描述
–time , -t Seconds to wait for stop before killing it

kill命令

https://docs.docker.com/engine/reference/commandline/kill

杀死一个或者多个运行的容器

容器内的主进程将先接收到 SIGTERM 信号,并在优雅关闭限期后,接收到 SIGKILL 信号。

docker kill [OPTIONS] CONTAINER [CONTAINER...]

命令行参数:

参数 描述
–signal , -s Signal to send to the container

restart命令

https://docs.docker.com/engine/reference/commandline/restart

重新启动一个或者多个运行的容器

docker restart [OPTIONS] CONTAINER [CONTAINER...]

命令行参数:

参数 描述
–time , -t Seconds to wait for stop before killing the container

pause命令

https://docs.docker.com/engine/reference/commandline/pause

暂停一个或多个容器中的所有进程

docker pause命令挂起(suspend)指定容器中的所有进程。 在Linux上,它使用cgroups freezer。 传统上,当暂停进程时,使用SIGSTOP信号,该进程被暂停可观察到。 使用cgroups freezer,该过程无感知,无法捕获它被暂停和随后的恢复。 在Windows上,只有Hyper-V容器可以被暂停。

docker pause CONTAINER [CONTAINER...]

unpause命令

恢复一个或多个容器中的所有暂停进程

docker unpause CONTAINER [CONTAINER...]

4 - Docker的run命令

Docker的run命令

介绍

https://docs.docker.com/engine/reference/commandline/run/

创建、启动容器并执行相应的命令。

在新的容器中运行命令。

docker run命令首先在指定的镜像上创建一个可写容器层,然后使用指定的命令启动它。 也就是说,docker run相当于API /containers/create/containers/(id)/start。 可以使用 docker start 重新启动已停止的容器,并使其先前的所有更改保持不变。 请参阅 docker ps -a 以查看所有容器的列表。

docker run 命令可与 docker commit 结合使用,以更改容器运行的命令。

更多资料:

使用

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

和 docker create 命令相同。

常用的命令行参数:

参数 描述
–attach , -a Attach to STDIN, STDOUT or STDERR
–env , -e Set environment variables
–env-file Read in a file of environment variables
–expose Expose a port or a range of ports
--hostname , -h Container host name
–interactive , -i Keep STDIN open even if not attached
–label , -l Set meta data on a container
–label-file Read in a line delimited file of labels
–mount Attach a filesystem mount to the container
–name Assign a name to the container
–publish , -p Publish a container’s port(s) to the host
–read-only Mount the container’s root filesystem as read only
–rm Automatically remove the container when it exits
–tty , -t Allocate a pseudo-TTY
–user , -u Username or UID (format: <name|uid>[:<group|gid>])
–volume , -v Bind mount a volume
–volumes-from Mount volumes from the specified container(s)
–workdir , -w Working directory inside the container

分配名字和伪TTY (–name, -it)

$ docker run --name test -it debian

连接到STDIN/STDOUT/STDERR (-a)

-a标志告诉 docker run 绑定到容器的STDIN,STDOUT或STDERR。 这使得可以根据需要操纵输出和输入。

$ docker run -a stdout ubuntu echo test
test

完整容器能力 (–privileged)

特权容器?

默认情况下,大多数潜在危险的内核功能都会被删除; 包括 cap_sys_admin(挂载文件系统所需)。 但是,–privileged标志将允许它运行。

$ docker run -t -i --privileged ubuntu bash

--privileged 标志为容器提供了所有功能,它还解除了设备cgroup控制器强制执行的所有限制。 换句话说,容器几乎可以完成主机可以执行的所有操作。 此标志存在以允许特殊用例,例如在Docker中运行Docker。

设置工作目录 (-w)

$ docker  run -w /path/to/dir/ -i -t  ubuntu pwd
/path/to/dir

-w 允许命令在给定的目录中执行,这里是 /path/to/dir/。 如果路径不存在,则在容器内创建。

挂载卷 (-v, –read-only)

docker  run  -v `pwd`:`pwd` -w `pwd` -i -t  ubuntu pwd

-v标志将当前工作目录挂载到容器中。 -w 让命令在当前工作目录中执行,方法是将工作目录更改为pwd返回的值。所以这个组合使用容器执行命令,但在当前工作目录中。

发布或者暴露端口 (-p, –expose)

docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

这将容器的端口8080绑定到主机的127.0.0.1上的TCP端口80。还可以指定udp和sctp端口。

docker run --expose 80 ubuntu bash

这会暴露容器的端口80,而不会将端口发布到主机系统接口。

设置环境变量(-e, –env, –env-file)

可以通过-e, --env, --env-file 设置容器的环境变量:

docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash

本地已经export的环境变量,可以不用=号和值:

export VAR1=value1
export VAR2=value2

$ docker run --env VAR1 --env VAR2 ubuntu env | grep VAR
VAR1=value1
VAR2=value2

在容器上设置元数据(-l, –label, –label-file)

可以通过-l, --label, --label-file 设置容器的label:

$ docker run -l my-label --label com.example.foo=bar ubuntu bash

将容器连接到网络(–network)

docker run -itd --network=my-net busybox
docker run -itd --network=my-net --ip=10.10.9.75 busybox

也可以使用 docker connect 命令

从容器挂载卷(–volumes-from)

docker run --volumes-from 777f7dc92da7 --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd

5 - Docker的ps命令

Docker的ps命令

介绍

https://docs.docker.com/engine/reference/commandline/ps/

列出容器

使用

docker ps [OPTIONS]

常用的命令行参数:

参数 描述
–all , -a Show all containers (default shows just running)
--filter , -f Filter output based on conditions provided
--last , -n Show n last created containers (includes all states)
–latest , -l Show the latest created container (includes all states)
–size , -s Display total file sizes

过滤

过滤标志(-f或--filter)格式是 key=value 对。 如果有多个过滤器,则传递多个标志(例如 --filter "foo=bar" --filter "bif=baz"

支持多种过滤方式,如 id,name,label,status等,具体看官方文档

docker ps --filter "label=color"
docker ps --filter "label=color=blue"
docker ps --filter "name=nostalgic_stallman"
docker ps --filter "name=nostalgic" # name可以使用substring
docker ps -a --filter 'exited=0'
docker ps -a --filter 'exited=137'
docker ps --filter status=running
docker ps --filter status=paused
docker ps --filter ancestor=ubuntu
docker ps --filter network=net1
docker ps --filter publish=80
docker ps --filter expose=8000-8080/tcp
docker ps --filter publish=80/udp

格式化输出

docker ps --format "{{.ID}}: {{.Command}}"
docker ps --format "table {{.ID}}\t{{.Labels}}"

看官方文档

6 - Docker的exec命令

Docker的exec命令

介绍

https://docs.docker.com/engine/reference/commandline/exec/

在运行的容器内运行命令

docker exec 命令在正在运行的容器中运行新命令。

使用docker exec启动的命令仅在容器的主进程(PID 1)运行时运行,如果重新启动容器则不会重新启动。

COMMAND将在容器的默认目录中运行。 如果底层镜像在其Dockerfile中使用WORKDIR指令指定有自定义目录,则将使用此目录。

COMMAND应该是可执行文件,链接或带引号的命令不起作用。 例:

docker exec -ti my_container "echo a && echo b" 不会工作, 但是 docker exec -ti my_container sh -c "echo a && echo b" 可以.

使用

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

常用的命令行参数:

参数 描述
–detach , -d Detached mode: run command in the background
–env , -e Set environment variables
–interactive , -i Keep STDIN open even if not attached
–privileged Give extended privileges to the command
–tty , -t Allocate a pseudo-TTY
–user , -u Username or UID (format: <name|uid>[:<group|gid>])
–workdir , -w Working directory inside the container

启动命令

先启动一个容器:

$ docker run -it --rm --name exectest  ubuntu bash
root@f13ee9356da6:/# 

用docker ps命令确认一下:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f13ee9356da6        ubuntu              "bash"              24 seconds ago      Up 22 seconds                           exectest

运行简单命令:

$ docker exec exectest pwd
/
$ docker exec exectest ls /
bin
boot
dev
etc
......

如果想后台执行:

$ docker exec -d exectest pwd

也可以用进到容器里面,打开bash,再慢慢执行命令:

$ docker exec -it exectest bash
root@f13ee9356da6:/# pwd
/

这会在容器 exectest 里面创建一个新的bash session。

可以在进入容器时定义一些环境变量,通过 -e 参数传递进去:

$ docker exec -it -e var1=v1 exectest bash
root@f13ee9356da6:/# echo $var1
v1

注意这个环境变量只有在这个新的bash session里面才能看到,在原来打开这个容器的bash里面是无法看到的。

默认新的 bash session 的工作目录是在当前容器被创建时设置的工作目录,可以通过 -w 参数修改:

$ docker exec -it -w /root exectest bash
root@f13ee9356da6:~# pwd
/root

7 - Docker的top命令

Docker的top命令

介绍

https://docs.docker.com/engine/reference/commandline/top/

显示容器的运行进程

使用

docker top CONTAINER [ps OPTIONS]

命令行参数可以参考ps命名。

# 在一个终端中启动容器
$ docker run -it --rm --name toptest  ubuntu bash
root@7493e17d1238:/# 
# 在另一个终端中查看
$ docker top toptest
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                21872               21848               0                   11:46               pts/0               00:00:00            bash

8 - Docker的attach命令

Docker的attach命令

介绍

https://docs.docker.com/engine/reference/commandline/attach/

将本地标准 input,output 和 error 流附加到正在运行的容器。

使用 docker attach 将终端的标准 input,output 和 error (或三者的任意组合)通过容器的ID或名称附加到正在运行的容器中。这允许您查看其正在进行的输出或以交互方式控制它,就像命令直接在您的终端中运行一样。

注意:attach命令将显示 ENTRYPOINT/CMD 进程的输出。这可能看起来好像挂起命令被挂起,而实际上该进程实际上可能根本就没有与终端进行交互。

您可以从Docker主机上的不同会话同时多次附加到同一个容器进程。

要停止容器,请使用CTRL-c。 此键序列将SIGKILL发送到容器。 如果–sig-proxy为true(默认值),则CTRL-c将SIGINT发送到容器。 您可以使用CTRL-p CTRL-q键序列从容器中分离并使其保持运行。

注意:在容器内作为PID 1运行的进程由Linux专门处理:它忽略具有默认操作的任何信号。 因此,除非进行编码,否则进程不会在SIGINT或SIGTERM上终止。

在附加到启用tty的容器(即:使用-t启动)时,禁止重定向docker attach命令的标准输入。

当客户端使用docker attach连接到容器的stdio时,Docker使用~1MB内存缓冲区来最大化应用程序的吞吐量。 如果填充此缓冲区,API连接的速度将开始影响过程输出写入速度。 这类似于SSH等其他应用程序。 因此,建议不要运行性能关键型应用程序,这些应用程序通过慢速客户端连接在前台生成大量输出。 相反,用户应使用docker logs命令来访问日志。

使用

docker attach [OPTIONS] CONTAINER

常用的命令行参数:

参数 描述
–no-stdin Do not attach STDIN
–sig-proxy Proxy all received signals to the process

启动命令

先启动一个容器:

$ docker run -it --rm --name attachtest  ubuntu bash
root@f13ee9356da6:/# 

然后再在另外一个终端中运行:

docker attach attachtest

之后在两个终端中输入命令,都可以看到同样的输出。

备注:当第二个终端用 exit 命令退出时,第一个终端(也就是启动容器的终端)也会同样因为stdin里面输入了exit 命令而退出,容器关闭。

如果不想影响原有容器的工作,可以用 –no-stdin 参数:

docker attach  --no-stdin attachtest

这样不附加 stdin ,也就不会有输入影响容器的运行,这个终端需要推出时,ctrl + c 即可。

9 - Docker的logs命令

Docker的logs命令

介绍

https://docs.docker.com/engine/reference/commandline/logs/

docker logs命令批量检索执行时存在的日志。

注意:此命令仅适用于使用 json-file 或 journald 日志记录驱动程序启动的容器。

docker logs --follow 命令将持续从容器的 STDOUT 和 STDERR 流式传输新输出。

将负数或非整数传递给 --tail 无效,并且在该情况下将值设置为all。

docker logs --timestamps 命令将为每个日志条目添加 RFC3339 Nano时间戳,例如 2014-09-16T06:17:46.000000000Z 。为了确保时间戳对齐,时间戳的纳秒部分将在必要时填充为零。

docker logs --details 命令将添加在创建容器时提供给 --log-opt 的额外属性,例如环境变量和标签。

--since 选项仅显示在给定日期之后生成的容器日志。您可以将日期指定为RFC 3339日期,UNIX时间戳或Go duration string(例如1m30s,3h)。除RFC3339日期格式外,您还可以使用RFC3339Nano, 2006-01-02T15:04:05, 2006-01-02T15:04:05.999999999, 2006-01-02Z07:00, and 2006-01-02。如果在时间戳结束时未提供Z或 +-00:00 时区偏移,则将使用客户端上的本地时区。提供Unix时间戳时输入秒[.nanoseconds],其中秒是自1970年1月1日(午夜UTC / GMT)以来经过的秒数,不计算闰秒(也称为Unix纪元或Unix时间)和可选项。纳秒字段是一秒的一小部分,不超过九位数。您可以将–since选项与–follow或–tail选项中的任何一个或两者结合使用。

使用

docker logs [OPTIONS] CONTAINER

常用的命令行参数:

参数 描述
--details Show extra details provided to logs
--follow , -f Follow log output
--since Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
--tail Number of lines to show from the end of the logs
–timestamps , -t Show timestamps
--until Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)

示例

先启动一个容器,这里会每秒钟打印一条日志:

docker run -it --rm --name logstest  ubuntu sh -c "while true; do $(echo date); sleep 1; done"

然后再在另外一个终端中运行:

docker logs -f logstest

就可以在第二个终端中看到输出。

10 - Docker的port命令

Docker的port命令

介绍

https://docs.docker.com/engine/reference/commandline/port/

列出容器的端口映射或特定映射

使用

docker port CONTAINER [PRIVATE_PORT[/PROTO]]

示例

$ docker port test
$ docker port test 7890/tcp
$ docker port test 7890/udp
$ docker port test 7890

11 - Docker的rm命令

Docker的rm命令

介绍

https://docs.docker.com/engine/reference/commandline/rm/

删除一个或者多个容器

使用

docker rm [OPTIONS] CONTAINER [CONTAINER...]

命令行参数:

参数 描述
--force , -f Force the removal of a running container (uses SIGKILL)
--link , -l Remove the specified link
--volumes , -v Remove the volumes associated with the container

示例

$ docker rm test
$ docker rm --force redis
$ docker rm $(docker ps -a -q) # 删除所有停止运行的容器
$ docker rm -v redis