当前位置: 首页 > news >正文

Docker使用【容器】

Docker容器

  • 1. 什么是容器
  • 2. 容器生活案例
  • 3. 为什么需要容器
  • 4. 容器的生命周期
    • 4.1 声明周期
    • 4.2 容器OOM
    • 4.3 容器异常退出
    • 4.4 容器暂停
  • 5. 容器命令详解
    • 5.1 容器命令清单
    • 5.2 docker create
    • 5.3 docker logs
    • 5.4 docker attach
    • 5.5 docker exec
    • 5.6 docker start
    • 5.7 docker stop
    • 5.8 docker restart
    • 5.9 docker kill
    • 5.10 docker top
    • 5.11 docker stats
    • 5.12 docker container inspect
    • 5.13 docker port
    • 5.14 docker cp
    • 5.15 docker diff
    • 5.16 docker commit
    • 5.17 docker pause
    • 5.18 docker unpause
    • 5.19 docker rm
    • 5.20 docker export
      • docker import
    • 5.21 docker wait
    • 5.22 docker rename
    • 5.23 docker container prune
    • 5.24 docker update
  • 6. 容器操作案例
    • 6.1 容器批量处理
    • 6.2 容器的交互模式
      • 6.2.1 attached 模式
      • 6.2.2 detached 模式
      • 6.2.3 interactive 模式
    • 6.3 容器自动删除
    • 6.4 容器的自动重启
    • 6.5 容器多个环境变量配置
    • 6.6 容器执行单行命令
  • 7. 综合实战
    • 7.1 MySQL容器化安装
    • 7.2 Redis容器化安装
    • 7.3 C++容器制作


1. 什么是容器


通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态。

虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。

容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。

在这里插入图片描述


2. 容器生活案例


镜像与容器就相当于同样是开发商提供的毛坯房,但是两家人装修出来的完全不一样。

在这里插入图片描述

或者我们都学习了 Java 或者 C++ 之类的面向对象的语言,可以理解为镜像为基础类,容器是实例化出来的一个个对象,没有用户需要的不一样,里面的内容也就不一样了。

在这里插入图片描述


3. 为什么需要容器


镜像是静态的文件,并不能提供服务,就像我拿了个 Linux 或者 Windows 的光盘一样,只有安装到主机里面运行起来才能对外提供服务,我们才能使用。

容器带来哪些收益呢,参考我们之前讲解的为什么要虚拟化、容器化。


4. 容器的生命周期


4.1 声明周期


1. 容器的生命周期是容器可能处于的状态

  • created:初建状态
  • running:运行状态
  • stopped:停止状态
  • paused: 暂停状态
  • deleted:删除状态

2. 各生命周期之间的转换关系如图所示:

在这里插入图片描述

  • docker create : 创建容器后,不立即启动运行,容器进入初建状态;
  • docker run : 创建容器,并立即启动运行,进入运行状态;
  • docker start : 容器转为运行状态;
  • docker stop : 容器将转入停止状态;
  • docker kill : 容器在故障(死机)时,执行 kill(断电),容器转入停止状态,这种操作容易丢失数据,除非必要,否则不建议使用;
  • docker restart : 重启容器,容器转入运行状态;
  • docker pause : 容器进入暂停状态;
  • docker unpause : 取消暂停状态,容器进入运行状态;
  • docker rm : 删除容器,容器转入删除状态。
  • killed by out-of-memory(因内存不足被终止) :宿主机内存被耗尽,也被称为 OOM:非计划终止 这时需要杀死最吃内存的容器
  • container process exitde(异常终止):出现容器被终止后,将进入 Should restart? 选择操作:
    • yes 需要重启,容器执行 start 命令,转为运行状态。
    • no 不需要重启,容器转为停止状态。

4.2 容器OOM


Docker 在处理 OOM 事件时分为三种情况

  • 如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。例如,在容器当中,部署了一个 web 服务。假设主机分配给此容器的内存上限为 1G,当脚本申请的内存大于 1G 时,此容器就会触发 OOM 事件。而在这种情况下,此容器将会被强制关闭。

但需要注意的是,此时关闭容器的并非是 Docker Daemon,而是宿主机操作系统。因为一个容器其实就是一组运行在宿主机操作系统当中的进程,宿主机操作系统通过 cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿主机操作系统的内核 OOM 事件,因此最终是由宿主机内核来关闭这些进程.

  • 如果用户不想关闭这个容器,那么可以选择 --oom-kill-disable 来禁用 OOM-Killer。使用此参数时,仍需要注意,如果使用 -m 设置了此容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器将处于 hung 状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去。
  • 如果用户使用了 --oom-kill-disable ,但也没有使用 -m 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大。

4.3 容器异常退出


每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。运行的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至 Init 进程也退出。当 Init 进程退出时,也就代表着此容器被关闭。Docker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器关闭情况时,Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running 状态。只有设置了--restart 参数的容器,Docker Daemon 才会去尝试启动,否则容器会保持停止状态。


4.4 容器暂停


Docker“剥夺”了此容器的 CPU 资源。而其他资源,如 Memory 资源、Network 资源
等还保留未动。如此一来,失去了 CPU 资源的进程,是不会被主机内核系统所调度的,所以此容器就处于“冰封”状态。


5. 容器命令详解

有一些命令如docker run在之前的章节中讲过了,此处不再赘述:Docker使用【Registry镜像仓库】


5.1 容器命令清单


