一文搞懂Docker使用,基础篇

49 阅读4分钟

一、镜像(image)

获取镜像的常用的两种方法:

1. 从docker Hub上面获取

# 拉取最新版(latest 标签)
docker pull nginx
​
# 拉取指定标签版本
docker pull node:22.12.0
​
# 拉取完整镜像名(含仓库地址)
docker pull docker.io/library/ubuntu:22.04
​
# 拉取私有仓库镜像
docker pull myregistry.com/myapp:v1.0

2. 自定义生成镜像

在自己的项目中创建一个 DockerFile,然后执行以下命令创建一个镜像:

docker image build -it pro-name .

当你使用 FROM 指令构建镜像时,若本地没有对应基础镜像,Docker 会自动从配置的仓库拉取:

FROM node:22.12.0  # 如果本地没有,build 时自动 pull

3. image相关命令介绍

3.1 docker image ls —— 列出本地镜像

# 基本列出
docker image ls# 只显示镜像 ID
docker image ls -q
​
# 过滤:只显示 dangling(悬空)镜像
docker image ls -f "dangling=true"# 按名称过滤
docker image ls node
​
# 格式化输出(如只显示名称和创建时间)
docker image ls --format "table {{.Repository}}\t{{.Tag}}\t{{.CreatedAt}}"

📌 悬空镜像(dangling) :没有标签且未被任何容器引用的中间层镜像,通常由构建过程产生。


3.2 docker image pull —— 拉取镜像

# 拉取最新版
docker image pull nginx
​
# 拉取指定版本
docker image pull redis:7.2-alpine
​
# 拉取多平台镜像(需启用实验特性)
docker image pull --platform linux/arm64 alpine

3.3 docker image rm —— 删除镜像

# 删除单个镜像(通过名称或 ID)
docker image rm nginx:latest
​
# 强制删除(即使被容器引用)
docker image rm -f <IMAGE_ID>
​
# 删除多个镜像
docker image rm ubuntu:22.04 alpine
​
# 删除所有悬空镜像
docker image rm $(docker image ls -f "dangling=true" -q)

3.4 docker image build —— 构建镜像

# 从当前目录的 Dockerfile 构建
docker image build -t myapp:v1 .
​
# 指定 Dockerfile 路径
docker image build -f ./deploy/Dockerfile -t myapp:test .
​
# 不使用缓存
docker image build --no-cache -t myapp:nc .
​
# 构建时传递构建参数
docker image build --build-arg NODE_ENV=production -t myapp:prod .

3.5 docker image tag —— 打标签(创建别名)

# 给镜像添加新标签(不复制数据,只是引用)
docker image tag myapp:v1 registry.example.com/myapp:latest
​
# 示例:准备推送私有仓库
docker image tag nginx:alpine my-registry/nginx:web-v1

3.6 docker image inspect —— 查看镜像详细信息

# 查看完整元数据(JSON 格式)
docker image inspect nginx
​
# 只获取镜像 ID
docker image inspect --format='{{.Id}}' nginx
​
# 获取暴露的端口
docker image inspect --format='{{.Config.ExposedPorts}}' nginx
​
# 获取环境变量
docker image inspect --format='{{.Config.Env}}' node

3.7 docker image history —— 查看构建历史(层)

# 显示每层的指令、大小、创建时间
docker image history nginx
​
# 不截断输出
docker image history --no-trunc nginx

📊 有助于分析镜像体积来源和优化 Dockerfile。


3.8 docker image prune —— 清理无用镜像

# 删除所有悬空镜像(默认)
docker image prune
​
# 同时删除所有未被使用的镜像(谨慎!)
docker image prune -a
​
# 自动确认(无需交互)
docker image prune -f
​
# 删除超过 24 小时未使用的镜像
docker image prune -a --filter "until=24h"

✅ 定期执行可释放磁盘空间。


3.9 docker image save / load —— 导出/导入镜像

导出(保存为 tar)

# 保存单个镜像
docker image save -o myapp.tar myapp:v1
​
# 保存多个镜像到一个文件
docker image save -o all.tar nginx:alpine redis:7 ubuntu:22.04

导入(从 tar 加载)

docker image load -i myapp.tar

🔄 适用于离线部署、备份、跨机器迁移。

二、容器(container)

1. docker container ls —— 列出容器

# 列出所有正在运行的容器
docker container ls# 列出所有容器(包括停止的)
docker container ls -a
​
# 只显示容器 ID
docker container ls -q
​
# 格式化输出(如只显示容器ID和状态)
docker container ls --format "table {{.ID}}\t{{.Status}}"

2. docker container run —— 创建并启动容器

# 运行一个交互式的终端容器
docker container run -it ubuntu /bin/bash
​
# 在后台运行容器,并映射端口
docker container run -d -p 80:80 nginx
​
# 指定名称运行容器
docker container run --name myapp -d app_image
​
# 使用卷挂载数据
docker container run -v /host/path:/container/path myimage

