1小时入门Docker和Docker Compose
前言
你是否曾因"在我电脑上能运行"的问题而困扰?Docker的出现彻底解决了环境一致性问题。本教程将用60分钟带你入门Docker容器技术,重点讲解Docker Compose的配置语法,让你读完就能部署多容器应用,再读一遍就能灵活配置复杂服务。
第一部分:认识Docker(10分钟)
什么是Docker?
Docker是一个开源的容器化平台,能让应用程序及其依赖环境被打包成标准化单元(容器),实现"一次构建,到处运行"。
核心优势: - 环境一致性:消除"在我这能运行"的问题 - 资源高效:比虚拟机更轻量,启动更快 - 隔离性:不同应用运行在独立容器中,互不干扰 - 可移植性:在开发机、测试环境、生产服务器间无缝迁移
核心概念
| 概念 | 解释 | 类比 |
|---|---|---|
| 镜像(Image) | 包含应用程序及依赖的只读模板 | 类似操作系统ISO文件 |
| 容器(Container) | 镜像的运行实例,可读写 | 类似运行中的虚拟机 |
| 仓库(Repository) | 存储和分发镜像的地方 | 类似代码仓库(如GitHub) |
| Dockerfile | 构建镜像的文本文件,包含一系列指令 | 类似自动化安装脚本 |
| Docker Compose | 用于定义和运行多容器Docker应用的工具 | 类似多服务启动脚本 |
与虚拟机的区别
- 虚拟机:需要完整的操作系统,资源占用大,启动慢
- Docker容器:共享宿主操作系统内核,只包含必要的应用和依赖,轻量高效
第二部分:Docker安装与基础操作(20分钟)
安装Docker
Windows系统
- 下载并安装Docker Desktop
- 启动Docker,等待状态栏显示"Docker Desktop running"
Mac系统
- 下载并安装Docker Desktop for Mac
- 从应用程序中启动Docker
Linux系统(Ubuntu为例)# 更新软件包索引
sudo apt-get update
安装必要的依赖
sudo apt-get install ca-certificates curl gnupg lsb-release
添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
设置稳定版仓库
echo "deb [arch=(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装Docker引擎
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
验证安装
sudo docker run hello-world
基础操作命令
镜像操作# 拉取镜像(从Docker Hub下载)
docker pull [镜像名]:[标签]
示例:拉取最新版Nginx镜像
docker pull nginx:latest
查看本地镜像
docker images
删除镜像
docker rmi [镜像ID或镜像名]
容器操作# 运行容器
docker run [选项] 镜像名 [命令]
示例:运行Nginx容器,映射80端口,后台运行
docker run -d -p 80:80 --name mynginx nginx
选项说明:
-d: 后台运行容器
-p 主机端口:容器端口: 端口映射
--name: 给容器指定名称
查看运行中的容器
docker ps
查看所有容器(包括停止的)
docker ps -a
停止容器
docker stop [容器ID或容器名]
启动已停止的容器
docker start [容器ID或容器名]
进入容器内部
docker exec -it [容器ID或容器名] /bin/bash
删除容器
docker rm [容器ID或容器名]
实战:运行一个Web应用# 拉取一个简单的Python Web应用镜像
docker pull python:3.9-slim
创建一个简单的Python文件(本地)
echo 'from flask import Flask app = Flask(name) @app.route("/") def hello(): return "Hello from Docker!" if name "main": app.run(host="0.0.0.0", port=5000)' > app.py
运行容器,挂载本地文件到容器,映射端口
docker run -d -p 5000:5000 -v $(pwd):/app -w /app --name myapp python:3.9-slim sh -c "pip install flask && python app.py"
访问http://localhost:5000即可看到运行结果,修改本地app.py文件后刷新页面,内容会实时更新。
第三部分:Docker Compose详解(25分钟)
什么是Docker Compose?
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过一个YAML文件配置应用程序的所有服务,然后使用单个命令创建和启动所有服务。
适用场景: - 包含多个服务的应用(如Web应用+数据库+缓存) - 开发环境的快速搭建 - 自动化测试环境配置 - 简单的服务编排
安装Docker Compose
注意:Windows和Mac安装Docker Desktop时已包含Docker Compose,Linux需要单独安装
Linux系统安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-(uname -s)-(uname -m)" -o /usr/local/bin/docker-compose
赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
验证安装
docker-compose --version
Docker Compose核心语法
Docker Compose使用YAML格式的配置文件(默认名为docker-compose.yml),主要包含以下顶级元素:
version:指定Compose文件格式版本(推荐使用3.x)services:定义各个服务(容器)的配置networks:定义网络配置volumes:定义数据卷配置configs:配置管理(用于Swarm模式)secrets:敏感信息管理
完整示例与语法详解
下面是一个包含Web应用、数据库和Redis缓存的完整示例,附带详细注释:
指定Compose文件格式版本,3.8是较新的稳定版本
version: '3.8'
定义所有服务(容器)
services: # 服务名称:web(可自定义) web: # 构建镜像的配置 build: context: ./app # Dockerfile所在目录 dockerfile: Dockerfile # Dockerfile文件名(默认就是Dockerfile,可省略) # 如果不构建,也可以直接使用现有镜像 # image: my-web-app:latest
# 容器名称(可选)
container_name: my_web_app
# 端口映射:主机端口:容器端口
ports:
- "80:8000" # 将主机80端口映射到容器的8000端口
# 环境变量配置
environment:
- DEBUG=False # 非敏感环境变量直接写
- DB_HOST=db # 可以引用其他服务名作为主机名
- DB_PORT=5432
env_file:
- ./.env # 从文件加载环境变量(适合开发环境)
# 数据卷挂载:持久化数据或共享文件
volumes:
- static_volume:/app/static # 命名卷:卷名:容器内路径
- ./app:/app # 绑定挂载:本地路径:容器内路径(适合开发)
# 依赖关系:先启动db和redis服务再启动web
depends_on:
- db
- redis
# 网络配置:指定服务加入的网络
networks:
- app_network
# 健康检查:检测服务是否正常运行
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s # 检查间隔
timeout: 10s # 超时时间
retries: 3 # 重试次数
start_period: 40s # 启动后等待时间
# 重启策略
restart: unless-stopped # 除非手动停止,否则总是重启
数据库服务
db: image: postgres:13 # 使用官方PostgreSQL镜像 container_name: my_postgres volumes: - postgres_data:/var/lib/postgresql/data/ # 持久化数据库数据 environment: - POSTGRES_USER=appuser - POSTGRES_PASSWORD=secretpassword - POSTGRES_DB=myappdb networks: - app_network restart: unless-stopped # 暴露端口(仅在内部网络可见,不映射到主机) expose: - "5432"
Redis缓存服务
redis: image: redis:6-alpine # 使用轻量的Alpine版本 container_name: my_redis volumes: - redis_data:/data networks: - app_network restart: unless-stopped command: redis-server --appendonly yes # 启动命令,开启持久化
定义网络
networks: app_network: driver: bridge # 使用桥接网络(默认)
定义数据卷
volumes: postgres_data: # 数据库数据卷 redis_data: # Redis数据卷 static_volume: # 静态文件卷
关键语法说明
services配置
每个服务对应一个容器,主要配置项:
build:构建镜像的配置context:构建上下文路径dockerfile:指定Dockerfileargs:构建参数
image:使用的镜像名称,与build二选一ports:端口映射,格式:主机端口:容器端口(如80:8080)- 仅指定容器端口(随机映射主机端口,如
8080)
environment:环境变量,两种格式:- 数组形式:
- KEY=VALUE - 字典形式:
KEY: VALUE
- 数组形式:
volumes:数据卷挂载,格式:- 命名卷:
卷名:容器路径[:选项] - 绑定挂载:
本地路径:容器路径[:选项] - 临时卷:
tmpfs:容器路径
- 命名卷:
depends_on:服务依赖关系,定义启动顺序-
networks:服务加入的网络 -
command:覆盖容器启动命令 -
restart:重启策略,常用值:no:默认,不重启always:总是重启on-failure:失败时重启unless-stopped:除非手动停止,否则总是重启
networks配置
定义网络让服务之间通信,常用驱动:
- bridge:默认,同一主机内的容器通信
- overlay:跨主机容器通信(Swarm模式)
- host:使用主机网络
- none:禁用网络
volumes配置
定义命名卷,用于持久化数据,避免容器删除后数据丢失。
Docker Compose命令
构建并启动所有服务(后台运行)
docker-compose up -d
启动服务并查看日志(前台运行)
docker-compose up
构建镜像(即使镜像已存在也重新构建)
docker-compose build
查看服务状态
docker-compose ps
查看服务日志
docker-compose logs
查看特定服务日志并实时更新
docker-compose logs -f web
停止服务(不删除容器)
docker-compose stop
启动已停止的服务
docker-compose start
停止并删除容器、网络(数据卷和镜像保留)
docker-compose down
停止并删除所有(包括数据卷)
docker-compose down -v
进入服务容器
docker-compose exec web /bin/bash
第四部分:实战练习(5分钟)
现在动手实践一个简单的多服务应用:
- 创建项目目录并进入
mkdir docker-demo && cd docker-demo - 创建
docker-compose.yml文件,内容如下:version: '3.8' services: # Web服务 web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html # 挂载本地HTML文件 depends_on: - api networks: - demo-network # API服务 api: image: kennethreitz/httpbin # 一个简单的HTTP测试服务 expose: - "80" networks: - demo-network networks: demo-network: - 创建HTML目录和文件
mkdir html && echo 'My Docker Demo
API地址: http://localhost/api/get' > html/index.html - 启动服务
docker-compose up -d - 测试访问
- 打开
http://localhost查看Web页面 - 打开
http://localhost/api/get查看API响应
- 打开
- 查看状态并停止服务
docker-compose ps docker-compose down
通过这个练习,你可以理解如何用Docker Compose编排多个服务,并实现服务间的通信。
总结与进阶
通过这一小时的学习,你已经掌握了:
- Docker的核心概念和基础操作
- Docker Compose的配置语法和使用方法
- 如何编排多容器应用
进阶学习方向:
- Dockerfile深入学习:掌握镜像构建的最佳实践
- 容器网络:理解不同网络模式的应用场景
- 数据管理:学习数据卷、绑定挂载的高级用法
- CI/CD集成:将Docker融入自动化部署流程
- 容器监控:学习如何监控容器运行状态
- Kubernetes:当应用规模扩大时,学习更强大的容器编排平台
实践建议:将你熟悉的项目Docker化,尝试用Docker Compose管理开发环境,逐步积累实战经验。Docker生态系统非常丰富,循序渐进地学习会让你更容易掌握。
《1小时入门Docker和Docker Compose》留言数:0