命令别名功能备注
docker createdocker container create创建容器
docker rundocker container run运行容器必须掌握
docker attachdocker container attach连接到正在运行中的容器。
docker commitdocker container commit将镜像提交为容器必须掌握
docker cpdocker container cp在容器和宿主机之间拷贝必须掌握
docker diffdocker container diff检查容器里文件结构的更改。
docker execdocker container exec在运行的容器中执行命令必须掌握
docker exportdocker container export将容器导出为 tar
docker container inspect查看容器详细信息必须掌握
docker killdocker container kill杀死容器必须掌握
docker logsdocker container logs查看日志必须掌握
docker psdocker container ls, docker container list, docker container ps查看正在运行的进程必须掌握
docker pausedocker container pause暂停进程
docker portdocker container port查看容器的端口映射
docker container prune删除停止的容器
docker renamedocker container rename重命名容器
docker restartdocker container restart重启容器必须掌握
docker rmdocker container rm, docker container remove删除容器必须掌握
docker startdocker container start启动容器必须掌握
docker statsdocker container stats查看资源占用信息必须掌握
docker stopdocker container stop停止容器必须掌握
docker topdocker container top查看某个容器的资源占用必须掌握
docker unpausedocker container unpause继续运行容器
docker updatedocker container update更新容器配置
docker waitdocker container wait阻止一个或多个容器停止,然后打印退出代码

5.2 docker create


1. 功能

  • 创建一个新的容器但不启动它。

2. 语法

docker create [OPTIONS] IMAGE [COMMAND] [ARG...] 

3. 别名

docker container create 

4. 关键参数

  • -i:以交互模式运行容器,通常与 -t 同时使用;
  • -P:随机端口映射,容器内部端口随机映射到主机的端口
  • -p:指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • --name="nginx-lb":为容器指定一个名称;
  • -h "mars":指定容器的 hostname;
  • -e username="ritchie":设置环境变量;
  • --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2":绑定容器到指定 CPU 运行;
  • -m:设置容器使用内存最大值;
  • --network="bridge":指定容器的网络连接类型;
  • --link=[]:添加链接到另一个容器;
  • --volume , -v:绑定一个卷;
  • --rm:shell 退出的时候自动删除容器;
  • --restart:自动重启。

5. 样例

  • 先创建一个nginx容器,然后启动它:

在这里插入图片描述

  • 外部访问:

在这里插入图片描述


5.3 docker logs


1. 功能

  • 查看容器日志。

2. 语法

docker logs [OPTIONS] CONTAINER

3. 别名

docker container logs 

4. 关键参数

  • -f ,--follow:跟踪日志输出;
  • --since:显示某个开始时间的所有日志(格式"年-月-日");
  • -t,--timestamps:显示时间戳;
  • -n,--tail:仅列出最新 N 条容器日志。

5. 样例

  • 首先不带参数,logs的输出是一次性的:

在这里插入图片描述

  • 加上-f,实时跟踪:

在这里插入图片描述

  • 使用最多的是-n,打印最近的n条日志:

在这里插入图片描述


5.4 docker attach


1. 功能

  • 连接到正在运行中的容器。

2. 语法

docker attach [OPTIONS] CONTAINER  

3. 别名

docker container attach 

4. 关键参数

  • --sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的
    话不会影响容器,否则退出会导致容器退出。

5. 样例

  • --sig-proxy为true,输入Ctrl+C直接导致容器退出:

在这里插入图片描述

  • --sig-proxy为false,Ctrl+C不影响容器:

在这里插入图片描述

感觉是一个很鸡肋的命令,写了半天,还不如不写了。


5.5 docker exec


1. 功能

  • 在容器中执行命令。

2. 语法

docker exec [OPTIONS] CONTAINER COMMAND [ARG...] 

3. 别名

docker container exec 

4. 关键参数

  • -d:分离模式,在后台运行;
  • -i:即使没有附加也保持 STDIN(标准输入) 打开;
  • -t:分配一个伪终端;
  • -e:设置环境变量;
  • -u,--user:指定用户 “<name|uid>[:<group|gid>]”;
  • -w,--workdir:指定工作目录。

-it一般都在一起,而且一般只配合bash使用。

5. 样例

  • docker exec只能用于正在启动中的容器,如果没有启动,需要先启动:

在这里插入图片描述

  • 也可以只执行一个指令:

在这里插入图片描述


5.6 docker start


1. 功能

  • 启动停止的容器。

2. 语法

docker start [OPTIONS] CONTAINER [CONTAINER...] 

3. 别名

docker container start 

5.7 docker stop


1. 功能

  • 停止运行的容器;

2. 语法

docker stop [OPTIONS] CONTAINER [CONTAINER...] 

3. 别名

docker container stop

4. 关键参数

  • -s:发送的信号,强制停止。

5. 样例

  • 正常退出,不带参数,nginx会在退出前释放一些资源:

在这里插入图片描述

  • 带上强制退出信号,nginx来不及释放资源,就被强制退出了:

在这里插入图片描述


5.8 docker restart


1. 功能

  • 重启容器。

2. 语法

docker restart [OPTIONS] CONTAINER [CONTAINER...] 

3. 别名

docker container restart 

4. 关键参数

  • -s:发送信号(这个参数和stop-s意义一样,指导重启进程如何退出)

太简单了,不演示了。


5.9 docker kill


1. 功能

  • 强制退出容器。

2. 语法

docker kill [OPTIONS] CONTAINER [CONTAINER...] 

3. 别名

docker container kill 

4. 关键参数

  • -s:发送信号。

