Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包应用及依赖到一个可移植的容器中。
安装
Windows/Mac
Linux (Ubuntu)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
基本概念
- 镜像 (Image):只读的模板,包含运行容器所需的文件系统
- 容器 (Container):镜像的运行实例
- 仓库 (Repository):存储镜像的地方,如 Docker Hub
常用命令
镜像管理
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 构建镜像
docker build -t myapp:1.0 .
# 导出镜像
docker save -o nginx.tar nginx:latest
# 导入镜像
docker load -i nginx.tar
容器管理
# 运行容器
docker run -d --name mynginx -p 80:80 nginx
# 参数说明:
# -d:后台运行
# --name:指定容器名称
# -p:端口映射 宿主机端口:容器端口
# -v:挂载卷 宿主机路径:容器路径
# -e:设置环境变量
# --restart:重启策略(no/always/on-failure/unless-stopped)
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop mynginx
# 启动容器
docker start mynginx
# 重启容器
docker restart mynginx
# 删除容器
docker rm mynginx
# 强制删除运行中的容器
docker rm -f mynginx
# 进入容器
docker exec -it mynginx bash
# 查看容器日志
docker logs -f mynginx
# 查看容器详细信息
docker inspect mynginx
# 查看容器资源占用
docker stats
# 复制文件到容器
docker cp file.txt mynginx:/path/
# 从容器复制文件
docker cp mynginx:/path/file.txt ./
数据卷管理
# 创建数据卷
docker volume create mydata
# 查看数据卷列表
docker volume ls
# 查看数据卷详情
docker volume inspect mydata
# 删除数据卷
docker volume rm mydata
# 清理未使用的数据卷
docker volume prune
网络管理
# 查看网络
docker network ls
# 创建网络
docker network create mynet
# 删除网络
docker network rm mynet
# 容器连接到网络
docker network connect mynet mynginx
Dockerfile
Dockerfile 是用于构建镜像的文本文件。
基本结构
# 基础镜像
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV PYTHONUNBUFFERED=1
# 复制文件
COPY requirements.txt .
# 执行命令
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["python", "app.py"]
常用指令
- FROM:指定基础镜像
- WORKDIR:设置工作目录
- COPY:复制文件到镜像
- ADD:复制文件,支持URL和自动解压
- RUN:执行命令(构建时)
- CMD:容器启动时执行的命令
- ENTRYPOINT:入口点,不会被docker run覆盖
- ENV:设置环境变量
- EXPOSE:声明端口
- VOLUME:定义数据卷
- USER:指定运行用户
- ARG:构建参数
多阶段构建
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
.dockerignore
类似 .gitignore,用于排除不需要复制到镜像的文件。
node_modules
.git
.env
*.log
__pycache__
.vscode
镜像加速
配置镜像源(Linux)
编辑 /etc/docker/daemon.json:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
重启 Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
实用技巧
清理系统
# 清理未使用的容器、网络、镜像
docker system prune -a
# 查看磁盘占用
docker system df
容器自动重启
docker run -d --restart=always nginx
限制资源
# 限制内存和CPU
docker run -d --memory="512m" --cpus="1.5" nginx
查看容器IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
常见应用部署
Nginx
docker run -d \
--name nginx \
-p 80:80 \
-v /path/to/html:/usr/share/nginx/html \
nginx:alpine
MySQL
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=password \
-v mysql_data:/var/lib/mysql \
mysql:8.0
Redis
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_data:/data \
redis:alpine \
redis-server --appendonly yes
PostgreSQL
docker run -d \
--name postgres \
-p 5432:5432 \
-e POSTGRES_PASSWORD=password \
-v postgres_data:/var/lib/postgresql/data \
postgres:16