查看容器(ps)
在运行容器之前,我们需要知道如何查看运行中的容器:
# Management Commands(推荐)
docker container ps
# 或者
docker container ls
# Commands
docker ps
使用此方法只能看到运行中的容器,对于以及停止的容器,还需要使用 -a
参数,比如:
docker container ps -a
容器运行(run,无参数)
前面有说过,容器是镜像的实例。学习 docker 最终目的就是就是运行它。
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
运行第一个测试容器:
# Management Commands(推荐)
docker container run hello-world
# Commands
docker run hello-world
如图所示:
hello-world 容器是一个测试容器,在输出一些文字之后就会退出,通过这个过程,我们可以发现:
- 对于运行容器,如果镜像不存在,则会去 registry 中自动下载。
- 使用 ps 查看容器的时候,如果不使用
-a
参数是看不到状态属于Exited
的容器的。 - 使用 ps 可以简单的看到容器的 ID,使用的镜像,执行的命令,创建时间,运行状态,端口,容器的名字等信息。
容器运行(run -d,守护态)
在运行容器时,需要确定这个容器是运行在前台模式还是后台模式。
-d,--detach
,守护态运行。能够将容器运行在后台模式。这样所有的 IO 都只能通过网络资源或存储卷来进行交互。容器不再监听执行 docker run 这个命令行的窗口。有点类似于 Linux 启动程序时候的 nohup + &
组合。
docker container run -d hello-world
如图所示:
可以发现,hello-world 容器加了 -d 参数后不在输出它的信息,只是返回了一长串字符,其实就是完整的 Container ID,用法类似 Image ID。
同时由于 hello-world 容器本身的特性,程序在后台执行完成之后就直接退出了,容器也跟着退出了。
再次运行以 nginx 容器为例:
docker container run nginx
如图所示:
可以发现以下信息:
- 由于没有跟 TAG,默认会以 latest 版本执行。在 docker 中,如果是运行 latest 版本,docker 都会去仓库试着拉取,而不是直接使用本地的镜像,因为本地的 latest 不一定是真正的 latest。
- 容器在运行之后会以前台模式运行,所有它 hung 在了命令行。
- 此时如果我们新开一个窗口来查看,可以发现容器处于
Up
状态,如下图所示:
- 如果我们去 docker run 的窗口使用
Ctrl + c
中断,然后再次查看容器运行状态,可以发现容器已经退出,这就是前台运行的问题,如图所示:
如果使用后台运行模式运行该容器:
docker container run -d nginx
运行效果如图所示:
容器被放在了后台运行,不会 hung 在命令行。当然所有的输出信息也不能直接看到了。
容器运行(run -it,交互式运行)
在使用 -d 参数之后,容器就不会 hung 在命令行窗口,而是以后台方式运行。但是这同时也有一个问题,某些时候我们是需要进入容器查看相关启动等信息的。此时就需要另外的参数配合使用:
-i,--interactive
:打开一个交互式界面。-t,--tty
:打开一个 TTY 终端。
将这个两个参数结合就是打开一个交互式的 TTY 终端。
docker container run -it nginx /bin/bash
如图所示:
通过该方法在创建容器的时候指定运行命令,然后以 bash 进入容器内部的命令行。可以发现:
- 容器内部就是 linux 的目录结构,但是是一个很简化的 linux,很多基础命令都没有。
- 当退出容器命令行,容器也跟着退出。原因是我们重写容器内部的命令为 bash 之后,nginx 就没有启动了,当退出 bash 之后,容器内部就没有进程了,所有容器就退出了。
- 这种方式用的比较少,一般都是容器运行之后,使用专门的命令进入容器。
容器运行(run --name,容器命名)
在创建容器的时候,如果不给容器指定一个名字,容器会生成一个随机的名字,一般都是以 xxx_xxx
的格式。
docker container run -d --name demo01 nginx
如图所示:
针对容器的名字,我们可以根据自己的需求指定相关的命名规范,以此来实现统一管理的目的。
容器运行(run --rm,退出删除)
某些容器可能是一次性容器,在运行之后,容器退出。同时不保留在 ps 中,此时就需要使用到 --rm
参数。
docker container run --rm --name rm_test hello-world
如图所示:
容器运行(run --restart,重启规则)
为了保障在以外的停止之后能够自动恢复,就需要对它配置相关 --restart
规则:
on-failure
:容器停止时,容器出现报错,则容器会被重启。但是如果 docker 服务被重启了该配置就不会生效。unless-stopped
:容器停止,如果没有报错,则容器会被重启。即使重启了 docker 服务,该配置也生效。always
:不管如何,容器只要停止就重启。
docker container run -d --restart always --name busybox_test busybox /bin/sh -c "sleep 60"
busybox
镜像是一个精简的 Linux,非常小,适合用来做测试。结果如下:
通过过一段时间查看,发现在容器内部 sleep 60 之后退出,然后被重启拉起一个新的。
以上就是容器运行的基本参数,至于容器的存储卷,网络等内容,后面会单独分节介绍。
查看详情(inspect)
通过该命令可以查看容器的详细信息:
docker container inspect busybox_test
详细信息中需要关注的点包括:
Image
:使用的镜像。Volumes
:数据存储卷。IPAddress
:容器的 IP 地址。Ports
:端口信息。
状态管理
通过该命令可以查看容器的运行时状态,如 Up,Exited 等:
# 创建容器但不运行
docker container create --name demo02 nginx
# 启动容器
docker container start demo02
# 暂停容器
docker container pause demo02
# 继续运行容器
docker container unpause demo02
# 停止容器
docker container stop demo02
# 重启容器
docker container restart demo02
结果如图所示:
进入容器(attach)
通过该命令可以连接到一个运行中的容器:
docker container attach --sig-proxy=false demo02
使用 --sig-proxy=false
的目的是为了避免 Ctrl + C
或者 Ctrl + D
使容器退出。
该命令会对容器进行监听,命令行处于交互式界面,此时从新窗口请求该容器的 nginx:
可以看到日志直接输出到屏幕,Ctrl + C
就可以退出该界面且保持容器继续运行。
进入容器(exec)
上面的方法是将输出直接输出到屏幕上,无法操作,如果想将容器当虚拟机一样使用,则需要 exec:
docker exec -it demo02 /bin/bash
注意,exec 后面需要跟执行命令,由于是命令行,则需要使用 /bin/bash
或者 /bin/sh
。
查看日志(logs)
通过该命令可以实时查看容器运行的日志:
docker container logs -f demo02
如图所示:
使用 -f
的参数可以让它像 linux 中的 tail
命令一样。否则就是一次性查看,跟 cat
一样。
文件拷贝(cp)
通过该命令可以实现容器和宿主机之间文件传输:
# 拷贝文件到容器
docker container cp anaconda-ks.cfg demo02:/tmp/
# 拷贝文件到容器并改名
docker container cp anaconda-ks.cfg demo02:/tmp/1.txt
# 拷贝目录到容器
docker container cp demo demo02:/tmp/
# 拷贝文件到本地
docker container cp demo02:/tmp/1.txt .
如图所示:
查看端口(port)
通过该命令可以查看容器和宿主机的端口映射关系:
docker container port demo02
查看状态(stats)
通过该命令可以查看容器内部系统资源使用情况:
docker container stats demo02
如图所示:
查看进程(top)
通过该命令可以查看到容器内部运行的进程:
docker container top demo02
如图所示:
提交镜像(commit)
该命令可以将现有的容器提交成镜像:
docker container commit -a "Dylan <1214966109@qq.com>" -m "Copy file" -p demo02 dylan/nginx-copy-file:v1.0
参数说明:
-a
:作者信息。-m
:提交信息,有点像 git commit -m。-p
:生成镜像时容器暂停。
如图所示:
停止容器(kill)
该命令相较于 stop 更暴力杀死一个或多个容器:
docker container kill demo02
如图所示:
重命名容器(rename)
该命令可以对容器重命名:
docker container rename demo02 demo03
如图所示:
导出容器(export)
该命令可以将容器当前的状态导出:
docker container export -o /tmp/demo03.tar demo03
如图所示:
查看系统变化(diff)
该命令可以查看容器目前的文件和文件系统本身的差异:
docker container diff demo03
如图所示:
删除容器(rm)
该命令可以删除指定的一个或多个容器:
# 删除停止的容器
docker container rm a7851616b54c
# 删除运行中的容器
docker container rm -f 338a3419e42e
如果容器在运行,需要使用 -f 强制删除:
批量删除(rm)
对于容器或者镜像,都可以使用条件筛选的方式对它进行批量删除:
# 删除所有容器
docker container rm $(docker container ls -aq)
# 删除所有 redis 镜像
docker image rm $(docker image ls -aq redis)
# 删除所有在 mongo:3.2 之前的镜像
docker image rm $(docker image ls -aq -f before=mongo:3.2)
使用 -q
参数能够增加筛选条件。
删除容器(prune)
该命令可以删除没有使用的容器:
docker container prune
可以通过 -f
参数直接删除,不用确认。
到此,容器的大部分操作都已经体验完毕。接下来将讲解如何制作镜像!