5. 注意事项

  • Docker stop 发送的是 SIGTERM 信号,docker kill 发送的是 SIGKILL 信号,更残暴。

6. 样例

在这里插入图片描述


5.10 docker top


1. 功能

  • 查看容器中运行的进程信息,支持 ps 命令参数。

2. 语法

docker top CONTAINER [ps OPTIONS] 

3. 别名

docker container top 

4. 注意事项

  • 容器运行时不一定有 /bin/bash 终端来交互执行 top 命令,而且容器还不一定有 top 命令,可以使用 docker top 来实现查看 container 中正在运行的进程。

5. 样例

root@Ubuntu22:/home/ubuntu# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS         PORTS                                     NAMES
a76dfa658aef   nginx:1.23.4   "/docker-entrypoint.…"   14 hours ago   Up 5 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mywebsite
root@Ubuntu22:/home/ubuntu# docker top mywebsite
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                3599                3575                0                   12:37               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            3675                3599                0                   12:37               ?                   00:00:00            nginx: worker process
systemd+            3676                3599                0                   12:37               ?                   00:00:00            nginx: worker process

5.11 docker stats


1. 功能

  • 显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等。

2. 语法

docker stats [OPTIONS] [CONTAINER...] 

3. 别名

docker container stats 

4. 关键参数

  • --all , -a:显示所有的容器,包括未运行的;
  • --format:指定返回值的模板文件。如 table,json
  • --no-stream:展示当前状态就直接退出了,不再实时更新;
  • --no-trunc:不截断输出。

5. 返回报文

  • CONTAINER ID 与 NAME:容器 ID 与名称。
  • CPU % 与 MEM %:容器使用的 CPU 和内存的百分比。
  • MEM USAGE / LIMIT:容器正在使用的总内存,以及允许使用的内存总量。
  • NET I/O:容器通过其网络接口发送和接收的数据量。
  • BLOCK I/O:容器从主机上的块设备读取和写入的数据量。
  • PIDs:容器创建的进程或线程数。

6. 样例

在这里插入图片描述


5.12 docker container inspect


1. 功能

  • 查看容器详细信息;

2. 语法

docker container inspect [OPTIONS] CONTAINER [CONTAINER...] 

3. 关键参数

  • -f:指定返回值的模板文件。如 table、json
  • -s:显示总的文件大小。

4. 注意事项

  • docker inspect 会自动检查是镜像还是容器然后显示相信信息。

5. 样例

root@Ubuntu22:/home/ubuntu# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS         PORTS                                     NAMES
a76dfa658aef   nginx:1.23.4   "/docker-entrypoint.…"   15 hours ago   Up 4 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mywebsite
root@Ubuntu22:/home/ubuntu# docker container inspect a76dfa658aef
[{"Id": "a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700","Created": "2025-10-25T14:24:12.381474994Z","Path": "/docker-entrypoint.sh","Args": ["nginx","-g","daemon off;"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 3912,"ExitCode": 0,"Error": "","StartedAt": "2025-10-26T05:42:48.161593547Z","FinishedAt": "2025-10-26T05:41:41.753164864Z"},"Image": "sha256:a7be6198544f09a75b26e6376459b47c5b9972e7aa742af9f356b540fe852cd4","ResolvConfPath": "/data/var/lib/docker/containers/a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700/resolv.conf","HostnamePath": "/data/var/lib/docker/containers/a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700/hostname","HostsPath": "/data/var/lib/docker/containers/a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700/hosts","LogPath": "/data/var/lib/docker/containers/a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700/a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700-json.log","Name": "/mywebsite","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": {"80/tcp": [{"HostIp": "","HostPort": "8080"}]},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"ConsoleSize": [22,134],"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/interrupts","/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": {"ID": "a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700","LowerDir": "/data/var/lib/docker/overlay2/b38ba724d1a17f7f4315ebea1a8a7ced54befe8733840dce67d24a0f4a3a15f6-init/diff:/data/var/lib/docker/overlay2/4142f3712d3957a57fbf06e72609b2ad7b0aa031365fef007b87bd845b4bcdf2/diff:/data/var/lib/docker/overlay2/b18e90b4b0b688ebd2de7571dcb5e1e16879f677bae8aa258c373c4f79ea85ce/diff:/data/var/lib/docker/overlay2/b6092671e558fc1ff2a3750765a9437b1d850dd5d218e26fa48618b8e7c7ff02/diff:/data/var/lib/docker/overlay2/4aa296d9c2802feb6beb8e6d5313697e54ddb1f35ca6bd47a27614e50b2fd59f/diff:/data/var/lib/docker/overlay2/9453c35c5bf0ec6ceec0f65591abf1c0615933a99c377b75f2583497a0f640fa/diff:/data/var/lib/docker/overlay2/73802f8cca677b5b5fcf9dcdd5837bdc3a561676f56dca2c65fc322c6383ba0d/diff","MergedDir": "/data/var/lib/docker/overlay2/b38ba724d1a17f7f4315ebea1a8a7ced54befe8733840dce67d24a0f4a3a15f6/merged","UpperDir": "/data/var/lib/docker/overlay2/b38ba724d1a17f7f4315ebea1a8a7ced54befe8733840dce67d24a0f4a3a15f6/diff","WorkDir": "/data/var/lib/docker/overlay2/b38ba724d1a17f7f4315ebea1a8a7ced54befe8733840dce67d24a0f4a3a15f6/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "a76dfa658aef","Domainname": "","User": "","AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"ExposedPorts": {"80/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","NGINX_VERSION=1.23.4","NJS_VERSION=0.7.11","PKG_RELEASE=1~bullseye"],"Cmd": ["nginx","-g","daemon off;"],"Image": "nginx:1.23.4","Volumes": null,"WorkingDir": "","Entrypoint": ["/docker-entrypoint.sh"],"OnBuild": null,"Labels": {"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"},"StopSignal": "SIGQUIT"},"NetworkSettings": {"Bridge": "","SandboxID": "7556deab9f4f1651abd75c34ca5c49425d6e6a8d3c1b9c8fbeffedf7f98db70b","SandboxKey": "/var/run/docker/netns/7556deab9f4f","Ports": {"80/tcp": [{"HostIp": "0.0.0.0","HostPort": "8080"},{"HostIp": "::","HostPort": "8080"}]},"HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "88f2bd504e84bb30c7823c3542f507020e3595f0fce19e677878b489044ac42f","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "1e:34:4a:83:2d:42","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"MacAddress": "1e:34:4a:83:2d:42","DriverOpts": null,"GwPriority": 0,"NetworkID": "99b5de65d949ad462f2b416916b311e120a054a70f0b8e844c0442ef5e6a4b31","EndpointID": "88f2bd504e84bb30c7823c3542f507020e3595f0fce19e677878b489044ac42f","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"DNSNames": null}}}}
]

