Docker 核心知识整理
·
一、Docker 概述
1. 基础定义
Docker 是基于 Go 语言开发、遵从 Apache2.0 协议开源的应用容器引擎,可将应用及其依赖包打包到轻量级、可移植的容器中,发布到任意流行的 Linux 机器实现虚拟化。核心优势是支持内核级虚拟化,资源消耗极低、运行稳定,容器间采用沙箱机制完全隔离,性能开销小,彻底解决 “在我的机器上可正常工作” 的环境兼容问题。
2. 核心应用场景
- 应用打包与分发:将应用及依赖打包为镜像,实现 “一次打包,到处运行”
- 环境一致性保障:开发、测试、生产环境高度统一,减少部署故障
- 快速交付与部署:替代传统 “帮助文档 + 安装程序” 模式,一键启动应用
- 资源高效利用:单台物理机可运行多个容器实例,服务器性能利用率最大化
- 便捷扩缩容:项目打包为镜像后,可快速在多服务器扩展部署
3. 与传统虚拟机的核心区别
| 对比维度 | Docker 容器 | 传统虚拟机(VMware/VirtualBox) |
|---|---|---|
| 虚拟化层级 | 内核级虚拟化(进程级隔离) | 硬件级虚拟化(完整 OS 隔离) |
| 系统内核 | 共享宿主机内核 | 自带独立内核 |
| 资源占用 | 轻量(MB 级),秒级启动 | 笨重(GB 级),分钟级启动 |
| 隔离强度 | 进程级隔离,相互无接口交互 | 完整 OS 隔离,隔离性更强 |
| 环境一致性 | 极高(镜像打包所有依赖) | 较低(需单独配置依赖) |
| 资源利用率 | 高(单物理机可运行数百容器) | 低(单物理机仅能运行数台虚拟机) |
二、Docker 的安装与启动
1. 下载
- 官方地址:https://www.docker.com/
- 文档地址:https://docs.docker.com/
- 仓库地址:https://hub.docker.com/
- 版本类型:CE(社区版,免费开源,适合个人及中小企业)、EE(企业版,付费带商业支持),支持 Windows/Linux/Mac 等系统
2. 安装(CentOS 7 为例)
- 卸载旧版本(可选):
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine - 安装依赖工具:
sudo yum install -y yum-utils - 配置镜像仓库(推荐阿里云):
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo - 安装 Docker CE:
sudo yum install docker-ce docker-ce-cli containerd.io - 启动 Docker 并设置开机自启:
sudo systemctl start docker systemctl enable docker
3. 核心目录结构
| 目录 / 文件 | 核心作用 |
|---|---|
| /var/lib/docker | Docker 默认工作目录,存储镜像、容器、数据卷等资源 |
| /etc/docker | 配置文件目录,核心配置文件为 daemon.json(镜像加速等配置) |
| 镜像(Image) | 只读模板,含应用运行所需环境、依赖、配置 |
| 容器(Container) | 镜像的运行实例,动态可修改,可理解为简易 Linux 系统 |
| 仓库(Repository) | 存储镜像的中心,分公有和私有仓库 |
4. 启动与验证
- 启动方式:
sudo systemctl start docker(CentOS);Windows 双击 Docker Desktop 启动 - 验证:执行
sudo docker run hello-world,自动下载镜像并运行,输出 “Hello from Docker!” 相关提示即成功
5. 常用命令(CentOS 7 为例)
- 启动:
sudo systemctl start docker - 停止:
sudo systemctl stop docker - 重启:
sudo systemctl restart docker - 查看状态:
sudo systemctl status docker - 配置检查:
docker info(查看 Docker 系统信息,含镜像 / 容器数量)
三、Docker 核心三要素
1. 镜像(Image)
- 定义:相当于 root 文件系统,包含运行应用所需的系统环境、依赖包、配置文件等,是静态的、不可修改的模板
- 示例:官方 ubuntu:16.04 镜像包含完整的 Ubuntu16.04 最小系统 root 文件系统
- 核心特性:基于联合文件系统,分层构建,修改镜像时创建新层而非修改原有层
2. 容器(Container)
- 定义:镜像运行时的实体,与镜像的关系类似 “类与实例”,动态可修改
- 生命周期:创建(create)→ 启动(start)→ 运行(running)→ 停止(stop)→ 销毁(rm)
- 核心特性:容器层为可写层,所有修改操作在容器层进行,不影响镜像本身
3. 仓库(Repository)
- 定义:存放镜像的代码控制中心,类似 Git 仓库,用于镜像的存储、分发和共享
- 分类:公有仓库(Docker Hub、阿里云容器服务等)、私有仓库(企业内部搭建)
- 使用流程:从仓库拉取(pull)镜像 → 基于镜像创建(run)容器 → 定制化后提交(commit)为新镜像 → 推送(push)到仓库

