Skip to content

04 Docker 快速入门 - 命令解读

Docker 架构

  • Docker 使用客户端 - 服务器架构。Docker 客户端与 Docker 守护进程通信,后者负责构建、运行和分发 Docker 容器的繁重工作。
  • Docker 客户端和守护进程可以在同一系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护进程。
  • Docker 客户端和守护进程使用 REST API 通过 UNIX 套接字或网络接口进行通信。
  • 另一个 Docker 客户端是 Docker Compose,它允许您使用由一组容器组成的应用程序。

Docker Architecture diagram

Docker daemon 守护进程

  • Docker 守护进程 ( dockerd ) 侦听 Docker API 请求并管理 Docker 对象,例如映像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理 Docker 服务。

Docker client 客户端

  • Docker 客户端 ( docker ) 是许多 Docker 用户与 Docker 交互的主要方式。
  • 当您使用 docker run 等命令时,客户端会将这些命令发送到 dockerd ,由后者执行这些命令。
  • docker 命令使用 Docker API。Docker 客户端可以与多个守护进程通信。

Docker Desktop 桌面

  • Docker Desktop 是一款适用于 Mac、Windows 或 Linux 环境的易于安装的应用程序,使您能够构建和共享容器化应用程序和微服务。
  • Docker Desktop 包括 Docker 守护进程 ( dockerd )、Docker 客户端 ( docker )、Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。有关更多信息,请参阅 Docker 桌面

Docker registries 仓库

  • Docker 仓库存储 Docker 镜像。
  • Docker Hub 是任何人都可以使用的公共仓库,Docker 默认在 Docker Hub 上查找镜像。您甚至可以运行自己的私人仓库。
  • 使用 docker pulldocker run 命令时,Docker 会从您配置的仓库中提取所需的映像。
  • 使用 docker push 命令时,Docker 会将您的镜像推送到您配置的仓库。

Docker objects 对象

  • 当您使用 Docker 时,您正在创建和使用镜像、容器、网络、卷、插件和其他对象。本节简要概述其中一些对象。

  • Images 镜像

    • 镜像是一个只读模板,包含创建 Docker 容器的说明。通常情况下,一个镜像基于另一个镜像,并做了一些额外的定制。例如,你可能会创建一个基于 ubuntu 镜像的镜像,但其中安装了 Apache 网络服务器和你的应用程序,以及运行你的应用程序所需的配置细节。
    • 你可以创建自己的镜像,也可以只使用他人创建并发布在注册表中的镜像。要创建自己的映像,您需要创建一个 Dockerfile,其中包含一个简单的语法,用于定义创建映像和运行映像所需的步骤。Dockerfile 中的每一条指令都会在映像中创建一个层。当你更改 Dockerfile 并重建镜像时,只有那些已经更改的层才会被重建。与其他虚拟化技术相比,这也是镜像如此轻便、小巧和快速的部分原因。
  • Containers 集装箱

    • 容器是一个映像的可运行实例。您可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。您可以将容器连接到一个或多个网络,为其附加存储设备,甚至根据其当前状态创建新的映像。
    • 默认情况下,容器与其他容器及其主机的隔离度相对较高。您可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。
    • 容器由其映像以及创建或启动容器时提供的任何配置选项定义。删除容器时,未存储在持久化存储中的对其状态的任何更改都会消失。

docker 运行命令示例

以下命令会运行一个 ubuntu 容器,以交互方式连接到本地命令行会话,并运行 /bin/bash .

bash
docker run -i -t ubuntu /bin/bash

运行该命令后,会出现以下情况(假设使用的是默认仓库配置):

  1. 如果本地没有 ubuntu 镜像,Docker 会从配置的仓库中提取它,就像手动运行 docker pull ubuntu 一样。
  2. Docker 会创建一个新容器,就像你手动运行 docker container create 命令一样。
  3. Docker 为容器分配了一个读写文件系统,作为其最后一层。这允许运行中的容器在其本地文件系统中创建或修改文件和目录。
  4. 由于您没有指定任何网络选项,因此 Docker 会创建一个网络接口,将容器连接到默认网络。这包括为容器分配一个 IP 地址。默认情况下,容器可以使用主机的网络连接连接到外部网络。
  5. Docker 启动容器并执行 /bin/bash 。由于容器是交互式运行的,并连接到终端(由于使用了 -i-t 标记),因此您可以使用键盘输入,同时 Docker 会将输出记录到终端。
  6. 运行 exit 命令终止 /bin/bash 命令时,容器会停止,但不会移除。您可以再次启动或删除它。

部署 MySQL 命令解读

bash
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql
  • docker run -d:创建并运行一个容器,-d 则是让容器以后台进程运行
  • --name mysql: 给容器起个名字叫 mysql容器取名随意,但是要保证唯一性
  • -p 3306:3306: 设置端口映射。
    • 容器是隔离环境,外界不可访问。但是可以将宿主机端口映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。
    • 容器内端口往往是由容器内的进程决定,例如 MySQL 进程默认端口是 3306,因此容器内端口一定是 3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
    • 格式:-p 宿主机端口:容器内端口,示例中就是将宿主机的 3306 映射到容器内的 3306 端口
  • -e TZ=Asia/Shanghai : 配置容器内进程运行时的一些参数 (环境变量)
    • 格式:-e KEY=VALUE,KEY 和 VALUE 都由容器内进程决定
    • 案例中,TZ=Asia/Shanghai 是设置时区;MYSQL_ROOT_PASSWORD=123 是设置 MySQL 默认密码
  • mysql: 设置镜像名称,Docker 会根据这个名字搜索并下载镜像
    • 格式:REPOSITORY:TAG,例如 mysql:8.0,其中 REPOSITORY 可以理解为镜像名,TAG 是版本号
    • 在未指定 TAG 的情况下,默认是最新版本,也就是 mysql:latest

容器名和镜像名

  • 容器取名随意,但是要保证唯一性;
  • 镜像的名称不是随意的,而是要到 DockerRegistry 中寻找,镜像运行时的配置也不是随意的,要参考镜像的帮助文档,这些在 DockerHub 网站或者镜像的官方网站中都能找到。

总结

  • docker run 命令中的常见参数:
    • -d:后台运行容器
    • --name:指定容器名字
    • -p:端口映射,格式为:宿主机端口:容器内端口
    • -e:设置容器内进程运行时的一些参数 (环境变量),格式为:-e KEY=VALUE
    • 镜像名:Docker 会根据这个名字搜索并下载镜像,格式为:REPOSITORY:TAG,例如 mysql:8.0,其中 REPOSITORY 可以理解为镜像名,TAG 是版本号,未指定 TAG 的情况下,默认是最新版本,也就是 mysql:latest