Skip to content

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.

发生了什么?

  1. Docker 在本地查找 hello-world 镜像
  2. 未找到,从 Docker Hub 拉取镜像
  3. 创建并启动容器
  4. 容器执行后输出欢迎信息并退出

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

# 退出容器
exit

1.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-app

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

2.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.0

2.5 运行您的镜像

bash
# 运行容器
docker run -d --name my-app -p 5000:5000 my-first-app:1.0

# 查看容器状态
docker ps

# 测试应用
curl http://localhost:5000

2.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 web

3.3 管理 Compose 应用

bash
# 停止服务
docker-compose stop

# 停止并删除容器、网络
docker-compose down

# 停止并删除容器、网络和卷
docker-compose down -v

# 重启服务
docker-compose restart

# 扩展服务实例数
docker-compose up -d --scale web=3

3.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-data

4.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 container2

5.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 安全建议

  1. 使用非 root 用户运行容器
dockerfile
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
USER appuser
  1. 定期更新基础镜像
bash
docker pull python:3.11-slim
  1. 扫描镜像漏洞
bash
docker scan my-first-app:1.0

6.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 快速入门。接下来,您可以:

基于 MIT 许可发布