Docker环境搭建笔记

1. Docker 安装

1.1 快速安装

一键安装脚本

1
2
# 使用阿里云镜像安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

启动Docker服务

1
2
3
4
5
6
7
8
# 启动Docker服务
systemctl start docker

# 重启Docker服务
systemctl restart docker

# 设置开机自启
systemctl enable docker

1.2 Docker Compose 安装

下载并安装

1
2
3
4
5
6
7
8
9
10
11
# 下载Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 设置执行权限
chmod +x /usr/local/bin/docker-compose

# 创建软链接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 验证安装
docker-compose --version

2. 镜像管理

2.1 镜像导入导出

Docker Import vs Docker Load

docker import - 导入容器快照

1
2
3
4
5
# 基本语法
docker import xxxx.tar [镜像名:标签]

# 示例
docker import my-container.tar myapp:v1.0
  • 用于导入docker export导出的容器快照

  • 会创建新镜像但丢失历史层信息

docker load - 导入镜像归档

1
2
3
4
5
6
# 基本语法
docker load -i xxxx.tar
docker load < xxxx.tar

# 示例
docker load -i nginx-latest.tar
  • 用于导入docker save导出的镜像归档

  • 保留完整的镜像历史和层级结构

2.2 镜像基本操作

查看镜像

1
2
3
4
5
6
7
8
9
10
11
# 列出所有镜像
docker images

# 查看镜像详细信息
docker inspect <镜像ID>

# 查看镜像构建历史
docker history <镜像ID>

# 查看镜像大小
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

镜像导出

1
2
3
4
5
6
7
8
# 导出镜像(保留层级结构)
docker save -o nginx.tar nginx:latest

# 导出容器为镜像
docker export <容器ID> > container.tar

# 压缩导出
docker save nginx:latest | gzip > nginx-latest.tar.gz

删除镜像

1
2
3
4
5
6
7
8
9
10
11
# 删除指定镜像
docker rmi <镜像ID>

# 强制删除镜像
docker rmi -f <镜像ID>

# 批量删除无用镜像
docker image prune -f

# 删除所有镜像
docker rmi $(docker images -q)

2.3 镜像构建

Dockerfile 基础示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 基础镜像
FROM python:3.9

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装依赖
RUN pip install -r requirements.txt

# 复制应用代码
COPY . .

# 设置环境变量
ENV PYTHONPATH=/app

# 暴露端口
EXPOSE 8000

# 启动命令
CMD ["python", "app.py"]

构建镜像

1
2
3
4
5
6
7
8
9
10
11
# 基本构建
docker build -t myapp:latest .

# 指定Dockerfile
docker build -f Dockerfile.prod -t myapp:prod .

# 构建时传递参数
docker build --build-arg ENV=production -t myapp:prod .

# 不使用缓存构建
docker build --no-cache -t myapp:latest .

3. 容器操作

3.1 创建和运行容器

基本运行命令

1
2
3
4
5
6
7
8
9
10
11
# 交互式运行容器
docker run -it <镜像名> /bin/bash

# 后台运行容器
docker run -d <镜像名>

# 运行容器并指定名称
docker run --name mycontainer <镜像名>

# 运行后自动删除容器
docker run --rm <镜像名>

-it 参数详解

  • -i (–interactive): 保持标准输入开放,允许与容器交互

  • -t (–tty): 分配伪终端,提供命令行界面

1
2
3
4
5
# 有-it参数:可以进入容器交互
docker run -it ubuntu bash

# 无-it参数:容器运行后立即退出
docker run ubuntu bash

3.2 容器管理

查看容器

1
2
3
4
5
6
7
8
# 查看运行中的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 查看容器详细信息
docker inspect <容器ID>

容器生命周期管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 启动已停止的容器
docker start <容器ID>

# 停止运行中的容器
docker stop <容器ID>

# 重启容器
docker restart <容器ID>

# 强制停止容器
docker kill <容器ID>

# 删除容器
docker rm <容器ID>

# 强制删除运行中的容器
docker rm -f <容器ID>

进入容器

1
2
3
4
5
6
7
8
# 进入正在运行的容器
docker exec -it <容器ID> bash

# 以root用户进入容器
docker exec -it --user root <容器ID> bash

# 执行单个命令
docker exec <容器ID> ls -la

3.3 容器批量操作

启动所有容器

1
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)

停止所有容器

1
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

删除所有容器

1
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)

删除所有镜像

1
docker rmi $(docker images | awk '{print $3}' |tail -n +2)

根据状态删除容器

1
2
# 删除已退出的容器
sudo docker rm $(sudo docker ps -qf status=exited)

设置容器自启动

1
2
3
4
5
# 设置容器开机自启
docker update --restart=always <容器名>

# 示例:设置MySQL为开机自启
docker update --restart=always mysql

4. 数据管理