5.13 docker port


1. 功能

  • 用于列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口。

2. 语法

docker port CONTAINER [PRIVATE_PORT[/PROTO]] 

3. 别名

docker container port 

4. 样例

在这里插入图片描述

  • 也可以带上过滤,查看容器80端口对应的宿主机端口:

在这里插入图片描述


5.14 docker cp


1. 功能

  • 在容器和宿主机之间拷贝文件;

2. 语法

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- 
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH 

3. 别名

docker container cp 

4. 样例

  • 开启nginx容器bash,交互式进入:

在这里插入图片描述

  • 进入目录/usr/share/nginx/html/index.html为默认主页文件,准备把这个文件拷贝到宿主机:

在这里插入图片描述

  • 开启另一个终端,拷贝容器index.html到当前目录:

在这里插入图片描述

  • 修改它:

在这里插入图片描述

  • 把修改好的文件拷贝回去:

在这里插入图片描述

  • 外部访问,修改成功:

在这里插入图片描述


5.15 docker diff


1. 功能

  • 检查容器里文件结构的更改。

2. 语法

docker diff CONTAINER

3. 样例

在这里插入图片描述


5.16 docker commit


1. 功能

  • 从容器创建一个新的自定义镜像。

2. 语法

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 

3. 参数

  • -a:提交的镜像作者;
  • -c:使用 Dockerfile 指令来创建镜像;可以修改启动指令;
  • -m:提交时的说明文字;
  • -p:在 commit 时,将容器暂停。

4. 样例

  • 将一个容器提交为镜像,并带上提交者和注释信息,这些信息可以通过inspect查看:

在这里插入图片描述

  • 使用-c参数,修改启动指令:
    • commit镜像,然后启动:

在这里插入图片描述

  • 查看启动信息是否被修改:

在这里插入图片描述


5.17 docker pause


1. 功能

  • 暂停容器中所有的进程。

2. 语法

docker pause CONTAINER [CONTAINER...] 

3. 别名

docker container pause 

5.18 docker unpause


1. 功能

  • 恢复容器中所有的进程。

2. 语法

docker unpause CONTAINER [CONTAINER...] 

3. 别名

docker container unpause 

5.19 docker rm


1. 功能

  • 删除停止的容器。

2. 语法

docker rm [OPTIONS] CONTAINER [CONTAINER...] 

3. 别名

docker container rm 

4. 关键参数

  • -f:通过 SIGKILL 信号强制删除一个运行中的容器。

5.20 docker export


1. 功能

  • 导出容器内容为 tar 文件;

2. 语法

docker export [OPTIONS] CONTAINER 

3. 别名

docker container export 

4. 关键参数

  • -o:写入到文件。

5. 样例

在这里插入图片描述


docker import

这是一个镜像命令,放在这里将最合适。


1. 功能

  • 从归档文件中创建镜像。

2. 语法

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] 

3. 别名

docker image import

4. 关键参数

  • -c:应用 docker 指令创建镜像;
  • -m:提交时的说明文字;

5. 样例

在这里插入图片描述
在这里插入图片描述

  • 这个tar包是用图中的nginx:1.23.4镜像export出来的,接下来,我们对比一下import出的镜像和原镜像有什么不同。
  • 先用这个新镜像,启动一个容器:

在这里插入图片描述

  • 然后查看这两个容器的详细信息,重点对比Config部分,发现通过exportimport生成的镜像,缺少很多配置信息。和saveload相比,他们产生的镜像配置是残缺的。所以不建议使用这两个命令生成自定义镜像,而是saveload更合适,还适合远距离离线传输。
