/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
📖 目录
- 一、Docker 安装与配置
- 1.1 安装 Docker
- 1.2 配置镜像加速器
- 1.3 测试 Docker 可用性
- 二、Docker 基础操作
- 2.1 镜像操作
- 2.2 容器操作
- 2.3 进入容器内部
- 三、私有镜像仓库搭建与使用
- 3.1 搭建私有仓库
- 3.2 镜像推送与拉取
- 四、开发阶段:创建自定义镜像
- 4.1 编写 Dockerfile
- 4.2 构建镜像
- 4.3 给镜像打标签
- 4.4 推送镜像到仓库
- 五、生产部署:容器化实战
- 5.1 Dockerfile 进阶示例
- 5.2 使用 docker-compose 编排多容器
- 5.3 复杂项目示例:.NET + MySQL + Redis
一、Docker 安装与配置
1.1 安装 Docker
1. 下载安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
2. 执行安装
sudo sh get-docker.sh
3. 加入 Docker 用户组
为了避免每次执行 Docker 命令都需要输入 sudo,可以将当前用户加入 Docker 用户组:
sudo usermod -aG docker $USER
4. 重启 Docker 服务
sudo systemctl restart docker
注意:执行完用户组修改后,需要重新登录系统或重启才能使权限生效。
1.2 配置镜像加速器
国内访问 Docker Hub 较慢,建议配置镜像加速器提升拉取镜像的速度。
1. 创建 Docker 配置文件目录
sudo mkdir -p /etc/docker
2. 配置镜像加速地址
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
3. 重启 Docker 服务使配置生效
sudo systemctl restart docker
1.3 测试 Docker 可用性
1. 拉取 Hello-World 镜像
docker pull hello-world
2. 运行 Hello-World 容器
docker run hello-world
如果看到 “Hello from Docker!” 的输出,说明 Docker 安装配置成功。
二、Docker 基础操作
2.1 镜像操作
查看镜像列表
docker images
启动镜像(运行容器)
启动一个 Nginx 网页镜像:
docker run -d –name myweb -p 8080:80 nginx
说明:外网访问服务器的 8080 端口,Docker 会把流量转发给容器内部的 80 端口。
停止容器
docker stop myweb
删除容器
docker rm myweb
2.2 容器操作
查看运行中的容器
docker ps
查看所有容器(包括已停止的)
docker ps -a
2.3 进入容器内部
docker exec -it 容器名称 /bin/bash
例如:
docker exec -it myweb /bin/bash
docker exec -it deploy-mysql-1 mysql -uroot -p123456 gym_management_system
三、私有镜像仓库搭建与使用
3.1 搭建私有仓库
1. 创建仓库容器
# -p 5000:5000:仓库服务监听虚拟机的 5000 端口
# registry:2:仓库的官方镜像(版本2)
docker run -d –name myrepo -p 5000:5000 registry:2
2. 验证仓库是否启动成功
curl http://localhost:5000/v2/
3. 设置容器重启自动启动
docker update –restart=always myrepo
3.2 镜像推送与拉取
拉取镜像
docker pull 仓库地址/镜像名:标签
四、开发阶段:创建自定义镜像
4.1 编写 Dockerfile
在项目根目录创建名为 Dockerfile 的文件(无后缀、名字大小写完全相同):
FROM nginx
COPY index.html /usr/share/nginx/html/index.html
4.2 构建镜像
在 Dockerfile 所在目录执行构建命令:
docker build -t my-web:v1 .
注意:命令最后的 . 代表打包当前目录的所有内容。
4.3 给镜像打标签
Docker 规定,要推送到私有仓库,镜像名必须带上仓库的 IP 和端口:
docker tag my-web:v1 镜像IP地址/my-web:v1
# 例如:
docker tag my-web:v1 192.168.245.128:5000/my-web:v1
4.4 推送镜像到仓库
docker push 仓库地址/my-web:v1
# 例如:
docker push 192.168.245.128:5000/my-web:v1
五、生产部署:容器化实战
5.1 Dockerfile 进阶示例
上一节演示了最简单的 Dockerfile 流程。实际项目中,Dockerfile 通常包含更多步骤:
示例 1:Nginx 项目
# 1. 基础镜像:使用官方 nginx 稳定版
FROM nginx:1.25
# 2. 复制构建产物到 nginx 默认站点目录
COPY dist/ /usr/share/nginx/html/
# 3. 可选:用自定义配置覆盖默认 nginx 配置
COPY nginx.conf /etc/nginx/nginx.conf
# 4. 声明容器对外提供服务时监听的端口
EXPOSE 80
# 5. 容器启动时执行的命令
CMD ["nginx", "-g", "daemon off;"]
示例 2:.NET 项目
# dotnet项目实例
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY ["Directory.Packages.props", "./"]
COPY ["Test.SPI/Test.SPI.csproj", "Test.SPI/"]
COPY ["Test.DataAccess/Test.DataAccess.csproj", "Test.DataAccess/"]
COPY ["Test.Business/Test.Business.csproj", "Test.Business/"]
COPY ["Test.Tools/Test.Infrastructure.csproj", "Test.Tools/"]
COPY ["Web/Web.csproj", "Web/"]
RUN dotnet restore "Web/Web.csproj"
COPY . .
RUN dotnet publish "Web/Web.csproj" –configuration Release –no-restore –output /app/publish
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final
WORKDIR /app
ENV ASPNETCORE_URLS=http://+:8080
EXPOSE 8080
COPY –from=build /app/publish .
ENTRYPOINT ["dotnet", "Web.dll"]
Dockerfile 常用指令说明:
- FROM:指定基础镜像,所有镜像都从这里开始构建
- COPY:把宿主机上的文件复制到镜像内部
- RUN:在构建镜像时执行命令,常用于安装依赖
- EXPOSE:声明容器运行时监听的端口,真正暴露端口还需要在 docker run 时加 -p 映射
- CMD:容器启动时默认执行的命令
构建并运行:
# 在 Dockerfile 所在目录构建镜像
docker build -t my-web:v2 .
# 映射宿主机 8080 端口到容器 80 端口,后台运行
docker run -d –name myweb-v2 -p 8080:80 my-web:v2
5.2 使用 docker-compose 编排多容器
docker-compose.yml 可以把「构建镜像、配置端口、挂载目录、设置环境变量、启动容器」等步骤统一写入一个文件,方便一键启动和管理多个容器。
示例 1:使用本地构建
services:
web:
build: .
container_name: myweb
ports:
– "8080:80"
restart: unless–stopped
示例 2:使用已有镜像
services:
web:
image: my–web:v2
container_name: myweb–v2
ports:
– "8080:80"
restart: unless–stopped
示例 3:.NET 项目配置
services:
web:
image: dotnet–web:latest
container_name: dotnet–web
environment:
ASPNETCORE_URLS: "http://+:8080"
ports:
– "8080:8080"
restart: unless–stopped
docker-compose 常用字段说明:
- services:定义所有容器服务,下面每一项都对应一个容器
- build:指定 Dockerfile 所在目录,Compose 会先按该目录构建镜像
- image:直接使用已有镜像,不再执行本地构建
- container_name:为容器指定固定名称,便于后续通过名称管理
- ports:端口映射,格式为「宿主机端口:容器端口」
- volumes:挂载目录或数据卷,通常用于持久化数据或同步配置文件
- environment:向容器内注入环境变量
- restart:设置容器退出后的重启策略,unless-stopped 表示除非手动停止,否则自动重启
- depends_on:声明服务之间的依赖和启动顺序
docker-compose 常用命令:
# 后台启动 Compose 中定义的所有服务
docker compose up -d
# 停止并删除容器,但默认保留数据卷
docker compose down
# 跟踪查看容器日志
docker compose logs -f
# 查看当前 Compose 管理下的服务状态
docker compose ps
5.3 复杂项目示例:.NET + MySQL + Redis
services:
api:
image: ${IMAGE_NAME:?Set IMAGE_NAME}
pull_policy: always
restart: unless–stopped
environment:
ASPNETCORE_ENVIRONMENT: Production
ASPNETCORE_URLS: http://+:8080
ConnectionStrings__GymManagementSystem: Server=mysql;Port=3306;Database=gym_management_system;User ID=${MYSQL_APP_USER:?Set MYSQL_APP_USER};Password=${MYSQL_APP_PASSWORD:?Set MYSQL_APP_PASSWORD}
ConnectionStrings__Redis: redis:6379,password=${REDIS_PASSWORD:?Set REDIS_PASSWORD},abortConnect=false
ports:
– "${API_PORT:-8080}:8080"
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
mysql:
image: 192.168.245.128:5000/mysql:8.0
restart: unless–stopped
environment:
MYSQL_DATABASE: gym_management_system
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?Set MYSQL_ROOT_PASSWORD}
MYSQL_USER: ${MYSQL_APP_USER:?Set MYSQL_APP_USER}
MYSQL_PASSWORD: ${MYSQL_APP_PASSWORD:?Set MYSQL_APP_PASSWORD}
volumes:
– mysql–data:/var/lib/mysql
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -uroot -p$$MYSQL_ROOT_PASSWORD –silent"]
interval: 5s
timeout: 3s
retries: 20
start_period: 10s
redis:
image: 192.168.245.128:5000/redis:7–alpine
restart: unless–stopped
environment:
REDIS_PASSWORD: ${REDIS_PASSWORD:?Set REDIS_PASSWORD}
command: ["redis-server", "–appendonly", "yes", "–requirepass", "${REDIS_PASSWORD:?Set REDIS_PASSWORD}"]
volumes:
– redis–data:/data
healthcheck:
test: ["CMD-SHELL", "redis-cli -a \\"$$REDIS_PASSWORD\\" ping"]
interval: 5s
timeout: 3s
retries: 20
volumes:
mysql-data:
redis-data:
总结
本文从 Docker 安装配置开始,逐步讲解了基础操作、私有仓库搭建、自定义镜像创建,到最终的生产环境容器化部署。通过 docker-compose 编排多容器服务,可以实现一键部署复杂应用。
开发调试时可以使用 docker build + docker run 手动验证,正式部署时改用 docker-compose 统一管理端口、环境变量和重启策略,大大简化了运维复杂度。



