一、为什么需要Docker?
Docker是一个开源的容器化平台,让开发者可以打包应用及其依赖到”容器”中,实现”一次构建,到处运行”。
1.1 传统部署 vs Docker
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| ┌─────────────────────────────────────────────────────────────────┐ │ 传统部署方式 │ ├─────────────────────────────────────────────────────────────────┤ │ 开发者机器: "在我电脑上能跑啊!" │ │ ↓ │ │ 测试环境: 缺少这个库、版本不对、系统不兼容... │ │ ↓ │ │ 生产环境: 又出bug了!来回切换环境搞死人 😤 │ └─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐ │ Docker部署方式 │ ├─────────────────────────────────────────────────────────────────┤ │ 开发 → 打包成镜像 → 镜像拉到任何机器都能跑 ✅ │ │ ↓ │ │ 测试: 拉镜像 → 跑起来 │ │ ↓ │ │ 生产: 拉镜像 → 跑起来 │ │ │ │ "Build once, run anywhere" 🐳 │ └─────────────────────────────────────────────────────────────────┘
|
1.2 核心概念
| 概念 |
说明 |
| 镜像(Image) |
模板,相当于”类” |
| 容器(Container) |
镜像的实例,相当于”对象” |
| 仓库(Repository) |
存放镜像的地方,如Docker Hub |
二、安装Docker
2.1 Windows安装
1 2 3 4 5 6 7 8 9 10 11 12
|
docker --version
docker run hello-world
|
2.2 Ubuntu安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
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
sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker sudo systemctl enable docker
docker --version sudo docker run hello-world
|
2.3 配置Docker镜像加速
国内访问Docker Hub较慢,建议配置镜像加速:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] } EOF
sudo systemctl daemon-reload sudo systemctl restart docker
docker info | grep -A 10 "Registry Mirrors"
|
三、Docker镜像操作
3.1 搜索镜像
1 2 3 4 5
| docker search nginx
docker search --filter stars=1000 nginx
|
3.2 拉取镜像
1 2 3 4 5 6 7 8
| docker pull nginx
docker pull nginx:1.25
docker pull ubuntu:22.04
|
3.3 查看镜像
1 2 3 4 5 6 7 8
| docker images
docker image inspect nginx:latest
docker images -q
|
3.4 删除镜像
1 2 3 4 5 6 7 8
| docker rmi nginx:latest
docker rmi -f nginx:latest
docker image prune -a
|
四、Docker容器操作
4.1 创建并运行容器
1 2 3 4 5 6 7 8 9 10 11
| docker run -it --name my-ubuntu ubuntu:22.04 /bin/bash
docker run -d --name my-nginx nginx
docker run -d -p 8080:80 --name my-nginx nginx
docker run -d -p 8080:80 -v /home/user/html:/usr/share/nginx/html --name my-nginx nginx
|
4.2 容器常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| docker ps
docker ps -a
docker start my-nginx
docker stop my-nginx
docker restart my-nginx
docker rm my-nginx
docker rm -f my-nginx
docker logs my-nginx
docker logs -f my-nginx
docker exec -it my-nginx /bin/bash
docker inspect my-nginx
|
4.3 容器资源限制
1 2 3 4 5 6 7 8
| docker run -d --memory=512m --name limited-app nginx
docker run -d --cpus=0.5 --name limited-app nginx
docker run -d --memory=512m --cpus=0.5 --name limited-app nginx
|
五、Dockerfile构建镜像
5.1 基础语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["python", "app.py"]
|
5.2 实战:构建Python Web应用镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| mkdir myapp && cd myapp
cat > app.py <<EOF from flask import Flask app = Flask(__name__)
@app.route('/') def hello(): return 'Hello Docker!'
if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) EOF
cat > requirements.txt <<EOF flask==3.0.0 EOF
cat > Dockerfile <<EOF FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt . RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"] EOF
docker build -t my-flask-app .
docker run -d -p 5000:5000 --name flask-app my-flask-app
curl http://localhost:5000
|
5.3 Dockerfile最佳实践
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| FROM ubuntu RUN apt-get update RUN apt-get install -y python RUN apt-get install -y python-pip RUN pip install flask
FROM ubuntu RUN apt-get update && \ apt-get install -y python3 python3-pip && \ rm -rf /var/lib/apt/lists/*
FROM python:3.11-slim RUN pip install --no-cache-dir flask
|
六、Docker Compose编排
6.1 安装Docker Compose
1 2 3 4 5 6 7
|
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
|
6.2 docker-compose.yml语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| version: '3.8'
services: web: build: . ports: - "5000:5000" volumes: - .:/app environment: - FLASK_ENV=development depends_on: - redis
redis: image: redis:7-alpine ports: - "6379:6379" volumes: - redis-data:/data
volumes: redis-data:
|
6.3 常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| docker-compose up -d
docker-compose down
docker-compose ps
docker-compose logs -f
docker-compose up -d --build
docker-compose restart web
|
七、实战案例
7.1 搭建MySQL服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| mkdir -p ~/mysql/data
docker run -d \ --name mysql-server \ -e MYSQL_ROOT_PASSWORD=root123 \ -e MYSQL_DATABASE=myapp \ -e MYSQL_USER=user \ -e MYSQL_PASSWORD=user123 \ -p 3306:3306 \ -v ~/mysql/data:/var/lib/mysql \ mysql:8
docker logs -f mysql-server
docker exec -it mysql-server mysql -uroot -proot123
|
7.2 搭建Redis缓存
1 2 3 4 5 6 7 8 9 10
| docker run -d \ --name redis-server \ -p 6379:6379 \ -v ~/redis/data:/data \ redis:7-alpine \ redis-server --appendonly yes
docker exec -it redis-server redis-cli
|
7.3 搭建Nginx反向代理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| mkdir -p ~/nginx/conf cat > ~/nginx/conf/nginx.conf <<EOF server { listen 80; server_name localhost;
location / { proxy_pass http://web:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } EOF
cat > ~/nginx/docker-compose.yml <<EOF version: '3.8'
services: web: image: python:3.11-slim working_dir: /app command: python -m http.server 5000 volumes: - ./app:/app
nginx: image: nginx:alpine ports: - "8080:80" volumes: - ./conf/nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - web EOF
cd ~/nginx && docker-compose up -d
|
八、常用命令速查
8.1 镜像命令
| 命令 |
说明 |
docker images |
查看本地镜像 |
docker pull <image> |
拉取镜像 |
docker rmi <image> |
删除镜像 |
docker build -t <name> . |
构建镜像 |
8.2 容器命令
| 命令 |
说明 |
docker ps |
查看运行中的容器 |
docker ps -a |
查看所有容器 |
docker run -d <image> |
后台运行容器 |
docker run -it <image> |
交互式运行 |
docker start <container> |
启动容器 |
docker stop <container> |
停止容器 |
docker rm <container> |
删除容器 |
docker logs <container> |
查看日志 |
docker exec -it <container> bash |
进入容器 |
8.3 Docker Compose命令
| 命令 |
说明 |
docker-compose up -d |
启动所有服务 |
docker-compose down |
停止所有服务 |
docker-compose ps |
查看服务状态 |
docker-compose logs -f |
查看日志 |
九、常见问题
9.1 端口占用
1 2 3 4 5
| netstat -tlnp | grep 8080
kill -9 <PID>
|
9.2 磁盘空间不足
1 2 3 4 5
| docker system prune -a
docker builder prune
|
9.3 容器内无法访问网络
1 2 3 4 5
| docker exec <container> cat /etc/resolv.conf
docker run --network=host <container>
|
十、进阶学习路线
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ┌─────────────────────────────────────────────────────────────────┐ │ Docker学习路线 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ 入门 ──→ 镜像操作 ──→ 容器操作 ──→ Dockerfile ──→ Compose │ │ │ │ ↓ │ │ │ │ 进阶 │ │ ├── Docker Swarm / Kubernetes 容器编排 │ │ ├── CI/CD 持续集成/部署 │ │ ├── 安全加固与优化 │ │ └── 微服务架构 │ │ │ └─────────────────────────────────────────────────────────────────┘
|
参考资料
持续更新中…欢迎收藏!
#Docker #容器 #DevOps #教程 #虚拟化