岗位:容器运维工程师
【了解】docker相关背景
【了解】容器底层原理
【掌握】容器相关命令
【掌握】docker的网络模式
【掌握】镜像相关的操作
-
容器技术概述
容器技术是一种轻量级的虚拟化技术,它通过操作系统级别的隔离机制(Linux namespace),将应用程序及其依赖环境(如代码、运行时、系统工具、库等)打包成一个独立、可移植的单元(称为容器),从而实现快速部署、跨环境一致运行和资源高效利用,是一种进程级别的虚拟化。
-
容器的诞生和发展历程
-
容器技术诞生的背景 —— 为什么会有 Docker?
在 Docker 之前,软件交付和部署有几个痛点:
- 开发环境和生产环境不一致
- 开发在 Windows,部署在 Linux,经常出现 “我本地能跑,线上跑不起来”。
- 传统虚拟机太重
- 虚拟机(VMware、VirtualBox)需要跑完整的操作系统(几十 GB),启动慢,资源浪费大。
- 应用依赖管理复杂
- 一个应用可能依赖不同版本的库(PHP 7.4 vs PHP 8.1),在同一台服务器上难以共存。
➡️ 于是人们需要一种 轻量、隔离、可移植 的解决方案 —— 这就是 容器化(Container)。
-
Docker 的诞生(2013 年)

- 2013 年,dotCloud 公司(一家 PaaS 提供商)开源了 Docker。
- 基于 Linux 的 cgroups + namespace 技术(实际上 Linux 已有容器化基础,但门槛高)。
- Docker 提供了:
- 镜像(Image):打包应用和依赖,就是启动容器最基本的环境,只读层
- 容器(Container):镜像的运行实例,可写层
- 仓库(Registry):镜像的分发(如 Docker Hub)
一句话解读Docker的作用:
Docker 把应用及其运行环境一起打包,实现环境即代码,解决了开发、测试、生产环境不一致的问题。
-
Docker 的发展历程
-
2013 - 2014
- Docker 开源,迅速走红,成为 DevOps 的明星项目。
-
2015
- Docker 公司成立,围绕生态打造 Docker Engine、Docker Hub。
- 容器编排问题开始被关注(Swarm、Mesos、Kubernetes 出现)。
-
2017
- Kubernetes(K8s)成为事实上的容器编排标准,Swarm 渐渐被边缘化。
- Docker 更多专注于开发者工具。
-
2019 - 2020
- Kubernetes 默认容器运行时改用 containerd(从 Docker 剥离出的核心)。
- 业界出现“Kubernetes 不再使用 Docker 运行时”的新闻,但实际 Docker 生态依旧繁荣。
-
现在(2025)
- Docker 仍是最流行的容器开发工具。
- Kubernetes 主导容器编排(多容器管理、跨主机的容器管理),Docker 常用作开发、打包、测试(单机版)。
- 镜像格式(OCI 标准)已经统一,Docker 只是其中的实现之一。
- 现在Kubernetes 可以使用一切支持 CRI(Container Runtime Interface,容器运行时接口)的容器运行时,而这些运行时通常又遵循 OCI 标准。
-
Docker 的价值
- 一次打包,到处运行
- 轻量:容器比虚拟机快、占用资源少
- 标准化:镜像规范化,交付更容易
- 生态完善:Docker Compose、Docker Hub、与 CI/CD 系统集成
总结:docker就是目前最火热的能实现容器技术的软件,使用go(golang)语言开发。
参考官方文档地址:https://www.docker.com/
-
未来趋势
-
云原生生态(Cloud Native)
- Docker 已成为 开发者工具,而生产部署更多依赖 Kubernetes + containerd/cri-o。
-
无服务器化(Serverless)
- 结合容器技术,应用无需关心底层运行环境。
-
轻量化运行时
- 如 Podman、CRI-O、Firecracker(AWS Lambda 用)正在兴启
-
容器原理和运行机制
-
容器技术实现的底层原理
容器原理的核心技术:
Cgroups(control groups)----资源控制组
Namespace----名称空间(命名空间)对系统资源的隔离技术(7大名称空间,命名空间)
Union Filesystem(联合文件系统)
-
Namespace(命名空间)
Namespace(命名空间)是 Linux 内核提供的核心隔离机制,允许进程、用户、网络等系统资源被分割成多个独立的视图,使得每个 Namespace 中的进程只能看到该 Namespace 内的资源,从而实现容器之间的隔离。容器技术正是基于 Namespace 实现了轻量级的虚拟化。
-
进程隔离(PID Namespace):每个容器有自己的进程 ID 编号,看不到宿主机或其他容器的进程。
-
网络隔离(Net Namespace):每个容器有独立的网络栈(IP、端口、路由表、防火墙规则等)。
-
文件系统隔离(Mount Namespace):容器可以有自己的
/根文件系统,不影响宿主机。 -
主机名隔离(UTS Namespace):容器可以设置自己的主机名(
hostname)。 -
用户隔离(User Namespace):容器内可以使用不同的用户 ID 映射,提升安全性。
-
进程间通信隔离(IPC Namespace):隔离 System V IPC 和 POSIX 消息队列。
-
时间(Time Namespace)(Linux 5.6+):允许容器使用独立的时间设置
-
Cgroups(控制组)
Linux Cgroups(Control Groups) 实现容器的资源隔离与限制,包括 CPU、内存、磁盘 I/O 等资源的分配和管理,避免单一容器耗尽宿主机资源(稳定性)、防止安全攻击(安全性)。
启动示例:启动容器时限制cpu和内存使用量
docker run -d \
--name=my_nginx \
--cpus=1.5 \ # 限制使用 1.5 个 CPU 核心
--memory=512m \ # 限制内存为 512MB
-p 80:80 \ # 映射端口 80
nginx:latest
-
Union Filesystem(联合文件系统)
Union Filesystem(联合文件系统)是 Docker 镜像和容器分层存储的核心技术,它允许多个文件系统(或目录)透明叠加(overlay),形成一个统一的视图
(1) 分层(Layers)结构
- 镜像层(Image Layers):Docker 镜像由多个只读层组成,每层代表一次修改(如安装软件、添加文件)。
- 容器层(Container Layer):容器启动时,在镜像层之上添加一个可写层(存储运行时修改的数据)。
(2) 联合挂载(Union Mount)
- 将多个目录(镜像层 + 容器层)合并挂载到一个虚拟目录,用户看到的是最终叠加结果。
- 写时复制(Copy-on-Write, CoW): 当容器修改文件时,联合文件系统会从底层的只读层复制文件到可写层,再修改(避免直接修改镜像层)。

