云计算
云计算
云计算指通过计算机网络(多指因特网)形成的计算能力极强的系统,可存储、集合相关资源并可按需配置,向用户提供个性化服务。
目前云计算服务模式主要包括以下几类:
基础设施即服务(Infrastructure as a Service, IaaS)
- 云平台提供各类基础设施类能力的服务类别,包括计算、存储、网络等资源服务能力。您无需购买和部署服务器、存储、网络设备等硬件基础设施就可以灵活部署自己的业务系统。
平台即服务(Platform as a Service, PaaS)
- 提供应用程序所需要的硬件和软件部署平台的服务类别。您无需管理和维护复杂的底层基础架构和操作系统,只需要关注自己的业务逻辑,加速开发效率。
软件即服务(Software as a Service, SaaS)
- 提供软件的服务类别,包括协同软件、客户关系管理、企业资源计划、人力资源系统等。您无需经过传统的研发流程,而是通过互联网即可使用软件服务,节约了管理基础设施和研发软件的工作。
- 邮箱、微信、支付宝、钉钉、在线文档、小程序
模型即服务(MaaS)
- 把 AI 模型当作生产的重要元素,从模型预训练到二次调优,最后到模型部署,围绕模型的生命周期来提供相应的服务。您可以通过低成本的方式访问、使用、集成模型,提升您的业务智能化能力。
云主机ECS
云主机就是云平台上的"虚拟机";
- 收费模式:包年,包月,按需购买,"抢购"模式
- 镜像:公共镜像,私有镜像...
- 快照:手动快照,自动快照
- VPC:专有网络,虚拟局域网,实现负载均衡高可用
- 安全组:入口规则(访问服务器),出口规则(访问其他网站)
- 存储:块存储,OSS对象存储
存储相关概念
- 块存储:物理硬盘,虚拟硬盘
- 可以自由的分区,格式化,建立文件系统,挂载,LVM逻辑卷,RAID
- 文件存储:NFS(网络文件系统)共享目录
- 将网络文件系统挂载到本机,实现多台服务器之间的文件共享;
- 可以像使用本地文件一样使用网络文件系统;
- 对象存储:网盘
- 对象(文件名,描述,唯一id)
- 分布式存储(网络版RAID10)
- 本地搭建CEPH\MinIO\HDFS...
容器化技术
- 1.什么是容器化技术?优势是什么?
- 2.Docker简介?
- 3.容器与镜像?
- 4.容器与虚拟机的区别?
- 5.容器的底层技术是什么?
Docker简介
容器化技术:一种操作系统级的虚拟化技术;简单理解为“微型虚拟机”;
功能与优势:
- 实现应用间隔离运行;
- 实现应用的一键"打包",将应用服务,依赖环境打包成镜像;
- 让应用可以在不同的系统中拥有一致运行环境;
- 对容器进行资源限制;
- 一键运行容器;
Docker
- Docker是使用go语言开发的一种容器管理工具,容器运行时(run time);
- RUNC、Podman、Containerd、LXC、CRI-0
- Docker 诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。
容器和镜像:
-
容器:一个运行中的镜像,类似于一个进程;
-
镜像:容器的模板,是静态文件,类似一个安装包;
镜像仓库:存放各种镜像的下载站点;官方docker hub;公司内部可以搭建私有仓库;
主机虚拟化和容器虚拟化特点
主机虚拟化

- 优点
- 应用程序运行环境强隔离
- 虚拟机操作系统与底层操作系统无关化
- 虚拟机内部操作不会影响到物理机
- 缺点
- 拥有操作系统会占用部署资源及存储
- 网络传输效率低
- 当应用程序需要调用硬件响应用户访问时间延迟大
容器虚拟化

