4.Docker容器

1 容器简介

容器:容器是一种轻量级、可移植、并将应用程序及其依赖进行打包的技术。

  • Docker 将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例
  • 容器具备一定的生命周期
  • 可以借助 docker ps 命令查看运行的容器

2 容器与虚拟机

2.1 Docker 容器与虚拟机相同点

  • 容器和虚拟机一样,都会对物理硬件资源进行共享使用。
  • 容器和虚拟机的生命周期比较类似(创建、运行、暂停、关闭等等)
  • 容器和虚拟机中都可以安装各种应用,如 redis、mysql、Nginx 等。在容器中的操作类似于在一个虚拟机(操作系统)中进行操作。
  • 同虚拟机一样,容器创建后,会存储在宿主机上:Linux 上位于 /var/lib/docker/containers

2.2 Docker 容器和虚拟机的不同点

注意
**容器不是虚拟机**,但有很多相似的地方
  • 虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运行在宿主机的内核上,其本质上是一系列进程的结合
  • 容器是轻量级的,虚拟机是重量级的。首先容器不需要额外的资源来管理(不需要 Hypervisor、Guest OS),而虚拟机会额外有更多的性能消耗;其次创建、启动或关闭容器,如同创建、启动或者关闭进程那么轻松,而创建、启动、关闭一个操作系统就没那么方便了。
  • 因为容器时轻量级的,所以在给定的硬件上能运行更多数量的容器,甚至可以直接把 Docker 运行在虚拟机上。

images/4.Docker容器/Pasted-image-20241227210644.png

3 容器的生命周期

3.1 虚拟机的生命周期

images/4.Docker容器/Pasted-image-20241227212605.png

3.2 容器的生命周期

images/4.Docker容器/Pasted-image-20241227212634.png