(3) 常见实现技术
Docker支持多种联合文件系统驱动,不同驱动实现细节略有差异:
文件系统类型特点Linux 内核要求OverlayFS性能高,实现简单(Docker 默认推荐)≥ 3.18AUFS早期 Docker 默认驱动,兼容性好但未合并到内核主线需额外安装模块Device Mapper基于块设备,适合旧内核(如 CentOS 6)通用Btrfs/ZFS支持高级功能(快照、压缩),但配置复杂需特定文件系统支持

2.1.4【掌握】面试题:容器和(传统)虚拟化的区别
在docker环境中,没有操作系统,容器就是一个进程
虚拟化:虚拟机、每一个虚拟机可以装独立的操作系统
容器:不需要独立的操作系统,只有一个docker进程和宿主机共享操作系统,启动容器就像启动一个进程,简单高效

3.三大组将与Docker的安装
Docker 的三大组件
容器、镜像,和仓库;

Docker-CE版本
Docker企业版(EE):专为企业的发展和IT团队建立。docker-ee为企业提供最安全的容器平台。
Docker社区版(CE):
- Docker CE 的核心特点【掌握】
- 特性说明免费开源无需付费,代码公开(部分组件基于 Apache 2.0 许可证)。跨平台支持支持 Linux、Windows 10/11(需 WSL2)、macOS(基于虚拟机)。核心功能完整包含镜像构建、容器运行、网络管理、存储卷等基础功能。定期更新每季度发布稳定版(Stable),每月发布边缘版(Edge,含实验性功能)。社区驱动依赖开发者社区贡献和反馈,无企业级技术支持。
- Docker CE 的组件
- 组件作用Docker Daemon后台服务(dockerd),管理容器生命周期和镜像。Docker CLI命令行工具(docker),用于与 Daemon 交互。Docker Compose工具(docker-compose),通过 YAML 文件定义多容器应用。Docker Engine包含 Daemon + CLI 的核心运行时。Containerd默认的底层容器运行时(从 Docker 剥离,符合 OCI 标准)。

