一、Docker环境准备
1. 安装Docker
Ubuntu/Debian系统:
bash
# 更新包索引
sudo apt update
# 安装依赖
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加Docker仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 验证安装
sudo docker --version
CentOS/RHEL系统:
bash
# 移除旧版本
sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安装依赖
sudo yum install -y yum-utils
# 添加Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动Docker
sudo systemctl start docker
sudo systemctl enable docker
2. Docker配置优化
bash
# 将当前用户加入docker组(避免每次sudo)
sudo usermod -aG docker $USER
# 需要重新登录生效
# 配置Docker镜像加速器
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"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
EOF
# 重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
二、创建自定义Docker镜像
1. 编写Dockerfile
dockerfile
# 基于官方镜像
FROM ubuntu:22.04
# 设置环境变量
ENV LANG=C.UTF-8 \
DEBIAN_FRONTEND=noninteractive \
TZ=Asia/Shanghai
# 设置时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 更新并安装基础软件
RUN apt update && apt install -y \
curl \
wget \
vim \
git \
net-tools \
iputils-ping \
python3 \
python3-pip \
nginx \
supervisor \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*
# 创建工作目录
WORKDIR /app
# 复制应用文件
COPY requirements.txt .
COPY app.py .
# 安装Python依赖
RUN pip3 install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 复制配置文件
COPY nginx.conf /etc/nginx/nginx.conf
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 暴露端口
EXPOSE 80 443
# 设置启动命令
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
2. 创建应用文件
requirements.txt:
flask==2.3.3
gunicorn==21.2.0
redis==4.6.0
python
from flask import Flask
import socket
app = Flask(__name__)
@app.route('/')
def hello():
hostname = socket.gethostname()
return f"Hello from Docker Container: {hostname}"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
3. 构建镜像
bash
# 构建镜像
docker build -t my-app:latest .
# 查看镜像
docker images
三、容器操作与管理
1. 运行容器
bash
# 基本运行
docker run -d --name my-app -p 8080:80 my-app:latest
# 带数据卷
docker run -d \
--name my-app \
-p 8080:80 \
-v /host/path:/container/path \
-e ENV_VAR=value \
my-app:latest
# 限制资源
docker run -d \
--name my-app \
--memory="512m" \
--cpus="1.0" \
--restart=always \
my-app:latest
2. 容器管理命令
bash
# 查看容器
docker ps # 运行中的容器
docker ps -a # 所有容器
# 容器操作
docker start my-app # 启动
docker stop my-app # 停止
docker restart my-app # 重启
docker rm my-app # 删除
docker rm -f my-app # 强制删除
# 进入容器
docker exec -it my-app /bin/bash
docker exec -it my-app sh
# 查看日志
docker logs my-app
docker logs -f my-app # 实时查看
docker logs --tail 50 my-app
# 查看资源使用
docker stats my-app
四、Docker Compose多容器编排
1. 创建docker-compose.yml
yaml
version: '3.8'
services:
web:
image: nginx:alpine
container_name: web-server
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
- ./logs:/var/log/nginx
networks:
- app-network
restart: unless-stopped
app:
build: .
container_name: app-backend
ports:
- "5000:5000"
volumes:
- ./app:/app
- ./data:/data
environment:
- DB_HOST=database
- REDIS_HOST=redis
depends_on:
- database
- redis
networks:
- app-network
restart: unless-stopped
database:
image: postgres:15
container_name: postgres-db
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
POSTGRES_DB: mydb
volumes:
- postgres-data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
networks:
- app-network
restart: unless-stopped
redis:
image: redis:7-alpine
container_name: redis-cache
command: redis-server --appendonly yes
volumes:
- redis-data:/data
ports:
- "6379:6379"
networks:
- app-network
restart: unless-stopped
volumes:
postgres-data:
redis-data:
networks:
app-network:
driver: bridge
2. Compose命令
bash
# 安装Docker Compose
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
# 使用Compose
docker-compose up -d # 启动所有服务
docker-compose down # 停止并删除
docker-compose ps # 查看服务状态
docker-compose logs # 查看日志
docker-compose build # 重新构建
docker-compose exec app bash # 进入服务容器
五、Docker镜像优化最佳实践
1. 多阶段构建示例
dockerfile
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
2. 优化建议
dockerfile
# 1. 使用官方基础镜像
FROM python:3.11-slim # 比ubuntu更小
# 2. 合并RUN命令减少镜像层
RUN apt update && apt install -y \
package1 \
package2 \
&& rm -rf /var/lib/apt/lists/*
# 3. 使用.dockerignore文件
.dockerignore:
node_modules
.git
*.log
*.tmp
# 4. 使用特定版本标签
FROM ubuntu:22.04 # 而不是ubuntu:latest
# 5. 非root用户运行
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
六、Docker网络配置
bash
# 创建自定义网络
docker network create my-network
# 查看网络
docker network ls
# 连接容器到网络
docker run -d --name container1 --network my-network nginx
docker run -d --name container2 --network my-network redis
# 容器间通过名称通信
# container1中可以直接 ping container2
七、数据持久化
bash
# 创建数据卷
docker volume create mydata
# 使用数据卷
docker run -d \
--name db \
-v mydata:/var/lib/mysql \
mysql:8.0
# 备份数据卷
docker run --rm \
-v mydata:/source \
-v $(pwd):/backup \
alpine tar czf /backup/backup.tar.gz -C /source .
# 恢复数据卷
docker run --rm \
-v mydata:/target \
-v $(pwd):/backup \
alpine tar xzf /backup/backup.tar.gz -C /target
八、监控与维护
bash
# 查看容器资源使用
docker stats
# 查看镜像大小
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 清理无用资源
docker system prune -a # 清理所有未使用的资源
docker image prune # 清理未使用的镜像
docker volume prune # 清理未使用的卷
docker network prune # 清理未使用的网络
# 导出/导入镜像
docker save my-app:latest > my-app.tar
docker load < my-app.tar
# 导出/导入容器
docker export my-app > my-app-container.tar
cat my-app-container.tar | docker import - my-app:backup
九、安全建议
bash
# 1. 使用非root用户
# 在Dockerfile中添加:
USER nobody
# 2. 扫描镜像漏洞
docker scan my-app:latest
# 3. 限制容器能力
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx
# 4. 使用只读文件系统
docker run --read-only alpine sh
# 5. 设置资源限制
docker run --memory="512m" --cpus="1.0" my-app
这个完整的Docker环境制作指南应该能帮助你从零开始搭建和管理Docker环境。根据你的具体需求,可以调整相应的配置。