Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

什么是Docker?

Docker是一个用来构建、分发、运行容器的平台。它常见的对象包括 image、container、network、volume 等。Docker还会默认从Docker Hub这样的镜像仓库拉取镜像。

可以将Docker体系中的核心对象概括为以下几类:

  • 镜像(Image):镜像是用于创建容器的只读模板,通常包含应用程序本身、运行时环境、依赖库、配置文件以及启动所需的元数据。
  • 容器(Container):容器是镜像的运行实例,是一个相对独立的执行环境。容器在运行时基于镜像创建,并在其上增加可写层以支持进程执行和状态变化。
  • Dockerfile:Dockerfile是定义镜像构建过程的声明式文本文件,用于描述基础镜像、构建步骤、文件复制、环境配置以及容器启动命令等内容。
  • Volume:Volume是Docker提供的数据持久化机制,用于将容器中的数据独立于容器生命周期之外进行存储,适合保存数据库文件、日志及其他需要长期保留的数据。
  • Network:Network是Docker的网络抽象机制,用于实现容器之间、容器与宿主机之间以及容器与外部服务之间的通信。
  • Registry:Registry是集中存储和分发镜像的仓库服务,用于镜像的上传、版本管理、共享与拉取,例如 Docker Hub或企业内部私有镜像仓库。

注意:镜像是只读模板,用来创建容器。容器是镜像的运行实例,可以启动、停止、删除。同一个镜像,可以启动多个容器。

Dockerfile

Dockerfile 是一个文本文件,里面写的是如何自动构建镜像。Docker 会按照 Dockerfile 中的指令顺序执行,且通常必须从 FROM 开始。默认文件名就叫 Dockerfile

一个最简单的例子:

1
2
3
4
5
6
# syntax=docker/dockerfile:1
FROM python:3.12-slim
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

这段的意思:

  • FROM:基于哪个基础镜像
  • WORKDIR:设置工作目录
  • COPY:把当前项目文件复制进镜像
  • RUN:构建时执行命令
  • CMD:容器启动时默认执行的命令

常用的Docker命令

在基于 Dockerfile 的开发流程中,常用命令主要围绕 镜像构建、容器创建、容器运行状态查看、容器内部操作以及容器清理 展开。

构建镜像

1
docker build -t myapp:1.0 .

该命令用于根据当前目录中的 Dockerfile 构建镜像。

其中:

  • build 表示执行镜像构建操作
  • -t myapp:1.0 用于为镜像指定名称和tag
    • -t:后面传递名字以及tag参数,但-t这部分其实是非必要的。
    • myapp镜像名,严格说常对应 repository/name(如果用了-t,那么这个名字参数就是必要的)
    • 1.0:镜像的tag(非必要参数)
  • . 表示以当前目录作为构建上下文

如果创建时未给定名字:

1
docker build .

后续则只能通过镜像id来调用它。

运行容器

1
docker run --name myapp-container -d -p 8080:80 myapp:1.0

该命令用于基于指定镜像创建并启动容器。

其中:

  • --name 用于指定容器名称

  • -d 表示以后台模式运行

    -d表示detached mode,也就是让容器在后台运行。
    不写 -d 的话,容器会在当前终端前台运行,你会直接看到程序输出。

  • -p 8080:80 表示将宿主机端口映射到容器端口

    它的作用是把宿主机端口映射到容器端口。
    只有当你的容器里运行的是 Web 服务、API 服务之类,需要从宿主机或外部访问时,这个参数才通常需要。Docker 网络文档把这种能力称为端口发布。

  • myapp:1.0 表示运行的目标镜像

    :1.0 这部分可以省略;省略时默认使用 latest 标签。

最简洁的运行命令:

1
docker run myapp

其他的都是非必需的参数。

但建议加上名字,方便后续调用:

1
docker run --name myapp-container myapp

查看正在运行的容器

1
docker ps

用于查看当前处于运行状态的容器。

如果需要查看所有容器,包括已停止的容器,可以使用:

1
docker ps -a

查看本地镜像

1
docker images

用于查看当前本地已经构建完成或已存在的镜像列表。

查看容器日志

1
docker logs myapp-container

用于查看容器的标准输出和标准错误输出,通常用于排查应用启动失败或运行异常等问题。

如果希望持续跟踪日志输出,可以使用:

1
docker logs -f myapp-container

进入容器内部执行命令

1
docker exec -it myapp-container /bin/sh

该命令用于进入正在运行的容器内部,便于查看文件、检查配置或手动执行命令。

其中:

  • exec 表示在运行中的容器内执行命令
  • -it 表示以交互方式进入容器终端
  • /bin/sh 表示在容器内启动一个 Shell

如果容器中安装了 Bash,也可以使用:

1
docker exec -it myapp-container /bin/bash

停止容器

1
docker stop myapp-container

用于停止正在运行的容器。

启动已经停止的容器

1
docker start myapp-container

用于重新启动一个已经存在但当前处于停止状态的容器。

重启容器

1
docker restart myapp-container

用于重启容器,常用于配置更新后重新加载应用。

删除容器

1
docker rm myapp-container

用于删除已经停止的容器。

如果容器仍在运行,通常需要先停止后再删除。

删除镜像

1
docker rmi myapp:1.0

用于删除本地镜像。

如果仍有容器依赖该镜像,通常需要先删除相关容器,再删除镜像。

挂载数据卷运行容器

1
docker run --name myapp-container -d -p 8080:80 -v mydata:/app/data myapp:1.0

用于在启动容器时挂载数据卷,以实现数据持久化存储。

其中:

  • -v mydata:/app/data 表示将名为 mydata 的数据卷挂载到容器内的 /app/data 目录

查看容器详细信息

1
docker inspect myapp-container

用于查看容器的详细配置信息,例如网络配置、挂载信息、环境变量和启动参数等。

查看镜像构建历史

1
docker history myapp:1.0

用于查看镜像各层的构建历史,便于分析镜像组成和优化镜像体积。