Docker 快速实践教程
本教程将带领您在几分钟内上手 Docker,从运行第一个容器到构建自定义镜像,再到使用 Docker Compose 编排多容器应用。
前置要求
在开始之前,请确保您已经:
- 安装 Docker Desktop(Windows/Mac)或 Docker Engine(Linux)
- 拥有命令行终端访问权限
- 具备基本的命令行操作知识
验证 Docker 安装:
bash
docker --version
Docker version 24.0.0, build 1234567第一步:运行您的第一个容器
1.1 运行 Hello World
让我们从最简单的示例开始——运行一个输出 "Hello World" 的容器:
bash
docker run hello-world输出示例:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:2498fce13458aa50c9e0f94a2...
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.发生了什么?
- Docker 在本地查找
hello-world镜像 - 未找到,从 Docker Hub 拉取镜像
- 创建并启动容器
- 容器执行后输出欢迎信息并退出
1.2 运行交互式容器
让我们运行一个 Ubuntu 容器并与其交互:
bash
# 运行交互式 Ubuntu 容器
docker run -it ubuntu:22.04 bash参数说明:
| 参数 | 说明 |
|---|---|
-i | 保持 STDIN 打开,允许交互 |
-t | 分配伪终端 |
ubuntu:22.04 | 使用 Ubuntu 22.04 镜像 |
bash | 在容器内运行 bash shell |
在容器内尝试一些命令:
bash
# 查看当前用户
whoami
# 输出: root
# 查看操作系统信息
cat /etc/os-release
# 安装软件包
apt-get update && apt-get install -y curl
# 退出容器
exit1.3 运行后台容器
使用 -d 参数在后台运行容器:
bash
# 运行 Nginx 服务器
docker run -d --name my-nginx -p 8080:80 nginx:alpine参数说明:
| 参数 | 说明 |
|---|---|
-d | 后台运行(分离模式) |
--name | 为容器指定名称 |
-p 8080:80 | 将主机 8080 端口映射到容器 80 端口 |
验证容器运行状态:
bash
# 查看运行中的容器
docker ps
# 查看容器日志
docker logs my-nginx
# 访问 Nginx 服务
curl http://localhost:8080停止并删除容器:
bash
docker stop my-nginx
docker rm my-nginx第二步:构建您的第一个镜像
2.1 创建项目目录
bash
mkdir my-first-app
cd my-first-app2.2 创建应用代码
创建 app.py 文件:
python
from flask import Flask
import socket
app = Flask(__name__)
@app.route('/')
def hello():
hostname = socket.gethostname()
return f'''
<h1>Hello from Docker!</h1>
<p>Hostname: {hostname}</p>
<p>This is my first Dockerized application.</p>
'''
@app.route('/health')
def health():
return {'status': 'healthy'}
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)创建 requirements.txt 文件:
flask==2.3.3
werkzeug==2.3.72.3 编写 Dockerfile
创建 Dockerfile 文件:
dockerfile
# 使用官方 Python 基础镜像
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY app.py .
# 暴露端口
EXPOSE 5000
# 定义健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:5000/health || exit 1
# 启动应用
CMD ["python", "app.py"]2.4 构建镜像
bash
# 构建镜像(注意最后的点表示当前目录)
docker build -t my-first-app:1.0 .构建过程输出:
[+] Building 15.2s (9/9) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 389B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/python:3.11-slim
=> [1/4] FROM docker.io/library/python:3.11-slim
=> [internal] load build context
=> => transferring context: 1.23kB
=> [2/4] WORKDIR /app
=> [3/4] COPY requirements.txt .
=> [4/4] RUN pip install --no-cache-dir -r requirements.txt
=> exporting to image
=> => exporting layers
=> => writing image sha256:abc123...
=> => naming to docker.io/library/my-first-app:1.02.5 运行您的镜像
bash
# 运行容器
docker run -d --name my-app -p 5000:5000 my-first-app:1.0
# 查看容器状态
docker ps
# 测试应用
curl http://localhost:50002.6 查看镜像信息
bash
# 列出本地镜像
docker images
# 查看镜像历史
docker history my-first-app:1.0
# 查看镜像详情
docker inspect my-first-app:1.0第三步:使用 Docker Compose
Docker Compose 是定义和运行多容器 Docker 应用的工具。
3.1 创建 Compose 文件
在项目根目录创建 docker-compose.yml:
yaml
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
environment:
- FLASK_ENV=production
depends_on:
- redis
networks:
- app-network
restart: unless-stopped
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
networks:
- app-network
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- web
networks:
- app-network
restart: unless-stopped
volumes:
redis-data:
networks:
app-network:
driver: bridge创建 nginx.conf 配置文件:
nginx
events {
worker_connections 1024;
}
http {
upstream web {
server web:5000;
}
server {
listen 80;
location / {
proxy_pass http://web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}3.2 启动多容器应用
bash
# 构建并启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs -f
# 查看特定服务日志
docker-compose logs -f web3.3 管理 Compose 应用
bash
# 停止服务
docker-compose stop
# 停止并删除容器、网络
docker-compose down
# 停止并删除容器、网络和卷
docker-compose down -v
# 重启服务
docker-compose restart
# 扩展服务实例数
docker-compose up -d --scale web=33.4 更新应用
修改代码后重新部署:
bash
# 重新构建并启动
docker-compose up -d --build
# 仅重新构建特定服务
docker-compose up -d --build web第四步:数据持久化
4.1 使用数据卷
bash
# 创建命名卷
docker volume create my-data
# 使用卷运行容器
docker run -d -v my-data:/data nginx:alpine
# 查看卷列表
docker volume ls
# 查看卷详情
docker volume inspect my-data4.2 使用绑定挂载
bash
# 将主机目录挂载到容器
docker run -d \
-v $(pwd)/html:/usr/share/nginx/html:ro \
-p 8080:80 \
nginx:alpine第五步:容器网络
5.1 创建自定义网络
bash
# 创建桥接网络
docker network create my-network
# 在网络中运行容器
docker run -d --name container1 --network my-network nginx:alpine
docker run -d --name container2 --network my-network nginx:alpine
# 容器间可以通过名称通信
docker exec container1 ping container25.2 网络模式对比
| 网络模式 | 说明 | 使用场景 |
|---|---|---|
| bridge | 默认模式,容器间通过网桥通信 | 大多数应用场景 |
| host | 共享主机网络栈 | 需要高性能网络 |
| none | 无网络 | 完全隔离 |
| overlay | 跨主机网络 | Swarm 集群 |
第六步:最佳实践
6.1 镜像优化
dockerfile
# 使用多阶段构建
FROM python:3.11 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]6.2 安全建议
- 使用非 root 用户运行容器
dockerfile
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
USER appuser- 定期更新基础镜像
bash
docker pull python:3.11-slim- 扫描镜像漏洞
bash
docker scan my-first-app:1.06.3 资源限制
bash
docker run -d \
--memory="512m" \
--cpus="1.0" \
--pids-limit=100 \
my-first-app:1.0常见问题排查
容器无法启动
bash
# 查看容器日志
docker logs <container-id>
# 查看容器详细信息
docker inspect <container-id>
# 进入失败容器调试
docker run -it --entrypoint sh my-first-app:1.0端口冲突
bash
# 查找占用端口的进程
lsof -i :8080
# 使用不同端口映射
docker run -p 8081:80 nginx:alpine清理资源
bash
# 删除所有停止的容器
docker container prune
# 删除未使用的镜像
docker image prune
# 删除未使用的卷
docker volume prune
# 清理所有未使用资源
docker system prune -a下一步
恭喜!您已经完成了 Docker 快速入门。接下来,您可以:
- 深入学习 镜像构建最佳实践
- 了解 Docker 网络配置
- 掌握 Docker 存储管理
- 学习 Docker 安全实践