当前位置: 首页 > news >正文

Docker 实战教程 - 从入门到大神

Docker 实战教程 - 从入门到大神

目录

  1. Docker 基础概念
  2. Docker 安装与配置
  3. Docker 镜像管理
  4. Docker 容器操作
  5. Docker 网络管理
  6. Docker 数据卷
  7. Dockerfile 编写
  8. Docker Compose
  9. Docker Registry
  10. Docker 实战案例
  11. Docker 最佳实践
  12. Docker 故障排查

Docker 基础概念

什么是 Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。

核心概念

概念说明
镜像 (Image)只读模板,包含运行应用所需的一切
容器 (Container)镜像的运行实例
仓库 (Repository)存放镜像的地方,如 Docker Hub
Dockerfile用于构建镜像的文本文件

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.io

Windows/Mac 安装

下载 Docker Desktop:https://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 docker

Docker 镜像管理

基本命令

# 搜索镜像dockersearch nginx# 拉取镜像dockerpull nginx:latestdockerpull nginx:1.21# 查看本地镜像dockerimagesdockerimagels# 删除镜像dockerrmi<镜像ID或名称>dockerrmi-f<镜像ID># 强制删除# 清理无用镜像dockerimage prune# 查看镜像详情dockerinspect<镜像ID>

镜像构建

# 从 Dockerfile 构建dockerbuild-tmyapp:v1.0.# 从容器提交新镜像dockercommit<容器ID>mynewimage:v1.0# 导出镜像dockersave-omyimage.tar myimage:v1.0# 导入镜像dockerload-imyimage.tar

Docker 容器操作

容器生命周期管理

# 运行容器dockerrun[选项]镜像[命令]# 常用选项-d,--detach# 后台运行--name<名称># 指定容器名称-p<宿主端口>:<容器端口># 端口映射-v<宿主路径>:<容器路径># 挂载数据卷-e<环境变量># 设置环境变量--rm# 容器退出后自动删除--restart=always# 自动重启# 示例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<容器ID>dockerrm-f<容器ID># 强制删除运行中的容器# 进入容器dockerexec-it<容器ID>/bin/bashdockerexec-it<容器ID>sh# 查看容器详情dockerinspect<容器ID># 查看容器资源使用dockerstats

Docker 网络管理

网络模式

模式说明
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:3306

Docker 数据卷

数据卷操作

# 创建数据卷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 nginx

Dockerfile 编写

基本语法

# 基础镜像 FROM python:3.9-slim # 维护者信息 LABEL maintainer="your@email.com" # 工作目录 WORKDIR /app # 复制文件 COPY requirements.txt . # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 暴露端口 EXPOSE 8000 # 环境变量 ENV ENV=production # 启动命令 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 --from=builder /app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]

Docker Compose

基本用法

# docker-compose.ymlversion:'3.8'services:web:build:.ports:-"8000:8000"environment:-DATABASE_URL=postgres://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--scaleweb=3

Docker Registry

Docker 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_URL=http://registry:5000\-eDELETE_IMAGES=true\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 --only=production COPY . . ENV NODE_ENV=production EXPOSE 3000 CMD ["node", "server.js"]
# docker-compose.ymlversion:'3.8'services:app:build:.ports:-"3000:3000"restart:alwaysenvironment:-PORT=3000

案例 2:数据库集群

version:'3.8'services:mysql-master:image:mysql:8.0container_name:mysql-masterenvironment:MYSQL_ROOT_PASSWORD:rootpasswordMYSQL_REPLICATION_MODE:masterports:-"3306:3306"volumes:-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:

案例 3:CI/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_TAG

Docker 最佳实践

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.txt

2. 使用 .dockerignore

# .dockerignore node_modules .git *.log .env __pycache__ *.pyc

3. 多阶段构建

# 减小最终镜像体积 FROM golang:1.19 AS builder WORKDIR /src COPY . . RUN CGO_ENABLED=0 go build -o app FROM alpine:latest COPY --from=builder /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 /app

5. 资源限制

# 限制容器资源dockerrun-d\--memory="512m"\--cpus="1.5"\--pids-limit100\nginx

Docker 故障排查

常用排查命令