-
服务器环境准备
-
操作系统
CentOS Stream 9
-
修改主机名和hosts
[root@node1 ~]# dnf -y install vim bash-completion net-tools #装包修改主机名
# hostnamectl set-hostname web01.itcast.cn
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.88.101 web01 web01.itcast.cn
-
关闭防火墙与SELinux
扩展:CentOS Stream 9 => systemctl
关闭防火墙与SELinux:
[root@web01 ~]# systemctl stop firewalld
[root@web01 ~]# systemctl disable firewalld
[root@web01 ~]# systemctl is-enabled firewalld.service
disabled
[root@web01 ~]# setenforce 0
[root@web01 ~]# getenforce
Disabled
[root@web01 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
等价于
# vim /etc/selinux/config
22: SELINUX=disabled
-
配置清华yum源 (了解)
帮助手册:https://mirrors.tuna.tsinghua.edu.cn/help/centos-stream/
yum或者dnf => 系统/etc/yum.repos.d目录,找到镜像仓库配置文件 => 请求远程仓库
配置方案:阿里镜像站、腾讯镜像站、华为镜像站、清华镜像站(推荐)
CentOS Stream 9 默认启用了包管理工具 dnf,其是 yum 包管理工具的替代品。dnf 与 yum 大部分的命令都是通用的,dnf 也使用 /etc/yum.repos.d/ 进行镜像配置。
CentOS Stream 9 中源被整合入两个文件 centos.repo 和 centos-addons.repo,由于文件中不包含 baseurl 字段,需要手动插入,通过文本替换修改源的方法较为复杂,也可以选择直接复制最后的替换结果覆盖源文件。
将这段代码保存为一个文件,例如 update_mirror.pl
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
my $mirrors = 'https://mirrors.tuna.tsinghua.edu.cn/centos-stream';
if (@ARGV < 1) {
die "Usage: $0 <filename1> <filename2> ...\n";
}
while (my $filename = shift @ARGV) {
my $backup_filename = $filename . '.bak';
rename $filename, $backup_filename;
open my $input, "<", $backup_filename;
open my $output, ">", $filename;
while (<$input>) {
s/^metalink/# metalink/;
if (m/^name/) {
my (undef, $repo, $arch) = split /-/;
$repo =~ s/^\s+|\s+$//g;
($arch = defined $arch ? lc($arch) : '') =~ s/^\s+|\s+$//g;
if ($repo =~ /^Extras/) {
$_ .= "baseurl=${mirrors}/SIGs/\$releasever-stream/extras" . ($arch eq 'source' ? "/${arch}/" : "/\$basearch/") . "extras-common\n";
} else {
$_ .= "baseurl=${mirrors}/\$releasever-stream/$repo" . ($arch eq 'source' ? "/" : "/\$basearch/") . ($arch ne '' ? "${arch}/tree/" : "os") . "\n";
}
}
print $output $_;
}
}
然后,在命令行中使用以下命令来执行它:
dnf install perl-autodie -y
perl ./update_mirror.pl /etc/yum.repos.d/centos*.repo
最后,更新软件包缓存:
# 使用 dnf
dnf clean all && dnf makecache
# 使用 yum
yum clean all && yum makecache
-
设置网络
[root@web01 ~]# ls /etc/NetworkManager/system-connections/
[root@web01 ~]# sudo vi /etc/NetworkManager/system-connections/ens160.nmconnection
------------------------------------------------------ 设置片段开始 -------------------------------------------------------------
[ipv4]
method=manual
addresses=192.168.88.101/24
gateway=192.168.88.2
dns=8.8.8.8;
[ipv6]
method=ignore
------------------------------------------------------ 设置结束 -------------------------------------------------------------
[root@web01 ~]# nmcli connection show
[root@web01 ~]# nmcli connection reload
[root@web01 ~]# nmcli connection up ens160
-
ntpdate时间同步
centos镜像源有很多种,centos-base.repo基础源,epel-release扩展源
ntpdate手工同步操作 => 人为实现时间同步
[root@web01 ~]# dnf install epel-release -y
[root@web01 ~]# dnf install ntpsec -y
[root@web01 ~]# ntpdate cn.ntp.org.cn
-----------------------------------------
[root@web01 ~]# yum install chrony -y
[root@web01 ~]# systemctl enable chronyd --now
[root@web01 ~]# systemctl status chronyd
自行配置chrony时间同步
-
Docker软件安装

-
yum源
docker-ce的yum源下载(任选其一)
- **方式一:**下载docker官方ce版(国外服务器),速度很慢,不推荐
[root@web01 ~]# yum install wget -y
[root@web01 ~]# wget https://download.docker.com/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
- **方式二:**使用aliyun的docker-ce源(中国服务器)
[root@web01 ~]# yum install wget -y
[root@web01 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum仓库路径:ls /etc/yum.repos.d/
-
版本选择和安装
[root@web01 ~]# dnf list docker-ce --showduplicates | sort -r # 查看可安装的版本
[root@web01 ~]# dnf install docker-ce -y
PS: 注意要安装docker-ce版,不要安装docker(否则可能安装1.13老版本)
-
启动服务
[root@web01 ~]# systemctl start docker
[root@web01 ~]# systemctl enable docker
[root@web01 ~]# systemctl status docker

-
查看版本信息
[root@web01 ~]# docker -v
Docker version 28.0.1, build 068a01e
[root@web01 ~]# docker info

4.【重点】Docker镜像管理操作
4.1 先配置代理拉取镜像
- 因国内已经无法正常访问hub.docker.com官方镜像仓库,需要使用代理进行访问,要进行代理配置
添加代理配置
[root@web01 /]# vim /etc/docker/daemon.json
{
"registry-mirrors":[
"https://docker.1panelproxy.com",
"https://hub.openeeds.com",
"https://dockerproxy.1panel.live",
"https://docker.1panel.live",
"https://proxy.1panel.live",
"https://docker.m.daocloud.io",
"https://noohub.ru",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com",
"https://5tqw56kt.mirror.aliyuncs.com",
"https://docker.1panel.live",
"http://mirrors.ustc.edu.cn/",
"http://mirror.azure.cn/",
"https://hub.rat.dev/",
"https://docker.ckyl.me/",
"https://docker.chenby.cn",
"https://docker.hpcloud.cloud",
"https://docker.m.daocloud.io"
]
}
重新加载系统服务
[root@web01 /]# systemctl daemon-reload
重启服务
[root@web01 /]# systemctl restart docker
4.2 镜像管理命令
镜像管理命令说明docker images查看本机镜像docker pull 镜像名称:标签下载镜像docker save 镜像名称:标签 -o 文件名备份镜像为tar包(导出镜像)docker load -i 备份文件名称导入备份的镜像文件docker history 镜像名称:标签查看镜像的制作历史
docker如何标识一个镜像:名称:标签 镜像的id
busybox:latest 是一个集成了数百个常用 Linux 命令的精简工具集,它以极小体积提供了一个轻量级的 Linux 环境,被誉为“Linux 系统的瑞士军刀”
pull、images、histroy
# 下载 busybox:latest 镜像
[root@docker ~]# docker pull busybox:latest
# 下载 nginx 镜像
[root@web01 ~]# docker pull nginx:latest
# 查看本机镜像
[root@docker ~]# docker images
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
busybox:latest fd8d9aa63ba2 6.74MB 2.23MB
# 查看镜像的制作历史
[root@web01 ~]# docker history nginx:latest
IMAGE CREATED CREATED BY SIZE COMMENT
5aca99593157 9 days ago CMD ["nginx" "-g" "daemon off;"] 0B buildkit.dockerfile.v0
<missing> 9 days ago STOPSIGNAL SIGQUIT 0B buildkit.dockerfile.v0
<missing> 9 days ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 9 days ago ENTRYPOINT ["/docker-entrypoint.sh"] 0B buildkit.dockerfile.v0
<missing> 9 days ago COPY 30-tune-worker-processes.sh /docker-ent… 8.19kB buildkit.dockerfile.v0
<missing> 9 days ago COPY 20-envsubst-on-templates.sh /docker-ent… 4.1kB buildkit.dockerfile.v0
<missing> 9 days ago COPY 15-local-resolvers.envsh /docker-entryp… 4.1kB buildkit.dockerfile.v0
<missing> 9 days ago COPY 10-listen-on-ipv6-by-default.sh /docker… 4.1kB buildkit.dockerfile.v0
<missing> 9 days ago COPY docker-entrypoint.sh / # buildkit 4.1kB buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c set -x && groupadd --syst… 85.7MB buildkit.dockerfile.v0
<missing> 9 days ago ENV DYNPKG_RELEASE=1~trixie 0B buildkit.dockerfile.v0
<missing> 9 days ago ENV PKG_RELEASE=1~trixie 0B buildkit.dockerfile.v0
<missing> 9 days ago ENV ACME_VERSION=0.4.1 0B buildkit.dockerfile.v0
<missing> 9 days ago ENV NJS_RELEASE=1~trixie 0B buildkit.dockerfile.v0
<missing> 9 days ago ENV NJS_VERSION=0.9.9 0B buildkit.dockerfile.v0
<missing> 9 days ago ENV NGINX_VERSION=1.31.1 0B buildkit.dockerfile.v0
<missing> 9 days ago LABEL maintainer=NGINX Docker Maintainers <d… 0B buildkit.dockerfile.v0
<missing> 2 weeks ago # debian.sh --arch 'amd64' out/ 'trixie' '@1… 85.9MB debuerreotype 0.17
save,load
# 备份 rockylinux:8.5 镜像为 tar 包
[root@docker ~]# docker save busybox:latest -o busybox.tar
# 使用备份文件恢复镜像
[root@docker ~]# docker load -i nginx.tar.gz
5.【重点】容器管理的相关命令
器管理命令说明docker run -it(d) 镜像名称:标签创建容器docker ps查看正在运行容器的信息docker inspect 镜像名称|容器名称查询(容器/镜像)的详细信息docker [start|stop|restart] 容器id启动、停止、重启容器docker exec -it 容器ID 启动命令在容器内执行命令docker cp 源路径1 目标路径2实现容器内文件和宿主机(真机)文件的相互拷贝
选项的含义:-i 交互式 -t tty终端 -it 打开一个可交互的终端 -d 在后台运行(起一个nginx,httpd,php服务类型的容器需要加-d选项)
容器隔离的验证(结合前面底层原理验证)
[root@web01 ~]# docker run -it --name minlinux busybox:latest
/ # hostname
5925be3d5673
/ # pwd
/
/ # ls /
bin dev etc home lib lib64 proc root sys tmp usr var
/ # cat /etc/shells
cat: can't open '/etc/shells': No such file or directory
/ # cat /etc/passwd | wc -l
9
/ # ps -ef
PID USER TIME COMMAND
1 root 0:00 sh
12 root 0:00 ps -ef
/ # date
Mon Jun 1 02:47:11 UTC 2026
/ # exit
[root@web01 ~]#
5.1 run、itd、-p、--name
[root@web01 ~]# docker run -it --name my-nginx1 -p 8080:80 nginx:latest #前台启动占用当前终端,ctrl + c 结束一下
[root@web01 ~]# docker run -itd --name my-nginx2 -p 8080:80 nginx:latest
参数说明:
-i # 交互、可以与容器交互、输入命令等
-t (--tty):分配一个终端(TTY)
-d:后台运行容器(守护模式)。
--name my-nginx:为容器命名(替代自动生成的ID)。
-p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口。
nginx:latest:使用官方 Nginx 镜像的最新版本。
可通过浏览器访问http://宿主机IP:8080测试
5.2 -v 卷映射,挂载自定义配置与静态文件
注意:文件映射到文件、目录映射到目录
创建两个需要挂载的宿主机目录
[root@web01 ~]# mkdir -p /opt/nginx/{conf,html}
从nginx容器把conf.d及里面的文件复制到/opt/nginx/conf目录下面
[root@web01 ~]# docker cp nginx:/etc/nginx/conf.d /opt/nginx/conf
Successfully copied 3.58kB to /opt/nginx/conf
[root@web01 ~]# ls /opt/nginx/conf/
conf.d
[root@web01 ~]# ls /opt/nginx/conf/conf.d/
default.conf
在/opt/nginx/html创建一个测试页面
[root@web01 ~] echo "this is the test web01 server" > /opt/nginx/html/index.html
[root@web01 ~]# tree /opt/nginx/
/opt/nginx/
├── conf
│ └── conf.d
│ └── default.conf
└── html
└── index.html
3 directories, 2 files
[root@web01 ~]#
运行my-nginx2026容器
[root@web01 ~] docker run -d \
--name my-nginx2026 \
-p 2026:80 \
-v /opt/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /opt/nginx/html:/usr/share/nginx/html \
nginx:latest
参数说明:
新增参数:
-v /opt/nginx/conf/conf.d:/etc/nginx/conf.d:挂载自定义 Nginx 配置文件。
-v /opt/nginx/html:/usr/share/nginx/html:挂载静态网页文件目录。
客户端访问测试、能看到自定义的页面内容
5.3 -e、--cpus、--restart设置环境变量与资源限制并实现故障自动恢复
[root@web01 ~] docker run -d \
--name my-nginx01 \
-p 2027:80 \
-v /opt/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /opt/nginx//html:/usr/share/nginx/html \
-e "TZ=Asia/Shanghai" \
--memory="512m" \
--cpus="1" \
--restart=always \
nginx:latest
参数解释:
-e "TZ=Asia/Shanghai":设置容器时区。(environment )
--memory="512m":限制内存为 512MB。
--cpus="1":限制使用 1 个 CPU 核心。
--restart=unless-stopped 容器退出时自动重启(除非手动停止)
=always:无论容器退出状态如何(包括正常退出),无限次重启(不含docker stop)
=on-failure[:max-retries]:当容器 非正常退出(返回非0状态码) 时自动重启,
可选的 :max-retries 限制最大重启次数(如 on-failure:3)
触发 always 的场景:
进程崩溃: 比如 Nginx 内部由于代码或配置错误 OOM(内存溢出)挂了。
强制杀死: 比如你在宿主机用 kill -9 杀掉了容器进程,而没告诉 Docker 守护进程。
系统重启: 如果宿主机重启了,由于设置了 always,Docker 服务启动后会自动把这个容器拉起来。
注:正常优雅的docker stop 是不会触发always的
# 启动一个完全不挂载任何目录、不限制 CPU 的纯净容器
docker run -d --name test-restart --restart always nginx:latest
# 确认它跑起来了
docker ps | grep test-restart
重启服务器测试always自动触发
5.4 network create 使用自定义网络
手动创建要使用的网络并在启动的时候进行网络指定
注意:容器名称和端口不要冲突、/opt/nginx/html目前权限要设置成755
# 创建自定义网络
[root@web01 ~] docker network ls
NETWORK ID NAME DRIVER SCOPE
268687e3a7e3 bridge bridge local
52b1ef9978da host host local
d9e3001e730a none null local
[root@web01 ~]# docker network create my-network
f3623c616725e95e27bc668f203f50caf20f0b53a64278827e8791c1374a17a6
[root@web01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
4c4c0eb4e1b7 bridge bridge local
52b1ef9978da host host local
f3623c616725 my-network bridge local
d9e3001e730a none null local
[root@web01 ~]#
# 启动容器并加入网络
[root@web01 ~] docker run -d \
--name my-nginx02 \
-p 2028:80 \
-v /opt/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /opt/nginx//html:/usr/share/nginx/html \
-e "TZ=Asia/Shanghai" \
--memory="512m" \
--cpus="1" \
--restart=unless-stopped \
--network=my-network \
nginx:latest
5.5 容器日常管理
查看容器启动、停止、重启、和详细信息 start stop restart inspect
#查看运行的容器
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4139c3d3ec6d nginx:latest "/docker-entrypoint.…" 37 minutes ago Up 37 minutes 0.0.0.0:2028->80/tcp, [::]:2028->80/tcp my-nginx02
7a4f9144738c nginx:latest "/docker-entrypoint.…" About an hour ago Up 40 minutes 80/tcp test-restart
aaedccb3cf2d nginx:latest "/docker-entrypoint.…" About an hour ago Up 40 minutes 0.0.0.0:2027->80/tcp, [::]:2027->80/tcp my-nginx01
[root@web01 ~]#
#查看所有的容器包括退出和停止的容器
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4139c3d3ec6d nginx:latest "/docker-entrypoint.…" 37 minutes ago Up 37 minutes 0.0.0.0:2028->80/tcp, [::]:2028->80/tcp my-nginx02
7a4f9144738c nginx:latest "/docker-entrypoint.…" About an hour ago Up 40 minutes 80/tcp test-restart
aaedccb3cf2d nginx:latest "/docker-entrypoint.…" About an hour ago Up 40 minutes 0.0.0.0:2027->80/tcp, [::]:2027->80/tcp my-nginx01
61a7e3da0b16 nginx:latest "/docker-entrypoint.…" 3 hours ago Exited (0) 41 minutes ago my-nginx2026
44dc9e141520 nginx:latest "/docker-entrypoint.…" 3 hours ago Exited (0) 41 minutes ago my-nginx2
bb5a9d0bda56 nginx:latest "/docker-entrypoint.…" 3 hours ago Exited (0) 3 hours ago my-nginx1
3987ca3bb6ce nginx:latest "/docker-entrypoint.…" 4 hours ago Exited (0) 4 hours ago nginx
[root@web01 ~]#
#容器启动、重启、停止、删除,通过容器名称或者容器ID,删除容器必须先停止容器
[root@web01 ~]# docker start my-nginx1
my-nginx1
[root@web01 ~]# docker stop my-nginx1
my-nginx1
[root@web01 ~]# docker ps | grep my-nginx1
[root@web01 ~]# docker ps -a | grep my-nginx1
bb5a9d0bda56 nginx:latest "/docker-entrypoint.…" 4 hours ago Exited (137) 37 seconds ago my-nginx1
[root@web01 ~]# docker restart my-nginx1
my-nginx1
[root@web01 ~]# docker ps | grep my-nginx1
bb5a9d0bda56 nginx:latest "/docker-entrypoint.…" 4 hours ago Up 1 second 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp my-nginx1
[root@web01 ~]#
#删除容器之前先要停止容器
[root@web01 ~]# docker stop my-nginx1
my-nginx1
[root@web01 ~]# docker rm my-nginx1
my-nginx1
[root@web01 ~]# docker ps -a | grep my-nginx1
[root@web01 ~]#
#查看容器的详细信息,可以看到容器运行状态,挂载目录,网络地址,宿主机对应一个的PID号等
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4139c3d3ec6d nginx:latest "/docker-entrypoint.…" 41 minutes ago Up 41 minutes 0.0.0.0:2028->80/tcp, [::]:2028->80/tcp my-nginx02
7a4f9144738c nginx:latest "/docker-entrypoint.…" About an hour ago Up 44 minutes 80/tcp test-restart
aaedccb3cf2d nginx:latest "/docker-entrypoint.…" About an hour ago Up 44 minutes 0.0.0.0:2027->80/tcp, [::]:2027->80/tcp my-nginx01
[root@web01 ~]# docker inspect my-nginx01
[root@web01 ~]#
#查看容器的日志,可以通过日志进行问题排查,查看最新的20行
[root@web01 ~]# docker logs --tail 20 my-nginx01
2026/03/26 16:58:46 [notice] 1#1: signal 29 (SIGIO) received
2026/03/26 16:58:46 [notice] 1#1: signal 17 (SIGCHLD) received from 23
2026/03/26 16:58:46 [notice] 1#1: worker process 23 exited with code 0
#查看容器时时输出日志
[root@web01 ~]# docker logs -f my-nginx01
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
^C[root@web01 ~]#
5.6 登录容器并交互式操作
可以登录一个正常运行的容器并在里面交互的执行系统命令
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4139c3d3ec6d nginx:latest "/docker-entrypoint.…" 55 minutes ago Up 55 minutes 0.0.0.0:2028->80/tcp, [::]:2028->80/tcp my-nginx02
7a4f9144738c nginx:latest "/docker-entrypoint.…" About an hour ago Up 58 minutes 80/tcp test-restart
aaedccb3cf2d nginx:latest "/docker-entrypoint.…" About an hour ago Up 58 minutes 0.0.0.0:2027->80/tcp, [::]:2027->80/tcp my-nginx01
[root@web01 ~]# docker exec -it my-nginx01 /bin/bash
root@aaedccb3cf2d:/# ls
bin docker-entrypoint.d home media proc sbin tmp
boot docker-entrypoint.sh lib mnt root srv usr
dev etc lib64 opt run sys var
root@aaedccb3cf2d:/#
#容器运行时必须指定-it参数,-i (--interactive):保持标准输入(STDIN)打开,允许输入。-t (--tty):分配一个伪终端(TTY),提供类似 Shell 的交互体验。
5.7 容器和宿主机之间文件拷贝
从容器内部复制文件到宿主机
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4139c3d3ec6d nginx:latest "/docker-entrypoint.…" 56 minutes ago Up 56 minutes 0.0.0.0:2028->80/tcp, [::]:2028->80/tcp my-nginx02
7a4f9144738c nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp test-restart
aaedccb3cf2d nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:2027->80/tcp, [::]:2027->80/tcp my-nginx01
[root@web01 ~]# docker cp my-nginx01:/etc/nginx/nginx.conf ./
Successfully copied 2.56kB to /root/./
[root@web01 ~]# ls
nginx.conf
[root@web01 ~]# cat nginx.conf
user nginx;
worker_processes auto;
... ....
[root@web01 ~]#
从宿主机复制文件到容器内部
[root@web01 ~]# docker cp /etc/fstab my-nginx01:/opt
Successfully copied 2.56kB to my-nginx01:/opt
[root@web01 ~]# docker exec -it my-nginx01 /bin/bash
root@aaedccb3cf2d:/# ls /opt
fstab
root@aaedccb3cf2d:/# cat /opt/fstab
... ....
5.8 批量删除停止的容器和僵尸容器
#筛选出状态异常的容器(Exited、Dead、Created)
[root@web01 ~]# docker ps -a --filter "status=exited" --filter "status=dead" --filter "status=created"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61a7e3da0b16 nginx:latest "/docker-entrypoint.…" 3 hours ago Exited (0) About an hour ago my-nginx2026
44dc9e141520 nginx:latest "/docker-entrypoint.…" 4 hours ago Exited (0) About an hour ago my-nginx2
3987ca3bb6ce nginx:latest "/docker-entrypoint.…" 4 hours ago Exited (0) 4 hours ago nginx
[root@web01 ~]#
#直接使用以下命令强制清理
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4139c3d3ec6d nginx:latest "/docker-entrypoint.…" 59 minutes ago Up 59 minutes 0.0.0.0:2028->80/tcp, [::]:2028->80/tcp my-nginx02
7a4f9144738c nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp test-restart
aaedccb3cf2d nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:2027->80/tcp, [::]:2027->80/tcp my-nginx01
61a7e3da0b16 nginx:latest "/docker-entrypoint.…" 3 hours ago Exited (0) About an hour ago my-nginx2026
44dc9e141520 nginx:latest "/docker-entrypoint.…" 4 hours ago Exited (0) About an hour ago my-nginx2
3987ca3bb6ce nginx:latest "/docker-entrypoint.…" 4 hours ago Exited (0) 4 hours ago nginx
[root@web01 ~]# docker ps -aq --filter "status=exited" --filter "status=dead" --filter "status=created" | xargs -r docker rm -f
61a7e3da0b16
44dc9e141520
3987ca3bb6ce
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4139c3d3ec6d nginx:latest "/docker-entrypoint.…" 59 minutes ago Up 59 minutes 0.0.0.0:2028->80/tcp, [::]:2028->80/tcp my-nginx02
7a4f9144738c nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp test-restart
aaedccb3cf2d nginx:latest "/docker-entrypoint.…" 2 hours ago Up About an hour 0.0.0.0:2027->80/tcp, [::]:2027->80/tcp my-nginx01
[root@web01 ~]#
补充说明:xargs -r 选项的意思是前面结果为空的时候,自动退出不执行后面的命令
6.【掌握】面试题:Docker网络模型
五大网络驱动
Docker 的网络子系统采用可插拔的驱动架构,默认提供 5 种核心网络驱动:
-
bridge - 默认网络驱动(单机桥接网络)
默认网络模式
容器拥有独立 IP
同一 bridge 网络内的容器可以互相通信
访问外网依赖 NAT 转换
最常用的网络模式

-
host - 直接使用宿主机网络栈
特点:
没有独立 IP
没有 NAT
没有端口映射
网络性能最好
-
overlay - 用于跨主机容器网络(Swarm集群)
特点:
通过 VXLAN 等封装技术,(vlan)
将多个主机上的容器连接到同一个逻辑网络。
-
macvlan - 为容器分配MAC地址使容器看起来像网络中的一台真实主机(container容器,复用已有的容器的网络)
特点:
容器拥有独立 MAC
容器拥有局域网真实 IP
交换机可直接看到容器
-
none - 禁用所有网络
特点:
没有 eth0
没有 IP
没有网关
无法访问外网
无法与其他容器通信
类似于只有127.0.0.1的回环网络
Bridge 模式和Host模式对比
操作Bridge 模式Host 模式容器访问宿主机 IP需通过 docker0 网关(172.17.0.1)。直接使用 127.0.0.1 或宿主机 IP。外部访问容器端口需 -p 8080:80 映射端口。直接访问宿主机端口(如 80)。性能测试(延迟/吞吐量)较低(经过网桥/NAT)。接近原生进程
7.作业与参考答案
必做:注册一个阿里云账号、并登录完成和实名认证
-
容器运行Mysql、Redis、Mongodb
参考答案
-
MySQL 容器
docker run -d \
--name mysql8-none \
-e MYSQL_ROOT_PASSWORD=xxxxxxxx \ # 改成自己的密码
-v mysql_none_data:/var/lib/mysql \
mysql:8.0
-
Redis 容器
docker run -d \
--name redis7-none \
-v redis_none_data:/data \
redis:7.0-alpine \
redis-server --save 60 1 --loglevel warning
-
MongoDB 容器
docker run -d \
--name mongodb7-none \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=your_secure_password \
-v mongodb_none_data:/data/db \
mongo:7.0
-
验证与访问
你可以 进入容器内部 或通过 Docker Exec 执行命令来操作。
# 1. 查看容器状态
docker ps --filter "network=none"
# 2. 操作容器内部(示例:MySQL)
docker exec -it mysql8 mysql -p
# 3. 在宿主机执行容器内命令(示例:Redis)
docker exec redis7 redis-cli ping
# 4. MongoDB 内部操作
docker exec -it mongodb7 mongosh -u admin -p
8.【了解】拓展资料
镜像拉取【扩展】
网站推荐
渡渡鸟镜像

轩辕镜像

毫秒镜像
毫秒镜像