root@Ubuntu22:/data/testexport# docker container inspect mywebsite
[{"Id": "a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700","Created": "2025-10-25T14:24:12.381474994Z","Path": "/docker-entrypoint.sh","Args": ["nginx","-g","daemon off;"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 3912,"ExitCode": 0,"Error": "","StartedAt": "2025-10-26T05:42:48.161593547Z","FinishedAt": "2025-10-26T05:41:41.753164864Z"},"Image": "sha256:a7be6198544f09a75b26e6376459b47c5b9972e7aa742af9f356b540fe852cd4","ResolvConfPath": "/data/var/lib/docker/containers/a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700/resolv.conf","HostnamePath": "/data/var/lib/docker/containers/a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700/hostname","HostsPath": "/data/var/lib/docker/containers/a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700/hosts","LogPath": "/data/var/lib/docker/containers/a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700/a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700-json.log","Name": "/mywebsite","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": {"80/tcp": [{"HostIp": "","HostPort": "8080"}]},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"ConsoleSize": [22,134],"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/interrupts","/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": {"ID": "a76dfa658aef2737883bea627bb0ba3a5c674b2d79513ad76fd5d85adba1d700","LowerDir": "/data/var/lib/docker/overlay2/b38ba724d1a17f7f4315ebea1a8a7ced54befe8733840dce67d24a0f4a3a15f6-init/diff:/data/var/lib/docker/overlay2/4142f3712d3957a57fbf06e72609b2ad7b0aa031365fef007b87bd845b4bcdf2/diff:/data/var/lib/docker/overlay2/b18e90b4b0b688ebd2de7571dcb5e1e16879f677bae8aa258c373c4f79ea85ce/diff:/data/var/lib/docker/overlay2/b6092671e558fc1ff2a3750765a9437b1d850dd5d218e26fa48618b8e7c7ff02/diff:/data/var/lib/docker/overlay2/4aa296d9c2802feb6beb8e6d5313697e54ddb1f35ca6bd47a27614e50b2fd59f/diff:/data/var/lib/docker/overlay2/9453c35c5bf0ec6ceec0f65591abf1c0615933a99c377b75f2583497a0f640fa/diff:/data/var/lib/docker/overlay2/73802f8cca677b5b5fcf9dcdd5837bdc3a561676f56dca2c65fc322c6383ba0d/diff","MergedDir": "/data/var/lib/docker/overlay2/b38ba724d1a17f7f4315ebea1a8a7ced54befe8733840dce67d24a0f4a3a15f6/merged","UpperDir": "/data/var/lib/docker/overlay2/b38ba724d1a17f7f4315ebea1a8a7ced54befe8733840dce67d24a0f4a3a15f6/diff","WorkDir": "/data/var/lib/docker/overlay2/b38ba724d1a17f7f4315ebea1a8a7ced54befe8733840dce67d24a0f4a3a15f6/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "a76dfa658aef","Domainname": "","User": "","AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"ExposedPorts": {"80/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","NGINX_VERSION=1.23.4","NJS_VERSION=0.7.11","PKG_RELEASE=1~bullseye"],"Cmd": ["nginx","-g","daemon off;"],"Image": "nginx:1.23.4","Volumes": null,"WorkingDir": "","Entrypoint": ["/docker-entrypoint.sh"],"OnBuild": null,"Labels": {"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"},"StopSignal": "SIGQUIT"},"NetworkSettings": {"Bridge": "","SandboxID": "7556deab9f4f1651abd75c34ca5c49425d6e6a8d3c1b9c8fbeffedf7f98db70b","SandboxKey": "/var/run/docker/netns/7556deab9f4f","Ports": {"80/tcp": [{"HostIp": "0.0.0.0","HostPort": "8080"},{"HostIp": "::","HostPort": "8080"}]},"HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "88f2bd504e84bb30c7823c3542f507020e3595f0fce19e677878b489044ac42f","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "1e:34:4a:83:2d:42","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"MacAddress": "1e:34:4a:83:2d:42","DriverOpts": null,"GwPriority": 0,"NetworkID": "99b5de65d949ad462f2b416916b311e120a054a70f0b8e844c0442ef5e6a4b31","EndpointID": "88f2bd504e84bb30c7823c3542f507020e3595f0fce19e677878b489044ac42f","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"DNSNames": null}}}}
]
root@Ubuntu22:/data/testexport# docker container inspect mywebsite2
[{"Id": "560e2d2eca2d8cf7a2015084bcb814ccede9d04144a77908dd249c0d26948523","Created": "2025-10-26T11:21:25.556934632Z","Path": "nginx","Args": ["-g","daemon off;"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 6436,"ExitCode": 0,"Error": "","StartedAt": "2025-10-26T11:21:25.657603782Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:78752042b4cf25ff2e61ccdc1c4b7159603cd979a12af10518efc5e545a8ba4b","ResolvConfPath": "/data/var/lib/docker/containers/560e2d2eca2d8cf7a2015084bcb814ccede9d04144a77908dd249c0d26948523/resolv.conf","HostnamePath": "/data/var/lib/docker/containers/560e2d2eca2d8cf7a2015084bcb814ccede9d04144a77908dd249c0d26948523/hostname","HostsPath": "/data/var/lib/docker/containers/560e2d2eca2d8cf7a2015084bcb814ccede9d04144a77908dd249c0d26948523/hosts","LogPath": "/data/var/lib/docker/containers/560e2d2eca2d8cf7a2015084bcb814ccede9d04144a77908dd249c0d26948523/560e2d2eca2d8cf7a2015084bcb814ccede9d04144a77908dd249c0d26948523-json.log","Name": "/mywebsite2","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": [22,134],"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/interrupts","/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": {"ID": "560e2d2eca2d8cf7a2015084bcb814ccede9d04144a77908dd249c0d26948523","LowerDir": "/data/var/lib/docker/overlay2/8ea7486647fd593a5f5943037c9928e0fa0ff4a6b310c0b0a11518c0edd9958e-init/diff:/data/var/lib/docker/overlay2/e5edef3e0ea815dc3efcb669ad1f13a69202535f83cd78cca7054c12a7c1b5cc/diff","MergedDir": "/data/var/lib/docker/overlay2/8ea7486647fd593a5f5943037c9928e0fa0ff4a6b310c0b0a11518c0edd9958e/merged","UpperDir": "/data/var/lib/docker/overlay2/8ea7486647fd593a5f5943037c9928e0fa0ff4a6b310c0b0a11518c0edd9958e/diff","WorkDir": "/data/var/lib/docker/overlay2/8ea7486647fd593a5f5943037c9928e0fa0ff4a6b310c0b0a11518c0edd9958e/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "560e2d2eca2d","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": null,"Cmd": ["nginx","-g","daemon off;"],"Image": "mynginx:v1.23.4","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {}},"NetworkSettings": {"Bridge": "","SandboxID": "0c73af980f28157db414c2ab223a64cce9aaf52a92fc39c660009c5baf96c798","SandboxKey": "/var/run/docker/netns/0c73af980f28","Ports": {},"HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "a14f55e27120f8025071740b05b1fbfa2b8e8df50760487c0d0310e074c4b5aa","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "d6:f8:26:58:4c:f9","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"MacAddress": "d6:f8:26:58:4c:f9","DriverOpts": null,"GwPriority": 0,"NetworkID": "99b5de65d949ad462f2b416916b311e120a054a70f0b8e844c0442ef5e6a4b31","EndpointID": "a14f55e27120f8025071740b05b1fbfa2b8e8df50760487c0d0310e074c4b5aa","Gateway": "172.17.0.1","IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"DNSNames": null}}}}
]