四、Docker 镜像核心操作
1. 查看本地镜像
docker images # 查看所有本地镜像
docker images -a # 列出所有镜像(含隐藏镜像)
docker images -q # 仅显示镜像 ID
2. 搜索仓库镜像
docker search 镜像名 # 如 docker search mysql
docker search --filter "is-official=true" 镜像名 # 筛选官方认证镜像
3. 拉取镜像
docker pull 镜像名:版本 # 如 docker pull mysql:5.7(指定版本)
docker pull 镜像名 # 不指定版本默认拉取 latest 最新版本
4. 删除镜像
docker rmi -f 镜像ID/镜像名 # 删除指定镜像
docker rmi -f 镜像ID1 镜像ID2 # 删除多个镜像
docker rmi -f $(docker images -aq) # 删除所有本地镜像
五、Docker 容器核心操作
1. 创建与启动容器
docker run [可选参数] 镜像名 [执行命令]
- 核心参数:
--name 容器名:指定容器名称-d:后台守护进程运行-it:交互模式运行,进入容器终端-p 宿主机端口:容器端口:端口映射(如-p 3306:3306)-P:随机端口映射-v 宿主机目录:容器目录:数据卷挂载(目录共享)
2. 查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(运行中+已停止)
3. 容器启停与重启
docker start 容器ID/容器名 # 启动停止的容器
docker stop 容器ID/容器名 # 停止运行的容器
docker restart 容器ID/容器名 # 重启容器
4. 进入与退出容器
docker exec -it 容器ID/容器名 /bin/bash # 进入容器(推荐,不影响容器运行)
exit # 退出并停止容器(仅交互模式生效)
Ctrl+P+Q # 退出但不停止容器
5. 删除容器
docker rm -f 容器ID/容器名 # 删除指定容器
docker rm -f $(docker ps -aq) # 删除所有容器
6. 容器其他常用操作
- 查看日志:
docker logs -tf 容器ID(-tf实时刷新,--tail 数字显示最后 N 行) - 查看容器进程:
docker top 容器ID - 查看容器元数据:
docker inspect 容器ID - 文件拷贝:
- 容器→宿主机:
docker cp 容器ID:容器内路径 宿主机路径 - 宿主机→容器:
docker cp 宿主机路径 容器ID:容器内路径
- 容器→宿主机:
六、Docker 镜像加速配置
1. 为什么需要加速
Docker Hub 是国外仓库,国内直接下载镜像速度极慢,甚至超时失败,需配置国内镜像加速器
2. 国内主流加速源
- 阿里云:https://<你的 ID>.mirror.aliyuncs.com
- 腾讯云:https://mirror.ccs.tencentyun.com
3. 阿里云加速配置步骤
# 1. 创建配置目录
sudo mkdir -p /etc/docker
# 2. 编写配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dqxpbshr.mirror.aliyuncs.com"]
}
EOF
# 3. 刷新配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
七、Docker 数据卷(Volume)
1. 基础定义
数据卷是宿主机与容器之间(或容器与容器之间)的目录映射,独立于容器生命周期,实现数据持久化和共享
2. 核心作用
- 数据持久化:容器销毁后,数据卷中的数据不会丢失
- 数据共享:宿主机与容器、多个容器之间可通过数据卷共享文件
- 性能优化:直接挂载宿主机目录,避免容器层 I/O 开销
3. 数据卷类型
- 绑定挂载:
docker run -v 宿主机目录:容器目录 镜像名(如-v /home/data:/data) - 命名卷:
docker volume create 卷名→docker run -v 卷名:容器目录 镜像名 - 匿名卷:
docker run -v 容器目录 镜像名(宿主机目录自动创建,无明确标识)
4. 常用操作命令
- 创建命名卷:
docker volume create 卷名 - 查看数据卷:
docker volume ls - 查看数据卷详情:
docker inspect 卷名 - 删除数据卷:
docker volume rm 卷名 - 清理无用数据卷:
docker volume prune
八、Docker 网络配置
1. 核心网络模式
| 网络模式 | 特点 | 适用场景 |
|---|---|---|
| bridge(默认) | 容器自动加入 docker0 网络,分配内网 IP,需端口映射对外 | 绝大多数场景,如 Web 应用、数据库 |
| host | 共享宿主机网络,无需端口映射,直接使用宿主机 IP / 端口 | 需占用宿主机端口的场景,如 Nginx |
| none | 无网络配置,不分配 IP,无法与外部通信 | 特殊测试场景 |
| container | 共享另一个容器的网络,共用 IP / 端口 | 多容器协作场景 |
2. 网络操作命令
- 查看网络:
docker network ls - 创建自定义网络:
docker network create -d bridge 网络名 - 容器加入网络:
docker network connect 网络名 容器名 - 容器退出网络:
docker network disconnect 网络名 容器名 - 删除网络:
docker network rm 网络名
3. 端口映射
- 语法:
-p 宿主机端口:容器端口(如-p 8080:8080) - 示例:
docker run -itd -p 80:80 --name nginx01 nginx - 作用:实现外网访问容器服务,宿主机端口请求转发至容器对应端口
九、Docker 镜像定制
1. docker commit 方式(容器打包镜像)
- 命令格式:
docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名:版本 - 示例:
docker run -d --name tomcat-temp tomcat docker exec -it tomcat-temp /bin/bash cp -r webapps.dist/* webapps # 容器内修改 docker commit -m="add webapps page" 容器ID mytomcat:1.0
2. Dockerfile 方式(推荐)
- 核心指令:
指令 作用 FROM 指定基础镜像(如 FROM centos:7) MAINTAINER 作者信息(姓名 + 邮箱) RUN 镜像构建时执行的命令 ADD/COPY 复制文件到容器(ADD 支持压缩包解压) WORKDIR 指定容器工作目录 ENV 设置环境变量 EXPOSE 声明暴露端口 CMD/ENTRYPOINT 容器启动时执行的命令 - 构建命令:
docker build -f Dockerfile -t 镜像名:版本 .(末尾 “.” 表示当前目录) - 示例 Dockerfile(定制 Tomcat 镜像):
dockerfile
FROM centos:7 MAINTAINER wd<1443005893@qq.com> ADD jdk-8u401-linux-x64.tar.gz /opt/ ADD apache-tomcat-9.0.115.tar.gz /opt/ ENV MYPATH /opt/ WORKDIR $MYPATH ENV JAVA_HOME $MYPATH/jdk1.8.0_401 ENV CLASS_PATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME $MYPATH/apache-tomcat-9.0.115 ENV CATALINA_BASH $MYPATH/apache-tomcat-9.0.115 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD $MYPATH/apache-tomcat-9.0.115/bin/startup.sh && tail -F $MYPATH/apache-tomcat-9.0.115/logs/catalina.out)
十、常用镜像部署示例
1. MySQL 部署
# 拉取镜像
docker pull mysql:5.7
# 启动容器(端口映射+数据卷挂载+设置密码)
docker run -itd --name mysql01 -p 3306:3306 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 配置远程连接
docker exec -it mysql01 /bin/bash
mysql -uroot -p123456
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
2. Nginx 部署
# 拉取镜像
docker pull nginx
# 启动容器
docker run -itd --name nginx01 -p 80:80 nginx
# 配置文件与静态资源挂载(自定义配置)
docker cp nginx01:/etc/nginx/nginx.conf /usr/nginx/conf
docker run -itd --name nginx02 -p 81:80 -v /usr/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/nginx/html:/usr/share/nginx/html nginx
3. Tomcat 部署
# 拉取镜像
docker pull tomcat
# 启动容器(端口映射+项目目录挂载)
docker run -itd --name tomcat01 -p 8080:8080 -v /usr/webapps:/usr/local/tomcat/webapps tomcat
# 配置默认页面
docker exec -it tomcat01 /bin/bash
cp -r webapps.dist/* webapps更多推荐


所有评论(0)