Docker 容器化技术标准化笔记

一、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:镜像唯一 ID
  • SIZE:镜像大小

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:容器 ID
  • IMAGE:用的哪个镜像
  • 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 注意事项补充

  1. 内核版本要求:CentOS 7 内核 3.10+ 都支持 Docker,默认内核就满足
  2. 防火墙:CentOS 7 默认 firewalld,Docker 会自动管理 iptables 规则,一般不用手动改
  3. SELinux :如果开着 SELinux,挂载目录可能有权限问题,可以临时关了测试:setenforce 0
  4. docker-compose:CentOS 7 上 docker-compose 是单独的二进制文件,不是插件,需要单独下载安装
相关推荐
hyhsandy18031 小时前
STM32F103 TIM学习笔记
笔记·stm32·学习
栈溢出了1 小时前
Redis 消息队列笔记:List 与 Pub/Sub
redis·笔记·list
我是一颗柠檬2 小时前
【Java项目技术亮点】EXPLAIN深度分析与慢查询治理
android·java·开发语言
万亿少女的梦1682 小时前
基于Spring Boot的社区管理系统设计与实现
java·spring boot·mysql·vue·系统设计
潘正翔2 小时前
docker基础_镜像使用
linux·运维·服务器·docker·容器·centos·devops
大气的小蜜蜂2 小时前
领域层的服务
java·前端·数据库
agent8972 小时前
Spring Boot 接口超时治理:从连接池、线程池到熔断限流的完整排查思路
java·spring boot·后端
Devin~Y2 小时前
抖音级短视频推荐与直播带货平台面试实战:从 Java 微服务到 RAG 智能客服全链路解析
java·spring boot·redis·spring cloud·kafka·agent·rag
帅次2 小时前
Android 高级工程师面试:Java 多线程与并发 近1年高频追问 22 题
android·java·面试