其实,如果我们不再import,加入-c选项,这个容器连启动命令都没有,根本就run不起来。


5.21 docker wait


1. 功能

  • 阻塞运行直到容器停止,然后打印出它的退出代码。

2. 语法

docker wait CONTAINER [CONTAINER...] 

3. 别名

docker container wait 

4. 样例

在这里插入图片描述

只是能拿到退出码,也是一个很鸡肋的命令。


5.22 docker rename


1. 功能

  • 重命名容器;

2. 语法

docker rename CONTAINER NEW_NAME 

3. 别名

docker container rename 

5.23 docker container prune


1. 功能

  • 删除所有停止的容器;

2. 语法

docker container prune [OPTIONS] 

3. 关键参数

  • -f, --force:不提示是否进行确认。

4. 样例

在这里插入图片描述


5.24 docker update


1. 功能

  • 更新容器配置。

2. 语法

docker update [OPTIONS] CONTAINER [CONTAINER...] 

3. 别名

docker container update 

4. 关键参数

  • --cpus:cpu 数量;
  • --cpuset-cpus:使用哪些 cpu;
  • --memory:内存限制;
  • --memory-swap:交换内存;
  • --cpu-period:是用来指定容器对 CPU 的使用要在多长时间内做一次重新分
    配;
  • --cpu-quota:是用来指定在这个周期内,最多可以有多少时间用来跑这个容
    器。

一般是直接在创建容器的时候就规划好内存等各种限制了,这个命令使用相对较少。


6. 容器操作案例


6.1 容器批量处理


1. 相关命令

命令解释
docker container ls -qf name=xxx根据名称过滤得到容器编号
docker container ls --filter status=running根据状态过滤容器信息
docker container ls -aq静默获取全部容器 id
docker container ls --filter ancestor=xxx过滤镜像名为 xxx 的容器信息
docker container ls --filter ancestor=xxx过滤镜像 id 为 xxx 的容器信息
  • -a:表示打印所有的容器信息, 包括正在运行和已经退出的;
  • -q:表示只返回容器 ID;
  • -f:表示基于给的条件过滤 等价于 --filter 选项。

2. 容器的批量查找

  • 涉及到的所有容器:

在这里插入图片描述

  • 筛选所有正在运行的容器;所有退出的容器:

在这里插入图片描述

  • 筛选引用指定镜像的容器(根据Tag筛选/根据id筛选):

在这里插入图片描述

  • 根据容器名称过滤得到容器编号:

在这里插入图片描述

3. 容器的批量操作

  • 停止所有运行容器:
    • 使用符号 `` 可以将命令输入作为参数传给命令:

在这里插入图片描述

  • 启动所有容器:

在这里插入图片描述

  • 过滤所有引用镜像nginx:1.23.4的容器编号:

在这里插入图片描述


6.2 容器的交互模式


6.2.1 attached 模式


# 通过 nginx 镜像创建一个容器, 映射 80 端口 
[zsc@VM-8-12-centos ~]$ docker container run -p 80:80 nginx 
  • 通过上述方式创建容器,就是 attached 模式,这样容器会在前台运行;
  • 访问服务器网址的时候,每访问一次,命令窗口就会打印一次日志,Docker 容器的日志会实时的展现到窗口并且占用此端口;
  • 如果是在 Linux 服务器上,按 Ctrl+C 就会停止掉 Docker 服务,很容易误操作,所以我们需要一个更好的,更稳定的模式,对应的是 detached 模式;
  • attached 模式仅适用于容器和程序的调试阶段。

6.2.2 detached 模式


docker container run -p 80:80 nginx 命令基础上加一个-d 或者--detach
选项表示 detached 模式, 即在后台执行:

  • 在后台运行,启动后只显示容器 ID,并且可以输入任何命令;
  • 就算关掉窗口依然继续运行,停止和删除容器都需要使用 shell 命令,减少了很多的误操作;
  • 比起 attached 模式更建议使用。

