Docker 实战教程 - 从入门到大神
Docker 实战教程 - 从入门到大神目录Docker 基础概念Docker 安装与配置Docker 镜像管理Docker 容器操作Docker 网络管理Docker 数据卷Dockerfile 编写Docker ComposeDocker RegistryDocker 实战案例Docker 最佳实践Docker 故障排查Docker 基础概念什么是 DockerDocker 是一个开源的应用容器引擎让开发者可以打包他们的应用以及依赖包到一个可移植的容器中然后发布到任何流行的 Linux 机器上。核心概念概念说明镜像 (Image)只读模板包含运行应用所需的一切容器 (Container)镜像的运行实例仓库 (Repository)存放镜像的地方如 Docker HubDockerfile用于构建镜像的文本文件Docker vs 虚拟机特性Docker虚拟机启动速度秒级分钟级资源占用极小较大隔离性进程级系统级移植性高中等Docker 安装与配置Linux 安装# Ubuntu/Debiancurl-fsSLhttps://get.docker.com-oget-docker.shshget-docker.sh# CentOS/RHELsudoyuminstall-yyum-utilssudoyum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.reposudoyuminstalldocker-ce docker-ce-cli containerd.ioWindows/Mac 安装下载 Docker Desktophttps://www.docker.com/products/docker-desktop启动 Docker# 启动服务sudosystemctl startdocker# 设置开机自启sudosystemctlenabledocker# 验证安装docker--versiondockerrun hello-world镜像加速配置#/etc/docker/daemon.json{registry-mirrors:[https://docker.mirrors.ustc.edu.cn,https://hub-mirror.c.163.com]}# 重启服务 sudo systemctl daemon-reload sudo systemctl restart dockerDocker 镜像管理基本命令# 搜索镜像dockersearch nginx# 拉取镜像dockerpull nginx:latestdockerpull nginx:1.21# 查看本地镜像dockerimagesdockerimagels# 删除镜像dockerrmi镜像ID或名称dockerrmi-f镜像ID# 强制删除# 清理无用镜像dockerimage prune# 查看镜像详情dockerinspect镜像ID镜像构建# 从 Dockerfile 构建dockerbuild-tmyapp:v1.0.# 从容器提交新镜像dockercommit容器IDmynewimage:v1.0# 导出镜像dockersave-omyimage.tar myimage:v1.0# 导入镜像dockerload-imyimage.tarDocker 容器操作容器生命周期管理# 运行容器dockerrun[选项]镜像[命令]# 常用选项-d,--detach# 后台运行--name名称# 指定容器名称-p宿主端口:容器端口# 端口映射-v宿主路径:容器路径# 挂载数据卷-e环境变量# 设置环境变量--rm# 容器退出后自动删除--restartalways# 自动重启# 示例dockerrun-d--namemynginx-p80:80 nginxdockerrun-it--namemyubuntu ubuntu /bin/bash容器管理命令# 查看运行中的容器dockerps# 查看所有容器dockerps-a# 查看容器日志dockerlogs容器ID或名称dockerlogs-f容器ID# 实时查看# 停止容器dockerstop容器ID# 启动容器dockerstart容器ID# 重启容器dockerrestart容器ID# 删除容器dockerrm容器IDdockerrm-f容器ID# 强制删除运行中的容器# 进入容器dockerexec-it容器ID/bin/bashdockerexec-it容器IDsh# 查看容器详情dockerinspect容器ID# 查看容器资源使用dockerstatsDocker 网络管理网络模式模式说明bridge默认模式通过 veth pair 连接host共享宿主机网络命名空间none无网络配置container共享其他容器的网络自定义网络用户创建的桥接网络网络操作# 查看网络dockernetworkls# 创建网络dockernetwork create mynetwork# 连接容器到网络dockernetwork connect mynetwork容器ID# 断开网络连接dockernetwork disconnect mynetwork容器ID# 查看网络详情dockernetwork inspect mynetwork# 删除网络dockernetworkrmmynetwork容器间通信# 创建自定义网络dockernetwork create app-net# 启动容器并连接到网络dockerrun-d--nameweb--networkapp-net nginxdockerrun-d--namedb--networkapp-net mysql# 容器可以通过容器名互相访问# web 容器可以访问 db:3306Docker 数据卷数据卷操作# 创建数据卷dockervolume create mydata# 查看数据卷dockervolumels# 查看数据卷详情dockervolume inspect mydata# 删除数据卷dockervolumermmydata# 清理无用数据卷dockervolume prune数据卷挂载# 方式一使用命名卷dockerrun-d-vmydata:/data nginx# 方式二绑定挂载dockerrun-d-v/host/path:/container/path nginx# 方式三只读挂载dockerrun-d-v/host/path:/container/path:ro nginx# 方式四临时卷匿名卷dockerrun-d-v/container/path nginxDockerfile 编写基本语法# 基础镜像 FROM python:3.9-slim # 维护者信息 LABEL maintaineryouremail.com # 工作目录 WORKDIR /app # 复制文件 COPY requirements.txt . # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 暴露端口 EXPOSE 8000 # 环境变量 ENV ENVproduction # 启动命令 CMD [python, app.py] # 或使用 ENTRYPOINT # ENTRYPOINT [python] # CMD [app.py]常用指令指令说明FROM指定基础镜像RUN执行命令CMD容器启动时的默认命令ENTRYPOINT容器启动时执行的入口程序COPY从宿主复制文件到镜像ADD类似 COPY支持 URL 和解压ENV设置环境变量ARG构建时的参数EXPOSE声明暴露的端口WORKDIR设置工作目录VOLUME声明数据卷USER指定运行用户LABEL添加元数据Dockerfile 最佳实践# 多阶段构建示例 # 第一阶段构建 FROM node:16-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 第二阶段运行 FROM nginx:alpine COPY --frombuilder /app/dist /usr/share/nginx/html EXPOSE 80 CMD [nginx, -g, daemon off;]Docker Compose基本用法# docker-compose.ymlversion:3.8services:web:build:.ports:-8000:8000environment:-DATABASE_URLpostgres://db:5432/mydbdepends_on:-db-redisdb:image:postgres:13volumes:-postgres_data:/var/lib/postgresql/dataenvironment:POSTGRES_USER:userPOSTGRES_PASSWORD:passwordPOSTGRES_DB:mydbredis:image:redis:alpinevolumes:postgres_data:常用命令# 启动服务docker-composeup# 后台启动docker-composeup-d# 停止服务docker-composedown# 重启服务docker-composerestart# 查看服务状态docker-composeps# 查看日志docker-composelogsdocker-composelogs-fweb# 构建镜像docker-composebuild# 扩展服务docker-composeup-d--scaleweb3Docker RegistryDocker Hub# 登录 Docker Hubdockerlogin# 推送镜像dockertag myimage:latest username/myimage:latestdockerpush username/myimage:latest# 拉取私有镜像dockerpull username/myimage:latest私有仓库搭建# 使用官方 Registry 镜像dockerrun-d-p5000:5000--nameregistry registry:2# 搭建带 UI 的私有仓库dockerrun-d-p80:80--nameregistry-ui\-eREGISTRY_URLhttp://registry:5000\-eDELETE_IMAGEStrue\joxit/docker-registry-ui:latest# 配置镜像拉取# /etc/docker/daemon.json{insecure-registries:[your-registry:5000]}Docker 实战案例案例 1部署 Web 应用# Node.js 应用 Dockerfile FROM node:16-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --onlyproduction COPY . . ENV NODE_ENVproduction EXPOSE 3000 CMD [node, server.js]# docker-compose.ymlversion:3.8services:app:build:.ports:-3000:3000restart:alwaysenvironment:-PORT3000案例 2数据库集群version:3.8services:mysql-master:image:mysql:8.0container_name:mysql-masterenvironment:MYSQL_ROOT_PASSWORD:rootpasswordMYSQL_REPLICATION_MODE:masterports:-3306:3306volumes:-master-data:/var/lib/mysqlmysql-slave:image:mysql:8.0container_name:mysql-slaveenvironment:MYSQL_ROOT_PASSWORD:rootpasswordMYSQL_REPLICATION_MODE:slaveMYSQL_MASTER_HOST:mysql-masterMYSQL_MASTER_PORT:3306depends_on:-mysql-mastervolumes:master-data:案例 3CI/CD 流水线# GitLab CI 示例stages:-build-test-deployvariables:IMAGE_TAG:$CI_REGISTRY_IMAGE:$CI_COMMIT_SHAbuild:stage:buildscript:-docker build-t $IMAGE_TAG .-docker push $IMAGE_TAGtest:stage:testscript:-docker run $IMAGE_TAG npm testdeploy:stage:deployscript:-docker pull $IMAGE_TAG-docker stop myapp||true-docker rm myapp||true-docker run-d--name myapp-p 80:80 $IMAGE_TAGDocker 最佳实践1. 镜像优化# ❌ 不好的做法 FROM ubuntu:20.04 RUN apt-get update RUN apt-get install -y python3 RUN apt-get install -y python3-pip RUN pip install flask # ✅ 好的做法 FROM python:3.9-slim COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt2. 使用 .dockerignore# .dockerignore node_modules .git *.log .env __pycache__ *.pyc3. 多阶段构建# 减小最终镜像体积 FROM golang:1.19 AS builder WORKDIR /src COPY . . RUN CGO_ENABLED0 go build -o app FROM alpine:latest COPY --frombuilder /src/app /app CMD [/app]4. 安全最佳实践# 使用非 root 用户 FROM node:16-alpine RUN addgroup -g 1001 -S nodejs RUN adduser -S nodejs -u 1001 USER nodejs WORKDIR /app5. 资源限制# 限制容器资源dockerrun-d\--memory512m\--cpus1.5\--pids-limit100\nginxDocker 故障排查常用排查命令# 查看容器日志dockerlogs--tail100-fcontainer# 查看容器详细信息dockerinspectcontainer# 查看容器内进程dockertopcontainer# 查看容器资源使用dockerstatscontainer# 查看容器网络配置dockerexeccontaineripaddr常见问题解决问题解决方案容器无法启动查看日志docker logs检查配置端口冲突使用-p指定不同端口权限问题使用sudo或添加用户到 docker 组镜像拉取失败配置镜像加速检查网络数据丢失使用数据卷持久化数据健康检查HEALTHCHECK --interval30s --timeout3s \ CMD curl -f http://localhost/ || exit 1# 查看健康状态dockerinspect--format{{.State.Health.Status}}container学习资源官方文档Docker 官方文档https://docs.docker.com/Docker Compose 文档https://docs.docker.com/compose/推荐书籍《Docker 实战》《Docker 权威指南》在线资源Docker Hubhttps://hub.docker.com/Docker 最佳实践https://docs.docker.com/develop/dev-best-practices/练习题创建一个包含 Nginx 和 MySQL 的应用栈编写一个 Dockerfile 构建自己的镜像使用 Docker Compose 部署一个完整的 Web 应用配置 Docker 镜像加速并验证实现容器间的网络通信使用数据卷实现数据持久化编写多阶段构建的 Dockerfile配置容器的资源限制搭建私有 Docker Registry实现 Docker 容器的健康检查祝学习顺利Docker 是一个强大的工具多动手实践才能真正掌握