docker 命令(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在现代软件开发中,Docker 已经成为容器化技术的基石。它通过标准化的环境隔离,解决了“在本地能运行,在生产环境却不行”的经典问题。而掌握 Docker 命令,是开发者高效利用这一工具的核心能力。本文将从零开始,通过循序渐进的方式讲解 Docker 命令的使用场景、原理与技巧,并结合实际案例帮助读者快速上手。无论是搭建开发环境、部署应用,还是调试容器,你都能从中找到实用的方法。


Docker 命令基础:容器生命周期管理

1. 创建与启动容器:docker run

docker run 是 Docker 的核心命令,用于从镜像创建并启动容器。其语法结构如下:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]  

常用参数解析

  • -d:后台运行容器(守护态模式)。
  • -p:端口映射,格式为 主机端口:容器端口
  • -v:挂载数据卷,实现宿主机与容器之间的文件共享。
  • --name:为容器指定一个自定义名称。

案例:启动一个 Nginx 容器

docker run -d -p 8080:80 --name my-nginx nginx  

此命令的作用是:

  1. 从 Nginx 镜像创建容器;
  2. 将容器的 80 端口映射到主机的 8080 端口;
  3. 以守护态运行,并命名为 my-nginx

比喻
可以将 docker run 想象为“启动一个标准化的集装箱”。镜像就像集装箱的模板,而 run 命令则是根据模板制造并装载货物(应用)的过程。


2. 查看容器状态:docker ps

docker ps 用于列出正在运行的容器。添加 -a 参数可查看所有容器(包括已停止的)。

docker ps -a  

输出结果包含容器 ID、名称、状态、端口映射等关键信息。

案例:查看所有容器

docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"  

此命令通过格式化输出,清晰展示容器的 ID、名称和运行状态。


3. 进入容器:docker exec

docker exec 允许开发者在运行中的容器内执行命令。例如:

docker exec -it my-nginx bash  

此命令的作用是:

  • -i:保持 STDIN 打开;
  • -t:分配一个伪终端;
  • bash:在容器内启动交互式 Shell。

比喻
这相当于“打开集装箱的门,进入内部进行操作”。


4. 停止与删除容器:docker stop 和 docker rm

  • 停止容器

    docker stop my-nginx  
    

    此命令向容器发送终止信号(SIGTERM),等待一段时间后强制停止。

  • 删除容器

    docker rm my-nginx  
    

    注意:需先停止容器才能删除。若需直接删除,可用 docker rm -f my-nginx(强制删除)。


进阶命令:镜像管理与网络配置

1. 拉取与构建镜像:docker pull 和 docker build

  • 从仓库拉取镜像

    docker pull nginx:latest  
    

    此命令从 Docker Hub 获取最新版本的 Nginx 镜像。

  • 基于 Dockerfile 构建镜像
    假设有一个简单的 Dockerfile

    FROM python:3.9-slim  
    COPY . /app  
    WORKDIR /app  
    RUN pip install -r requirements.txt  
    CMD ["python", "app.py"]  
    

    构建命令为:

    docker build -t my-python-app .  
    

    参数 -t 用于指定镜像名称。


2. 查看镜像列表:docker images

docker images  

输出包含镜像名称、标签(Tag)、大小等信息。若需删除镜像,可使用 docker rmi <镜像ID>


3. 网络管理:docker network

Docker 容器默认连接到 bridge 网络,但可通过自定义网络实现更灵活的通信。例如:

docker network create my-network  

docker run -d --name mysql_db --network my-network mysql:5.7  
docker run -d --name app --network my-network my-python-app  

此时,app 容器可通过 mysql_db 的名称直接访问数据库,无需暴露外部端口。


高级技巧:数据持久化与调试

1. 数据卷(Volumes):持久化存储

容器默认的文件系统是临时的,重启后数据会丢失。使用 docker volume 可实现持久化存储:

docker volume create my-data  

docker run -d -v my-data:/app/data --name my-app my-python-app  

此操作将容器的 /app/data 目录与宿主机的卷 my-data 绑定,数据不会随容器删除而丢失。


2. 调试与日志查看:docker logs

当容器出现异常时,可通过 docker logs 查看日志:

docker logs --tail 10 --follow my-nginx  

参数说明:

  • --tail 10:仅显示最后 10 行日志;
  • --follow:实时追踪日志(类似 tail -f)。

3. 多阶段构建:优化镜像体积

在 Dockerfile 中,可通过多阶段构建减少最终镜像的大小。例如:

FROM golang:1.20 AS builder  
WORKDIR /app  
COPY go.mod go.sum .  
RUN go mod download  
COPY . .  
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o myapp  

FROM alpine:3.18  
COPY --from=builder /app/myapp /usr/local/bin  
CMD ["myapp"]  

此方法将编译和运行环境分离,最终镜像仅包含运行时所需的文件。


最佳实践与常见问题

1. 命令组合技巧

  • 快速删除所有停止的容器
    docker container prune -f  
    
  • 查看实时资源使用情况
    docker stats  
    

2. 常见问题排查

  • 端口冲突:若启动容器时提示端口被占用,可修改 -p 参数的主机端口。
  • 镜像拉取失败:检查网络连接或更换镜像源(如阿里云镜像站)。

结论

Docker 命令的学习是一个从“掌握基础”到“灵活运用”的过程。通过本文的讲解,读者应能:

  1. 熟练管理容器生命周期(创建、启动、停止、删除);
  2. 理解镜像构建与网络配置的核心逻辑;
  3. 运用数据卷、多阶段构建等技巧优化开发效率。

实践是检验学习成果的最佳方式。建议读者尝试以下步骤:

  1. 使用 docker run 启动一个简单的 Web 应用;
  2. 通过 docker exec 进入容器修改配置文件;
  3. 创建自定义网络并验证容器间通信。

掌握 Docker 命令后,开发者可以更高效地管理本地开发环境、协作部署应用,并为后续学习 Docker Compose、Kubernetes 等进阶技术打下坚实基础。


希望这篇文章能成为你探索 Docker 世界的起点!如果有任何疑问或需要进一步讨论,欢迎在评论区留言。

最新发布