【Docker】docker容器管理总结
简介:总结docker 容器部分的相关命令
确认Docker已经安装好
前提:已经在Ubuntu宿主机上安装了Docker。
调用docker的info命令,该命令返回所有容器和镜像的数量、Docker使用的执行驱动和存储驱动,以及Docker的基本配置
运行第一个容器
使用docker run命令创建容器
aaa@qq.com:~$ docker run -i -t ubuntu /bin/bash
aaa@qq.com:/#
命令解释:
docker run后面指定了-i和-t参数。-i是保证容器中STDID是开启的,-t是告诉Docker为要创建的容器分配一个伪tty终端,这样新创建的容器才能提供一个交互式的shell。然后告诉Docker基于什么镜像来创建容器,示例中使用的是ubuntu镜像。
注意:上述命令首先会检查本地是否存在ubuntu镜像,如果本地还没有该镜像的话,那么Docker会去Docker Hub中下载该镜像并保持到本地。
然后,Docker在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口。最后,我们告诉Docker在新容器中要运行什么命令,在本例中是运行/bin/bash命令启动了一个 Bash shell。容器创建完毕之后,就可以看到容器内的shell了:
aaa@qq.com:/#
使用第一个容器
现在我们已经以root用户登录到了新容器中,容器的ID为63def11e36a3。这是一个完整的Ubuntu系统,我们可以把这个容器当做Ubuntu操作系统使用,比如可以输入如下命令:
- 查看主机名
aaa@qq.com:/# hostname
63def11e36a3
- 查看/etc/hosts文件
aaa@qq.com:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 63def11e36a3
- 查看容器中运行的进程
aaa@qq.com:/# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4108 3424 pts/0 Ss 10:36 0:00 /bin/bash
root 10 0.0 0.0 5880 2784 pts/0 R+ 10:55 0:00
想要退出容器时,输入exit,就可以返回到Ubuntu宿主机的命令行了
aaa@qq.com:/# exit
exit
aaa@qq.com:~$
一旦退出容器,/bin/bash命令也就结束了,容器也是停止运行状态,但容器是仍然存在的,可以用docker ps -a 命令查看当前系统中容器的列表:
aaa@qq.com:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
63def11e36a3 ubuntu "/bin/bash" 25 minutes ago Exited (0) 2 minutes ago tender_poincare
f9e46e2999e9 postman/newman:4.5-alpine "newman run AuthPoin…" 5 weeks ago Exited (0) 5 weeks ago sweet_ellis
091181a11c68 postman/newman:4.5-alpine "newman run AuthPoin…" 5 weeks ago Exited (0) 5 weeks ago relaxed_moore
注意:docker ps -a是列表所有容器,而docker ps只列出正在运行的容器
从该命令的输出结果可以看到:ID、用于创建该容器的镜像、容器最后执行的命令、创建时间以及容器的退出状态(上例中通过exit正常退出,状态就是0)。
另外,有三种方式可以指代唯一容器:短UUID、长UUID、名称。
容器命名
Docker会为我们创建的每一个容器自动生成一个随机的名称。例如上例中创建的容器就被命名为tender_poincare。如果想为容器指定一个名称,可以用–name标志来实现,如下:
aaa@qq.com:~$ docker run --name lingshu_ubuntu -i -t ubuntu /bin/bash
aaa@qq.com:/# exit
exit
上述命令将会创建一个名为lingshu_ubuntu的容器,在很多Docker命令中,都可以用容器的名称来替代容器ID。另外,容器的命名必须是唯一的,如果试图创建两个名称相同的容器,则命令将会失败。
重新启动已经停止的容器
上文的lingshu_ubuntu容器已经停止了,可以用如下命名来重新启动一个已经停止的容器:
aaa@qq.com:~$ docker start lingshu_ubuntu
lingshu_ubuntu
也可以通过容器ID来启动:
aaa@qq.com:~$ docker start 79889a53fbb2
79889a53fbb2
这时,可以通过docker ps查看到该容器已经在运行了:
aaa@qq.com:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79889a53fbb2 ubuntu "/bin/bash" 5 minutes ago Up About a minute lingshu_ubuntu
cdc5300f65e8 jenkins/jenkins:lts "/sbin/tini -- /usr/…" 2 months ago Up 3 weeks 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp jenkins
附着到容器上
Docker容器重新启动的时候,会沿用docker run命令时指定的参数来运行,因此我们的容器重新启动后会运行一个交互式会话shell。可以用docker attach命令重新附着到该容器的会话上,如下:
aaa@qq.com:~$ docker attach lingshu_ubuntu
aaa@qq.com:/#
也可以使用容器ID,重新附着到容器的会话上:
aaa@qq.com:~$ docker attach 79889a53fbb2
aaa@qq.com:/#
注意:有时需要按下回车键才能进入该会话。
创建守护式容器
除了交互式运行的容器(interactive container),我们也可以创建长期运行的容器。守护式容器(daemonized container)没有交互式会话,非常适合运行应用程序和服务。创建守护式容器如下:
aaa@qq.com:~$ docker run --name daemon_ubuntu -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
8b3531ac66c56e219acd092219845d6b9302d404981ee6419e9a43cd48599edf
上面的docker run命令使用了-d参数,因此Docker会将容器放到后台运行。我们还在容器要运行的命令里使用了一个while循环,该循环会一直打印hello world,直到容器或其进程停止运行。
通过docker ps命令可以看到该容器正在运行:
查看容器运行日志
- 可以用docker logs命令来获取容器的日志,如下:
aaa@qq.com:~$ docker logs daemon_ubuntu
hello world
hello world
hello world
hello world
hello world
hello world
hello world
...
-
可以用docker logs --tail 5 daemon_ubuntu来获取日志的最后10行:
aaa@qq.com:~$ docker logs --tail 5 daemon_ubuntu
hello world
hello world
hello world
hello world
hello world -
可以用docker logs -f daemon_ubuntu来实时打印日志,通过Ctrl+C退出日志跟踪:
aaa@qq.com:~$ docker logs -f daemon_ubuntu
hello world
hello world
hello world
hello world
hello world
...
- 为了让调试更简单,还可以使用-t参数来为每条日志加上时间戳:
- aaa@qq.com:~$ docker logs -ft daemon_ubuntu
2020-07-24T11:35:13.404238072Z hello world
2020-07-24T11:35:14.423384834Z hello world
2020-07-24T11:35:15.417673016Z hello world
2020-07-24T11:35:16.418416028Z hello world
2020-07-24T11:35:17.419170884Z hello world
…
查看容器内的进程
可以用docker top命令来查看容器内部运行的进程:
aaa@qq.com:~$ docker top daemon_ubuntu
UID PID PPID C STIME TTY TIME CMD
root 478333 478316 0 11:35 ? 00:00:00 /bin/sh -c while true; do echo hello world; sleep 1; done
root 479323 478333 0 11:47 ? 00:00:00 sleep 1
在容器内部运行进程
在Docker1.3之后,可以通过docker exec命令在容器内部额外启动新进程。可以在容器内运行的进程有两种类型:后台任务和交互式任务。
- 先看一个后台任务:
aaa@qq.com:~$ docker exec -d daemon_ubuntu touch /etc/new_config_file
这里-d参数表明需要运行一个后台进程,-d参数之后,指定的是要在内部执行这个命令的容器的名字以及要执行的命令。上面的例子会在daemon_ubuntu容器内创建一个空文件,文件名为/etc/new_config_file。通过docker exec后台命令,我们可以在正在运行的容器中进行维护、监控及管理任务。
- 也可以在daemon_ubuntu中启动一个诸如打开shell 的交互式任务,如下:
aaa@qq.com:~$ docker exec -t -i daemon_ubuntu /bin/bash
aaa@qq.com:/#
停止守护式容器
aaa@qq.com:~$ docker stop daemon_ubuntu
daemon_ubuntu
注意:docker stop命令会向容器进程发送SIGTERM信号。如果想快速停止某个容器,也可以使用docker kill命令来向容器进程发送SIGKILL信号。
自动重启容器
如果由于某种错误而导致容器停止运行,可以通过–restart参数,让Docker自动重新启动该容器。如下:
aaa@qq.com:~$ docker run --restart=always --name daemon_ubuntu -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
深入容器
可以使用docker inspect来获取更多的容器信息:
aaa@qq.com:~$ docker inspect daemon_ubuntu
[
{
"Id": "8b3531ac66c56e219acd092219845d6b9302d404981ee6419e9a43cd48599edf",
"Created": "2020-07-24T11:35:12.529330344Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true; do echo hello world; sleep 1; done"
],
"State": {
"Status": "exited",
"Running": false,
...
docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置等。
也可以使用-f或者–format参数来选定查看结果,如下:
查看容器运行状态:
aaa@qq.com:~$ docker inspect --format='{{ .State.Running }}' daemon_ubuntu
false
查看容器IP:
aaa@qq.com:~$ docker inspect --format='{{ .NetworkSettings.IPAddress }}' daemon_ubuntu
172.17.0.3
删除容器
如果容器已经不再使用,可以使用docker rm命令来删除它们,如下:
aaa@qq.com:~$ docker rm daemon_ubuntu
daemon_ubuntu
注意:运行中的Docker容器是无法删除的,必须通过docker stop或docker kill命令先停止容器,再删除。
下一篇: dockerfile