1. 为什么每个开发者都应该学Docker?
第一次接触Docker是在2016年参与一个微服务项目时。当时团队里一位资深架构师只用了一个docker-compose.yml文件,就解决了困扰我们两周的环境配置问题——从那时起,我就意识到容器化技术将彻底改变软件交付的方式。
Docker本质上是一个轻量级的虚拟化工具,但它与传统虚拟机有着根本区别。传统VM需要模拟整个操作系统(Guest OS),而Docker容器直接共享主机内核,通过命名空间和控制组实现隔离。这就好比公寓合租(Docker)与独立别墅(VM)的区别——前者共享基础设施但保持私人空间,后者则完全独立但开销更大。
2. 环境准备与安装指南
2.1 系统要求检查
在安装Docker前,建议先确认系统满足以下条件:
- 64位CPU(支持虚拟化)
- 至少4GB内存(运行多个容器时需要更多)
- 20GB可用磁盘空间
- 对于Windows/macOS用户,需要开启硬件虚拟化支持(BIOS中VT-x/AMD-v)
重要提示:Windows家庭版用户需要先升级到专业版或企业版,因为家庭版缺少Hyper-V支持。我在帮学员排错时,发现约30%的安装失败都源于此。
2.2 各平台安装方法
Windows平台:
- 下载Docker Desktop安装包(约500MB)
- 安装时勾选"Use WSL 2 backend"(性能更好)
- 安装完成后在PowerShell运行:
bash复制
wsl --set-default-version 2
macOS平台:
bash复制# 使用Homebrew安装更便捷
brew install --cask docker
Linux平台(以Ubuntu为例):
bash复制# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 设置仓库
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# 添加Docker官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置稳定版仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.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 docker-compose-plugin
# 验证安装
sudo docker run hello-world
3. 核心概念快速掌握
3.1 镜像(Image)与容器(Container)
可以把镜像理解为软件的"模具",而容器则是根据这个模具制造出的"产品"。例如:
- nginx:latest 是一个镜像
- 当你运行
docker run nginx时,就创建了一个容器
查看本地镜像列表:
bash复制docker images
查看运行中的容器:
bash复制docker ps
3.2 Dockerfile实战
下面是一个典型的Python应用Dockerfile示例:
dockerfile复制# 使用官方Python基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 先复制依赖文件(利用缓存层)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 再复制应用代码
COPY . .
# 暴露端口
EXPOSE 8000
# 定义环境变量
ENV NAME World
# 容器启动命令
CMD ["python", "app.py"]
构建镜像命令:
bash复制docker build -t my-python-app .
3.3 容器网络与存储
Docker提供多种网络模式:
- bridge(默认):容器通过虚拟网桥通信
- host:容器直接使用主机网络
- none:禁用所有网络
创建持久化数据卷:
bash复制docker volume create mydata
挂载数据卷到容器:
bash复制docker run -v mydata:/data my-image
4. 开发实战:部署WordPress博客
4.1 单容器方案
bash复制docker run --name my-wordpress \
-e WORDPRESS_DB_HOST=db \
-e WORDPRESS_DB_USER=wordpress \
-e WORDPRESS_DB_PASSWORD=secret \
-e WORDPRESS_DB_NAME=wordpress \
-p 8080:80 \
wordpress
4.2 生产级方案(使用Docker Compose)
yaml复制version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
- wp_data:/var/www/html
volumes:
db_data:
wp_data:
启动命令:
bash复制docker-compose up -d
5. 常见问题排错指南
5.1 容器启动失败
检查日志的最快方式:
bash复制docker logs <container_id>
查看详细错误信息:
bash复制docker inspect <container_id> | grep -i error
5.2 端口冲突处理
当出现"端口已占用"错误时:
bash复制# 查找占用端口的进程
sudo lsof -i :8000
# 或者直接停止冲突容器
docker stop $(docker ps -q --filter ancestor=nginx)
5.3 镜像加速配置
对于国内用户,建议配置镜像加速器(以阿里云为例):
json复制{
"registry-mirrors": ["https://<your-id>.mirror.aliyuncs.com"]
}
6. 进阶技巧与最佳实践
6.1 多阶段构建
优化镜像大小的经典模式:
dockerfile复制# 构建阶段
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 最终阶段
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
6.2 健康检查配置
dockerfile复制HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
6.3 资源限制
启动容器时限制资源:
bash复制docker run -it --cpus=".5" --memory="512m" my-image
7. 安全注意事项
-
永远不要使用root用户运行容器进程:
dockerfile复制RUN groupadd -r appuser && useradd -r -g appuser appuser USER appuser -
定期扫描镜像漏洞:
bash复制
docker scan my-image -
避免使用latest标签,明确指定版本号
-
敏感信息通过环境变量或secrets传递,不要硬编码在镜像中
8. 学习资源推荐
- 官方文档:https://docs.docker.com/
- 交互式教程:https://labs.play-with-docker.com/
- 可视化工具:Portainer(适合初学者)
- 进阶书籍:《Docker Deep Dive》
记得我第一次成功部署Docker化应用时,那种"一次构建,到处运行"的畅快感至今难忘。现在每当我看到新学员克服了环境配置的噩梦,脸上露出如释重负的笑容,就知道容器化技术又收获了一位忠实拥趸。