docker container run 参数说明:

  • -d:后台运行;

  • -p:端口映射

    8000:80 (先外后内,宿主机8000端口,映射容器的80端口)

  • -v:挂载卷;

    第一种方式:绑定挂载

    -v 宿主机的目录:容器目录

    容器、宿主机的文件的修改,会相互同步;目的是 数据的持久化保存,防止删除容器时数据被删除

    还有一种方式,创建一个存储空间(命名卷);命名卷挂载

    -v 卷的名字:容器目录

  • --name:指定容器名(在宿主机上必须是唯一的)

  • -e:环境变量

  • -it

  • --rm:退出时删除容器

  • --restarts

    always:只要容器停止了就会重启

    unless-stopped:和always相似,不过手动停止的不会重启,生产环境特别有用

如何使用命名卷挂载

# 创建命名卷
docker volume create demo-html
​
# 使用命名卷 创建容器
docker container run -v demo-html:/container/path myimage
​
# 命名卷 在宿主机的目录在哪里? 执行以下命令可以查看文件所在地址
# 注意:如果你是mac、windows本地测试,无法找到文件地址,应为不存在该地址:
# Docker 实际上是在一个隐藏的 Linux 虚拟机里运行的。因此,像 /var/lib/docker/volumes/... 这样的路径只存在于那个虚拟机内部,无法直接从 macOS 的 Finder 或终端访问
docker volume inspect demo-html

3. docker container start/stop/restart —— 控制容器状态

# 启动已存在的容器
docker container start my_container_id_or_name
​
# 停止运行中的容器
docker container stop my_container_id_or_name
​
# 重启容器
docker container restart my_container_id_or_name
​
# 强制停止容器(立即终止)
docker container stop -t 0 my_container_id_or_name

4. docker container rm —— 删除容器

# 删除一个已停止的容器
docker container rm my_container_id_or_name
​
# 强制删除一个运行中的容器
docker container rm -f my_container_id_or_name
​
# 删除所有已停止的容器
docker container rm $(docker container ls -aq -f status=exited)

5. docker container exec —— 在运行中的容器内执行命令

# 在运行中的容器中打开一个新的交互式shell
docker container exec -it my_container_id_or_name /bin/bash
​
# 执行单个命令(例如更新包列表)
docker container exec my_container_id_or_name apt-get update

6. docker container inspect —— 查看容器详细信息

# 查看容器的所有元数据(JSON格式)
docker container inspect my_container_id_or_name
​
# 只获取特定信息(如 IP 地址)
docker container inspect --format='{{.NetworkSettings.IPAddress}}' my_container_id_or_name

7. docker container logs —— 获取容器日志

# 查看容器的日志
docker container logs my_container_id_or_name
​
# 实时查看日志(类似 tail -f)
docker container logs -f my_container_id_or_name
​
# 显示最近的 n 行日志
docker container logs --tail 10 my_container_id_or_name

8. docker container prune —— 清理停止的容器

# 删除所有已停止的容器
docker container prune
​
# 自动确认(无需交互)
docker container prune -f

三、docker compose

它就是一个统一管理多个容器的工具; 例如你本地需要启动多个docker 容器,你是不是需要一个一个的去启动,特别麻烦; docker compose就是为了解决这个问题,你只需要一个docker-compose.yaml配置文件,就可以一个命令启动、管理多个容器;

非常适合本地开发时使用;

写一个最简单的配置:

services:
  web:
    image: web
    ports:
      - 8000:8000

启动一个名为web的镜像,端口映射 8000;

1. services

  • 每个服务对应一个容器。
  • 服务名(如 webdb)会自动成为该容器在自定义网络中的主机名(其他服务可通过 http://web 访问)。

2. 常用字段说明:

字段说明
image使用的镜像(如 nginx, redis:7
build从 Dockerfile 构建(代替 image
ports端口映射,格式:宿主机端口:容器端口
volumes挂载卷或绑定挂载(bind mount)
environment设置环境变量
env_file从文件加载环境变量(如 .env
depends_on启动顺序依赖(⚠️ 不保证服务“就绪”,仅控制启动顺序)
networks自定义网络(默认所有服务在同一网络)
restart重启策略(如 unless-stopped

这些字段其实就是对应 docker container run 参数 的参数,例如 -e 对应 environment-v对应volumes

3. 常用命令

命令说明
docker compose up启动所有服务(前台运行)
docker compose up -d后台运行
docker compose down停止并删除容器、网络(默认不删卷)
docker compose down -v同时删除卷(⚠️ 数据会丢失!)
docker compose ps查看服务状态
docker compose logs -f web实时查看 web 服务日志
docker compose exec db psql -U user myapp进入 db 容器执行命令
docker compose build重新构建 build 定义的服务
docker compose config验证并查看最终配置