ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Docker容器技术与微服务实战:从安装部署到避坑指南

Docker容器技术与微服务实战:从安装部署到避坑指南 简介这份PPT课件面向微服务开发学习者与企业内训场景聚焦容器技术中的Docker核心知识适合具备一定Linux基础的初中级开发者、架构师及培训讲师使用。内容从容器概念与隔离原理切入系统讲解Docker架构、镜像与容器操作、Dockerfile构建、数据卷与网络管理、底层技术原理及Compose服务编排并延伸至云计算、SpringCloud、分布式治理、缓存、消息、事务等完整技术栈兼顾自学与企培需求。资源包共1个pptx文件约12.06MB以幻灯片形式呈现结构清晰、图文并茂无需修改即可直接用于授课或学习。目前已有277人学习下载。课件源自企业实训经验迭代整理涵盖课程目标、目录导航与关键指令示例能帮助读者快速掌握Docker镜像制作、容器编排与底层设计思想并衔接后续K8S与微服务框架内容形成从容器到分布式系统的完整学习路径。1. 从一份 PPT 标题说起容器技术与应用到底在讲什么很多人第一次看到「容器技术与应用」这个标题脑子里蹦出来的是一堆名词Docker、镜像、容器、微服务、K8s。但真到要动手的时候问题就变成了我到底该先装什么、镜像从哪来、容器跑起来之后怎么改配置、微服务是不是必须上容器。这份 PPT 标题背后其实是一条完整的落地链路——用 Docker 把应用和它的运行环境打包成一个镜像再用容器把镜像跑起来最后用微服务的方式把一个大系统拆成若干能独立部署的小服务。它解决的核心问题是「在我机器上能跑到你机器上也能跑」适合后端开发、运维、测试以及任何需要频繁部署和迁移服务的人。下面我不讲 PPT 本身而是按这条链路把每一步的命令、参数和踩过的坑讲清楚让你看完能自己搭一套能用的环境。2. Docker 安装与镜像加速先把地基打对2.1 为什么选 Docker 而不是直接装环境在没有容器之前部署一个 Java 服务要装 JDK、配环境变量、装数据库、改配置文件换一台机器重来一遍版本对不上就出玄学问题。Docker 的做法是把应用和它依赖的运行时、库、配置一起打包成镜像镜像跑起来就是容器。容器之间共享宿主机内核所以比虚拟机轻得多启动通常在一秒以内。选 Docker 而不是 Podman、containerd 这些主要原因是生态最全官方镜像、社区镜像、文档、排错资料都最多新手遇到问题更容易搜到答案。微服务场景下每个服务一个镜像独立升级、独立扩缩容这也是容器技术被大量采用的原因。2.2 Linux 上安装 Docker 的完整命令以 CentOS 7 和 Ubuntu 为例常见做法是用官方脚本或包管理器安装。下面这套命令在 CentOS 7 上验证过Ubuntu 把 yum 换成 apt 即可。# 卸载旧版本避免冲突 sudo yum remove -y docker docker-client docker-common docker-engine # 安装依赖工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加 Docker 官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装 Docker 引擎和命令行 sudo yum install -y docker-ce docker-ce-cli containerd.io # 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 验证安装 docker version docker run hello-world逻辑说明先卸载旧包是因为老版本包名和新版冲突不卸干净后面会报依赖错误。device-mapper 和 lvm2 是存储驱动需要的缺了容器起不来。添加官方仓库是为了拿到最新稳定版。docker run hello-world会拉取一个极小的测试镜像并运行输出一段欢迎信息就说明安装成功。参数上-y表示自动确认systemctl enable保证重启后 Docker 自动运行。2.3 镜像加速与国内镜像源配置国内直接拉 Docker Hub 镜像经常超时需要配置镜像加速器。常见做法是修改/etc/docker/daemon.json。sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com ], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m } } EOF sudo systemctl daemon-reload sudo systemctl restart docker逻辑说明registry-mirrors是镜像加速地址列表Docker 会按顺序尝试。native.cgroupdriversystemd是为了和宿主机 cgroup 驱动一致避免和 K8s 集成时报错。日志限制max-size是防止容器日志把磁盘写满这个坑很常见。改完必须daemon-reload再重启 Docker否则配置不生效。验证加速是否生效可以docker info看 Registry Mirrors 那一行。注意镜像加速地址会失效如果拉取仍然超时换一个可用的地址即可不要死磕一个源。2.4 Windows 和 macOS 上的 Docker DesktopWindows 11 和 macOS 用户一般装 Docker Desktop。Windows 上需要先开启 WSL2 或 Hyper-V安装时勾选对应后端。常见报错「virtualization support not detected」是因为 BIOS 里虚拟化没开进 BIOS 打开 VT-x 或 AMD-V 即可。安装完成后在设置里同样可以配镜像加速。Docker Desktop 适合本地开发生产环境还是用 Linux 上的 Docker 引擎。3. 镜像与容器操作从拉取到进入容器改配置3.1 镜像、容器、仓库三个概念的关系镜像是一个只读模板容器是镜像的运行实例。你可以把镜像理解成类容器理解成对象。仓库是存放镜像的地方比如 Docker Hub、阿里云镜像仓库。拉取镜像用docker pull启动容器用docker run查看本地镜像用docker images查看运行中容器用docker ps。微服务部署时每个服务构建一个镜像推送到仓库目标机器拉取后启动容器这样环境完全一致。3.2 拉取镜像并启动容器的标准流程以 MySQL 8.0 和 Redis 为例这是微服务里最常用的两个中间件。# 拉取 MySQL 8.0 镜像 docker pull mysql:8.0 # 启动 MySQL 容器映射端口设置密码挂载数据目录 docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDyourpassword \ -v /data/mysql:/var/lib/mysql \ mysql:8.0 # 拉取 Redis 镜像并启动 docker pull redis:7 docker run -d \ --name redis7 \ -p 6379:6379 \ -v /data/redis:/data \ redis:7 redis-server --appendonly yes逻辑说明-d后台运行--name指定容器名方便管理-p做端口映射格式是宿主机端口:容器端口。-e设置环境变量MySQL 用MYSQL_ROOT_PASSWORD指定 root 密码。-v挂载数据卷把容器内数据目录映射到宿主机这样容器删了数据还在这是生产环境必须做的。Redis 启动命令加了--appendonly yes开启持久化。参数上数据卷路径要提前建好并确保权限否则 MySQL 会因权限问题启动失败。3.3 进入容器排查问题和修改文件容器跑起来后经常需要进去看日志、改配置。用docker exec进入。# 进入容器的交互式 shell docker exec -it mysql8 /bin/bash # 查看容器日志 docker logs -f --tail 100 mysql8 # 从宿主机拷贝文件到容器 docker cp ./my.cnf mysql8:/etc/mysql/conf.d/my.cnf # 重启容器使配置生效 docker restart mysql8逻辑说明-it是交互式终端/bin/bash是容器内的 shell有些精简镜像只有/bin/sh。docker logs -f实时跟踪日志--tail 100只看最后 100 行避免刷屏。docker cp用于临时改配置生产环境更推荐用挂载卷的方式把配置文件放在宿主机挂载进去改完重启容器即可。Windows 上 Docker Desktop 里操作容器文件可以在 Docker Desktop 界面里直接浏览和增删但底层还是这些命令。3.4 容器资源隔离与权限设置容器默认使用宿主机的 CPU 和内存不加限制可能一个容器把整机拖垮。启动时可以限制资源。docker run -d \ --name app \ --cpus1.5 \ --memory512m \ --memory-swap1g \ -v /data/app:/app/data:rw \ myapp:latest逻辑说明--cpus限制 CPU 核数--memory限制内存--memory-swap限制内存加交换分区总量。-v挂载时加:rw表示读写权限默认就是读写加:ro是只读。如果容器内进程需要写宿主机目录要确保宿主机目录权限对容器内用户可写常见做法是chmod 777或指定用户 ID。容器资源隔离靠的是 Linux 的 cgroup 和 namespace这也是容器和虚拟机最本质的区别。4. 微服务与容器结合拆分、部署与联调4.1 微服务拆分的常见思路微服务不是越细越好。常见做法是按业务能力拆比如用户服务、订单服务、商品服务每个服务独立数据库、独立部署。拆分时要考虑服务边界是否清晰、团队规模是否匹配、运维成本是否可控。一个刚起步的项目拆成三到五个服务比较合适拆太细会导致联调复杂、链路追踪困难。Spring Boot 适合做微服务Spring Cloud 提供注册中心、配置中心、网关等组件。容器化之后每个服务打包成镜像用 Docker Compose 或 K8s 编排。4.2 用 Docker Compose 编排多服务单机联调时Docker Compose 是最省事的编排工具。下面是一个典型的三服务加数据库的 compose 文件。version: 3.8 services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: user_db ports: - 3306:3306 volumes: - ./data/mysql:/var/lib/mysql networks: - backend user-service: build: ./user-service ports: - 8081:8081 depends_on: - mysql environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/user_db networks: - backend order-service: build: ./order-service ports: - 8082:8082 depends_on: - mysql environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/order_db networks: - backend networks: backend: driver: bridge逻辑说明services下每个服务对应一个容器。build指定 Dockerfile 路径Compose 会先构建镜像再启动。depends_on控制启动顺序但注意它只保证容器启动顺序不保证服务内部就绪所以应用里要有重试逻辑。networks让服务之间用服务名互相访问比如 user-service 里连数据库用mysql:3306而不是 localhost。environment覆盖应用配置这样同一镜像可以在不同环境用不同参数启动。4.3 服务间联调与网络排查容器网络不通是高频问题。常见现象是 A 容器 ping 不通 B 容器或者应用连数据库超时。排查步骤先docker network ls看网络是否存在再docker network inspect backend看容器是否都加入了同一网络。如果不在同一网络用docker network connect手动加入。应用连不上数据库先docker exec -it user-service ping mysql测试网络再docker exec -it mysql mysql -uroot -p测试数据库本身。注意容器内不要用 localhost 连其他容器localhost 永远指向容器自己。提示Docker Compose 默认会创建一个网络所有服务自动加入所以用 Compose 时通常不用手动配网络。4.4 镜像构建与 Dockerfile 要点每个微服务需要一个 Dockerfile。以 Java 服务为例。FROM openjdk:17-jdk-slim WORKDIR /app COPY target/user-service.jar app.jar EXPOSE 8081 ENTRYPOINT [java, -jar, app.jar]逻辑说明FROM指定基础镜像用 slim 版本体积小。WORKDIR设置工作目录。COPY把构建好的 jar 包复制进去。EXPOSE声明端口只是文档作用实际映射靠-p。ENTRYPOINT是启动命令。构建时用docker build -t user-service:1.0 .。注意 jar 包要先在宿主机用 Maven 构建好或者用多阶段构建在容器内构建后者更干净但构建慢。5. 避坑与排查那些让我加班到凌晨的容器问题5.1 容器启动后立刻退出现象docker run -d之后docker ps看不到容器docker ps -a显示 Exited。原因容器的主进程执行完就退出了比如启动命令是bash但没有交互终端或者应用启动报错。解决用docker logs 容器名看日志如果是应用报错就修配置如果是命令问题改成前台运行的主进程比如nginx -g daemon off;。容器需要一个持续运行的前台进程这是设计机制不是 bug。5.2 端口映射了但外部访问不了现象docker ps显示端口映射正常但宿主机外访问超时。原因可能是防火墙没放行或者映射的是127.0.0.1:3306:3306只绑定了本地回环。解决检查-p是否写成0.0.0.0:3306:3306或直接3306:3306再检查宿主机防火墙firewall-cmd或安全组规则。云服务器还要看安全组。5.3 数据卷权限导致数据库启动失败现象MySQL 容器启动后日志报Permission denied或Cant create/write to file。原因宿主机挂载目录的属主和容器内 MySQL 用户不匹配。解决chown -R 999:999 /data/mysql999 是 MySQL 镜像里 mysql 用户的 UID或者启动时加--user root临时绕过但生产环境不推荐。5.4 镜像拉取超时或镜像源失效现象docker pull卡住然后报net/http: TLS handshake timeout。原因默认 Docker Hub 在国内访问不稳定或者配置的加速地址已失效。解决换可用的镜像加速地址或者用阿里云容器镜像服务的个人加速地址。配置后记得重启 Docker。如果某个镜像实在拉不到可以找国内镜像站或自己构建。5.5 容器日志占满磁盘现象磁盘突然满了df -h发现/var/lib/docker很大。原因容器日志默认不限制大小长期运行的服务日志越写越多。解决在daemon.json里配置log-opts的max-size和max-file然后重启 Docker。已经产生的日志可以用truncate -s 0清空但要注意别删正在写的文件。6. 进阶技巧用多阶段构建和健康检查把镜像做小做稳镜像体积直接影响拉取速度和部署效率。一个 Spring Boot 应用的 jar 包可能几百 MB加上基础镜像轻松上 G。多阶段构建能把构建环境和运行环境分开最终镜像只保留运行时。# 第一阶段构建 FROM maven:3.9-eclipse-temurin-17 AS builder WORKDIR /build COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests # 第二阶段运行 FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --frombuilder /build/target/*.jar app.jar EXPOSE 8080 HEALTHCHECK --interval30s --timeout3s --retries3 \ CMD wget -qO- http://localhost:8080/actuator/health || exit 1 ENTRYPOINT [java, -jar, app.jar]逻辑说明第一阶段用 maven 镜像构建dependency:go-offline先下载依赖利用 Docker 层缓存依赖没变时不用重新下载。第二阶段用 alpine 的 JRE 镜像体积小很多。COPY --frombuilder只复制构建产物不把 Maven 和源码带进最终镜像。HEALTHCHECK让 Docker 定期检查应用健康状态配合 Compose 的depends_on的condition: service_healthy可以实现真正的启动顺序控制。参数上--interval是检查间隔--timeout是超时时间--retries是失败重试次数。另一个技巧是给镜像打标签时用语义化版本加 git commit比如user-service:1.0.0-a1b2c3d这样回滚时能精确找到对应代码。别用latest上生产这是血泪经验latest会变回滚时你根本不知道当时跑的是哪个版本。我自己现在的习惯是每个服务先写 Dockerfile本地用 Compose 跑通再推镜像到仓库最后上服务器。镜像构建完先docker run单独跑一遍确认健康检查通过再进编排。这套流程帮我省了很多后悔药。希望帮到你。本文还有配套的精品资源点击获取
返回列表