# 查看容器日志dockerlogs--tail100-f<container># 查看容器详细信息dockerinspect<container># 查看容器内进程dockertop<container># 查看容器资源使用dockerstats<container># 查看容器网络配置dockerexec<container>ipaddr

常见问题解决

问题解决方案
容器无法启动查看日志docker logs,检查配置
端口冲突使用-p指定不同端口
权限问题使用sudo或添加用户到 docker 组
镜像拉取失败配置镜像加速,检查网络
数据丢失使用数据卷持久化数据

健康检查

HEALTHCHECK --interval=30s --timeout=3s \ 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 Hub:https://hub.docker.com/
  • Docker 最佳实践:https://docs.docker.com/develop/dev-best-practices/

练习题

  1. 创建一个包含 Nginx 和 MySQL 的应用栈
  2. 编写一个 Dockerfile 构建自己的镜像
  3. 使用 Docker Compose 部署一个完整的 Web 应用
  4. 配置 Docker 镜像加速并验证
  5. 实现容器间的网络通信
  6. 使用数据卷实现数据持久化
  7. 编写多阶段构建的 Dockerfile
  8. 配置容器的资源限制
  9. 搭建私有 Docker Registry
  10. 实现 Docker 容器的健康检查

祝学习顺利!Docker 是一个强大的工具,多动手实践才能真正掌握!

http://www.cnnetsun.cn/news/2597755.html

相关文章:

  • Hotkey Detective:5分钟找出Windows快捷键冲突的终极解决方案
  • 从Shiro注解失效到自定义注解:一种更优雅的接口免认证方案
  • 钉钉自动打卡助手完整解决方案:告别迟到困扰的智能办公神器
  • Stanford Doggo:开源四足机器人终极指南 - 如何构建你的跳跃机器人伙伴
  • 开关磁阻电机变磁链三闭环DTC:抑制转矩脉动与降低铜耗的工程实践
  • IQFM:基于自监督学习的无线信号基础模型,赋能6G智能通信
  • 天基数字底座架构:从通信导航遥感孤岛到一体化智能服务
  • KMS_VL_ALL_AIO智能激活:Windows系统激活困境的终极技术解决方案指南
  • 论文提速的终极秘籍!好用的AI论文工具,秒出初稿不费力
  • 云克隆蛋白:科研与工业的可靠“蛋白引擎”
  • 【收藏 2026 版】程序员转型 AI 开发:Java 老司机转型大模型实战全指南
  • 别再让PCB打板翻车!手把手教你用华秋DFM+AD18做开短路检查(保姆级避坑)
  • 终极指南:如何快速免费将QQ音乐QMC文件转换为MP3/FLAC格式
  • 基于系统攻击面的移动目标防御有效性评估模型构建与仿真
  • RoboMaster舵轮底盘代码调试避坑指南:从CAN通信到PID调参的实战经验
  • 从赛后复盘到实战提升:以2022 GDCPC为例,聊聊如何高效训练应对算法竞赛中的“套路题”
  • 告别配置迷茫!手把手教你用ETAS ISOLAR-A配置AUTOSAR COM模块(附超时与信号处理实战)
  • Outfit字体:9种字重免费开源几何无衬线字体,打造专业品牌视觉
  • Windows Defender禁用与恢复终极指南:5个简单步骤解决安全中心问题
  • Digital逻辑设计模拟器:从零开始构建你的数字世界
  • Ryujinx存档安全指南:3种方法保护你的Switch游戏进度
  • 从二阶微分到卷积核:拉普拉斯算子在图像边缘检测与增强中的数学本质与实现
  • Deep3D:如何用AI将2D视频秒变立体3D大片?完整指南
  • 从原理到实践:AprilTags二维码的精准检测与机器人视觉应用
  • 别再为APC发愁了!手把手教你用支付宝搞定Wiley、MDPI版面费(附截图避坑)
  • 华硕笔记本性能管理终极指南:GHelper轻量控制工具完全教程
  • 3分钟打造专属NGA论坛:这个免费插件让你的浏览效率翻倍
  • Python还是Java?小白程序员必收藏 | 大模型应用开发6个月完整学习路线图
  • 如何在5分钟内成为虚幻引擎资源分析专家:FModel完整指南
  • 等效积温导向的谷物干燥过程建模与智能控制【附程序】