Docker容器命令
- 1: Docker容器命令概述
- 2: Docker的create命令
- 3: Docker的启停命令
- 4: Docker的run命令
- 5: Docker的ps命令
- 6: Docker的exec命令
- 7: Docker的top命令
- 8: Docker的attach命令
- 9: Docker的logs命令
- 10: Docker的port命令
- 11: Docker的rm命令
1 - 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命令
介绍
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的启停命令
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命令
介绍
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命令
介绍
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命令
介绍
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命令
介绍
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命令
介绍
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命令
介绍
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命令
介绍
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命令
介绍
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