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 不需要重启,容器转为停止状态。
 
- yes 需要重启,容器执行 
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 create | docker container create | 创建容器 | |
| docker run | docker container run | 运行容器 | 必须掌握 | 
| docker attach | docker container attach | 连接到正在运行中的容器。 | |
| docker commit | docker container commit | 将镜像提交为容器 | 必须掌握 | 
| docker cp | docker container cp | 在容器和宿主机之间拷贝 | 必须掌握 | 
| docker diff | docker container diff | 检查容器里文件结构的更改。 | |
| docker exec | docker container exec | 在运行的容器中执行命令 | 必须掌握 | 
| docker export | docker container export | 将容器导出为 tar | |
| docker container inspect | 查看容器详细信息 | 必须掌握 | |
| docker kill | docker container kill | 杀死容器 | 必须掌握 | 
| docker logs | docker container logs | 查看日志 | 必须掌握 | 
| docker ps | docker container ls, docker container list, docker container ps | 查看正在运行的进程 | 必须掌握 | 
| docker pause | docker container pause | 暂停进程 | |
| docker port | docker container port | 查看容器的端口映射 | |
| docker container prune | 删除停止的容器 | ||
| docker rename | docker container rename | 重命名容器 | |
| docker restart | docker container restart | 重启容器 | 必须掌握 | 
| docker rm | docker container rm, docker container remove | 删除容器 | 必须掌握 | 
| docker start | docker container start | 启动容器 | 必须掌握 | 
| docker stats | docker container stats | 查看资源占用信息 | 必须掌握 | 
| docker stop | docker container stop | 停止容器 | 必须掌握 | 
| docker top | docker container top | 查看某个容器的资源占用 | 必须掌握 | 
| docker unpause | docker container unpause | 继续运行容器 | |
| docker update | docker container update | 更新容器配置 | |
| docker wait | docker 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部分,发现通过export和import生成的镜像,缺少很多配置信息。和save,load相比,他们产生的镜像配置是残缺的。所以不建议使用这两个命令生成自定义镜像,而是save和load更合适,还适合远距离离线传输。
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:tag,MYSQL_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]# 
