欢迎光临
我们一直在努力

Docker 从入门到实战:安装、配置与容器化部署完整指南

/* 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 统一管理端口、环境变量和重启策略,大大简化了运维复杂度。

赞(0)
未经允许不得转载:171主机测评 » Docker 从入门到实战:安装、配置与容器化部署完整指南
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址