欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Docker】docker容器管理总结

程序员文章站 2022-04-18 23:15:40
...

简介:总结docker 容器部分的相关命令

确认Docker已经安装好

前提:已经在Ubuntu宿主机上安装了Docker。

调用docker的info命令,该命令返回所有容器和镜像的数量、Docker使用的执行驱动和存储驱动,以及Docker的基本配置
【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】docker容器管理总结

查看容器运行日志

  • 可以用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命令先停止容器,再删除。

相关标签: Docker docker