Docker 使用手册
Docker 使用手册
Docker 基础命令
镜像管理
查找镜像
docker search image_name
--filter
/-f
:按条件过滤(如stars=100
)。--limit
:限制返回结果数量。
拉取镜像
docker pull image_name:tag
--all-tags
/-a
:拉取镜像的所有标签。
查看本地镜像
docker images
--all
/-a
:列出所有镜像,包括中间层。--digests
:显示镜像摘要信息。--filter
/-f
:按条件过滤。
删除镜像
docker rmi image_name:tag
--force
/-f
:强制删除。docker image prune -a
:删除未使用的镜像。
保存与加载镜像
docker save image_name:tag | gzip > image.tar.gz
gunzip -c image.tar.gz | docker load
查看镜像历史
docker history image_name:tag
--no-trunc
:显示完整信息。--quiet
/-q
:只显示层 ID。
根据容器提交镜像
docker commit -a "nathan" -m "create new img" <container_id> image_name:tag
-a
:设置作者信息。-m
:描述信息。--change
/-c
:对镜像进行配置更改。
重命名镜像
docker tag old-repo/myimage:tag new-repo/myimage:new-tag
容器管理
运行容器
docker run -it --entrypoint sh image_name:tag
-i
:保持标准输入打开。-t
:分配伪终端。--name
:为容器命名。-d
:后台运行。--rm
:退出后自动删除。-p
:端口映射(如8080:80
)。-v
:挂载数据卷(如/host/path:/container/path
)。
查看容器日志
docker logs <container_id>
docker logs --since 10m container_id
-f
:实时查看日志。--tail
:显示最新日志行数(如100
)。--since
:从指定时间开始显示日志(支持10m
、1h
、具体时间戳等)。--until
:设置日志显示结束时间。
查看容器状态
docker ps
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
-a
/--all
:列出所有容器。-q
:只显示容器 ID。--filter
/-f
:按条件过滤。--format
:以指定格式显示容器信息,可用占位符包括:{{.ID}}
:容器 ID{{.Names}}
:容器名称{{.Status}}
:容器状态{{.Ports}}
:容器端口
--latest
/-l
:只显示最近创建的容器。--size
/-s
:显示容器的文件大小。
删除容器
docker rm $(docker ps -aq)
-f
/--force
:强制删除。-v
:同时删除挂载的卷。
停止/启动/重启容器
docker stop/start/restart container_id
--time
/-t
:设置停止超时时间(默认 10 秒)。
检查容器信息
docker inspect container_id
docker inspect --format='{{.State.Running}}' container_id
使用
--format
提取特定信息:{{.State.Status}}
:容器状态{{.Config.Image}}
:镜像名称
进入容器
docker exec -it container_id /bin/bash
网络管理
查看网络
docker network ls
--filter
/-f
:按条件过滤。
创建网络
docker network create my-network
--driver
:指定网络驱动类型(如bridge
、host
)。--subnet
:指定子网(如192.168.1.0/24
)。
指定网络运行容器
docker run --network my-network --name nginx -d nginx
删除网络
docker network rm network_name
查看详细信息
docker network inspect network_name
创建带驱动配置的网络
docker network create \
--driver bridge \
--subnet=192.168.1.0/24 \
custom-network
删除未使用的网络
docker network prune
清理无用资源
清理未使用镜像和容器
docker image prune -a
docker system prune -a
-a
:删除所有未使用资源。--force
/-f
:跳过确认提示。
性能监控
查看资源使用情况
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
查看容器进程
docker top container_id
查看系统事件
docker events
挂载管理
查看数据卷
docker volume ls
- 列出使用中的数据
docker volume ls --filter dangling=false
检查数据卷信息
docker volume inspect <volume_name>
删除数据卷
docker volume rm volume_name
清理未使用的卷
docker volume prune --force
系统信息
查看版本
docker version
查看系统信息
docker info
导出与导入
导出容器
docker export container_id > container.tar
导入容器
cat container.tar | docker import - new_image_name:tag
文件复制
从主机复制到容器
docker cp local_path container_id:container_path
从容器复制到主机
docker cp container_id:container_path local_path
登录与登出
登录 Docker 仓库
docker login
--username
/-u
:指定用户名。--password
/-p
:指定密码(不推荐明文)。
登出 Docker 仓库
docker logout
Dockerfile 使用指南
1. 常用指令
基础设置
FROM
:指定基础镜像,通常是第一行。FROM ubuntu:20.04
LABEL
:添加元数据。LABEL maintainer="your-email@example.com" version="1.0"
文件与目录操作
WORKDIR
:设置工作目录。WORKDIR /app
COPY
和ADD
:复制文件到镜像中。COPY . /app ADD http://example.com/file.tar.gz /app # 支持远程 URL 下载与解压
VOLUME
:声明挂载点。VOLUME ["/data"]
软件安装与命令执行
RUN
:执行命令安装依赖或配置环境。RUN apt-get update && apt-get install -y python3
USER
:设置后续命令的执行用户。USER nonroot
容器启动行为
CMD
:设置容器启动时的默认命令(可被docker run
覆盖)。CMD ["python3", "app.py"]
ENTRYPOINT
:设置不可覆盖的默认命令。ENTRYPOINT ["python3", "app.py"]
EXPOSE
:声明容器监听的端口(仅文档作用)。EXPOSE 8080
2. 分阶段构建
分阶段构建用于优化镜像大小。以下是示例:
# 构建阶段
FROM node:16 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
- 构建阶段中安装依赖和生成构建产物。
- 运行阶段中仅包含运行所需的文件。
3. docker build
命令
docker build
用于根据 Dockerfile 构建镜像。
基本语法
docker build [OPTIONS] PATH
常用选项
-t
:为镜像命名和标记版本。docker build -t myapp:1.0 .
-f
:指定 Dockerfile 文件路径。docker build -f /path/to/Dockerfile .
--no-cache
:禁用构建缓存,强制执行所有步骤。docker build --no-cache -t myapp .
--build-arg
:传递构建时参数。docker build --build-arg VERSION=1.0 -t myapp .
ARG VERSION ENV APP_VERSION=$VERSION
-q
:仅返回镜像 ID,隐藏构建日志。docker build -q -t myapp .
--target
:指定目标构建阶段,在多阶段构建中,仅构建指定阶段:docker build --target builder -t app-builder .
导出缓存将构建缓存保存到目录:
docker build --cache-to=type=local,dest=./cache .
启用并行构建使用
--progress
docker build --progress=plain .
示例
构建镜像:
docker build -t myapp .
带参数构建:
docker build --build-arg ENV=production -t myapp:prod .
4. 优化建议
- 多阶段构建:减少最终镜像大小。
- 缓存利用:将变化较小的命令置于 Dockerfile 顶部。
- 精简基础镜像:选择
alpine
等轻量级镜像。 合并 RUN 命令:减少镜像层数。
RUN apt-get update && apt-get install -y python3 && apt-get clean
总结
通过合理使用 Dockerfile 指令及优化构建过程,可以高效生成体积小、性能优的镜像。docker build
提供了丰富的选项以支持复杂需求,结合分阶段构建,可满足不同场景的性能和管理需求。
Docker Compose 使用指南
常用命令
启动服务
docker-compose up -d
-d
:后台运行。
停止并移除服务
docker-compose down
- 默认会移除容器及相关网络,但不会删除卷。
- 使用
--volumes
删除所有关联卷。
docker-compose down --volumes
使用
--remove-orphans
删除未定义的容器。docker-compose down --remove-orphans
查看状态
docker-compose ps
指定配置文件启动
docker-compose -f custom-compose.yml up -d
重启服务
docker-compose restart
查看实时日志
docker-compose logs -f
可指定服务名查看:
docker-compose logs -f service_name
清理无用卷
docker volume prune
docker-compose.yaml
书写规范
结构
顶层字段:
version
:指定 Compose 文件版本。services
:定义服务。volumes
:定义数据卷。networks
:定义网络。
- 缩进:使用两个空格,保持层级清晰。
示例
version: "3.9"
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- web-data:/usr/share/nginx/html
networks:
- webnet
app:
build:
context: ./app
environment:
- NODE_ENV=production
depends_on:
- db
networks:
- appnet
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
networks:
- appnet
volumes:
web-data:
db-data:
networks:
webnet:
appnet:
网络配置
自定义网络
networks: custom-network: name: my-custom-network driver: bridge
使用外部网络
networks: existing-network: external: true
子网和网关
networks: custom-network: driver: bridge ipam: config: - subnet: 192.168.1.0/24 gateway: 192.168.1.1
卷配置
命名卷
volumes: app-data:
挂载主机目录
services: app: volumes: - /host/path:/container/path
驱动与选项
volumes: my-volume: driver: local driver_opts: type: nfs o: addr=192.168.1.100,rw device: ":/path/to/dir"
Docker Compose 的 build
配置
build
配置支持更多高级功能,例如缓存、构建参数、挂载等。
完整配置示例
services:
app:
build:
context: ./app
dockerfile: Dockerfile.prod
args:
APP_ENV: "production"
cache_from:
- app-cache
target: builder
network: host
extra_hosts:
- "local.test:127.0.0.1"
字段说明
context
:指定构建上下文目录(通常是包含 Dockerfile 的路径)。dockerfile
:自定义 Dockerfile 路径。args
:传递构建参数(在 Dockerfile 中使用ARG
声明)。cache_from
:使用指定镜像作为构建缓存源,减少重复构建时间。target
:指定构建阶段的目标,仅构建多阶段镜像中的某一阶段。network
:设置构建时使用的网络模式(如host
)。extra_hosts
:在构建时定义额外的主机解析(类似/etc/hosts
)。
更多高级用法
挂载构建时的卷(Docker BuildKit 支持)
用于在构建时临时挂载额外数据,例如私有依赖库。
services: app: build: context: . dockerfile: Dockerfile secrets: - my_secret secrets: my_secret: file: ./secrets.txt
使用 BuildKit 的缓存挂载
services: app: build: context: . dockerfile: Dockerfile cache_from: - type=local,src=./cache cache_to: - type=local,dest=./cache
实用技巧
depends_on
限制定义依赖关系,但不会保证服务完全启动:
depends_on: - db
扩展字段
使用x-
前缀定义共享配置:x-shared-config: environment: - LOG_LEVEL=debug services: service1: <<: *x-shared-config image: app1 service2: <<: *x-shared-config image: app2
动态扩展配置
配合环境变量使用:services: app: image: "${APP_IMAGE:-default-app}:latest"
综合示例
以下是一个完整的 Compose 配置文件示例:
version: "3.9"
services:
frontend:
image: nginx:alpine
ports:
- "8080:80"
networks:
- frontend-backend
backend:
build:
context: ./backend
environment:
- APP_ENV=production
depends_on:
- db
networks:
- frontend-backend
- backend-db
db:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend-db
volumes:
db-data:
networks:
frontend-backend:
backend-db:
总结
通过合理配置 docker-compose.yaml
文件并利用 Compose 命令,可以轻松管理复杂的容器服务。配合网络和卷配置,能进一步优化服务间的交互与数据持久化。
4. 常用脚本示例
检查容器内文件
#!/bin/bash
if [ -z "$1" ]; then
echo "请传入要搜索的文件名"
exit 1
fi
RUNNING_CONTAINERS="$(docker ps --format '{{.Names}}')"
for CONTAINER in $RUNNING_CONTAINERS; do
if docker exec -it $CONTAINER sh -c 'test -e $1'; then
echo "Found $1 in container: $CONTAINER"
fi
done
5. 常见问题与注意事项
- 镜像源加速配置
# apk镜像源加速
RUN echo "https://mirrors.aliyun.com/alpine/v3.18/main" > /etc/apk/repositories && \
echo "https://mirrors.aliyun.com/alpine/v3.18/community" >> /etc/apk/repositories && \
apk update --allow-untrusted && \
apk add --allow-untrusted --clean-protected --no-cache bash && \
rm -rf /var/cache/apk/*
# apt镜像源加速
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && apt-get update
- 删除未使用的镜像
comm -23 <(docker images --format "{{.Repository}}:{{.Tag}}" | sort) <(kubectl get pods --all-namespaces -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' | sort) | grep emotibot | grep -v infra | xargs docker rmi