1.核心概念

  • 镜像: 一个只读的模板,类似于虚拟机的快照。例如 ubuntu:22.04, nginx, python:3.9-slim。

  • 容器: 镜像的运行实例。你可以创建、启动、停止、移动或删除容器。它是轻量级和可移植的。

2.命名格式

docker [command] [sub-command] [options] [arguments]

3.容器生命周期管理

3.1.docker run 创建并启动一个新容器

这是最常用的命令,它会从一个镜像创建一个新的容器并启动它

# 最基本用法:启动一个容器,运行一次然后退出
docker run ubuntu:22.04 /bin/echo 'Hello World'

# 启动一个交互式容器并进入命令行 (--interactive, --tty)
docker run -it ubuntu:22.04 /bin/bash

# 启动容器并在后台运行 (--detach)
docker run -d --name my_nginx nginx

# 映射端口 (主机端口:容器端口)
docker run -d -p 8080:80 --name web nginx
# 访问:http://localhost:8080

# 映射数据卷 (主机目录:容器目录)
docker run -v /host/path:/container/path -it ubuntu bash

# 设置环境变量
docker run -e "MY_VAR=my_value" -e "ENV=production" my-image

# 传递所有环境变量从主机到容器
docker run --env-file .env my-image

# 综合示例:启动一个后台运行的MySQL容器,设置root密码,并创建数据卷
docker run -d \
  --name mysql_db \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -v mysql_data:/var/lib/mysql \
  mysql:8.0

3.2.docker start/stop/restart - 启动/停止/重启容器

# 启动一个已停止的容器
docker start <container_name_or_id>

# 停止一个运行中的容器(发送 SIGTERM,等待优雅关闭)
docker stop <container_name_or_id>

# 强制立即停止一个容器(发送 SIGKILL)
docker kill <container_name_or_id>

# 重启容器
docker restart <container_name_or_id>

3.3.docker rm - 删除容器

# 删除一个已停止的容器
docker rm <container_name_or_id>

# 强制删除一个容器(即使正在运行)
docker rm -f <container_name_or_id>

# 删除所有已停止的容器(非常实用!)
docker container prune
# 或者
docker rm $(docker ps -aq)

4.容器信息查询

4.1.docker ps 列出容器

# 查看正在运行的容器
docker ps

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

# 查看最新创建的容器(包括已停止的)
docker ps -l

# 显示容器大小(增加磁盘使用信息)
docker ps -s

# 格式化输出(只显示ID和镜像名)
docker ps --format "table {{.ID}}\t{{.Image}}"

4.2.docker logs 查看容器日志

# 查看容器的日志
docker logs <container_name_or_id>

# 实时查看日志流(类似 tail -f)
docker logs -f <container_name_or_id>

# 查看最后N行日志
docker logs --tail 100 <container_name_or_id>

# 查看带时间戳的日志
docker logs -t <container_name_or_id>

# 查看自某个时间点后的日志
docker logs --since 2023-01-01T00:00:00 <container_name_or_id>

4.3.docker inspect - 查看容器详细信息

# 查看容器的所有详细信息
docker inspect <container_name_or_id>

# 只查看容器的IP地址
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name_or_id>

# 只查看容器的状态
docker inspect -f '{{.State.Status}}' <container_name_or_id>

# 查看容器的日志路径
docker inspect -f '{{.LogPath}}' <container_name_or_id>

4.4.docker stats - 查看容器资源使用情况

# 查看所有运行中容器的实时资源使用情况
docker stats

# 查看指定容器的资源使用情况
docker stats <container_name_or_id> <another_container_name_or_id>

# 只显示一次当前的资源使用情况(不持续流式输出)
docker stats --no-stream

4.5.docker top - 查看容器内进程

# 查看容器内的进程列表
docker top <container_name_or_id>

4.6.docker diff - 查看容器文件系统变化

docker diff <container_name_or_id>
# 输出示例:
# A /tmp/new_file      # A = Added (添加)
# C /etc/config.conf   # C = Changed (修改)
# D /var/log/old.log   # D = Deleted (删除)

5.容器内操作

5.1.docker exec - 在运行中的容器内执行命令

# 在运行中的容器内执行一次命令
docker exec <container_name_or_id> ls /app

# 启动一个交互式 Bash Shell 到容器中(最常用!)
docker exec -it <container_name_or_id> /bin/bash
docker exec -it <container_name_or_id> /bin/sh

# 以root用户身份进入容器(如果当前用户不是root)
docker exec -u root -it <container_name_or_id> /bin/bash

# 在指定工作目录下执行命令
docker exec -w /path/to/dir <container_name_or_id> pwd

5.5.docker cp - 复制文件/目录

# 从容器复制文件到主机
docker cp <container_name_or_id>:/path/to/file.txt /host/path/target.txt

# 从主机复制文件到容器
docker cp /host/path/file.txt <container_name_or_id>:/container/path/

# 复制整个目录
docker cp /host/folder <container_name_or_id>:/container/path/

6.实际操作

#1、一键清理
# 停止所有运行中的容器
docker stop $(docker ps -aq)

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

# 删除所有未被使用的镜像、容器、网络、构建缓存(谨慎使用!)
docker system prune -a

#2、查看容器资源限制
# 查看容器的内存和CPU限制
docker inspect <container_name_or_id> | grep -i "memory\|cpus"

#3、修改容器限制(需容器)
# 停止容器
docker stop my_container

# 使用 `docker update` 命令修改运行配置(如内存)
docker update --memory 512m my_container

# 启动容器
docker start my_container

7、综合示例

#1、拉取镜像
docker pull nginx:alpine
#2、运行容器
docker run -d \
  --name my-webapp \
  -p 80:80 \
  -v $(pwd)/html:/usr/share/nginx/html \
  nginx:alpine

#3、检查状态
docker ps
docker logs my-webapp

#4、进入容器调试
docker exec -it my-webapp /bin/sh
# 在容器内:检查配置文件、日志等

#5、停止和清理
docker stop my-webapp
docker rm my-webapp

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