4 容器创建 - docker container create

  • 作用
    利用镜像创建出一个 Created 状态的待启动容器

  • 命令格式

    docker container create [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    • COMMAND 表示容器启动后,需要在容器中执行的命令,如 ps、ls 等命令
    • ARG 表示执行 COMMEND 时需要提供的一些参数,如 ps 命令的 aux、ls 命令的 -a 等
  • 命令参数查看更多

    参数 默认值 描述
    -t, --tty 分配伪 TTY,也就是分配虚拟终端
    -i, --interactive 即使未连接,也要保持 STDIN 开放
    --name 为容器指定名称,如果没有指定将随机产生一个名称

4.1 创建容器

创建一个 centos 容器,并执行命令 ls -a

images/4.Docker容器/Pasted-image-20241227215317.png

在执行 docker ps 命令时,如果没有加任何参数,默认只展示运行状态的容器,查看所有容器要加参数 -a

如果在创建容器时没有指定 COMMEND ,那么容器会执行默认命令 /bin/bash

images/4.Docker容器/Pasted-image-20241227215721.png

4.2 创建一个指定名字的容器

创建一个 centos 容器,并执行命令 ls -a ,并且容器名为 my_centos

images/4.Docker容器/Pasted-image-20241227220119.png

5 容器的删除 - docker container rm

  • 作用
    删除一个或多个容器

  • 命令格式

    docker container rm [OPTIONS] CONTAINER [CONTAINER...]
    
  • 命令参数

    参数 默认值 描述
    -f, --force 强制删除正在运行的容器(使用 SIGKILL)

5.1 删除容器

images/4.Docker容器/Pasted-image-20241227220938.png

6 容器的启动 - docker container start

  • 作用
    启动一个或多个已停止的容器

  • 命令格式

    docker container start [OPTIONS] CONTAINER [CONTAINER...]
    
  • 命令参数

    参数 默认值 描述
    -a, --attach 连接 STDOUT/STDERR 并转发信号
    -i, --interactive 连接容器的 STDIN

6.1 启动容器

创建后启动一个 centos 容器,并执行命令 ls -a

images/4.Docker容器/Pasted-image-20241227222323.png

在启动容器后终端并没有输出,这是因为没有将 STDOUT/STDERR 绑定到当前终端。而容器显示已经退出是因为 ls -a 在一瞬间就执行完毕了,而容器在执行完命令后就直接退出了。

想要看到容器的输出,就要使用 -a 参数连接 STDOUT/STDERR 。

images/4.Docker容器/Pasted-image-20241227223248.png

6.2 连接容器的 STDIN

如果要执行 python 或 bash 这种需要终端输入配合的命令,那么在创建容器时就要使用 -t 参数为容器分配一个终端,-i 参数为容器分配一个 STDIN 。否则容器在创建时不会出错,但在运行时会出错,命令无法运行,导致容器直接退出。

images/4.Docker容器/Pasted-image-20241227225445.png

创建时添加 -ti 参数

images/4.Docker容器/Pasted-image-20241227225720.png

创建时添加了 -ti 参数,在启动时可以发现进入了容器的 bash 中,但是该终端却无法接收指令。这是因为在启动时没有添加 -i 参数,所以没有连接到容器的 STDIN。create 时的 -i 参数只能保证在创建容器时容器的 STDIN 开放。

images/4.Docker容器/Pasted-image-20241227230517.png

创建时只添加了 -t 参数,在启动时添加 -i 参数,无法连接到容器的 STDIN,因为创建容器时没有打开 STDIN。

![[编程/Docker/images/Pasted image 20250117175331.png]]

7 容器的运行 - dcoker container run

  • 作用
    从映像创建并运行新容器

  • 命令格式

    docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
  • 命令参数

    参数 默认值 描述
    -a, --attach 附加 STDIN、STDOUT 或 STDERR
    -d, --detach 后台运行容器并打印容器 ID
    -i, --interactive 即使未连接,也要保持 STDIN 开放
    -t, --tty 分配伪 TTY

7.1 运行容器

images/4.Docker容器/Pasted-image-20241227231038.png

从上面的结果可以看到在执行 docker container run centos ls -a 后,ls -a 命令的输出直接打印在了当前终端上,而不需要像 docker start 一样加 -a 参数。故 docker run == docker create + dcoekr start -a

同样的在执行 python 或 bash 这种需要终端输入配合的命令,那么在创建容器时就要使用 -t 参数为容器分配一个终端,-i 参数为容器分配一个 STDIN 。

images/4.Docker容器/Pasted-image-20241227231835.png

7.2 后台执行容器

我们有时不想将命令的结果直接显示在当前终端,及想要实现 docker create + docker start 的效果。可以加一个 -d 参数。即 docker run -d == docker create + docker start

images/4.Docker容器/Pasted-image-20241227232223.png

注意
`docker run == docker create + dcoekr start -a` 前台模式
> `docker run -d == docker create + docker start` 后台模式

8 容器的关闭 - docker container stop

  • 作用
    停止一个或多个正在运行的容器

  • 命令格式

    docker container stop [OPTIONS] CONTAINER [CONTAINER...]
    
  • 命令参数

    参数 默认值 描述
    -s, --signal 发送给容器的信号
    -t, --time 终止容器前等待的秒数

8.1 停止容器

images/4.Docker容器/Pasted-image-20241228084041.png

8.2 使用信号停止容器(-s,--signal)

--signal 标志向容器发送系统调用信号以退出。此信号可以是格式为 SIG<NAME> 的信号名称 ,例如  SIGKILL,也可以是与内核系统调用表中的位置匹配的无符号数字,例如 9。有关可用信号,请参阅  signal(7) 。

默认使用的信号由镜像的 STOPSIGNAL 定义 ,可以在构建镜像时通过 Dockerfile 指令 StopSignal 设置 ,也可以在创建容器时使用 --stop-signal 选项配置。如果容器没有配置信号,则默认使用 SIGTERM

8.3 使用超时停止容器(-t,--timeout)

--time 标志设置发送预定义系统调用信号 --signal 后等待容器停止的秒数。如果容器在超时后未退出,则会通过 SIGKILL 信号强制终止容器。

如果设置 --time-1,则不应用超时,并且守护进程将无限期地等待容器退出。

--stop-timeout  默认超时时间可以在创建容器时使用选项指定 。如果容器没有配置默认超时时间,则 Daemon 会确定默认超时时间,Linux 容器的超时时间为 10 秒,Windows 容器的超时时间为 30 秒。

9 容器的终止 - docker container kill

  • 作用
    终止一个或多个正在运行的容器

  • 命令格式

    docker container kill [OPTIONS] CONTAINER [CONTAINER...]
    
  • 命令参数

    参数 默认值 描述
    -s, --signal 发送给容器的信号

9.1 向容器发送 KILL 信号

以下示例将默认 SIGKILL 信号发送到名为的容器  my_container

$ docker kill my_container

images/4.Docker容器/Pasted-image-20241228085547.png

9.2 向容器发送自定义信号(--signal)

以下示例向名为 my_container 的容器发送信号  SIGHUP

$ docker kill --signal=SIGHUP  my_container

可以通过 namenumber 指定自定义信号。SIG 前缀是可选的,因此以下示例是等效的:

$ docker kill --signal=SIGHUP my_container
$ docker kill --signal=HUP my_container
$ docker kill --signal=1 my_container

请参阅  signal(7)  手册页以获取标准 Linux 信号的列表。

10 容器的暂停 - docker container pause

  • 作用
    暂停一个或多个容器内的所有进程

  • 命令格式

    docker container pause CONTAINER [CONTAINER...]
    
  • 命令参数

10.1 容器暂停

images/4.Docker容器/Pasted-image-20241228090711.png

11 容器的取消暂停 - docker container unpause

  • 作用
    取消暂停一个或多个容器内的所有进程

  • 命令格式

    docker container unpause CONTAINER [CONTAINER...]
    
  • 命令参数

11.1 取消容器暂停

images/4.Docker容器/Pasted-image-20241228090922.png

12 容器的重启 - docker container restart

  • 作用
    重启一个或多个容器

  • 命令格式

    docker container restart [OPTIONS] CONTAINER [CONTAINER...]
    
  • 命令参数

    参数 默认值 描述
    -s, --signal 发送给容器的信号
    -t, --time 终止容器前等待的秒数

可以将 docker container restart 看做是 docker container stop + docker container start 的结合

13 容器详细信息查看 - docker container inspect

  • 作用
    显示一个或多个容器的详细信息

  • 命令格式

    docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
    
  • 命令参数

    参数 默认值 描述
    -f, --format 使用自定义模板格式化输出:'json':以 JSON 格式打印
    -s, --size 显示文件总大小

13.1 查看容器详细信息

zhy@ubuntu24-04:~$ docker container inspect 3320
[
    {
        "Id": "3320c0c7c6b9837b4d11d7acacc41ba3ea1caf8bb15af6dc8c1295c6557284c0",
        "Created": "2024-12-28T00:55:10.344926305Z",
        "Path": "bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 20293,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2024-12-28T01:06:25.018383927Z",
            "FinishedAt": "2024-12-28T00:55:34.838567013Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/var/lib/docker/containers/3320c0c7c6b9837b4d11d7acacc41ba3ea1caf8bb15af6dc8c1295c6557284c0/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/3320c0c7c6b9837b4d11d7acacc41ba3ea1caf8bb15af6dc8c1295c6557284c0/hostname",
        "HostsPath": "/var/lib/docker/containers/3320c0c7c6b9837b4d11d7acacc41ba3ea1caf8bb15af6dc8c1295c6557284c0/hosts",
        "LogPath": "/var/lib/docker/containers/3320c0c7c6b9837b4d11d7acacc41ba3ea1caf8bb15af6dc8c1295c6557284c0/3320c0c7c6b9837b4d11d7acacc41ba3ea1caf8bb15af6dc8c1295c6557284c0-json.log",
        "Name": "/my_container",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "bridge",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "ConsoleSize": [
                26,
                105
            ],
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "private",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": [],
            "BlkioDeviceWriteBps": [],
            "BlkioDeviceReadIOps": [],
            "BlkioDeviceWriteIOps": [],
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": null,
            "PidsLimit": null,
            "Ulimits": [],
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware",
                "/sys/devices/virtual/powercap"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/71a0dbeaad2a9bb65666d284e1f2e9c8056be4b400bda194e52c6945b4f9582e-init/diff:/var/lib/docker/overlay2/05fa4a625f86c6e82c32106f950cacd7da578d47f2b781e3e45a976c6ac18c89/diff",
                "MergedDir": "/var/lib/docker/overlay2/71a0dbeaad2a9bb65666d284e1f2e9c8056be4b400bda194e52c6945b4f9582e/merged",
                "UpperDir": "/var/lib/docker/overlay2/71a0dbeaad2a9bb65666d284e1f2e9c8056be4b400bda194e52c6945b4f9582e/diff",
                "WorkDir": "/var/lib/docker/overlay2/71a0dbeaad2a9bb65666d284e1f2e9c8056be4b400bda194e52c6945b4f9582e/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "3320c0c7c6b9",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "bash"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "61e2c99ff188fc8170dbf0c45caf660679a222a26448bdfdbf2b9d99ee727518",
            "SandboxKey": "/var/run/docker/netns/61e2c99ff188",
            "Ports": {},
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "8160f6b85c0c05726b6be9214954e3704015f1c05ca5c0ae91b94c35a0aaa059",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null,
                    "NetworkID": "829a559073f29a89e999f3fb5e3662fdcfea49fbfa46bfd74659dee7e63546d9",
                    "EndpointID": "8160f6b85c0c05726b6be9214954e3704015f1c05ca5c0ae91b94c35a0aaa059",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "DNSNames": null
                }
            }
        }
    }
]
zhy@ubuntu24-04:~$ docker container inspect -f "{{json .Config.Cmd}}" 3320
["bash"]
zhy@ubuntu24-04:~$