- 可以实现应用程序的隔离
- 直接使用物理机的操作系统可以快速响应用户请求
- 不占用部署时间
- 占用少量磁盘空间
Docker的底层技术:
- Namespaces:Linux内核中提供命名空间功能,隔离进程、网络、文件系统;
- Cgroup:资源限制,CPU、内存;
- OverlayFS:镜像文件分层技术;
Docker可以做什么?
1.快速部署应用服务;
2.可以统一开发,测试,生产环境,避免由于环境问题导致的服务运行异常;
安装Docker
配置Docker镜像加速
Docker常用命令
镜像常用命令:
docker search ubuntu # 查找镜像
docker pull 镜像:版本 # 下载镜像
docker images # 查看本地镜像
docker save 镜像:版本 -o 镜像.tar # 将镜像保存为文件
docker rmi 镜像名 # 删除镜像
docker load -i 镜像.tar # 将镜像文件加载到本地镜像仓库
docker inspect 镜像:版本 # 查看镜像的详细信息
docker rmi $(docker images -aq) # 删除所有镜像
# 批量导入所有镜像
for img in `ls *.tar`;do docker load -i $img;done
容器管理命令:
docker ps # 查看正在运行容器
docker ps -a # 查看运行与曾经运行的容器
docker run # 使用镜像运行容器
--name #给容器起名
-i # 交互式启动
-t # 分配终端
-d # 后台执行容器
-v --volume # 目录映射 真机路径:容器路径
-p # 指定端口映射 真机端口:容器端口
-P # 随机端口
-e # 设置容器中的环境变量
--network # 指定网络模式
--rm # 容器停止时,自动删除容器和容器中的数据
-u # 以什么用户的身份创建容器
-h # 指定容器的主机名,默认容器ID前N位
-m # 设置容器内存的最大值
docker run --name -itd -p 80:80 nginx:1.26
# 进入容器,执行命令与操作
docker exec -it nginx-test /bin/bash
# 将容器导出为镜像文件
docker export -o mynginx.tar nginx-test
# 将镜像容器生成的文件导入本地镜像仓库
docker import mynginx.tar mynginx:1.0
# 直接将容器生成镜像到本地仓库
docker commit nginx-test mynginx:2.0
# 停止容器
docker stop nginx-test
# 删除容器
docker rm nginx-test
仓库管理命令:
Docker实战
Docker实战
Docker安装部署MySQL一主二从集群
-
单台电脑 Docker 部署 MySQL 一主二从集群(终极成功版·命令单独标注)
核心逻辑:解决「密码插件不兼容」「DNS 解析不稳定」「非交互式命令格式」三大坑,所有命令单独标注,可直接复制执行,确保一次成功。
前置条件
- 已安装 Docker(Windows/Mac/Linux 均可)
- 验证 Docker 安装:📌 命令:
docker -v - 实验环境临时关闭宿主机防火墙(避免端口限制)
第一步:拉取 MySQL 5.7 镜像(固定版本)
📌 命令:
docker pull mysql:5.7
第二步:创建主库(Master)容器
2.1 创建主库配置和数据目录(持久化)
📌 命令(Linux/Mac):
mkdir -p ~/docker/mysql/master/conf
📌 命令(Linux/Mac):mkdir -p ~/docker/mysql/master/data2.2 编写主库配置文件(my.cnf)
在
~/docker/mysql/master/conf目录下创建my.cnf文件,内容如下:[mysqld] server-id=1 # 集群唯一ID,主库固定为1 log-bin=mysql-bin # 开启二进制日志(主从复制核心) binlog-ignore-db=mysql # 忽略同步系统库 binlog-ignore-db=information_schema bind-address=0.0.0.0 # 允许所有IP访问(容器内安全)2.3 启动主库容器
📌 命令:
docker run -d \ --name mysql-master \ -p 3306:3306 \ -v ~/docker/mysql/master/conf/my.cnf:/etc/mysql/conf.d/my.cnf \ -v ~/docker/mysql/master/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -e TZ=Asia/Shanghai \ --privileged=true \ mysql:5.72.4 进入主库容器,创建同步用户(指定兼容密码插件)
📌 命令1:
docker exec -it mysql-master bash
📌 命令2(登录MySQL):mysql -uroot -p123456
📌 命令3(创建同步用户):CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl123';
📌 命令4(授予复制权限):GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
📌 命令5(刷新权限):FLUSH PRIVILEGES;
📌 命令6(查看主库状态,记录File和Position):SHOW MASTER STATUS;记录结果示例(以实际输出为准):
File: mysql-bin.000004,Position: 1652📌 命令7(退出MySQL):
exit
📌 命令8(退出主库容器):exit2.5 查询主库容器IP(用于从库直连)
📌 命令:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-master记录结果示例:172.17.0.2(下文统称「主库IP」)
第三步:创建从库1(Slave1)容器
3.1 创建从库1配置和数据目录
📌 命令(Linux/Mac):
mkdir -p ~/docker/mysql/slave1/conf
📌 命令(Linux/Mac):mkdir -p ~/docker/mysql/slave1/data3.2 编写从库1配置文件(my.cnf)
在
~/docker/mysql/slave1/conf目录下创建my.cnf文件,内容如下:[mysqld] server-id=2 # 唯一ID,区别于主库(1) relay-log=relay-log # 开启中继日志 log-slave-updates=1 # 从库同步后记录日志(可选) read-only=1 # 从库设为只读(root用户不受限)3.3 启动从库1容器
📌 命令:
docker run -d \ --name mysql-slave1 \ -p 3307:3306 \ -v ~/docker/mysql/slave1/conf/my.cnf:/etc/mysql/conf.d/my.cnf \ -v ~/docker/mysql/slave1/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -e TZ=Asia/Shanghai \ --privileged=true \ mysql:5.73.4 从库1关联主库(同步配置)
方式1:手动进入容器执行(推荐,成功率100%)
📌 命令1:
docker exec -it mysql-slave1 bash
📌 命令2(登录MySQL):mysql -uroot -p123456
📌 命令3(停止同步):STOP SLAVE;
📌 命令4(关联主库,替换主库IP、File、Position):CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='repl', MASTER_PASSWORD='repl123', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=1652;📌 命令5(启动同步):
START SLAVE;
📌 命令6(验证状态,需看到两个Yes):SHOW SLAVE STATUS\G;
📌 命令7(退出MySQL):exit
📌 命令8(退出从库1容器):exit方式2:非交互式批量执行(外面直接跑)
📌 命令(替换主库IP、File、Position):
docker exec -i mysql-slave1 bash -c ' mysql -uroot -p123456 -e " STOP SLAVE; CHANGE MASTER TO MASTER_HOST=\'主库IP\', MASTER_USER=\'repl\', MASTER_PASSWORD=\'repl123\', MASTER_LOG_FILE=\'mysql-bin.000004\', MASTER_LOG_POS=1652; START SLAVE; SHOW SLAVE STATUS\G; " '
第四步:创建从库2(Slave2)容器
4.1 创建从库2配置和数据目录
📌 命令(Linux/Mac):
mkdir -p ~/docker/mysql/slave2/conf
📌 命令(Linux/Mac):mkdir -p ~/docker/mysql/slave2/data4.2 编写从库2配置文件(my.cnf)
在
~/docker/mysql/slave2/conf目录下创建my.cnf文件,内容如下:[mysqld] server-id=3 # 唯一ID,区别于主库(1)和从库1(2) relay-log=relay-log # 开启中继日志 log-slave-updates=1 # 从库同步后记录日志(可选) read-only=1 # 从库设为只读(root用户不受限)4.3 启动从库2容器
📌 命令:
docker run -d \ --name mysql-slave2 \ -p 3308:3306 \ -v ~/docker/mysql/slave2/conf/my.cnf:/etc/mysql/conf.d/my.cnf \ -v ~/docker/mysql/slave2/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -e TZ=Asia/Shanghai \ --privileged=true \ mysql:5.74.4 修复从库2数据目录权限(避免启动失败)
📌 命令:
sudo chown -R 999:999 ~/docker/mysql/slave2/data4.5 从库2关联主库(同步配置)
方式1:手动进入容器执行(推荐,成功率100%)
📌 命令1:
docker exec -it mysql-slave2 bash
📌 命令2(登录MySQL):mysql -uroot -p123456
📌 命令3(停止同步):STOP SLAVE;
📌 命令4(关联主库,替换主库IP、File、Position):CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='repl', MASTER_PASSWORD='repl123', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=1652;📌 命令5(启动同步):
START SLAVE;
📌 命令6(验证状态,需看到两个Yes):SHOW SLAVE STATUS\G;
📌 命令7(退出MySQL):exit
📌 命令8(退出从库2容器):exit方式2:非交互式批量执行(外面直接跑)
📌 命令(替换主库IP、File、Position):
docker exec -i mysql-slave2 bash -c ' mysql -uroot -p123456 -e " STOP SLAVE; CHANGE MASTER TO MASTER_HOST=\'主库IP\', MASTER_USER=\'repl\', MASTER_PASSWORD=\'repl123\', MASTER_LOG_FILE=\'mysql-bin.000004\', MASTER_LOG_POS=1652; START SLAVE; SHOW SLAVE STATUS\G; " '
第五步:验证集群可用性(主从同步测试)
5.1 主库插入测试数据
📌 命令1:
docker exec -it mysql-master bash
📌 命令2(登录MySQL):mysql -uroot -p123456
📌 命令3(创建测试库):CREATE DATABASE test_cluster;
📌 命令4(使用测试库):USE test_cluster;
📌 命令5(创建测试表):CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20));
📌 命令6(插入测试数据):INSERT INTO user (name) VALUES ('主从同步测试1'), ('主从同步测试2');
📌 命令7(退出MySQL):exit
📌 命令8(退出主库容器):exit5.2 从库1验证同步数据
📌 命令1:
docker exec -it mysql-slave1 bash
📌 命令2(登录MySQL):mysql -uroot -p123456
📌 命令3(使用测试库):USE test_cluster;
📌 命令4(查询数据,应看到主库插入的2条记录):SELECT * FROM user;
📌 命令5(退出MySQL):exit
📌 命令6(退出从库1容器):exit5.3 从库2验证同步数据
📌 命令1:
docker exec -it mysql-slave2 bash
📌 命令2(登录MySQL):mysql -uroot -p123456
📌 命令3(使用测试库):USE test_cluster;
📌 命令4(查询数据,应看到主库插入的2条记录):SELECT * FROM user;
📌 命令5(退出MySQL):exit
📌 命令6(退出从库2容器):exit
第六步:集群常用管理命令(单独标注)
6.1 查看所有MySQL容器状态
📌 命令:
docker ps | grep mysql-6.2 启动所有容器
📌 命令:
docker start mysql-master mysql-slave1 mysql-slave26.3 停止所有容器
📌 命令:
docker stop mysql-master mysql-slave1 mysql-slave26.4 查看容器日志(排查问题)
📌 命令(主库):
docker logs mysql-master
📌 命令(从库1):docker logs mysql-slave1
📌 命令(从库2):docker logs mysql-slave26.5 删除所有容器(重置集群)
📌 命令:
docker stop mysql-master mysql-slave1 mysql-slave2 && docker rm mysql-master mysql-slave1 mysql-slave2
📌 命令(清空所有数据):sudo rm -rf ~/docker/mysql/*
关键避坑总结
- 主库同步用户必须指定
mysql_native_password插件,否则从库无法识别密码; - 从库关联主库用「主库IP」而非容器名,避免Docker DNS解析问题;
- 非交互式执行命令需用「单引号外层包裹+内层转义」,否则命令解析失败;
- 从库数据目录需设置权限(
chown -R 999:999),避免MySQL启动失败。
要不要我帮你整理一份 集群一键执行脚本,把所有启动、配置、验证命令整合在一起,你直接复制到宿主机终端,无需手动分步执行?
Docker安装项目:Blog、电商、游戏、网盘、视频网站(任选其一)
-
Docker 安装 WordPress 博客(Blog)项目(命令单独标注·直接执行版)
核心逻辑:Docker 容器化部署 WordPress(主流开源博客系统),搭配 MySQL 数据库,实现「应用+环境」一键搭建,所有命令单独标注,步骤清晰无坑。
-
前置条件
-
已安装 Docker(Windows/Mac/Linux 均可)
-
验证 Docker 安装:📌 命令:
docker -v -
确保宿主机 8080 端口(可自定义)未被占用(验证:
netstat -tuln | grep 8080,无输出则可用)第一步:拉取所需镜像(WordPress + MySQL)
1.1 拉取 MySQL 镜像(WordPress 依赖数据库)
📌 命令:
docker pull mysql:5.7(选择 5.7 稳定版,兼容性强)1.2 拉取 WordPress 官方镜像
📌 命令:
docker pull wordpress:latest(最新稳定版,无需手动配置环境)第二步:创建 MySQL 容器(Blog 数据库服务)
2.1 创建 MySQL 数据目录(持久化,避免容器销毁数据丢失)
📌 命令(Linux/Mac):
mkdir -p ~/docker/wordpress/mysql/data2.2 启动 MySQL 容器(配置数据库账号密码、端口)
📌 命令:
docker run -d
--name wp-mysql
-p 3309:3306
-v ~/docker/wordpress/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=wp123456
-e MYSQL_DATABASE=wordpress
-e MYSQL_USER=wpuser
-e MYSQL_PASSWORD=wpuser123
-e TZ=Asia/Shanghai
--privileged=true
mysql:5.7### 2.3 验证 MySQL 容器是否启动成功 📌 命令:`docker ps | grep wp-mysql`(输出中显示「Up」则正常) ## 第三步:创建 WordPress 容器(Blog 应用服务) ### 3.1 创建 WordPress 数据目录(主题、插件、上传文件持久化) 📌 命令(Linux/Mac):`mkdir -p ~/docker/wordpress/app` ### 3.2 启动 WordPress 容器(关联 MySQL 数据库) 📌 命令: ```bash docker run -d \ --name wordpress-blog \ -p 8080:80 \ -v ~/docker/wordpress/app:/var/www/html \ -e WORDPRESS_DB_HOST=wp-mysql:3306 \ -e WORDPRESS_DB_NAME=wordpress \ -e WORDPRESS_DB_USER=wpuser \ -e WORDPRESS_DB_PASSWORD=wpuser123 \ -e TZ=Asia/Shanghai \ --link wp-mysql:mysql \ --privileged=true \ wordpress:latest3.3 验证 WordPress 容器是否启动成功
📌 命令:
docker ps | grep wordpress-blog(输出中显示「Up」则正常)第四步:配置 WordPress 博客(浏览器操作)
4.1 访问 Blog 初始化页面
📌 操作:打开浏览器,输入
http://宿主机IP:8080(宿主机IP:Linux/Mac 用ifconfig/ip addr查询,Windows 用ipconfig查询)4.2 初始化 WordPress 配置
1. 选择语言:默认「简体中文」,点击「继续」; 2. 填写站点信息(自定义): - 站点标题:例如「我的 Docker 博客」 - 用户名:自定义(如 `admin`) - 密码:自定义(如 `admin123456`) - 电子邮箱:自定义(如 `test@xxx.com`) 3. 点击「安装 WordPress」,等待 10 秒完成安装; 4. 安装完成后,点击「登录」,输入用户名密码,进入博客后台。4.3 验证 Blog 可用性
- 前台访问:
http://宿主机IP:8080(查看博客首页,默认已生成示例文章); - 后台管理:
http://宿主机IP:8080/wp-admin(可发布文章、安装主题/插件)。
第五步:常用管理命令(单独标注)
5.1 查看容器状态
📌 命令:
docker ps | grep -E "wp-mysql|wordpress-blog"5.2 启动/停止容器
📌 启动命令:
docker start wp-mysql wordpress-blog
📌 停止命令:docker stop wp-mysql wordpress-blog5.3 查看容器日志(排查问题)
📌 MySQL 日志:
docker logs wp-mysql
📌 WordPress 日志:docker logs wordpress-blog5.4 进入容器(手动操作)
📌 进入 MySQL 容器:
docker exec -it wp-mysql bash
📌 进入 WordPress 容器(修改配置文件等):docker exec -it wordpress-blog bash5.5 重置项目(删除容器+数据,谨慎执行)
📌 命令:
-
-
停止并删除容器
docker stop wp-mysql wordpress-blog && docker rm wp-mysql wordpress-blog
清空所有数据
sudo rm -rf ~/docker/wordpress/*
## 关键避坑总结(命令+操作·直接执行/检查) ### 1. 端口冲突 📌 检查命令:`netstat -tuln | grep 8080`(或 `netstat -tuln | grep 3309`) 📌 解决:若端口被占用,修改 `docker run` 中 `-p` 参数(如 `8081:80`、`3310:3306`),再重启容器。 ### 2. 数据库连接失败 📌 检查点:确保 `WORDPRESS_DB_HOST=wp-mysql:3306`(容器名+端口),且 `--link wp-mysql:mysql` 未省略。 📌 解决:重启 WordPress 容器:`docker restart wordpress-blog`。 ### 3. 数据丢失 📌 检查点:必须通过 `-v` 挂载数据目录(如 `~/docker/wordpress/mysql/data`、`~/docker/wordpress/app`)。 📌 预防:非必要不执行「重置项目」命令。 ### 4. 权限问题(Linux/Mac) 📌 报错特征:容器日志显示「Permission denied」。 📌 解决命令:`sudo chown -R 999:999 ~/docker/wordpress/`(给数据目录赋权,999 是容器内用户 UID)。 ### 5. 浏览器无法访问 📌 检查点1:宿主机防火墙开放 8080 端口(如 `ufw allow 8080` 或 Windows 防火墙入站规则)。 📌 检查点2:云服务器需配置安全组开放 8080 端口(如阿里云安全组入方向添加 TCP 8080)。
通过Docker命令创建一个自己的镜像
-
通过 Docker 命令创建自定义镜像(以「带个人页面的 Nginx 镜像」为例·命令单独标注)
核心逻辑:基于官方基础镜像(Nginx),通过
Dockerfile定义自定义配置/文件,再用docker build构建镜像,步骤可复现、命令直接执行。 -
第一步:准备自定义镜像的「构建材料」
-
1.1 创建工作目录(存放 Dockerfile 和自定义文件)
📌 命令(Linux/Mac):
mkdir -p ~/my-docker-image # 创建目录 cd ~/my-docker-image # 进入目录1.2 创建自定义页面(镜像内要展示的内容,比如个人主页)
📌 命令(创建 index.html 文件,内容可自定义):
echo '<h1>My First Custom Docker Image!</h1>'' > index.html- 作用:镜像启动后,访问 Nginx 会显示这个页面,区别于官方 Nginx 默认页面。
第二步:编写 Dockerfile(定义镜像构建规则)
2.1 创建 Dockerfile 文件
📌 命令(用 echo 快速生成,或用 vim 编辑):
cat > Dockerfile << EOF
- 指定基础镜像(基于官方 Nginx 稳定版,省去自己装 Nginx 的步骤)
FROM nginx:stable-alpine
- 把本地的 index.html 复制到镜像内的 Nginx 默认页面目录(覆盖官方默认页面)
COPY index.html /usr/share/nginx/html/index.html
- 暴露镜像的 80 端口(Nginx 默认端口,告诉 Docker 这个镜像用 80 端口)
EXPOSE 80
- 启动镜像时自动运行 Nginx 服务(继承官方镜像的启动命令,可省略,此处为清晰展示)
CMD ["nginx", "-g", "daemon off;"]
EOF
```
- 每个指令作用:`FROM` 定基础镜、`COPY` 加自定义文件、`EXPOSE` 声明端口、`CMD` 定启动命令。
## 第三步:构建自定义镜像(核心命令 `docker build`)
### 3.1 执行构建命令
📌 命令(`-t` 给镜像打标签:`镜像名:版本`,`.` 表示从当前目录读取 Dockerfile):
```bash
docker build -t my-nginx:v1 .
```
- 示例标签:`my-nginx` 是镜像名(自定义),`v1` 是版本(方便后续区分)。
### 3.2 验证镜像是否构建成功
📌 命令(查看本地镜像列表,找 `my-nginx:v1`):
```bash
docker images | grep my-nginx
```
- 成功标志:输出包含 `my-nginx` 和 `v1` 的行,说明镜像已生成。
**纠错**:若构建报错「COPY failed: no source files were specified」,检查 `index.html` 是否和 `Dockerfile` 在同一目录(`~/my-docker-image`),且文件名无拼写错误。
## 第四步:运行自定义镜像(验证功能是否正常)
### 4.1 启动容器(基于自定义镜像)
📌 命令(`-p` 映射宿主机 8082 端口到容器 80 端口,避免和其他服务冲突):
```bash
docker run -d --name my-nginx-container -p 8082:80 my-nginx:v1
```
### 4.2 验证容器和页面
1. 检查容器是否运行:📌 命令 `docker ps | grep my-nginx-container`(显示「Up」则正常);
2. 访问自定义页面:
- 宿主机本地访问:📌 命令 `curl http://127.0.0.1:8082`,输出 `<h1>My First Custom Docker Image!</h1>` 即成功;
- 外部访问(如浏览器):输入 `http://宿主机IP:8082`,能看到自定义标题。
**纠错**:若访问失败,检查端口是否被占用(`netstat -tuln | grep 8082`),若占用则更换端口(如 `8083:80`)重新启动容器。
## 第五步:自定义镜像管理命令(删除/重命名)
### 5.1 删除容器(先停再删,避免占用镜像)
📌 命令:
```bash
docker stop my-nginx-container # 停止容器
docker rm my-nginx-container # 删除容器
```
### 5.2 删除自定义镜像(容器删除后才能删镜像)
📌 命令:
```bash
docker rmi my-nginx:v1
```
### 5.3 给镜像重命名(可选,比如改版本号)
📌 命令(将 `my-nginx:v1` 重命名为 `my-nginx:v2`):
```bash
docker tag my-nginx:v1 my-nginx:v2
```
## 关键总结
1. 自定义镜像核心:`Dockerfile` 定义规则 + `docker build` 执行构建;
2. 基础镜像选择:优先选 `alpine` 版本(体积小,适合快速构建);
3. 调试技巧:构建失败看日志(`docker build` 输出的 ERROR 信息),运行失败看容器日志(`docker logs 容器名`)。
按这个流程,你可以基于任何官方镜像(如 Python、Node.js)创建带自定义代码/配置的镜像,比如「带自己脚本的 Python 镜像」「带自定义配置的 Redis 镜像」等~
要不要我帮你扩展一个「带自定义 Python 脚本的镜像」教程?步骤类似,只需修改 Dockerfile 和自定义文件即可。
1
Docker网络
root@Docker:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
a2424329464c bridge bridge local
2c91da5e815c host host local
b63ed9722f30 none null local
# bridge 桥接模式(默认模式),创建docker0网卡,每个容器都有一个自动分配的IP地址,建立虚拟局域网,容器间可以通过ip+port通信,外部访问容器通过宿主机的ip+port,端口映射;
172.17.0.1/16
# host 主机模式,让容器直接使用主机的网络(ip地址和端口);
# 优点:网络效率最高
# 缺点:占用主机端口
# none 无网络模式,不联网没有ip
# overlay network 层叠网络,跨主机通信,vxlan(隧道技术),容器的集群部署中使用该模式
#查看当前的 docker 网络
docker network ls
# 创建docker网络,使用桥接模式
docker neowork create test-network -d bridge
# 使用docker网络,启动容器时,指定--network参数
docker run -itd --network=test-network --name ubuntu-test ubuntu:latest
# 将创建好的容器添加到docker网络中
docker network connect test-network 容器名称或ID
# 当docker网络不在被使用时,可以删除
docker network rm test-network
Docker存储
docker 数据卷(Data Volume)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于 Linux 的 mount 操作。
数据卷创建、挂载、删除、数据共享;
- docker volume create 数据卷名称
- /var/lib/docker/volumes/数据卷名称
- 直接指定系统目录作为数据卷
- -v系统目录:容器目录
# 查看所有数据卷
docker volume ls
# 创建数据卷
docker volume create test_volume
# 在运行容器时候直接挂载数据卷
docker run -itd --name nginx-test -p 8080:80 -v test_volume:/etc/nginx nginx:1.26
# 多个容器共享同一个数据卷
docker run -itd --name nginx-test-2 -p 9090:80 -v test_volume:/etc/nginx nginx:1.26
# 查看数据卷的详细信息
docker volume inspect test_volume
# 当数据卷未被占用时,可以删除,y
docker volume rm test_volume
1
DockerFile
Docker常用指令
| 指令 | 功能 |
|---|---|
| FROM | 指定基础镜像(父镜像) |
| LABEL | 添加新建镜像的元数据(坐着,简介) |
| RUN | 在容器中执行linux命令 |
| ENV | 在容器中设置环境变量 |
| ADD | 复制本地文件并自动解压缩,支持URL下载 |
| COPY | 只有复制功能 |
| YOLUME | 指定持久化目录 |
| CMD | |
| ENTRYPOINT | 容器启动时执行的命令,但不会被覆盖 |
| WORKDIR | 工作目录,等价执行 cd |
| EXPOSE | 指定对外暴露 |
通过Dockerfile创建镜像
docker build -t nginx-test .
- 使用Dockerfile制作MySQL镜像
以下是使用 Dockerfile 制作自定义 MySQL 镜像的完整笔记,包含环境准备、配置编写、问题解决及验证步骤,适用于 Linux 环境(以阿里云 ECS 为例):
### **一、环境准备**
1. **基础环境**
- 系统:Linux(如 Ubuntu、CentOS)
- 已安装 Docker:`docker --version` 验证(未安装需先安装 Docker)。
- 工作目录:`/root`(所有文件放在此目录下,可自定义)。
### **二、核心文件准备**
#### 1. Dockerfile(镜像构建脚本)
创建 `Dockerfile` 文件(`vim Dockerfile`),内容如下:
```dockerfile
# 基础镜像:使用 MySQL 8.0 官方镜像(固定版本更稳定)
FROM mysql:8.0
# 维护者信息(可选)
LABEL maintainer="your-name <your-email@example.com>"
# 环境变量配置(非敏感信息固定,密码建议启动时传入)
ENV TZ=Asia/Shanghai \ # 时区(避免日志时间偏移)
MYSQL_DATABASE=app_db \ # 自动创建的数据库
MYSQL_USER=app_user # 额外创建的应用用户
# 复制自定义 MySQL 配置文件(覆盖默认配置)
COPY ./conf/my.cnf /etc/mysql/conf.d/
RUN chmod 644 /etc/mysql/conf.d/my.cnf # 配置文件权限(必需)
# 复制初始化脚本(首次启动时自动执行)
COPY ./init-scripts/ /docker-entrypoint-initdb.d/
RUN chmod -R 755 /docker-entrypoint-initdb.d/ # 脚本可执行权限(必需)
# 暴露端口
EXPOSE 3306 33060
```
#### 2. 自定义 MySQL 配置文件(my.cnf)
- 创建 `conf` 目录及配置文件:
```bash
mkdir -p ./conf # 创建目录
vim ./conf/my.cnf # 编辑配置
```
- 配置内容(示例):
```ini
[mysqld]
character-set-server=utf8mb4 # 支持 emoji 的字符集
collation-server=utf8mb4_unicode_ci
max_connections=500 # 最大连接数
default-time-zone=+08:00 # 数据库时区
lower_case_table_names=1 # 表名不区分大小写(Linux 环境生效)
[client]
default-character-set=utf8mb4
```
#### 3. 初始化脚本(创建表和数据)
- 创建 `init-scripts` 目录及脚本文件:
```bash
mkdir -p ./init-scripts # 创建目录
```
- 脚本 1:创建表结构(`vim ./init-scripts/01_create_table.sql`):
```sql
USE app_db; # 使用自动创建的数据库
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
- 脚本 2:插入初始数据(`vim ./init-scripts/02_insert_data.sql`):
```sql
USE app_db;
INSERT INTO users (username) VALUES ('test_user');
```
### **三、构建镜像(关键步骤)**
#### 1. 修复 Docker 镜像源(避免拉取失败)
默认镜像源可能访问缓慢或失效,需配置国内源(阿里云 ECS 优先用阿里云源):
- 编辑配置文件:
```bash
sudo vim /etc/docker/daemon.json
```
- 配置内容(替换为阿里云专属加速地址,获取方式:阿里云控制台 → 容器镜像服务 → 镜像加速器):
```json
{
"registry-mirrors": ["https://你的阿里云加速地址.mirror.aliyuncs.com"]
}
```
- 重启 Docker 生效:
```bash
sudo systemctl daemon-reload
sudo systemctl restart docker
```
#### 2. 构建自定义 MySQL 镜像
在工作目录执行构建命令:
```bash
docker build -t my-mysql:v1.0 . # 镜像名:版本号 自定义
```
**常见错误及解决**:
- `E212: Can't open file for writing`:目录不存在,先创建 `conf` 或 `init-scripts` 目录(`mkdir -p 目录名`)。
- `Syntax error in ENV`:`ENV` 指令中 `\` 后有空格/注释,需删除(`\` 必须是行尾最后一个字符)。
- `镜像拉取失败`:检查 `daemon.json` 格式是否正确(JSON 语法严格),重启 Docker 后重试。
### **四、启动容器并验证**
#### 1. 启动 MySQL 容器
```bash
# 启动命令(数据持久化,避免容器删除后数据丢失)
docker run -d \
--name my-mysql-container \ # 容器名称
-p 3306:3306 \ # 端口映射(宿主:容器)
-v mysql-data:/var/lib/mysql \ # 数据卷挂载
-e MYSQL_ROOT_PASSWORD=root123 \ # 传入 root 密码(生产环境用强密码)
-e MYSQL_PASSWORD=user123 \ # 传入应用用户密码
my-mysql:v1.0 # 使用自定义镜像
```
**常见错误**:
- `invalid reference format`:命令中 `\` 后有注释,删除注释或写成一行命令。
#### 2. 验证容器状态
```bash
# 查看容器是否运行(状态为 Up 即正常)
docker ps | grep my-mysql-container
# 查看启动日志(排查初始化问题)
docker logs my-mysql-container
```
#### 3. 验证 MySQL 配置及数据
- 进入容器并连接 MySQL:
```bash
docker exec -it my-mysql-container bash # 进入容器
mysql -u root -p # 输入密码 root123 连接
```
- 执行 SQL 验证:
```sql
-- 验证数据库是否创建
show databases; # 应包含 app_db
-- 验证表和数据是否初始化
use app_db;
show tables; # 应包含 users 表
select * from users; # 应显示 test_user 数据
-- 验证字符集配置
show variables like 'character_set%'; # 应显示 utf8mb4
```
### **五、生产环境优化建议**
1. **敏感信息管理**:密码等敏感信息通过 `docker run -e` 传入,避免硬编码在 Dockerfile 中。
2. **固定镜像版本**:`FROM mysql:8.0.36`(具体版本),避免自动更新导致兼容问题。
3. **健康检查**:Dockerfile 中添加 `HEALTHCHECK` 监控服务状态:
```dockerfile
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD mysqladmin ping -h localhost -u root -p"${MYSQL_ROOT_PASSWORD}" || exit 1
```
4. **数据备份**:定期备份数据卷 `mysql-data`(`docker volume inspect mysql-data` 查看路径)。
### **总结**
通过以上步骤,可完成自定义 MySQL 镜像的构建、容器启动及验证,核心包括:
- 正确编写 Dockerfile 及配套配置/脚本;
- 解决镜像源、权限、语法等常见问题;
- 确保数据持久化和服务可访问性。
适用于开发环境快速部署,生产环境需进一步优化安全和稳定性。
- 使用Dockerfile制作Redis镜像
- 使用Dockerfile制作Tomcat镜像
DockerCompose
单机容量编排,一键批量管理多个容器
Docker私有镜像站-Harbor
私有镜像站,方便管理,下载部署自己的镜像;
cd /opt
wget http://192.168.57.200/Software/harbor-offline-installer-v2.14.0.tgz
tar -xvf harbor-offline-installer-v2.14.0.tgz
cd harbo
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
hostname
passwrod
ssl
/etc/docker/d
docker compose up -d
容器化技术是现代软件开发、交付和运维(DevOps)体系中的核心技术之一,其核心目标是解决“软件在开发环境能跑,在生产环境跑不起来”的环境一致性问题,并提升资源利用率与部署效率。以下针对你的问题逐一展开说明:
## 1. 什么是容器化技术?优势是什么?
### (1)定义
容器化技术是一种**操作系统级虚拟化技术**,它通过对应用程序及其所有依赖(如库、配置文件、环境变量等)进行“打包”,形成一个独立的“容器”单元。容器共享宿主机的操作系统内核,但拥有独立的文件系统、网络空间和资源配额,从而实现“**一次打包,到处运行**”的效果。
简单来说,容器就像一个“轻量级的隔离盒子”,里面装着应用和它需要的所有“配件”,无论放在哪台支持容器的机器上,都能以相同的方式运行。
### (2)核心优势
- **环境一致性**:彻底解决“开发环境能跑,生产环境崩了”的问题。容器将应用与依赖打包,确保在开发、测试、生产等不同环境中运行环境完全一致。
- **资源高效利用**:容器共享宿主机内核,无需像虚拟机那样为每个实例分配独立的操作系统(Guest OS),资源占用极低(通常以MB为单位),一台宿主机可运行成百上千个容器。
- **快速启动与部署**:容器启动时间通常在**秒级**(甚至毫秒级),远快于虚拟机的分钟级启动;同时支持自动化部署,可快速扩缩容,适应业务流量波动。
- **强可移植性**:容器可在任意支持容器引擎(如Docker)的环境中运行,包括物理机、虚拟机、公有云(AWS/Azure/阿里云)、私有云等,无需修改应用代码。
- **轻量隔离**:容器间通过技术手.段实现资源(CPU、内存、网络)和文件系统的隔离,既保证了应用间互不干扰,又避免了虚拟机的重量级开销。
## 2. Docker简介
Docker是**容器化技术的主流开源实现**,由Docker Inc.(后被Mirantis收购)于2013年推出,它极大地简化了容器的创建、管理和分发流程,让容器技术从“小众技术”走向了主流。
### (1)核心定位
Docker的核心使命是“**Build, Ship, Run Any App, Anywhere**”(构建、分发、运行任意应用,随时随地),其本质是一个“容器引擎”——负责管理容器的生命周期(创建、启动、停止、销毁)。
### (2)核心组件
- **Docker Engine**:Docker的核心运行组件,包含守护进程(dockerd)、命令行工具(docker CLI)和API接口,负责与宿主机内核交互,实现容器的创建和管理。
- **Docker Image(镜像)**:容器的“模板”,包含应用及其依赖的静态文件(如代码、库、配置),是创建容器的基础(下文会详细说明)。
- **Docker Container(容器)**:镜像的“运行实例”,是动态的、可执行的单元(类比“类”与“对象”的关系)。
- **Docker Registry(仓库)**:用于存储和分发镜像的平台,类似“代码仓库”(如GitHub)。最常用的公共仓库是**Docker Hub**,包含数百万个官方/第三方镜像(如Nginx、MySQL镜像)。
### (3)生态优势
Docker拥有庞大的生态系统,支持与Kubernetes(容器编排工具)、Jenkins(CI/CD工具)、Prometheus(监控工具)等主流DevOps工具无缝集成,成为企业级容器化落地的“标准工具链”之一。
## 3. 容器与镜像:“模板”与“实例”的关系
容器和镜像是Docker(及其他容器技术)中最核心的两个概念,二者是“**静态模板**”与“**动态实例**”的关系,类比编程中的“**类(Class)** ”与“**对象(Object)** ”。
### (1)Docker Image(镜像):静态的“模板”
- **定义**:镜像是一个**只读的、分层的文件集合**,包含运行应用所需的所有依赖(代码、库、环境变量、配置文件等),以及应用的启动命令。
- **核心特性**:
- **只读性**:镜像一旦构建完成,就无法修改(若需修改,需基于原镜像创建新镜像);
- **分层结构**:镜像由多个“层(Layer)”组成(如基础层、依赖层、应用层),不同镜像可共享相同的层(如多个应用都基于“Ubuntu 22.04”基础层),极大节省存储空间和拉取时间。
- **示例**:我们从Docker Hub拉取的`nginx:alpine`就是一个镜像,它包含了Nginx服务和轻量级的Alpine Linux系统依赖。
### (2)Docker Container(容器):动态的“实例”
- **定义**:容器是镜像的**可运行实例**——当我们通过`docker run`命令启动镜像时,Docker会在镜像的只读层之上添加一个“**可写层**”,容器的所有修改(如创建文件、修改配置)都只发生在这个可写层,不会影响原镜像。
- **核心特性**:
- **可写性**:容器的可写层允许动态修改数据;
- **独立性**:每个容器有独立的网络、进程空间和资源配额,即使基于同一个镜像启动多个容器,它们也互不干扰。
- **示例**:通过`docker run -d nginx:alpine`启动后,就会生成一个运行Nginx的容器,我们可以通过`docker exec`进入容器操作,或通过`docker stop`停止容器。
### (3)二者关系总结
| 维度 | Docker镜像(Image) | Docker容器(Container) |
| -------- | -------------------------- | ------------------------ |
| 状态 | 静态(只读) | 动态(可运行、可修改) |
| 作用 | 作为容器的“模板” | 作为应用的“运行载体” |
| 生命周期 | 构建后长期存在(除非删除) | 启动后存在,停止后可销毁 |
| 数据修改 | 不可修改 | 可在“可写层”修改 |
## 4. 容器与虚拟机的区别:轻量级vs重量级
容器和虚拟机(VM)都是虚拟化技术,核心目标都是“隔离应用”,但二者的虚拟化层级、资源占用和效率有本质区别,具体对比如下:
| 对比维度 | 容器(Container) | 虚拟机(Virtual Machine) |
| ----------------- | ------------------------------------------ | -------------------------------------------------- |
| **虚拟化层级** | 操作系统级(共享宿主机内核) | 硬件级(模拟物理硬件) |
| **核心组件** | 容器引擎(如Docker)+ 宿主机OS | Hypervisor(如VMware/KVM)+ Guest OS(每个VM独立) |
| **资源占用** | 极低(MB级,共享内核) | 较高(GB级,需独立OS资源) |
| **启动速度** | 秒级(甚至毫秒级) | 分钟级(需启动Guest OS) |
| **隔离性** | 轻量隔离(共享内核,隔离文件/网络/资源) | 强隔离(完全独立的OS,安全性更高) |
| **镜像/文件大小** | 小(通常几十MB~几百MB,如Nginx镜像约20MB) | 大(通常几GB~几十GB,如Windows Server VM约10GB) |
| **适用场景** | 微服务、DevOps、高频部署场景 | 需强隔离的场景(如运行不同OS、敏感业务) |
### 关键总结
- 容器是“**共享内核的轻量级隔离**”,适合追求效率和密度的场景;
- 虚拟机是“**独立OS的重量级隔离**”,适合追求强安全性和跨OS的场景。
## 5. 容器的底层技术(以Linux为例)
容器的“轻量级隔离”和“资源控制”能力,本质依赖于Linux内核的三大核心技术:**Namespace**、**Cgroups** 和 **Union File System(UnionFS)**。
### (1)Namespace:实现“隔离”的核心
Namespace(命名空间)是Linux内核提供的一种“**环境隔离机制**”,它能让容器内的进程“误以为”自己是系统中唯一的进程,从而实现网络、进程ID、文件系统等维度的隔离。
常见的Namespace类型及作用:
- **PID Namespace**:隔离进程ID(容器内的PID从1开始,与宿主机PID不冲突);
- **NET Namespace**:隔离网络(容器有独立的网卡、IP、端口,与宿主机网络隔离);
- **Mount Namespace**:隔离文件系统挂载点(容器内的`/`根目录与宿主机不同);
- **UTS Namespace**:隔离主机名和域名(容器可设置独立的主机名);
- **IPC Namespace**:隔离进程间通信(如信号量、消息队列,容器间无法直接通信);
- **User Namespace**:隔离用户ID(容器内的root用户在宿主机中可能是普通用户,提升安全性)。
### (2)Cgroups:实现“资源限制”的核心
Cgroups(Control Groups,控制组)是Linux内核提供的“**资源配额管理机制**”,它能限制容器对CPU、内存、磁盘IO、网络带宽等资源的使用,避免单个容器过度占用资源影响其他容器。
常见的Cgroups控制能力:
- **CPU限制**:限制容器使用的CPU核心数或CPU时间占比(如限制容器最多使用1个CPU核心);
- **内存限制**:限制容器的最大内存使用量(如限制容器最多使用512MB内存,超出则OOM);
- **IO限制**:限制容器对磁盘的读写速率(如限制写入速率为100MB/s);
- **PID限制**:限制容器内可创建的最大进程数。
### (3)UnionFS:实现“镜像分层”的核心
UnionFS(联合文件系统)是一种“**分层文件系统**”,它能将多个只读的文件层(镜像层)和一个可写层(容器层)“联合”成一个统一的文件系统,从而实现镜像的分层复用和容器的可写性。
Docker中常用的UnionFS实现:
- **OverlayFS**:Docker默认的存储驱动(高效、稳定),将镜像的只读层作为“lowerdir”,容器的可写层作为“upperdir”,联合后对外呈现为“merged”目录(容器内的`/`);
- **AUFS**:早期Docker使用的存储驱动,功能类似OverlayFS,但兼容性稍弱。
### 总结
容器的底层技术本质是“**Namespace隔离环境 + Cgroups限制资源 + UnionFS管理文件**”——三者协同工作,共同支撑了容器的轻量级、高效、可移植特性。
# 1.Docker简介
Docker 是一个开源的应用容器引擎,基于 Go 语言开发,遵循 Apache 2.0 协议开源。它能让开发者将应用及其依赖打包到一个轻量级、可移植的 “容器” 中,然后发布到任何支持 Docker 的环境(Linux、Windows、macOS)中,实现 “一次构建,到处运行”。
## 1.1 Docker 核心概念
Docker 生态有 3 个最核心的组件,理解它们是入门的关键:
镜像(Image):容器的 “模板”,是一个只读的文件集合(包含应用代码、依赖、环境变量、配置文件等)。例如 nginx:alpine、mysql:8.0 都是官方镜像。
容器(Container):镜像的 “运行实例”,是一个可读写的沙箱环境。容器之间相互隔离,拥有独立的网络和文件系统,可被启动、停止、删除。
仓库(Repository):存放镜像的 “仓库”,类似代码仓库(如 GitHub)。分为公开仓库(如 Docker Hub,全球最大的公开镜像库)和私有仓库(如 Harbor,企业内部使用)。
## 1.2 为什么要用 Docker?
环境一致性:解决 “开发环境能跑,生产环境跑不了” 的经典问题(依赖、配置统一)。
轻量级:容器基于宿主机内核运行,无需像虚拟机(VM)那样模拟完整操作系统,启动快(秒级)、资源占用少(单宿主机可运行上千容器)。
隔离性:容器间相互隔离,避免应用间的依赖冲突(如 A 应用用 Python 3.8,B 应用用 Python 3.10)。
可移植性:容器可在任何支持 Docker 的环境中运行(物理机、云服务器、本地电脑)。
自动化部署:与 CI/CD 工具(Jenkins、GitLab CI)无缝集成,实现自动化构建、测试、发布。
# 2.安装Docker
#### 2.1.2 Ubuntu 20.04 安装
1. 卸载旧版本:
```bash
sudo apt-get remove docker docker-engine docker.io containerd runc
2. 安装依赖包:
```bash
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common3. 添加 Docker 官方 GPG 密钥:
```bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```
4. 配置 Docker 仓库:
```bash
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
```
5. 安装 Docker CE:
```bash
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io
```
6. 启动 Docker 并设置开机自启:
```bash
sudo systemctl start docker
sudo systemctl enable docker
```
7. 验证安装:
```bash
sudo docker --version # 查看版本
sudo docker run hello-world # 运行测试容器(会自动拉取 hello-world 镜像)
```
# 3.配置Docker镜像加速
Docker 默认拉取镜像的源是 Docker Hub(国外服务器),国内访问速度极慢,需配置**国内镜像加速器**(如阿里云、网易云)。
### 3.1 主流国内加速源
| 加速源名称 | 加速地址 |
| -------------- | ------------------------------------------------------------ |
| 阿里云(推荐) | https://<你的阿里云 ID>.[mirror.aliyuncs.com](https://mirror.aliyuncs.com/) |
| 网易云 | [https://hub-mirror.c.163.com](https://hub-mirror.c.163.com/) |
| DaoCloud | [https://docker.m.daocloud.io](https://docker.m.daocloud.io/) |
| 腾讯云 | [https://mirror.ccs.tencentyun.com](https://mirror.ccs.tencentyun.com/) |
> 阿里云加速需注册阿里云账号,在「容器镜像服务」->「镜像加速器」中获取专属地址(免费)。
### 3.2 配置步骤(以 Linux 为例)
1. 创建 Docker 配置目录(若不存在):
```bash
sudo mkdir -p /etc/docker
```
2. 编写配置文件
```
daemon.json
```
```bash
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hub-mirror.c.163.com"] # 替换为你的加速地址
}
EOF
```
3. 重启 Docker 服务使配置生效:
```bash
sudo systemctl daemon-reload
sudo systemctl restart docker
```
4. 验证配置:
```bash
sudo docker info | grep "Registry Mirrors"
```
若输出包含你配置的加速地址,说明配置成功。
# 4. Docker 常用命令
Docker 命令按功能可分为**镜像命令**、**容器命令**、**仓库命令**、**网络命令**等,以下是高频使用的核心命令。
### 4.1 镜像命令(操作 Image)
| 命令 | 作用 | 示例 |
| ----------------------------------------------- | ------------------------------------------ | ------------------------------------------- |
| `docker pull <镜像名>` | 拉取镜像(默认最新版,加 `:tag` 指定版本) | `docker pull nginx:1.24` |
| `docker images` | 查看本地所有镜像 | `docker images -a`(显示所有镜像) |
| `docker rmi <镜像名>` | 删除镜像 | `docker rmi -f nginx:1.24`(强制删除) |
| `docker build -t <镜像名:tag> <DockerFile路径>` | 基于 DockerFile 构建镜像 | `docker build -t my-nginx:v1 .`(当前目录) |
| `docker save -o <压缩包名>.tar <镜像名>` | 导出镜像为压缩包 | `docker save -o nginx.tar nginx:1.24` |
| `docker load -i <压缩包名>.tar` | 从压缩包导入镜像 | `docker load -i nginx.tar` |
### 4.2 容器命令(操作 Container)
| 命令 | 作用 | 示例 |
| ------------------------------------ | ------------------------------ | --------------------------------------------------- |
| `docker run <参数> <镜像名>` | 基于镜像创建并启动容器 | `docker run -d -p 80:80 --name my-nginx nginx:1.24` |
| `docker ps` | 查看运行中的容器 | `docker ps -a`(查看所有容器,包括停止的) |
| `docker start/stop <容器名/ID>` | 启动/停止容器 | `docker start my-nginx` |
| `docker restart <容器名/ID>` | 重启容器 | `docker restart my-nginx` |
| `docker exec -it <容器名/ID> <命令>` | 进入运行中的容器(交互模式) | `docker exec -it my-nginx /bin/bash` |
| `docker rm <容器名/ID>` | 删除容器 | `docker rm -f my-nginx`(强制删除运行中的容器) |
| `docker logs <容器名/ID>` | 查看容器日志 | `docker logs -f my-nginx`(实时跟踪日志) |
| `docker inspect <容器名/ID>` | 查看容器详细信息(IP、配置等) | `docker inspect my-nginx` |
### 4.3 仓库命令(操作 Repository)
| 命令 | 作用 | 示例 |
| --------------------------------------------- | -------------------------------- | ------------------------------------------------- |
| `docker login <仓库地址>` | 登录镜像仓库(默认 Docker Hub) | `docker login`(登录 Docker Hub,需输入账号密码) |
| `docker logout <仓库地址>` | 退出镜像仓库 | `docker logout` |
| `docker tag <原镜像名> <仓库地址/镜像名:tag>` | 给镜像打标签(用于推送私有仓库) | `docker tag nginx:1.24 192.168.1.100/my-nginx:v1` |
| `docker push <仓库地址/镜像名:tag>` | 推送镜像到仓库 | `docker push 192.168.1.100/my-nginx:v1` |
# 5. Docker 实战
通过 3 个经典实战案例,巩固 Docker 命令的使用。
### 5.1 实战 1:部署 Nginx 服务
目标:启动 Nginx 容器,通过宿主机 IP 访问 Nginx 首页。
1. 拉取 Nginx 镜像:
```bash
docker pull nginx:1.24
```
2. 启动容器(端口映射:宿主机 80 端口 -> 容器 80 端口):
```bash
docker run -d \
--name my-nginx \
-p 80:80 \
-v /opt/nginx/html:/usr/share/nginx/html \ # 挂载宿主机目录到容器(自定义首页)
nginx:1.24
```
3. 验证:在浏览器输入宿主机 IP(如 `http://192.168.1.100`),若显示 Nginx 欢迎页,说明部署成功。
4. 自定义首页:在宿主机 `/opt/nginx/html` 目录下创建 `index.html`,内容如下,刷新浏览器即可看到自定义页面:
```html
<h1>Hello Docker Nginx!</h1>
```
### 5.2 实战 2:部署 MySQL 服务
目标:启动 MySQL 容器,设置root密码,挂载数据卷(持久化数据)。
1. 拉取 MySQL 镜像:
```bash
docker pull mysql:8.0
```
2. 启动容器(设置密码、挂载数据卷):
```bash
docker run -d \
--name my-mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \ # 设置 root 密码
-v /opt/mysql/data:/var/lib/mysql \ # 挂载数据卷(持久化数据)
mysql:8.0
```
3. 验证:通过 MySQL 客户端连接(如 Navicat、命令行):
```bash
# 宿主机安装 mysql-client 后连接
mysql -h 127.0.0.1 -u root -p123456
```
若能成功登录,说明 MySQL 部署成功。
### 5.3 实战 3:部署 Spring Boot 应用
目标:将本地 Spring Boot 项目打包为 Docker 镜像,启动容器并访问。
1. 准备 Spring Boot 项目:确保项目能正常运行(如提供 `/hello` 接口),打包为 JAR 包(`demo.jar`)。
2. 在 JAR 包同级目录创建 `DockerFile`:
```dockerfile
# 基础镜像(Java 11)
FROM openjdk:11-jre-slim
# 作者信息
MAINTAINER demo <demo@example.com>
# 创建目录
WORKDIR /app
# 复制 JAR 包到容器
COPY demo.jar /app/demo.jar
# 暴露端口(项目端口)
EXPOSE 8080
# 启动命令
CMD ["java", "-jar", "demo.jar"]
```
3. 构建镜像:
```bash
docker build -t demo-app:v1 .
```
4. 启动容器:
```bash
docker run -d --name demo-app -p 8080:8080 demo-app:v1
```
5. 验证:访问 `http://宿主机IP:8080/hello`,若返回接口数据,说明部署成功。
# 6. Docker 网络
Docker 容器间的通信、容器与宿主机的通信,依赖 Docker 网络。Docker 内置 5 种网络模式,默认使用 `bridge` 模式。
### 6.1 5 种网络模式对比
| 网络模式 | 特点 | 适用场景 |
| ---------------- | ----------------------------------------- | ----------------------------------------------- |
| `bridge`(默认) | 容器使用独立 IP,通过宿主机网桥与外界通信 | 多容器在同一宿主机内通信(如 Nginx 连接 MySQL) |
| `host` | 容器共享宿主机网络(无独立 IP) | 需使用宿主机端口,追求性能(如高性能服务) |
| `none` | 容器无网络(仅本地环路) | 无需网络的容器(如仅处理本地文件的脚本) |
| `container` | 容器共享另一个容器的网络(同 IP、端口) | 需复用其他容器网络的场景(如 sidecar 模式) |
| `overlay` | 跨宿主机的容器网络(多宿主机容器通信) | 分布式应用(如 Docker Swarm、K8s 集群) |
### 6.2 常用网络命令
| 命令 | 作用 | 示例 |
| --------------------------------------------- | ---------------------------------- | ----------------------------------------------- |
| `docker network ls` | 查看所有 Docker 网络 | `docker network ls` |
| `docker network create <网络名>` | 创建自定义网络(默认 bridge 类型) | `docker network create my-network` |
| `docker network connect <网络名> <容器名>` | 将容器加入指定网络 | `docker network connect my-network my-nginx` |
| `docker network disconnect <网络名> <容器名>` | 将容器从网络移除 | `docker network disconnect my-network my-nginx` |
| `docker network rm <网络名>` | 删除网络 | `docker network rm my-network` |
### 6.3 实战:自定义网络实现容器通信
目标:创建自定义网络,让 Nginx 容器和 MySQL 容器在该网络内通信(无需端口映射)。
1. 创建自定义网络:
```bash
docker network create demo-network
```
2. 启动 MySQL 容器并加入网络:
```bash
docker run -d \
--name demo-mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--network demo-network \ # 加入自定义网络
mysql:8.0
```
3. 启动 Nginx 容器并加入网络:
```bash
docker run -d \
--name demo-nginx \
--network demo-network \
nginx:1.24
```
4. 验证通信:进入 Nginx 容器,ping MySQL 容器(用容器名作为 hostname):
```bash
docker exec -it demo-nginx /bin/bash
ping demo-mysql # 若能 ping 通,说明通信正常
```
# 7. DockerFile
DockerFile 是一个**文本文件**,包含一系列指令(如 `FROM`、`COPY`、`RUN`),用于定义“如何构建 Docker 镜像”。通过 DockerFile,可实现镜像构建的标准化和自动化。
### 7.1 DockerFile 核心指令
| 指令 | 作用 | 示例 |
| -------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| `FROM <镜像名>` | 指定基础镜像(必须是第一条指令) | `FROM openjdk:11-jre-slim`(基于 Java 11 镜像) |
| `WORKDIR <路径>` | 设置容器的工作目录(后续指令的默认目录) | `WORKDIR /app` |
| `COPY <源路径> <目标路径>` | 复制宿主机文件到容器(源路径是相对 DockerFile 的路径) | `COPY demo.jar /app/demo.jar` |
| `ADD <源路径> <目标路径>` | 类似 COPY,但支持远程文件和压缩包自动解压 | `ADD https://xxx/demo.tar.gz /app`(不推荐远程,用 COPY + wget 更灵活) |
| `RUN <命令>` | 构建镜像时执行的命令(如安装依赖) | `RUN apt-get update && apt-get install -y curl` |
| `EXPOSE <端口>` | 声明容器暴露的端口(仅文档作用,不实际映射) | `EXPOSE 8080` |
| `ENV <键>=<值>` | 设置环境变量(构建和运行时都生效) | `ENV JAVA_OPTS="-Xms512m -Xmx1024m"` |
| `CMD <命令>` | 容器启动时执行的命令(仅最后一条生效,可被 `docker run` 命令覆盖) | `CMD ["java", "-jar", "demo.jar"]` |
| `ENTRYPOINT <命令>` | 容器启动时执行的命令(不可被覆盖,可与 CMD 配合传参) | `ENTRYPOINT ["java", "-jar"]` + `CMD ["demo.jar"]` |
### 7.2 编写最佳实践
1. **基础镜像选择**:优先选择官方、轻量级镜像(如 `alpine` 版本,体积小),避免使用 `latest` 标签(版本不稳定)。
- 坏:`FROM ubuntu`(体积大,版本不确定)
- 好:`FROM ubuntu:22.04` 或 `FROM nginx:1.24-alpine`
2. **合并 RUN 指令**:减少镜像层数(Docker 镜像分层存储,层数越多体积越大),用 `&&` 合并命令,用 `\` 换行。
- 坏:
```dockerfile
RUN apt-get update
RUN apt-get install -y curl
```
- 好:
```dockerfile
RUN apt-get update && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/* # 清理缓存,减少体积
```
3. **使用 .dockerignore 文件**:排除无需复制到容器的文件(如 `node_modules`、`logs`、`.git`),减少镜像体积。
# 8. Docker Compose
当应用需要多个容器(如 Nginx + MySQL + Spring Boot)时,手动用 `docker run` 启动多个容器效率低且易出错。**Docker Compose** 是一个用于定义和运行“多容器 Docker 应用”的工具,通过一个 `docker-compose.yml` 文件配置所有容器,执行一条命令即可启动/停止所有服务。
### 8.1 安装 Docker Compose
- Linux 系统:
```bash
# 下载 Compose(版本可替换为最新版)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
```
- Windows/macOS:安装 Docker Desktop 时已自带 Docker Compose,无需额外安装。
### 8.2 docker-compose.yml 核心结构
`docker-compose.yml` 是 YAML 格式文件,核心字段包括:
- `version`:指定 Compose 版本(需与 Docker 版本兼容,推荐 `3.8`)。
- `services`:定义所有容器服务(如 `nginx`、`mysql`、`app`),每个服务对应一个容器。
- `networks`:定义服务使用的网络(类似 `docker network create`)。
- `volumes`:定义数据卷(类似 `docker volume create`)。
### 8.3 实战:用 Compose 部署多容器应用
目标:通过 Compose 启动 Nginx + MySQL + Spring Boot 三个服务。
1. 项目结构:
```
demo-project/
├── docker-compose.yml # Compose 配置文件
├── app/ # Spring Boot 项目
│ ├── demo.jar
│ └── DockerFile
└── nginx/ # Nginx 配置
└── nginx.conf
```
2. 编写 `docker-compose.yml`:
```yaml
version: '3.8'
services:
# Spring Boot 服务
app:
build: ./app # 基于 ./app 目录的 DockerFile 构建镜像
container_name: demo-app
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/demo_db?useSSL=false&serverTimezone=UTC
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=123456
depends_on: # 依赖 mysql 服务,确保 mysql 先启动
- mysql
networks:
- demo-network
# MySQL 服务
mysql:
image: mysql:8.0
container_name: demo-mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=demo_db # 自动创建数据库
volumes:
- mysql-data:/var/lib/mysql # 挂载数据卷(持久化)
networks:
- demo-network
# Nginx 服务
nginx:
image: nginx:1.24
container_name: demo-nginx
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf # 挂载配置文件
depends_on:
- app
networks:
- demo-network
# 定义网络
networks:
demo-network:
driver: bridge
# 定义数据卷
volumes:
mysql-data: # 自动创建数据卷,持久化 MySQL 数据
```
3. 启动所有服务:在 `docker-compose.yml` 同级目录执行:
```bash
docker-compose up -d # -d 表示后台运行
```
4. 查看服务状态:
```bash
docker-compose ps
```
5. 停止并删除所有服务(包括容器、网络,数据卷保留):
```bash
docker-compose down
```
6. 停止并删除所有服务+数据卷:
```bash
docker-compose down -v
```
# 9. Docker 私有镜像站 - Harbor
Docker Hub 是公开镜像库,适合存储开源镜像,但企业内部的敏感镜像(如业务应用镜像)需存储在**私有镜像库**中。**Harbor** 是 VMware 开源的企业级私有镜像仓库,支持镜像管理、权限控制、漏洞扫描、日志审计等功能,是企业内部的首选。
### 9.1 Harbor 核心功能
- **镜像管理**:支持镜像的上传、下载、删除,按项目分组管理。
- **权限控制**:基于角色(RBAC)的访问控制(如管理员、开发者、访客)。
- **安全扫描**:集成 Clair 工具,扫描镜像中的漏洞。
- **日志审计**:记录所有镜像操作日志,便于追溯。
- **高可用**:支持多节点部署,避免单点故障。
### 9.2 安装 Harbor(基于 Docker Compose)
Harbor 依赖 Docker 和 Docker Compose,需先确保两者已安装。
1. 下载 Harbor 安装包:
```bash
# 下载最新版(可从 https://github.com/goharbor/harbor/releases 查看最新版本)
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
# 解压
tar -zxvf harbor-offline-installer-v2.10.0.tgz
cd harbor
```
2. 配置 Harbor:
- 复制模板配置文件:
```bash
cp harbor.yml.tmpl harbor.yml
```
- 编辑 `harbor.yml`,修改核心配置(其他配置默认即可):
```yaml
hostname: 192.168.1.100 # Harbor 服务器的 IP 或域名(必须修改)
http:
port: 80 # HTTP 端口(可选,生产环境推荐用 HTTPS)
# https: # 生产环境需配置 HTTPS,此处省略
# port: 443
# certificate: /your/cert/path
# private_key: /your/key/path
harbor_admin_password: Harbor12345 # 管理员密码(默认,可修改)
```
3. 安装 Harbor:
```bash
# 执行安装脚本(自动加载镜像、启动 Compose 服务)
sudo ./install.sh
```
4. 验证安装:
- 访问 Harbor 页面:在浏览器输入 `http://192.168.1.100`(你的 hostname),用账号 `admin`、密码 `Harbor12345` 登录。
- 查看 Harbor 服务:
```bash
cd harbor
docker-compose ps # 若所有服务状态为 Up,说明安装成功
```
### 9.3 实战:使用 Harbor 私有仓库
目标:将本地 `demo-app:v1` 镜像推送到 Harbor,再从其他机器拉取。
1. 在 Harbor 上创建项目:
- 登录 Harbor 页面,点击「新建项目」,输入项目名(如 `demo-project`),选择「私有」(仅授权用户可访问)。
2. 本地机器登录 Harbor:
```bash
# 若 Harbor 用 HTTP(非 HTTPS),需先配置 Docker 信任该仓库(否则登录失败)
# 编辑 /etc/docker/daemon.json,添加 "insecure-registries": ["192.168.1.100"]
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hub-mirror.c.163.com"],
"insecure-registries": ["192.168.1.100"] # 新增该行
}
EOF
# 重启 Docker
sudo systemctl daemon-reload && sudo systemctl restart docker
# 登录 Harbor
docker login 192.168.1.100
# 输入 Harbor 账号(如 admin)和密码(Harbor12345)
```
3. 给镜像打标签(符合 Harbor 规范:`Harbor地址/项目名/镜像名:tag`):
```bash
docker tag demo-app:v1 192.168.1.100/demo-project/demo-app:v1
```
4. 推送镜像到 Harbor:
```bash
docker push 192.168.1.100/demo-project/demo-app:v1
```
- 推送成功后,在 Harbor 页面的「demo-project」项目中可看到该镜像。
5. 从其他机器拉取镜像:
- 在目标机器上,同样配置 Docker 信任 Harbor 仓库(步骤 2)。
- 登录 Harbor 并拉取镜像:
```bash
docker login 192.168.1.100
docker pull 192.168.1.100/demo-project/demo-app:v1
```
### 9.4 Harbor 日常维护
- **启动/停止 Harbor**:
```bash
cd harbor
docker-compose start # 启动
docker-compose stop # 停止
docker-compose restart # 重启
```
- **升级 Harbor**:参考 [Harbor 官方升级文档](https://goharbor.io/docs/2.10.0/upgrade/),需备份数据后执行升级脚本。
- **备份数据**:备份 Harbor 的数据库(默认存储在 `/data/database`)和镜像数据(默认存储在 `/data/registry`)。
---
通过以上 9 个主题的学习,你已掌握 Docker 从基础到进阶的核心知识,包括镜像/容器管理、网络配置、DockerFile 构建、Compose 多容器编排、Harbor 私有仓库。后续可进一步学习 Docker Swarm(Docker 原生集群)或 Kubernetes(K8s,容器编排领域标准),实现大规模容器的管理。
```
2.
```
浙公网安备 33010602011771号