4.1 目录挂载 (-v 参数)

基本目录挂载

1
2
3
4
5
6
7
8
9
10
11
# 基本语法
docker run -v <本地路径>:<容器路径> <镜像名>

# 挂载当前目录
docker run -it -v $(pwd):/workspace ubuntu bash

# 挂载指定目录
docker run -it -v /home/user/code:/app python:3.9 bash

# 只读挂载
docker run -v /host/path:/container/path:ro <镜像名>

4.2 文件复制

容器与主机间文件传输

1
2
3
4
5
6
7
8
# 从容器复制文件到本地
docker cp <容器ID>:/path/to/file /local/path

# 从本地复制文件到容器
docker cp /local/path/file <容器ID>:/container/path

# 复制目录
docker cp <容器ID>:/app/logs ./container-logs

4.3 数据卷管理

数据卷操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建数据卷
docker volume create myvolume

# 使用数据卷
docker run -v myvolume:/data <镜像名>

# 查看所有数据卷
docker volume ls

# 查看数据卷详细信息
docker volume inspect myvolume

# 删除数据卷
docker volume rm myvolume

# 清理未使用的数据卷
docker volume prune

5. 网络配置

5.1 端口映射 (-p 参数)

端口映射语法

1
2
3
4
5
6
7
8
9
10
11
# 映射单个端口
docker run -p 8080:80 nginx

# 映射多个端口
docker run -p 8080:80 -p 8443:443 nginx

# 映射到指定IP
docker run -p 127.0.0.1:8080:80 nginx

# 映射随机端口
docker run -P nginx

端口映射格式说明

支持三种格式:

  • hostPort:containerPort - 映射本机指定端口到容器端口(常用)

  • ip:hostPort:containerPort - 映射指定地址的端口到容器端口

  • ip::containerPort - 映射指定地址的任意端口到容器端口

5.2 网络管理

网络操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看网络列表
docker network ls

# 创建自定义网络
docker network create mynetwork

# 在指定网络中运行容器
docker run --network mynetwork nginx

# 查看网络详细信息
docker network inspect mynetwork

# 连接容器到网络
docker network connect mynetwork <容器ID>

# 断开容器网络连接
docker network disconnect mynetwork <容器ID>

# 删除网络
docker network rm mynetwork

6. Docker Compose

6.1 基本命令

Compose 服务管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 启动服务
docker-compose up

# 后台启动服务
docker-compose up -d

# 停止服务
docker-compose down

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs

# 重新构建并启动
docker-compose up --build

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

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 指定Docker Compose文件版本
version: '3.8'

# 定义服务列表
services:
# Web应用服务
web:
# 使用当前目录的Dockerfile构建镜像
build: .
# 端口映射:主机端口8000映射到容器端口8000
ports:
- "8000:8000"
# 数据卷挂载:当前目录挂载到容器/app目录
volumes:
- .:/app
# 环境变量设置
environment:
- DEBUG=1
# 服务依赖:web服务依赖db服务启动
depends_on:
- db

# 数据库服务
db:
# 使用PostgreSQL 13镜像
image: postgres:13
# 数据库配置环境变量
environment:
- POSTGRES_DB=mydb # 数据库名
- POSTGRES_USER=user # 用户名
- POSTGRES_PASSWORD=password # 密码
# 数据持久化:使用命名卷存储数据库数据
volumes:
- postgres_data:/var/lib/postgresql/data
# 端口映射(可选,用于外部访问数据库)
ports:
- "5432:5432"

# 定义命名卷
volumes:
postgres_data: # 用于PostgreSQL数据持久化

配置项详细说明

build 配置

1
2
3
4
5
build: .                    # 使用当前目录Dockerfile
build: ./path/to/dockerfile # 指定Dockerfile路径
build:
context: . # 构建上下文
dockerfile: Dockerfile.dev # 指定Dockerfile文件名

image 配置

1
2
image: nginx:alpine         # 官方镜像
image: myregistry/myapp:v1.0 # 私有镜像

ports 配置

1
2
3
4
ports:
- "8080:80" # 主机8080映射容器80
- "127.0.0.1:8080:80" # 绑定到指定IP
- "3000-3005:3000-3005" # 端口范围映射

volumes 配置

1
2
3
4
volumes:
- ./data:/app/data # 目录挂载
- myvolume:/app/storage # 命名卷挂载
- /etc/config:/app/config:ro # 只读挂载

environment 配置

1
2
3
4
5
6
environment:
- NODE_ENV=production # 数组形式
- DEBUG=1
environment: # 对象形式
NODE_ENV: production
DEBUG: "1"

depends_on 配置

1
2
3
depends_on:
- db # 等待db服务启动
- redis

6.3 完整项目示例

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
47
48
49
50
51
52
53
54
55
56
57
58
version: '3.8'