14 容器的日志信息 - docker container logs

  • 作用
    获取容器的日志

  • 命令格式

    docker container logs [OPTIONS] CONTAINER
    
  • 命令参数

    参数 默认值 描述
    --details 显示提供给日志的额外详细信息
    -f, --follow 跟踪日志输出
    --since 显示自时间戳(例如 2013-01-02T13:23:37Z)或相对时间戳(例如 42m42 分钟)以来的日志
    -n, --tail all 从日志末尾显示的行数
    -t, --timestamps 显示时间戳
    --until 显示时间戳(例如 2013-01-02T13:23:37Z)或相对时间戳(例如 42m42 分钟)之前的日志
注意
容器日志中记录的是容器主进程的输出 STDIN/STDERR

14.1 查看容器日志

images/4.Docker容器/Pasted-image-20241228094053.png

15 容器的重命名 - docker container rename

  • 作用
    重命名容器

  • 命令格式

    docker container rename CONTAINER NEW_NAME
    
  • 命令参数

15.1 重命名容器示例

images/4.Docker容器/Pasted-image-20241228095018.png

16 容器连接 - docker container attach

  • 作用
    将本地标准输入、输出和错误流附加到正在运行的容器

  • 命令格式

    docker container attach [OPTIONS] CONTAINER
    
  • 命令参数

    参数 默认值 描述
    --no-stdin 不要附加 STDIN

