尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

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

Docker 从入门到实战:安装、配置与容器化部署完整指南 目录一、Docker 安装与配置1.1 安装 Docker1.2 配置镜像加速器1.3 测试 Docker 可用性二、Docker 基础操作2.1 镜像操作2.2 容器操作2.3 进入容器内部三、私有镜像仓库搭建与使用3.1 搭建私有仓库3.2 镜像推送与拉取四、开发阶段创建自定义镜像4.1 编写 Dockerfile4.2 构建镜像4.3 给镜像打标签4.4 推送镜像到仓库五、生产部署容器化实战5.1 Dockerfile 进阶示例5.2 使用 docker-compose 编排多容器5.3 复杂项目示例.NET MySQL Redis一、Docker 安装与配置1.1 安装 Docker1. 下载安装脚本curl-fsSLhttps://get.docker.com-oget-docker.sh2. 执行安装sudoshget-docker.sh3. 加入 Docker 用户组为了避免每次执行 Docker 命令都需要输入sudo可以将当前用户加入 Docker 用户组sudousermod-aGdocker$USER4. 重启 Docker 服务sudosystemctl restartdocker注意执行完用户组修改后需要重新登录系统或重启才能使权限生效。1.2 配置镜像加速器国内访问 Docker Hub 较慢建议配置镜像加速器提升拉取镜像的速度。1. 创建 Docker 配置文件目录sudomkdir-p/etc/docker2. 配置镜像加速地址sudotee/etc/docker/daemon.json-EOF { registry-mirrors: [https://docker.m.daocloud.io] } EOF3. 重启 Docker 服务使配置生效sudosystemctl restartdocker1.3 测试 Docker 可用性1. 拉取 Hello-World 镜像dockerpull hello-world2. 运行 Hello-World 容器dockerrun hello-world如果看到 “Hello from Docker!” 的输出说明 Docker 安装配置成功。二、Docker 基础操作2.1 镜像操作查看镜像列表dockerimages启动镜像运行容器启动一个 Nginx 网页镜像dockerrun-d--namemyweb-p8080:80 nginx说明外网访问服务器的 8080 端口Docker 会把流量转发给容器内部的 80 端口。停止容器dockerstop myweb删除容器dockerrmmyweb2.2 容器操作查看运行中的容器dockerps查看所有容器包括已停止的dockerps-a2.3 进入容器内部dockerexec-it容器名称 /bin/bash例如dockerexec-itmyweb /bin/bash三、私有镜像仓库搭建与使用3.1 搭建私有仓库1. 创建仓库容器# -p 5000:5000仓库服务监听虚拟机的 5000 端口# registry:2仓库的官方镜像版本2dockerrun-d--namemyrepo-p5000:5000 registry:22. 验证仓库是否启动成功curlhttp://localhost:5000/v2/3. 设置容器重启自动启动dockerupdate--restartalways myrepo3.2 镜像推送与拉取拉取镜像dockerpull 仓库地址/镜像名:标签四、开发阶段创建自定义镜像4.1 编写 Dockerfile在项目根目录创建名为Dockerfile的文件无后缀、名字大小写完全相同FROM nginx COPY index.html /usr/share/nginx/html/index.html4.2 构建镜像在 Dockerfile 所在目录执行构建命令dockerbuild-tmy-web:v1.注意命令最后的.代表打包当前目录的所有内容。4.3 给镜像打标签Docker 规定要推送到私有仓库镜像名必须带上仓库的 IP 和端口dockertag my-web:v1 镜像IP地址/my-web:v1# 例如dockertag my-web:v1192.168.245.128:5000/my-web:v14.4 推送镜像到仓库dockerpush 仓库地址/my-web:v1# 例如dockerpush192.168.245.128:5000/my-web:v1五、生产部署容器化实战5.1 Dockerfile 进阶示例上一节演示了最简单的 Dockerfile 流程。实际项目中Dockerfile 通常包含更多步骤示例 1Nginx 项目# 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_URLShttp://:8080 EXPOSE 8080 COPY --frombuild /app/publish . ENTRYPOINT [dotnet, Web.dll]Dockerfile 常用指令说明FROM指定基础镜像所有镜像都从这里开始构建COPY把宿主机上的文件复制到镜像内部RUN在构建镜像时执行命令常用于安装依赖EXPOSE声明容器运行时监听的端口真正暴露端口还需要在docker run时加-p映射CMD容器启动时默认执行的命令构建并运行# 在 Dockerfile 所在目录构建镜像dockerbuild-tmy-web:v2.# 映射宿主机 8080 端口到容器 80 端口后台运行dockerrun-d--namemyweb-v2-p8080:80 my-web:v25.2 使用 docker-compose 编排多容器docker-compose.yml可以把「构建镜像、配置端口、挂载目录、设置环境变量、启动容器」等步骤统一写入一个文件方便一键启动和管理多个容器。示例 1使用本地构建services:web:build:.container_name:mywebports:-8080:80restart:unless-stopped示例 2使用已有镜像services:web:image:my-web:v2container_name:myweb-v2ports:-8080:80restart:unless-stopped示例 3.NET 项目配置services:web:image:dotnet-web:latestcontainer_name:dotnet-webenvironment:ASPNETCORE_URLS:http://:8080ports:-8080:8080restart:unless-stoppeddocker-compose 常用字段说明services定义所有容器服务下面每一项都对应一个容器build指定 Dockerfile 所在目录Compose 会先按该目录构建镜像image直接使用已有镜像不再执行本地构建container_name为容器指定固定名称便于后续通过名称管理ports端口映射格式为「宿主机端口:容器端口」volumes挂载目录或数据卷通常用于持久化数据或同步配置文件environment向容器内注入环境变量restart设置容器退出后的重启策略unless-stopped表示除非手动停止否则自动重启depends_on声明服务之间的依赖和启动顺序docker-compose 常用命令# 后台启动 Compose 中定义的所有服务dockercompose up-d# 停止并删除容器但默认保留数据卷dockercompose down# 跟踪查看容器日志dockercompose logs-f# 查看当前 Compose 管理下的服务状态dockercomposeps5.3 复杂项目示例.NET MySQL Redisservices:api:image:${IMAGE_NAME:?Set IMAGE_NAME}pull_policy:alwaysrestart:unless-stoppedenvironment:ASPNETCORE_ENVIRONMENT:ProductionASPNETCORE_URLS:http://:8080ConnectionStrings__GymManagementSystem:Servermysql;Port3306;Databasegym_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},abortConnectfalseports:-${API_PORT:-8080}:8080depends_on:mysql:condition:service_healthyredis:condition:service_healthymysql:image:192.168.245.128:5000/mysql:8.0restart:unless-stoppedenvironment:MYSQL_DATABASE:gym_management_systemMYSQL_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/mysqlhealthcheck:test:[CMD-SHELL,mysqladmin ping -h localhost -uroot -p$$MYSQL_ROOT_PASSWORD --silent]interval:5stimeout:3sretries:20start_period:10sredis:image:192.168.245.128:5000/redis:7-alpinerestart:unless-stoppedenvironment:REDIS_PASSWORD:${REDIS_PASSWORD:?Set REDIS_PASSWORD}command:[redis-server,--appendonly,yes,--requirepass,${REDIS_PASSWORD:?Set REDIS_PASSWORD}]volumes:-redis-data:/datahealthcheck:test:[CMD-SHELL,redis-cli -a \$$REDIS_PASSWORD\ ping]interval:5stimeout:3sretries:20volumes:mysql-data:redis-data:总结本文从 Docker 安装配置开始逐步讲解了基础操作、私有仓库搭建、自定义镜像创建到最终的生产环境容器化部署。通过docker-compose编排多容器服务可以实现一键部署复杂应用。开发调试时可以使用docker builddocker run手动验证正式部署时改用docker-compose统一管理端口、环境变量和重启策略大大简化了运维复杂度。
返回列表