下面来实践一下 detached 模式的用法:

  • 第一步:以 detached 模式创建容器, 并映射 8080 端口

在这里插入图片描述

  • 第二步:查看后台日志

在这里插入图片描述

  • 第三步:转为 detached 模式

在这里插入图片描述

  • 然后按 Ctrl + C 就能终止容器了。

6.2.3 interactive 模式


当我们创建好一个容器之后,可能需要去容器内部获取一些信息或执行一些命令,就需要进入到交互式模式。例如创建一个 Ubuntu 容器之后,需要到系统里输入各种 Shell 命令和系统进行交互就需要进入交互式模式才可以完成。

  • 创建运行容器并进入到交互模式,并启动nginx

在这里插入图片描述

  • 按Ctrl + C不会使容器退出,输入exit可以使容器退出,并退出Shell:

在这里插入图片描述


6.3 容器自动删除


1. 启动一个 nginx,我们指定–rm 选项:

root@139-159-150-152:/data/myworkdir/container# docker run --name mynginx1 -d --rm -p 80:80 nginx:1.22.1 
44f865b89919625e539a9fb41d841efa363017a08d9a84194c0046f2e871fe43 
root@139-159-150-152:/data/myworkdir/container# docker ps 
CONTAINER ID IMAGE COMMAND CREATED 
STATUS PORTS NAMES 
44f865b89919 nginx:1.22.1 "/docker-entrypoint.…" 11 seconds 
ago Up 10 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp mynginx1 

2. 停止容器

root@139-159-150-152:/data/myworkdir/container# docker stop 
mynginx1 
mynginx1 

3. 再次查看容器是否存在,发现容器自动删除了

root@139-159-150-152:/data/myworkdir/container# docker ps -a 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 

6.4 容器的自动重启


容器重启选项如下:

  • docker run --restart=no [容器名]:默认值不自动重启
  • docker run --restart=on-failure:3 [容器名]on-failure 若容器的退出状态非 0,则 docker 自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃
  • docker run --restart=always [容器名]always 容器退出时总是重启
  • docker run --restart=unless-stopped [容器名]unless-stopped 容器退出时总是重启,但不考虑 Docker 守护进程启动时就已经停止的容器
  • 如果容器启动时没有设置 --restart 参数,则通过下面命令进行更新:
    • docker update --restart=always [容器名]

实操:

  • 启动nginx服务,并设置always重启:

在这里插入图片描述

  • 可以通过inspect查看容器的RestartPolicy字段,可以看到关于重启的详细信息:

在这里插入图片描述

  • 通过exec交互式访问容器,然后退出:

在这里插入图片描述

  • 在另一个终端观察容器是否退出,发现容器任然在run,只不过启动时间变了:

在这里插入图片描述

  • stop该容器,发现设置容器并不能影响stop

在这里插入图片描述

总结:通过stop停止的容器,restart设置不起作用。


6.5 容器多个环境变量配置


  • 通过 --env-file 可以指定环境变量所在的文件:

在这里插入图片描述


6.6 容器执行单行命令


我们可以直接借助 Docker 的容器环境执行一些命令,比如容器中有某个命令而宿主机上没有这个时候借助容器可以完成某些任务。

  • 假设宿主机上没有ping命令:

在这里插入图片描述


7. 综合实战


7.1 MySQL容器化安装


1. 进入dockerhub,查找mysql镜像

  • 下载5.7的版本:

在这里插入图片描述

2. 拉到本地

在这里插入图片描述

  • 我们知道 msyql 的默认端口是 3306,而且有密码,查看官网的启动用例 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tagMYSQL_ROOT_PASSWORD=my-secret-pw 指定了 mysql 的密码信息。
  • 下面我们启动一个容器,密码设为123456:
root@Ubuntu22:/data/test# docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 8000:3306 -d mysql:5.7
458f21c72acf2f750a1ca90bd7079629f02efa3209cd4ab0d8f3baa43821cc4f
root@Ubuntu22:/data/test# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
458f21c72acf   mysql:5.7   "docker-entrypoint.s…"   5 seconds ago   Up 5 seconds   33060/tcp, 0.0.0.0:8000->3306/tcp, [::]:8000->3306/tcp   mysql
  • 启动 bash,并登入 mysql
root@Ubuntu22:/data/test# docker exec -it mysql bash
bash-4.2# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44 MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
  • 建库建表,并插入数据,验证数据库功能能否正常使用:
mysql> create database test;
Query OK, 1 row affected (0.00 sec)mysql> use test;
Database changed
mysql> create table test_user(name varchar(50), age int);
Query OK, 0 rows affected (0.02 sec)mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test_user      |
+----------------+
1 row in set (0.00 sec)mysql> insert into test_user values('zhangsan', '99');
Query OK, 1 row affected (0.01 sec)mysql> select * from test_user;
+----------+------+
| name     | age  |
+----------+------+
| zhangsan |   99 |
+----------+------+
1 row in set (0.00 sec)
  • 测试远程连接:

在这里插入图片描述

  • 正常连接:

在这里插入图片描述


7.2 Redis容器化安装


1. 官网查找可用镜像

在这里插入图片描述

  • 然后用 docker pull 拉下来。

2. 启动一个redis容器