16.1 容器连接

attach 是将当前标准输入、输出和错误流绑定到容器的主进程即 COMMAND 上

images/4.Docker容器/Pasted-image-20241228095839.png

17 容器中执行新命令 - docker container exec

  • 作用
    在正在运行的容器中执行命令

  • 命令格式

    docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]
    
  • 命令参数

    参数 默认值 描述
    -d, --detach 分离模式:在后台运行命令
    -i, --interactive 即使未连接,也要保持 STDIN 开放
    -t, --tty 分配伪 TTY
    -w, --workdir 容器内的工作目录
    -e, --env 设置环境变量

17.1 容器执行新命令

exec 是在容器中运行一个新的进程,该进程关闭后不会影响主进程的执行,即容器不会退出

zhy@ubuntu24-04:~$ docker container ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                      PORTS     NAMES
3515ee7dbae3   centos    "ls -a"   24 minutes ago   Exited (0) 24 minutes ago             my_container
665c791f4503   centos    "bash"    25 minutes ago   Exited (0) 7 minutes ago              focused_merkle
zhy@ubuntu24-04:~$ docker container start 665c
665c
zhy@ubuntu24-04:~$ docker container ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                      PORTS     NAMES
3515ee7dbae3   centos    "ls -a"   24 minutes ago   Exited (0) 24 minutes ago             my_container
665c791f4503   centos    "bash"    25 minutes ago   Up 2 seconds                          focused_merkle
zhy@ubuntu24-04:~$ docker exec 665c ps -A
    PID TTY          TIME CMD
      1 pts/0    00:00:00 bash
     15 ?        00:00:00 ps
zhy@ubuntu24-04:~$ docker exec 665c ps -A
    PID TTY          TIME CMD
      1 pts/0    00:00:00 bash
     21 ?        00:00:00 ps
zhy@ubuntu24-04:~$ docker exec -ti 665c bash
[root@665c791f4503 /]# ps -A
    PID TTY          TIME CMD
      1 pts/0    00:00:00 bash
     27 pts/1    00:00:00 bash
     41 pts/1    00:00:00 ps
[root@665c791f4503 /]# exit
exit
zhy@ubuntu24-04:~$ docker container ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                      PORTS     NAMES
3515ee7dbae3   centos    "ls -a"   26 minutes ago   Exited (0) 26 minutes ago             my_container
665c791f4503   centos    "bash"    27 minutes ago   Up 2 minutes                          focused_merkle
zhy@ubuntu24-04:~$

18 总结

images/4.Docker容器/Pasted-image-20241228101718.png

posted @ 2026-04-12 13:59  挖掘鱼  阅读(4)  评论(0)    收藏  举报