一、Docker 核心概念
1. 什么是容器化技术
将应用 + 应用运行所需的全部依赖环境打包封装成一个镜像文件,这个镜像可以在任意安装了 Docker 的系统上直接运行,一次打包、到处运行。
Docker 是目前最主流的容器化技术实现。
2. 容器化 vs 虚拟机(VM)对比
表格
| 对比项 | 虚拟机 VM | Docker 容器 |
|---|---|---|
| 虚拟化层级 | 硬件级虚拟化,基于 Hypervisor | 系统级虚拟化,基于操作系统 |
| 原理 | 虚拟出整套硬件,每个虚拟机有独立的内核系统 | 共享宿主机内核,用 namespace 和 cgroup 做隔离 |
| 资源利用率 | 低,虚拟硬件 + 系统占用大量资源 | 高,只有应用本身,没有额外系统开销 |
| 启动速度 | 分钟级 | 秒级 |
| 安全性 / 稳定性 | 更高,硬件级隔离 | 稍低,共享内核隔离 |
3. Docker 两大核心底层技术
namespace 命名空间:实现隔离
让每个容器觉得自己有独立的一套系统环境,互相看不见:
- PID namespace:进程隔离,容器里的进程和宿主机不冲突
- NET namespace:网络隔离,每个容器有独立的 IP、端口、网卡
- MNT namespace:文件系统隔离,容器有自己的根目录
- UTS namespace:主机名隔离,容器可以自己设主机名
- USER namespace:用户隔离,容器里的 root 和宿主机 root 不是一回事
- IPC namespace:进程间通信隔离
cgroup 控制组:实现资源限制
控制每个容器能用多少硬件资源,防止一个容器占满宿主机:
- 限制 CPU 使用量
- 限制内存大小
- 限制磁盘 IO
- 限制网络带宽
补充:容器有优先级,优先级高的容器在宿主机资源紧张时不容易被 OOM 杀掉。
4. Docker 三要素
表格
| 概念 | 解释 | 类比 |
|---|---|---|
| 镜像 Image | 应用 + 依赖环境打包好的只读文件,是模板 | 相当于安装包 / 类 class |
| 容器 Container | 镜像运行起来的实例,就是跑起来的应用 | 相当于安装好运行中的程序 / 对象 instance |
| 仓库 Repository | 存放镜像的地方 | 相当于应用商店 / 软件仓库 |
仓库分类:
- 公有仓库:Docker Hub(官方)、阿里云镜像仓库、网易云等
- 私有仓库:Harbor(企业自建私有仓库最常用)
二、Docker 环境部署(CentOS 7 专用)
1. 先卸载旧版本(如果有的话)
bash
运行
# 卸载系统自带的旧docker(如果有)
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
2. 安装 yum 工具包
bash
运行
# 安装yum-config-manager等工具
yum install -y yum-utils device-mapper-persistent-data lvm2
3. 配置华为云 Docker yum 源(国内下载快)
bash
运行
# 添加docker-ce的yum源文件,用华为云镜像地址
yum-config-manager --add-repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
# 把源里的官方地址替换成华为云地址,加速下载
sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
CentOS 7 不用改 releasever,系统变量自动识别是 7。
4. 查看可用的 Docker 版本
bash
运行
# 列出所有可安装的docker-ce版本,从高到低排序
yum list docker-ce --showduplicates | sort -r
5. 安装 Docker
方式一:安装最新稳定版
bash
运行
# 安装docker引擎、命令行工具、容器运行时
yum install -y docker-ce docker-ce-cli containerd.io
方式二:安装指定版本(生产推荐,固定版本更稳定)
bash
运行
# 指定版本号安装,格式:docker-ce-版本号
yum install -y docker-ce-24.0.6-1.el7 docker-ce-cli-24.0.6-1.el7 containerd.io
注意版本号后面要带
-1.el7,CentOS 7 的包都带这个后缀。
6. 启动 Docker 并设置开机自启
bash
运行
# 启动docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker
# 验证安装成功,查看版本
docker version
能看到 Client 和 Server 两部分信息就说明安装成功了。
三、配置镜像加速器
国内访问 Docker Hub 官方仓库很慢,配置加速器从国内镜像站拉取。
1. 创建 docker 配置目录(如果不存在)
bash
运行
mkdir -p /etc/docker
2. 编写加速器配置文件
bash
运行
# 用tee命令写入配置,daemon.json是docker的主配置文件
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://noohub.ru",
"https://huecker.io",
"https://dockerhub.timeweb.cloud"
]
}
EOF
3. 重启 Docker 生效
bash
运行
# 重载systemd配置+重启docker服务
systemctl daemon-reload
systemctl restart docker
# 验证加速器是否生效,看输出里的 Registry Mirrors
docker info
输出里找到 Registry Mirrors: 那一段,能看到你配的加速器地址就成功了。
四、Docker 镜像操作(带案例 + 注释)
1. 查看本地所有镜像
bash
运行
docker images
# 或者等价命令
docker image ls
输出字段说明:
REPOSITORY:镜像名称TAG:版本标签,latest 表示最新版IMAGE ID:镜像唯一 IDSIZE:镜像大小
2. 搜索镜像(从 Docker Hub 找镜像)
bash
运行
# 搜索nginx相关的镜像
docker search nginx
输出里 OFFICIAL 列是 OK 的就是官方镜像,优先用官方的,安全有保障。
3. 下载(拉取)镜像
bash
运行
# 格式:docker pull 镜像名:版本号
# 不写版本号默认拉取 latest 最新版
# 案例1:拉取最新版nginx
docker pull nginx
# 案例2:拉取指定版本的nginx
docker pull nginx:1.24
# 案例3:拉取centos 7镜像
docker pull centos:7
4. 给镜像改名字(打标签)
bash
运行
# 格式:docker tag 原镜像名:版本 新镜像名:新版本
# 作用:给镜像起个别名,或者推送到私有仓库前必须改成仓库地址格式
# 案例1:给本地nginx镜像改个名
docker tag nginx:latest mynginx:v1
# 案例2:改成阿里云仓库格式(推送前必须改)
docker tag nginx:latest registry.cn-beijing.aliyuncs.com/你的命名空间/nginx:v1
注意:tag 只是给镜像加了个别名,不是复制了一份,两个名字指向同一个镜像 ID,删一个另一个还在。
5. 删除镜像
bash
运行
# 格式:docker rmi 镜像名:版本 或者 镜像ID
# 案例1:按名字删
docker rmi mynginx:v1
# 案例2:按ID删(ID写前几位就行,能唯一识别就可以)
docker rmi 605c77
# 案例3:强制删除(有容器在用也强行删)
docker rmi -f nginx:latest
注意:如果镜像已经被容器使用了,不加
-f会删不掉,要先删容器再删镜像。
五、Docker 仓库操作(阿里云镜像仓库为例)
1. 登录私有仓库
bash
运行
# 格式:docker login --username=用户名 仓库地址
docker login --username=你的阿里云账号 registry.cn-beijing.aliyuncs.com
执行后输入密码(阿里云仓库的访问密码,不是登录密码),提示 Login Succeeded 就登录成功了。
2. 退出登录
bash
运行
docker logout registry.cn-beijing.aliyuncs.com
3. 推送镜像到私有仓库
两步走:先改名成仓库格式,再 push 推送。
bash
运行
# 第一步:给本地镜像打标签,改成仓库要求的格式
# 格式:docker tag 本地镜像 仓库地址/命名空间/仓库名:版本
docker tag nginx:latest registry.cn-beijing.aliyuncs.com/你的命名空间/nginx:v1
# 第二步:推送到仓库
docker push registry.cn-beijing.aliyuncs.com/你的命名空间/nginx:v1
4. 从私有仓库拉取镜像
bash
运行
docker pull registry.cn-beijing.aliyuncs.com/你的命名空间/nginx:v1
六、Docker 容器操作(重点,带案例 + 注释)
核心原则
容器里必须有一个前台运行的守护进程,没有前台进程容器会立刻退出。 容器的生命周期 = 主进程的生命周期,主进程挂了容器就停了。
1. 创建并启动容器(docker run 最常用)
命令格式
bash
运行
docker run [参数] 镜像名 [启动命令]
常用参数
表格
| 参数 | 作用 |
|---|---|
-d |
后台运行(守护进程模式),返回容器 ID |
-i |
交互式,保持标准输入打开 |
-t |
分配一个伪终端 |
-it |
一般一起用,交互式进入容器 |
--name |
给容器起个名字,不用每次用 ID |
-p 宿主机端口:容器端口 |
端口映射,把容器端口映射到宿主机上,外部才能访问 |
-P |
大写 P,随机映射容器所有暴露的端口到宿主机 |
--rm |
临时容器,退出后自动删除,测试用 |
-v 宿主机路径:容器路径 |
数据卷挂载,容器数据存到宿主机上 |
-e 环境变量=值 |
给容器传环境变量 |
实战案例
bash
运行
# 案例1:后台运行一个nginx容器,起名mynginx,把80端口映射到宿主机8080
docker run -d --name mynginx -p 8080:80 nginx
# -d 后台跑
# --name 容器名叫mynginx
# -p 8080:80 宿主机8080端口映射到容器的80端口
# 用的镜像是nginx:latest
# 验证:浏览器访问 宿主机IP:8080 能看到nginx默认页面
# 案例2:交互式运行一个centos容器,进去敲命令,退出自动删除
docker run -it --rm centos:7 /bin/bash
# -it 交互式终端
# --rm 退出就删
# /bin/bash 启动后执行bash命令,进入shell
# 输入 exit 退出,容器自动删掉
# 案例3:随机端口映射
docker run -d -P nginx
# 大写P,自动随机选个宿主机端口映射到容器80
# 用docker ps看映射了哪个端口
2. 查看容器
bash
运行
# 查看正在运行的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
输出关键字段:
CONTAINER ID:容器 IDIMAGE:用的哪个镜像COMMAND:容器启动命令STATUS:状态,Up 是运行中,Exited 是已停止PORTS:端口映射信息NAMES:容器名字
3. 进入运行中的容器
推荐方式:docker exec(生产用这个)
bash
运行
# 格式:docker exec -it 容器名/容器ID /bin/bash
docker exec -it mynginx /bin/bash
# -it 交互式终端
# mynginx 容器名
# /bin/bash 执行bash命令进入shell
特点:exit 退出容器,容器还在运行,不会停。这是和 attach 最大的区别,生产环境用 exec。
不推荐:docker attach
bash
运行
docker attach mynginx
特点:exit 退出后容器会停止,基本不用,了解就行。
4. 容器启停操作
bash
运行
# 启动一个停止的容器
docker start 容器名/ID
# 停止一个运行的容器(优雅停止,给进程发信号让它保存退出)
docker stop 容器名/ID
# 强制杀死容器(直接发KILL信号,不等进程退出)
docker kill 容器名/ID
# 重启容器
docker restart 容器名/ID
# 暂停容器(容器还在内存里,只是不干活了,冻结住)
docker pause 容器名/ID
# 恢复暂停的容器
docker unpause 容器名/ID
区分:
stop:正常停止,容器退出,资源释放pause:暂停挂起,还占着内存,随时可以恢复
5. 删除容器
bash
运行
# 删除一个已停止的容器
docker rm 容器名/ID
# 强制删除(运行中的容器也能删,先杀再删)
docker rm -f 容器名/ID
# 批量删除所有已停止的容器(清理用)
docker rm $(docker ps -aq)
6. 查看容器日志
bash
运行
# 查看容器的标准输出日志
docker logs 容器名/ID
# 持续跟踪日志(类似tail -f),实时看
docker logs -f 容器名/ID
# 看最后100行
docker logs --tail 100 容器名/ID
排错必备,容器启动失败先看日志找原因。
7. 查看容器 / 镜像详细信息
bash
运行
# 查看容器的所有详细配置:IP、挂载、网络、环境变量等
docker inspect 容器名/ID
# 查看镜像的详细信息
docker inspect 镜像名
输出是 JSON 格式,信息非常全,排错、查 IP 都用这个。
8. 宿主机和容器之间互拷文件
bash
运行
# 格式:docker cp 源路径 目标路径
# 容器路径写法:容器名:容器内路径
# 案例1:把宿主机的文件拷进容器里
docker cp /root/index.html mynginx:/usr/share/nginx/html/
# 把宿主机的index.html拷到mynginx容器的网站根目录
# 案例2:把容器里的文件拷出来到宿主机
docker cp mynginx:/etc/nginx/nginx.conf /root/
# 把容器里的nginx配置文件拷到宿主机/root下
容器里没有 vi、没有 yum,改配置就拷出来改完再拷回去。
9. 查看容器文件系统的变化
bash
运行
docker diff 容器名/ID
输出三种标记:
A:Added,新增的文件 / 目录D:Deleted,删除的文件 / 目录C:Changed,修改过的文件 / 目录
可以看到容器运行后对文件系统做了哪些改动。
七、CentOS 7 注意事项补充
- 内核版本要求:CentOS 7 内核 3.10+ 都支持 Docker,默认内核就满足
- 防火墙:CentOS 7 默认 firewalld,Docker 会自动管理 iptables 规则,一般不用手动改
- SELinux :如果开着 SELinux,挂载目录可能有权限问题,可以临时关了测试:
setenforce 0 - docker-compose:CentOS 7 上 docker-compose 是单独的二进制文件,不是插件,需要单独下载安装