services:
# Nginx反向代理
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- web
restart: unless-stopped

# Web应用
web:
build:
context: .
dockerfile: Dockerfile.prod
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:password@db:5432/myapp
- REDIS_URL=redis://redis:6379
volumes:
- ./uploads:/app/uploads
depends_on:
- db
- redis
restart: unless-stopped

# 数据库
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
restart: unless-stopped

# 缓存
redis:
image: redis:alpine
volumes:
- redis_data:/data
restart: unless-stopped

volumes:
postgres_data:
redis_data:

networks:
default:
name: myapp_network

7. 日志与监控

7.1 查看日志

容器日志操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看容器日志
docker logs <容器ID>

# 实时查看日志
docker logs -f <容器ID>

# 查看最近N行日志
docker logs --tail 100 <容器ID>

# 查看指定时间的日志
docker logs --since 2023-01-01 <容器ID>

# 查看指定时间范围的日志
docker logs --since 2023-01-01 --until 2023-01-02 <容器ID>

7.2 容器监控

资源使用监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看所有容器资源使用情况
docker stats

# 查看单个容器状态
docker stats <容器ID>

# 只显示一次统计信息
docker stats --no-stream

# 查看容器内进程
docker top <容器ID>

# 查看容器详细信息
docker inspect <容器ID>

8. 系统维护

8.1 环境变量管理

设置环境变量

1
2
3
4
5
6
7
8
# 运行时设置环境变量
docker run -e VAR1=value1 -e VAR2=value2 <镜像名>

# 从文件读取环境变量
docker run --env-file .env <镜像名>

# 查看容器环境变量
docker exec <容器ID> env

.env 文件示例

1
2
3
4
5
# .env文件内容
NODE_ENV=production
DATABASE_URL=postgresql://user:pass@db:5432/myapp
API_KEY=your-secret-api-key
DEBUG=false

8.2 系统清理

清理无用资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 清理停止的容器
docker container prune

# 清理无用镜像
docker image prune

# 清理无用网络
docker network prune

# 清理无用数据卷
docker volume prune

# 清理所有无用资源
docker system prune -a

# 查看磁盘使用情况
docker system df

批量清理操作

1
2
3
4
5
6
7
8
9
10
11
# 停止所有容器
docker stop $(docker ps -q)

# 删除所有容器
docker rm $(docker ps -aq)

# 删除所有镜像
docker rmi $(docker images -q)

# 删除所有数据卷
docker volume rm $(docker volume ls -q)

8.3 性能优化

资源限制

1
2
3
4
5
6
7
8
# 限制容器内存使用
docker run -m 512m <镜像名>

# 限制CPU使用
docker run --cpus="1.5" <镜像名>

# 设置重启策略
docker run --restart=always <镜像名>

重启策略选项

  • no: 不自动重启(默认)

  • on-failure: 非正常退出时重启

  • unless-stopped: 总是重启,除非手动停止

  • always: 总是重启

8.4 安全最佳实践

安全运行选项

1
2
3
4
5
6
7
8
9
10
11
# 以非root用户运行
docker run --user 1000:1000 <镜像名>

# 只读根文件系统
docker run --read-only <镜像名>

# 禁用网络
docker run --network none <镜像名>

# 限制容器权限
docker run --cap-drop=ALL --cap-add=NET_ADMIN <镜像名>

8.5 实用调试技巧

调试容器问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看容器启动失败原因
docker logs <容器ID>

# 检查容器配置
docker inspect <容器ID>

# 进入容器调试
docker exec -it <容器ID> bash

# 查看容器进程
docker top <容器ID>

# 查看容器文件系统变化
docker diff <容器ID>

网络调试

1
2
3
4
5
6
7
8
# 测试容器网络连接
docker exec <容器ID> ping google.com

# 查看容器IP地址
docker inspect <容器ID> | grep IPAddress

# 测试端口连接
docker exec <容器ID> telnet host port

9. 常用命令速查

镜像相关

1
2
3
4
5
docker images                    # 查看镜像
docker pull <镜像名> # 拉取镜像
docker push <镜像名> # 推送镜像
docker build -t <名称> . # 构建镜像
docker rmi <镜像ID> # 删除镜像

容器相关

1
2
3
4
5
6
7
docker run <镜像名>               # 运行容器
docker ps # 查看运行容器
docker ps -a # 查看所有容器
docker stop <容器ID> # 停止容器
docker start <容器ID> # 启动容器
docker rm <容器ID> # 删除容器
docker exec -it <容器ID> bash # 进入容器

数据相关

1
2
3
docker volume ls                 # 查看数据卷
docker volume create <卷名> # 创建数据卷
docker cp <容器>:/path ./path # 复制文件

网络相关

1
2
3
docker network ls                # 查看网络
docker network create <网络名>   # 创建网络
docker port <容器ID>             # 查看端口映射