无题
本文基于Docker实战文档整理,构建结构化知识体系,涵盖Docker核心概念、基础操作、数据卷、自定义镜像、网络配置及项目部署全流程,同时附上完整的Docker安装指南。内容兼顾入门友好性与实战实用性,适用于个人学习笔记及教学场景。
一、Docker概述与核心优势
1.1 传统部署的痛点
在传统Linux环境部署项目时,普遍面临以下问题:
-
命令繁多且难记忆,学习成本高;
-
软件安装包名称复杂,获取渠道不统一;
-
安装部署步骤繁琐,容易因环境差异出错;
-
多服务器部署时,环境一致性难以保证,脚本复用性低。
1.2 Docker的核心价值
Docker是一款开源的容器化技术,核心优势在于解耦应用与运行环境,实现“一次构建,到处运行”,具体体现在:
-
简化部署流程:无需手动处理依赖、配置环境,一条命令即可完成软件部署;
-
跨平台兼容:相同的Docker命令可在CentOS、Ubuntu、macOS、Windows(WSL)等系统运行;
-
环境一致性:容器包含应用运行所需的完整环境,避免“开发环境正常,生产环境报错”;
-
高效运维:支持批量容器管理,大幅降低多服务器部署的工作量。
1.3 学习目标
-
能利用Docker部署常见软件(如MySQL、Nginx);
-
能利用Docker打包并部署Java应用;
-
理解Docker数据卷的基本作用及使用方式;
-
能看懂并编写Docker Compose文件,实现多容器协同部署。
二、Docker快速入门
本教程统一使用预置Docker环境的CentOS虚拟机(无需额外安装);若需在其他机器安装Docker,可参考本文附录。
2.1 快速部署MySQL(对比传统部署)
2.1.1 传统部署MySQL步骤
-
搜索并下载对应系统的MySQL安装包;
-
上传安装包至Linux环境;
-
解压文件并配置环境变量;
-
执行安装命令并解决依赖问题;
-
初始化数据库并配置权限。
2.1.2 Docker部署MySQL(一步完成)
在命令行输入以下命令,直接创建并运行MySQL容器:
1 |
|
2.1.3 运行效果与说明
命令执行后,终端会输出容器ID(如6097d43dc087…),表示MySQL容器创建成功,可直接通过客户端工具连接(主机:虚拟机IP,端口:3307,密码:123)。
Docker自动完成的操作:
-
从镜像仓库搜索并下载
mysql:8镜像(本地已存在则直接使用); -
基于镜像创建容器,并配置端口映射、时区、初始密码等参数;
-
自动启动容器内的MySQL服务,无需手动干预。
2.2 核心概念:镜像与容器
-
镜像(Image):可理解为“软件安装包+运行环境”的只读模板,包含程序运行所需的系统函数库、依赖、配置等。例如
mysql:8就是MySQL 8版本的镜像。 -
容器(Container):镜像的运行实例,是独立的隔离环境。容器可启动、停止、删除,每个容器之间相互隔离,不影响主机环境。
2.3 镜像仓库(Docker Registry)
Docker镜像的存储与管理平台,用于存放各类软件的镜像,分为三类:
-
官方仓库:Docker Hub(https://hub.docker.com),包含官方基础镜像及各大厂商提供的软件镜像(国内访问较慢);
-
第三方仓库:阿里云、华为云等提供的镜像仓库,支持镜像加速,提升下载速度;
-
私有仓库:企业内部搭建的仓库,用于存储机密项目的自定义镜像。
镜像来源:① 直接从镜像仓库下载;② 基于基础镜像自定义构建。
2.4 快速入门总结
Docker部署应用的核心流程:通过Docker命令告知Docker守护进程 → 守护进程从镜像仓库拉取对应镜像 → 基于镜像创建并启动容器 → 应用部署完成。
三、Docker基础操作
3.1 核心命令汇总
以下是Docker日常使用的核心命令,涵盖镜像管理、容器管理等场景:
| 命令 | 说明 | 示例 |
|---|---|---|
| docker pull | 从镜像仓库拉取镜像 | docker pull nginx:1.20.2 |
| docker push | 推送镜像到镜像仓库 | docker push myapp:1.0 |
| docker images | 查看本地所有镜像 | docker images |
| docker rmi | 删除本地镜像(需先删除依赖容器) | docker rmi nginx:1.20.2 |
| docker run | 创建并运行容器(不可重复创建同名容器) | docker run -d --name nginx -p 80:80 nginx |
| docker stop | 停止指定容器 | docker stop nginx |
| docker start | 启动已停止的容器 | docker start nginx |
| docker restart | 重启容器 | docker restart nginx |
| docker rm | 删除容器(运行中容器需加 -f 强制删除) | docker rm -f nginx |
| docker ps | 查看容器(默认显示运行中,-a 显示所有) | docker ps -a |
| docker logs | 查看容器运行日志(-f 实时监控) | docker logs -f mysql |
| docker exec | 进入运行中的容器 | docker exec -it nginx bash |
| docker save | 将镜像保存为本地压缩文件 | docker save -o nginx.tar nginx:1.20.2 |
| docker load | 加载本地压缩文件为镜像 | docker load -i nginx.tar |
| docker inspect | 查看容器/镜像详细信息 | docker inspect mysql |
3.1.1 开机自启配置
默认情况下,虚拟机重启后Docker及容器需手动启动,可通过以下命令设置开机自启:
1 |
|
3.1.2 命令演示(以Nginx为例)
1 |
|
3.2 数据卷(Volume)
3.2.1 核心问题:容器与数据解耦
容器是隔离环境,内部文件默认存储在容器内部:① 容器销毁后,数据会丢失(如MySQL数据);② 直接操作容器内文件不方便(如修改Nginx配置)。因此需要通过数据卷实现“容器内目录”与“宿主机目录”的映射。
3.2.2 数据卷定义与优势
数据卷是Docker管理的虚拟目录,作为容器内目录与宿主机目录的桥梁,优势:
-
数据持久化:容器销毁后,数据存储在宿主机,不会丢失;
-
解耦环境:容器仅关注运行,数据存储由宿主机管理;
-
灵活映射:可通过数据卷间接映射,避免容器与宿主机目录强耦合。
默认数据卷存储路径:/var/lib/docker/volumes/[数据卷名]/_data
3.2.3 数据卷核心命令
| 命令 | 说明 | 示例 |
|---|---|---|
| docker volume create | 创建数据卷 | docker volume create nginx-html |
| docker volume ls | 查看所有数据卷 | docker volume ls |
| docker volume rm | 删除指定数据卷 | docker volume rm nginx-html |
| docker volume inspect | 查看数据卷详情(含宿主机路径) | docker volume inspect nginx-html |
| docker volume prune | 删除未使用的数据卷(清理空间) | docker volume prune |
3.2.4 数据卷挂载演示(Nginx)
通过-v 数据卷名:容器内目录实现挂载(创建容器时配置,不可事后修改):
1 |
|
3.2.5 匿名数据卷
创建容器时未指定数据卷名,仅指定容器内目录,Docker会自动创建“匿名数据卷”(名称为随机哈希值)。例如MySQL容器默认会匿名挂载/var/lib/mysql目录,确保数据持久化。
1 |
|
3.2.6 本地目录/文件直接挂载
数据卷默认路径较深,可直接将容器目录挂载到宿主机指定目录(更直观),语法:-v 宿主机目录:容器内目录(宿主机目录需以/或./开头,否则识别为数据卷)。
示例:MySQL本地目录挂载(提前在宿主机创建/root/mysql/data、conf、init目录)
1 |
|
3.3 自定义镜像(Dockerfile)
3.3.1 自定义镜像场景
官方镜像无法满足需求时(如部署自定义Java项目),需基于基础镜像构建自定义镜像。镜像本质是“分层文件集合”,每层对应构建过程的一个操作步骤。
3.3.2 Dockerfile核心语法
Dockerfile是记录镜像构建步骤的文本文件,常用指令:
| 指令 | 说明 | 示例 |
|---|---|---|
| FROM | 指定基础镜像(必须放在首行) | FROM centos:7 |
| ENV | 设置环境变量(后续指令可复用) | ENV JAVA_HOME=/usr/local/jdk-17.0.10 |
| COPY | 拷贝宿主机文件到镜像内 | COPY app.jar /app/app.jar |
| RUN | 执行Linux shell命令(构建时运行) | RUN tar -xzf jdk17.tar.gz -C /usr/local/ |
| EXPOSE | 声明容器运行时监听的端口(仅说明,不映射) | EXPOSE 8080 |
| WORKDIR | 设置容器运行时的工作目录 | WORKDIR /app |
| ENTRYPOINT | 指定容器启动时执行的命令(不可被覆盖) | ENTRYPOINT [“java”,“-jar”,“app.jar”] |
3.3.3 自定义Java应用镜像示例
需求:基于CentOS 7构建包含JDK 17和Java项目(app.jar)的镜像。
步骤1:准备文件
在宿主机创建myapp目录,放入三个文件:① Dockerfile;② jdk17.tar.gz(JDK压缩包);③ app.jar(项目打包文件)。
步骤2:编写Dockerfile
1 |
|
步骤3:构建镜像
1 |
|
3.4 Docker网络
3.4.1 容器互联问题
容器默认使用Docker桥接网络,可通过IP互联,但容器IP是虚拟IP,重启后可能变化,直接写死IP会导致连接失败。解决方案:自定义网络,通过容器名互联。
3.4.2 网络核心命令
| 命令 | 说明 | 示例 |
|---|---|---|
| docker network create | 创建自定义网络 | docker network create itheima |
| docker network ls | 查看所有网络 | docker network ls |
| docker network connect | 将容器加入指定网络 | docker network connect itheima mysql |
| docker network disconnect | 将容器移出网络 | docker network disconnect itheima mysql |
| docker network rm | 删除指定网络 | docker network rm itheima |
| docker network inspect | 查看网络详细信息 | docker network inspect itheima |
3.4.3 自定义网络演示(容器名互联)
1 |
|
四、项目部署实战(tlias项目)
本实战基于tlias-web-management项目,实现“后端Java服务+前端Nginx+MySQL”的完整部署,分为手动部署和Docker Compose批量部署两种方式。
4.1 手动部署(分步实现)
4.1.1 部署服务端(Java项目)
步骤1:项目准备与打包
- 修改项目配置文件
application.yml,将MySQL地址改为容器名(加入同一网络后可通过容器名访问):
1 |
|
- 通过Maven执行
package命令(跳过测试),将打包后的JAR包命名为tlias.jar。
步骤2:编写Dockerfile
1 |
|
步骤3:构建镜像并启动容器
1 |
|
4.1.2 部署前端(Nginx)
步骤1:准备前端资源
-
宿主机创建
/usr/local/tlias-web目录,包含html(前端静态资源)和conf(Nginx配置文件)子目录; -
将前端打包后的静态资源(assets、index.html等)上传到
/usr/local/tlias-web/html; -
将配置好的nginx.conf上传到
/usr/local/tlias-web/conf(配置反向代理到后端服务)。
步骤2:启动Nginx容器
1 |
|
步骤3:访问测试
浏览器输入http://虚拟机IP,能正常显示前端页面并调用后端接口,说明部署成功。
4.2 Docker Compose批量部署
4.2.1 Docker Compose优势
多容器项目(如前端、后端、MySQL)手动部署步骤繁琐,Docker Compose可通过一个docker-compose.yml文件定义所有容器的配置,一键完成创建、启动、网络配置等操作。
4.2.2 核心语法(与docker run参数对应)
| docker run 参数 | docker-compose.yml 指令 | 说明 |
|---|---|---|
| –name | container_name | 容器名称 |
| -p | ports | 端口映射 |
| -e | environment | 环境变量 |
| -v | volumes | 数据卷/目录挂载 |
| –network | networks | 加入的网络 |
| 镜像名 | image | 使用的镜像 |
| -f(Dockerfile) | build.context/dockerfile | 构建自定义镜像的配置 |
4.2.3 docker-compose.yml编写(tlias项目)
1 |
|
4.2.4 Docker Compose核心命令
| 命令 | 说明 | 示例 |
|---|---|---|
| docker compose up -d | 后台启动所有服务(创建容器、网络等) | docker compose up -d |
| docker compose down | 停止并删除所有容器、网络(数据卷保留) | docker compose down |
| docker compose ps | 查看当前服务的容器状态 | docker compose ps |
| docker compose logs 服务名 | 查看指定服务的运行日志 | docker compose logs tlias |
| docker compose stop/start/restart | 停止/启动/重启所有服务 | docker compose restart |
| docker compose exec 服务名 命令 | 进入指定服务的容器执行命令 | docker compose exec mysql bash |
4.2.5 部署演示
1 |
|
五、附录:Docker安装与配置(CentOS)
5.1 卸载旧版Docker(可选)
若系统已安装旧版Docker,先执行卸载命令:
1 |
|
5.2 配置Docker的YUM源
1 |
|
5.3 安装Docker
1 |
|
5.4 启动与校验
1 |
|
5.5 配置镜像加速(国内必备)
配置国内镜像源,提升镜像下载速度:
1 |
|
(注:文档部分内容可能由 AI 生成)