root@Ubuntu22:/data/test# docker images
REPOSITORY           TAG               IMAGE ID       CREATED         SIZE
redis                7.0               7705dd2858c1   17 months ago   109MB
mysql                5.7               5107333e08a8   22 months ago   501MB
nginx                1.23.4            a7be6198544f   2 years ago     142MB
18135631780/mytest   busybox-v1.36.0   af2c3e96bcf1   2 years ago     4.86MB
busybox              1.36.0            af2c3e96bcf1   2 years ago     4.86MB
nginx                1.24.0            6c0218f16876   2 years ago     142MB
centos               7                 eeb6ee3f44bd   4 years ago     204MB
root@Ubuntu22:/data/test# docker run --name redis -p 8300:6379 -d redis:7.0
6dba82f21c67735d0aa82aacff5d86e14f699c59ac3f919f0e8f52d580a73306
root@Ubuntu22:/data/test# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                         NAMES
6dba82f21c67   redis:7.0   "docker-entrypoint.s…"   4 seconds ago   Up 4 seconds   0.0.0.0:8300->6379/tcp, [::]:8300->6379/tcp   redis

3. 交互式连接redis容器,测试相关功能

root@Ubuntu22:/data/test# docker exec -it redis bash
root@6dba82f21c67:/data# redis-cli
127.0.0.1:6379> set mykey 1
OK
127.0.0.1:6379> get mykey
"1"
127.0.0.1:6379> 

7.3 C++容器制作


1. 下载CentOS7镜像

在这里插入图片描述

2. 交互式启动该容器,并更新镜像源为中科大源

root@Ubuntu22:/data/test# docker run -it --name centos7 centos:7 bash
[root@7337ccd46d83 /]# sed -i.bak \
>   -e 's|^mirrorlist=|#mirrorlist=|g' \
>   -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos-vault/centos|g' \
>   /etc/yum.repos.d/CentOS-Base.repo
[root@7337ccd46d83 /]# yum makecache
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
base                                                                                                           | 3.6 kB  00:00:00     
extras                                                                                                         | 2.9 kB  00:00:00     
updates                                                                                                        | 2.9 kB  00:00:00     
(1/10): base/7/x86_64/group_gz                                                                                 | 153 kB  00:00:00     
(2/10): base/7/x86_64/primary_db                                                                               | 6.1 MB  00:00:01     
(3/10): base/7/x86_64/other_db                                                                                 | 2.6 MB  00:00:01     
(4/10): extras/7/x86_64/filelists_db                                                                           | 305 kB  00:00:03     
(5/10): extras/7/x86_64/other_db                                                                               | 154 kB  00:00:00     
(6/10): extras/7/x86_64/primary_db                                                                             | 253 kB  00:00:03     
(7/10): base/7/x86_64/filelists_db                                                                             | 7.2 MB  00:00:19     
(8/10): updates/7/x86_64/filelists_db                                                                          |  14 MB  00:00:13     
(9/10): updates/7/x86_64/other_db                                                                              | 1.6 MB  00:00:01     
(10/10): updates/7/x86_64/primary_db                                                                           |  27 MB  00:00:21     
Metadata Cache Created

3. 下载gcc

  • yum install gcc

4. 制作hello docker镜像

  • 这个镜像的功能仅仅只是输出一个hello docker!
[root@7337ccd46d83 /]# mkdir test
[root@7337ccd46d83 /]# cd test
[root@7337ccd46d83 test]# ls
[root@7337ccd46d83 test]# vim demo.c
bash: vim: command not found
[root@7337ccd46d83 test]# vi demo.c
[root@7337ccd46d83 test]# cat demo.c 
#include <stdio.h>int main()
{printf("hello docker!\n");return 0;
}
[root@7337ccd46d83 test]# gcc demo.c 
[root@7337ccd46d83 test]# ./a.out 
hello docker!
[root@7337ccd46d83 test]# 

http://www.dtcms.com/a/549093.html

相关文章:

  • 行业电子商务网站建设房地产网站开发公司电话
  • LangChain 提示模板之少样本示例(二)
  • Product Hunt 每日热榜 | 2025-10-30
  • Spring MVC核心概念
  • 鸿蒙HDF框架源码分析
  • Springboot旅游管理系统8cx8xy5m(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • ppt免费制作网站如何建设网站山东济南兴田德润官网
  • 如何获取网站根目录链接诸城做网站的
  • GPT-0: Attention+Transformer+可视化
  • 告别“人眼扫描”:EasyGBS智能搜索功能助力重塑海量视频监控管理效率
  • 【ubuntu】ubuntu系统如何快速删除当前用户的配置
  • dz地方门户网站制作南昌seo招聘信息
  • 灵犀科技网站开发湖南网站建设的公司排名
  • 沈阳装修公司网站建设做网站只用前端知识可以吗
  • ELK es+logstash
  • Java 大视界 -- Java 大数据在智能医疗远程康复数据管理与康复方案个性化定制实战(430)
  • 【C#】XtraMessageBox(DevExpress)与MessageBox(WinForms 标准库)的区别
  • 石家庄物流网站建设北京公司网站建设价格
  • 网络编程入门
  • 每日一个C语言知识:C 错误处理
  • 基础建设的网站有哪些内容网页制作基础教程费
  • 建站工具哪个好用深圳网站建设定制平台
  • 2048游戏笔记3 游戏开始与结束 cocos3.8.7
  • 【AI WorkFow】n8n 源码分析-核心结构体设计思考(六)
  • 网站诊断内容工程建设教育培训
  • Opencv(四):自适应二值化
  • GitHub 热榜项目 - 日榜(2025-10-30)
  • 网络:4.应用层自定义协议与序列化
  • Word崩溃打不开?实测三款Word文档修复工具!
  • 哪个网站做签约插画师好网站域名过期后续费多长时间生效