Docker 入门指北

为什么用 Docker

首先让我们来回顾一下过往至今的服务部署方案。

部署时代

特性容器虚拟机
启动秒级分钟级
硬盘使用一般为 MB一般为 GB
性能接近原生弱于
系统支持量单机支持上千个容器一般几十个
  • 传统部署时代:

    早期,各个组织机构在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。 例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况, 结果可能导致其他应用程序的性能下降。 一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展, 并且维护许多物理服务器的成本很高。有如下缺点:

    • 环境配置麻烦,不同操作系统或者版本不同导致安装方式不同。
    • 资源分配不均匀,一个程序占用大部分资源的情况,可能导致其他应用程序性能下降。
  • 虚拟化部署时代:

    作为解决方案,引入了虚拟化。虚拟化技术允许你在单个物理服务器的 CPU 上运行多个虚拟机(VM)。 虚拟化允许应用程序在 VM 之间隔离,并提供一定程度的安全,因为一个应用程序的信息 不能被另一应用程序随意访问。

    虚拟化技术能够更好地利用物理服务器上的资源,并且因为可轻松地添加或更新应用程序 而可以实现更好的可伸缩性,降低硬件成本等等。

    每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。现还有如下缺点:

    • 资源占用多,虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
    • 冗余步骤多,虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
    • 启动慢,启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
  • 容器部署时代:

    作为解决方案,引入了容器。容器类似于 VM,但是它们具有被放宽的隔离属性,可以在应用程序之间共享操作系统(OS)。 因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。

    容器因具有许多优势而变得流行起来。下面列出的是容器的一些好处:

    • 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
    • 持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性),支持可靠且频繁的 容器镜像构建和部署。
    • 关注开发与运维的分离:在构建/发布时而不是在部署时创建应用程序容器镜像, 从而将应用程序与基础架构分离。
    • 可观察性:不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
    • 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
    • 跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
    • 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
    • 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
    • 资源隔离:可预测的应用程序性能。
    • 资源利用:高效率和高密度。

Docker 百度搜索指数

自从 2013 年 Docker 问世以来,凭借其容器化运行时的特点,风靡世界,搜索指数一路高升。各个大厂现已经将生产环境用于容器部署,该技术已成为未来的大势所趋。

Docker 安装

安装完成后,可执行 docker version 命令,验证是否安装成功。

Docker 概念

Docker Architecture

Docker 镜像仓库(Repository) 集中存放镜像文件的地方

镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

这里补充一下 Docker Registry 公开服务和私有 Docker Registry 的概念:

Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub ,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为:hub.docker.com/ 。在国内访问 Docker Hub 可能会比较慢国内也有一些云服务商提供类似于 Docker Hub 的公开服务。

除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 Docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

Docker 镜像(Image)一个特殊的文件系统

操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。

Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。 镜像实际是由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

Docker 容器(Container)镜像运行时的实体

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run,数据却不会丢失。

Docker 指令(Command)

官方 Docker CLI 参考资料

Docker Commands Diagram

让我们执行下 docker --help 查看一共有哪些命令,先混个眼熟:

$ docker --help

Options:
      --config string      Location of client config files (default
                           "C:\\Users\\AATROX\\.docker")
  -c, --context string     Name of the context to use to connect to the
                           daemon (overrides DOCKER_HOST env var and
                           default context set with "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level
                           ("debug"|"info"|"warn"|"error"|"fatal")
                           (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default
                           "C:\\Users\\AATROX\\.docker\\ca.pem")
      --tlscert string     Path to TLS certificate file (default
                           "C:\\Users\\AATROX\\.docker\\cert.pem")
      --tlskey string      Path to TLS key file (default
                           "C:\\Users\\AATROX\\.docker\\key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  builder     Manage builds
  buildx*     Docker Buildx (Docker Inc., v0.7.1)
  compose*    Docker Compose (Docker Inc., v2.2.1)
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  image       Manage images
  manifest    Manage Docker image manifests and manifest lists
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  scan*       Docker Scan (Docker Inc., v0.14.0)
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

相信大家看到一堆指令就麻了,我在这里先列举出常用场景,依次指令挨个说明:

docker info

显示系统信息。

示例:docker info

$ docker info

Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc., v0.7.1)
  compose: Docker Compose (Docker Inc., v2.2.1)
  scan: Docker Scan (Docker Inc., v0.14.0)

Server:
 Containers: 1
  Running: 1
  Paused: 0
  Stopped: 0
 Images: 1
 Server Version: 20.10.11
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc version: v1.0.2-0-g52b36a2
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.10.16.3-microsoft-standard-WSL2
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 19.44GiB
 Name: docker-desktop
 ID: OJZN:FRCZ:TF6M:Z7VD:SVIP:SH6Q:6BAO:FK3A:HPCG:27C5:LA5G:DJ5M
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://7g4zdb7j.mirror.aliyuncs.com/
 Live Restore Enabled: false

docker version

查看 Docker 以及相关组件版本信息。

示例:docker version

$ docker version

Client:
 Cloud integration: v1.0.22
 Version:           20.10.11
 API version:       1.41
 Go version:        go1.16.10
 Git commit:        dea9396
 Built:             Thu Nov 18 00:42:51 2021
 OS/Arch:           windows/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.11
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.9
  Git commit:       847da18
  Built:            Thu Nov 18 00:35:39 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

docker login

登录远程镜像仓库。

WARN

如果同学没有远程仓库,则可先忽略此命令

示例:docker login --username=****@qq.com registry.cn-shanghai.aliyuncs.com

$ docker login --username=*****@qq.com registry.cn-shanghai.aliyuncs.com

Password:
Login Succeeded

docker logout

退出远程仓库已登录账号信息。

WARN

如果同学没有远程仓库,则可先忽略此命令

示例:docker logout registry.cn-shanghai.aliyuncs.com

$ docker logout registry.cn-shanghai.aliyuncs.com

Removing login credentials for registry.cn-shanghai.aliyuncs.com

Docker Hub 查找镜像。

示例:docker search nginx

$ docker search nginx

NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        16043     [OK]
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   2104                 [OK]
richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of…   819                  [OK]
jc21/nginx-proxy-manager          Docker container for managing Nginx proxy ho…   301

docker pull【高频率】

从远程仓库拉取镜像。

命令格式:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

命令说明

  • OPTIONS
    • -a:下载镜像仓库中该镜像名称的所有标签镜像。与 TAG 参数互斥,只能填一个。
  • NAME:镜像名称,如果没指定远程仓库地址的话,默认去 Docker Hub 获取镜像。
  • TAG:标签,如果没指定的话,默认 TAG 为 latest
  • @DIGEST:镜像唯一ID。

示例:docker pull nginx

$ docker pull nginx

Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

命令执行分析

  1. 命令补全,判断用户是否输入 TAG 参数等等,没输入的话按照默认参数进行补全。
  2. 识别 OPTIONS 参数是否填写,填写的话,则增加该参数的操作。
  3. 首先 docker 会根据 name:tag@digest 寻找远程仓库是否有该镜像。
    • 如果没有该镜像,则报错。
  4. 如果有该镜像,则通过 name:tag@digest 判断本地是否已存在该镜像。
    • 先比对本地仓库是否有相同 name:tag 参数的镜像,如果有的话,则再比对 @digest 参数,如果镜像 sha256 一致的话,则不从远程仓库下载镜像,复用本地镜像。
  5. 如果没有该镜像,则从远程仓库获取镜像。
    • 如果是第三方镜像仓库,则会先判断是否需要登录,需要登录的话,会从本地已验证账号列表里面寻找与之匹配的账号密码,如果登录失败则拉取镜像失败。

docker images【高频率】

查看镜像列表。

命令格式

docker images [OPTIONS] [REPOSITORY[:TAG]]

命令说明

  • OPTIONS
    • -a:列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)。
    • --digests:显示镜像的摘要信息。
    • -f:添加过滤条件,使用 key=value 方式进行过滤,key 如下:
      • dangling:显示标记为空的镜像,值只有 truefalse
      • label:这个是根据标签进行过滤,其中 lable的值,是 docker在编译的时候配置的或者在 Dockerfile 中配置的。
      • before:这个是根据时间来进行过滤,其中 beforevalue表示某个镜像构建时间之前的镜像列表。
      • since:跟 before 正好相反,表示的是在某个镜像构建之后构建的镜像。
      • reference:这个是添加正则进行匹配。
    • -q:仅显示 IMAGE ID
  • REPOSITORY:镜像名称,如果指定的话,则会只显示该 REPOSITORY 相关的镜像信息。
  • TAG:标签,如果指定的话,则会只显示该 REPOSITORY 以及该 TAG 相关的镜像信息。

示例:docker images

$ docker images

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   13 hours ago   141MB

命令执行分析

  1. 识别 OPTIONS 参数是否填写,填写的话,则增加该参数的操作。
  2. 显示相关镜像信息。

docker tag【高频率】

创建一个新 tag 镜像。

命令格式

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

命令说明

  • SOURCE_IMAGE:源镜像名称。
  • TARGET_IMAGE:目标镜像名称。
  • TAG:标签,如果没指定的话,默认 TAG 为 latest

示例:docker tag nginx:latest nginx:my-tag-latest

$ docker tag nginx:latest nginx:my-tag-latest

指令运行完毕后输入 docker images 即可看到一个 nginx 有一个新 tag my-tag-latest 的镜像。

命令执行分析

  1. 命令补全,判断用户是否输入 TAG 参数等等,没输入的话按照默认参数进行补全。
  2. 根据源镜像信息拷贝一份到目标镜像信息。

docker history

显示镜像的历史。

一般用于查看镜像构建步骤,分析后可进行镜像瘦身、镜像改造等等。

命令格式

docker history [OPTIONS] IMAGE[:TAG]

命令说明

  • OPTIONS
    • -H:以可读的格式打印镜像大小和日期,默认为 true
    • --no-trunc:显示完整的提交记录。
    • -q:仅列出提交记录ID。
  • TAG:标签,如果指定的话,则会只显示该 REPOSITORY 以及该 TAG 相关的镜像信息。

示例:docker history nginx

$ docker history nginx

605c77e624dd   13 hours ago   /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B
<missing>      13 hours ago   /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B
<missing>      13 hours ago   /bin/sh -c #(nop)  EXPOSE 80                    0B
<missing>      13 hours ago   /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B
<missing>      13 hours ago   /bin/sh -c #(nop) COPY file:09a214a3e07c919a…   4.61kB
<missing>      13 hours ago   /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7…   1.04kB
<missing>      13 hours ago   /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0…   1.96kB
<missing>      13 hours ago   /bin/sh -c #(nop) COPY file:65504f71f5855ca0…   1.2kB
<missing>      13 hours ago   /bin/sh -c set -x     && addgroup --system -…   61.1MB
<missing>      13 hours ago   /bin/sh -c #(nop)  ENV PKG_RELEASE=1~bullseye   0B
<missing>      13 hours ago   /bin/sh -c #(nop)  ENV NJS_VERSION=0.7.1        0B
<missing>      13 hours ago   /bin/sh -c #(nop)  ENV NGINX_VERSION=1.21.5     0B
<missing>      9 days ago     /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B
<missing>      9 days ago     /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      9 days ago     /bin/sh -c #(nop) ADD file:09675d11695f65c55…   80.4MB

INFO

一个镜像由多个可读的镜像层组成,显示镜像历史的时候,会将最新的镜像层从上自下显示。

docker push【高频率】

推送镜像至镜像仓库。

命令格式

docker push [OPTIONS] NAME[:TAG]

命令说明

  • NAME:镜像名称。
  • TAG:标签,如果指定的话,则会只显示该 REPOSITORY 以及该 TAG 相关的镜像信息。

示例:docker push nginx:pongsky-1.0.0

$ docker push nginx:pongsky-1.0.0

The push refers to repository [docker.io/library/nginx]
bc23383c378c: Preparing
d874fd2bc83b: Preparing
32ce5f6a5106: Preparing
f1db227348d0: Preparing
b8d6e692a25e: Preparing
e379e8aedd4d: Waiting
2edcec3590a4: Waiting
denied: requested access to the resource is denied

docker rmi【高频率】

删除本地一个或多个镜像。

命令格式

docker rmi [OPTIONS] IMAGE [IMAGE...]

命令说明

  • OPTIONS
    • -f:强制删除。
    • --no-prune:不移除该镜像的过程镜像,默认移除。
  • IMAGEIMAGE ID 或者 NAME:TAG

示例:docker rmi -f nginx:latest

$ docker rmi -f nginx:latest

Untagged: nginx:latest
Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f

docker run【高频率】

创建一个新的容器并运行一个命令。

命令格式

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

命令说明

  • OPTIONS
    • -d:后台运行容器,并返回容器ID。
    • -i:以交互模式运行容器,通常与 -t 同时使用。
    • -p:指定端口映射,格式为 宿主机端口:容器端口/[tcp/udp],不填写默认 tcp
    • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
    • --name:为容器指定一个名称。
    • -h:指定容器的 hostname
    • -e:设置环境变量。
    • --network:连接进一个网络。
    • --link:添加链接到另一个容器。
    • --entrypoint:覆盖默认的 entrypoint
    • -v:绑定一个数据卷,格式为 宿主机路径:容器路径
  • IMAGEIMAGE ID 或者 NAME:TAG
  • COMMAND:指令信息。
  • ARG...:指令参数列表。

示例:docker run -d --name nginx -p 80:80/tcp -v C:/Users/AATROX/Downloads/index.html:/usr/share/nginx/html/index.html nginx

$ docker run -d --name nginx -p 80:80/tcp  -v C:/Users/AATROX/Downloads/index.html:/usr/share/nginx/html/index.html nginx

命令执行分析

  1. 命令补全,判断用户是否输入缺省属性 -p [tcp/udp] 参数等等,没输入的话按照默认参数进行补全。
  2. 首先 docker 会根据 IMAGE 寻找本地是否有该镜像,如果有的话则默认使用本地镜像,默认没有的话,则去远程仓库获取镜像。
    • 如果没有该镜像,则报错。
  3. 根据 OPTIONS 参数创建容器后并启动,然后执行容器 COMMAND ARG... 指令。
    • 如果容器没有交互指令也并没有分配伪终端的话,则容器会进入暂停状态。

docker ps【高频率】

列出容器。

命令格式

docker ps [OPTIONS]

命令说明

  • OPTIONS
    • -a:显示所有的容器,包括未运行的(默认只显示运行中的容器)。
    • -f:根据条件过滤显示的内容。
    • -l:显示最近创建的容器。
    • -n:列出最近创建的 n 个容器。
    • -q:只显示容器编号。
    • -s:显示总的文件大小。

示例:docker ps -a

$ docker ps -a

CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS     NAMES
6c13d872ee5d   nginx:pongsky-1.0.0   "/docker-entrypoint.…"   21 minutes ago   Up 21 minutes   80/tcp    pongsky
d34742ff4e87   nginx                 "/docker-entrypoint.…"   3 days ago       Up 3 days       80/tcp    nginx

docker exec【高频率】

在运行的容器中执行命令。

一般用于启动容器后进入执行初始化信息或者排查容器信息。

命令格式

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

命令说明

  • OPTIONS
    • -e:设置环境变量。
    • -i:保持 STDIN 打开,即使没有连接。
    • -t:分配一个伪 TTY
    • -u:用户名或 UID
    • -w:容器内的工作目录。
  • CONTAINER:容器,CONTAINER ID 或者 CONTAINER NAME
  • ARG...command 指令参数列表。

示例:docker exec -it nginx /bin/bash

$ docker exec -it nginx /bin/bash


docker stop

停止一个或多个正在运行中的容器。

命令格式

docker stop [OPTIONS] CONTAINER [CONTAINER...]

命令说明

  • OPTIONS
    • -t:在杀死它之前等待停止的秒数(默认 10)。
  • CONTAINER:容器,CONTAINER ID 或者 CONTAINER NAME
  • CONTAINER...:容器列表,CONTAINER ID 或者 CONTAINER NAME 列表。

示例:docker stop nginx

$ docker stop nginx

nginx

docker start

启动一个或多个已停止的容器。

命令格式

docker start[OPTIONS] CONTAINER [CONTAINER...]

命令说明

  • CONTAINER:容器,CONTAINER ID 或者 CONTAINER NAME
  • CONTAINER...:容器列表,CONTAINER ID 或者 CONTAINER NAME 列表。

示例:docker start nginx

$ docker start nginx

nginx

docker restart

重启一个或多个容器。

命令格式

docker restart [OPTIONS] CONTAINER [CONTAINER...]

命令说明

  • OPTIONS
    • -t:在杀死它之前等待停止的秒数(默认 10)。
  • CONTAINER:容器,CONTAINER ID 或者 CONTAINER NAME
  • CONTAINER...:容器列表,CONTAINER ID 或者 CONTAINER NAME 列表。

示例:docker restart nginx

$ docker restart nginx

nginx

docker logs【高频率】

获取容器的日志。

命令格式

docker logs [OPTIONS] CONTAINER

命令说明

  • OPTIONS
    • -f:跟踪日志输出。
    • -t:显示时间戳。
    • --tail:仅列出最新 n 条容器日志。
    • --since:显示某个开始时间的所有日志。
  • CONTAINER:容器,CONTAINER ID 或者 CONTAINER NAME

示例:docker logs -f -t --tail 10 nginx

$  docker logs -f -t --tail 10 nginx

2022-01-04T01:48:35.491607254Z 2022/01/04 01:48:35 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2022-01-04T01:48:35.491790545Z 2022/01/04 01:48:35 [notice] 1#1: start worker processes
2022-01-04T01:48:35.492379907Z 2022/01/04 01:48:35 [notice] 1#1: start worker process 24
2022-01-04T01:48:35.492497245Z 2022/01/04 01:48:35 [notice] 1#1: start worker process 25
2022-01-04T01:48:35.492694700Z 2022/01/04 01:48:35 [notice] 1#1: start worker process 26
2022-01-04T01:48:35.492861997Z 2022/01/04 01:48:35 [notice] 1#1: start worker process 27
2022-01-04T01:48:35.494038216Z 2022/01/04 01:48:35 [notice] 1#1: start worker process 28
2022-01-04T01:48:35.494775667Z 2022/01/04 01:48:35 [notice] 1#1: start worker process 29
2022-01-04T01:48:35.495491899Z 2022/01/04 01:48:35 [notice] 1#1: start worker process 30

docker commit

从容器创建一个新的镜像。

命令格式

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

命令说明

  • OPTIONS
    • -a:提交的镜像作者。
    • -m:提交时的说明文字。
    • -p:在 commit 时,将容器暂停。
  • CONTAINER:容器,CONTAINER ID 或者 CONTAINER NAME
  • REPOSITORY:镜像名称,如果指定的话,则会只显示该 REPOSITORY 相关的镜像信息。
  • TAG:标签,如果指定的话,则会只显示该 REPOSITORY 以及该 TAG 相关的镜像信息。

示例:docker commit -a "PONGSKY" -m "测试 commit" nginx nginx:pongsky-1.0.0

$ docker commit -a "PONGSKY" -m "测试 commit" nginx nginx:pongsky-1.0.0

sha256:fe752a22bc4032c7c317661e39b8cc2e70112c3edd70dc4cbd314cf9102fb989

docker diff

检查容器里文件结构的更改。

命令格式

docker diff CONTAINER

命令说明

  • CONTAINER:容器,CONTAINER ID 或者 CONTAINER NAME

示例:docker diff nginx

$ docker diff nginx

A /pongsky
C /root
A /root/.bash_history
C /run
A /run/nginx.pid
A /commit
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf

docker cp

用于容器与主机之间的数据拷贝。

命令格式

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

命令说明

  • CONTAINER:容器,CONTAINER ID 或者 CONTAINER NAME

将容器数据拷贝至本地 示例:docker cp nginx:/etc/nginx D:\nginx

将本地数据拷贝至容器 示例:docker cp D:\nginx nginx:/pongsky

docker cp nginx:/etc/nginx D:\nginx

docker cp D:\nginx nginx:/pongsky

docker rm【高频率】

删除一个或多个容器。

命令格式

docker rm [OPTIONS] CONTAINER [CONTAINER...]

命令说明

  • OPTIONS
    • -f:强制删除正在运行的容器。
  • CONTAINER:容器,CONTAINER ID 或者 CONTAINER NAME
  • CONTAINER...:容器列表,CONTAINER ID 或者 CONTAINER NAME 列表。

示例:docker rm -f nginx

$ docker rm -f nginx

nginx

docker events

从服务器获取实时事件。

命令格式

docker events [OPTIONS]

命令说明

  • OPTIONS
    • -f:根据条件过滤事件。
    • --since:从指定的时间戳后显示所有事件。

示例:docker events

$ docker events

2022-01-04T10:08:15.221847318+08:00 container kill d34742ff4e87e18e89c4886311a8e5de8f94657171c93582e83bd90347e761bb (image=nginx, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, name=nginx, signal=3)
2022-01-04T10:08:15.410436756+08:00 container die d34742ff4e87e18e89c4886311a8e5de8f94657171c93582e83bd90347e761bb (exitCode=0, image=nginx, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, name=nginx)
2022-01-04T10:08:15.716204013+08:00 network disconnect f4645324feaef4dd22a2e8e1deafd7b4f68c7ab89862e1e6f13679fda4ff1ea0 (container=d34742ff4e87e18e89c4886311a8e5de8f94657171c93582e83bd90347e761bb, name=bridge, type=bridge)
2022-01-04T10:08:15.745159367+08:00 container stop d34742ff4e87e18e89c4886311a8e5de8f94657171c93582e83bd90347e761bb (image=nginx, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, name=nginx)
2022-01-04T10:08:38.813402562+08:00 network connect f4645324feaef4dd22a2e8e1deafd7b4f68c7ab89862e1e6f13679fda4ff1ea0 (container=d34742ff4e87e18e89c4886311a8e5de8f94657171c93582e83bd90347e761bb, name=bridge, type=bridge)
2022-01-04T10:08:39.207083007+08:00 container start d34742ff4e87e18e89c4886311a8e5de8f94657171c93582e83bd90347e761bb (image=nginx, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, name=nginx)

docker stats

显示容器资源使用统计。

命令格式

docker stats [OPTIONS] [CONTAINER...]

命令说明

  • OPTIONS
    • -a:显示所有容器(默认只显示正在运行状态的容器)。
    • --no-stream:禁用实时流统计并只提取第一个结果。
  • CONTAINER...:容器列表,CONTAINER ID 或者 CONTAINER NAME 列表。

示例:docker stats nginx

$ docker stats nginx

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT    MEM %     NET I/O      BLOCK I/O   PIDS
d34742ff4e87   nginx     0.00%     6.82MiB / 19.44GiB   0.03%     1.4kB / 0B   0B / 0B     9

docker inspect

获取容器/镜像的元数据。

命令格式

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

命令说明

示例:docker inspect nginx

$ docker inspect nginx

[
    {
        "Id": "2f704ed68d4df4858a8b3e6d021232023147289dda0f678d9e2ceb8ec05b288e",
        "Created": "2022-01-04T02:12:17.816585871Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 3737,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-01-04T02:12:18.432727092Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85",
        "ResolvConfPath": "/var/lib/docker/containers/2f704ed68d4df4858a8b3e6d021232023147289dda0f678d9e2ceb8ec05b288e/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/2f704ed68d4df4858a8b3e6d021232023147289dda0f678d9e2ceb8ec05b288e/hostname",
        "HostsPath": "/var/lib/docker/containers/2f704ed68d4df4858a8b3e6d021232023147289dda0f678d9e2ceb8ec05b288e/hosts",
        "LogPath": "/var/lib/docker/containers/2f704ed68d4df4858a8b3e6d021232023147289dda0f678d9e2ceb8ec05b288e/2f704ed68d4df4858a8b3e6d021232023147289dda0f678d9e2ceb8ec05b288e-json.log",
        "Name": "/nginx",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": [
            "c637bb6940f69036fef36e6770264339ba24ab58e7ef1da8958930aed26aa803",
            "e9e4b4c4736406c477a8cba9368c56583eb9e28b83833c4c9a6b0f866ba3d946"
        ],
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "80/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "80"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                28,
                120
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/2bb3bc38ae00aca6bc1bc7d26f4da56750f77f0b6a81a89ba937bd17b78be950-init/diff:/var/lib/docker/overlay2/c3a2a8b2fedc7ffd8c432f4d3ac2a92329f7e3a1d3e726b772a986b2a4f31d89/diff:/var/lib/docker/overlay2/492236c88cfafc679b68d2571e89ceeef4b97587c898cd5f99d49de663eb4493/diff:/var/lib/docker/overlay2/ad4e499eba0be3d0ba80cf49305dd9e02b61e777788a55d4d0dd31b31da49f32/diff:/var/lib/docker/overlay2/c6f5403a8f442a482427508e250e074ca311d63664d114fcdbc15c8bed1bf2ba/diff:/var/lib/docker/overlay2/6c12a4051d37d441dc976c18f695bd1f1c7ae172d87e8f01f11c9bc2ddce5f57/diff:/var/lib/docker/overlay2/2c36a20eafffe17aae7ecf6688645319c64fbb4fb135626d889845522e1adb1f/diff",
                "MergedDir": "/var/lib/docker/overlay2/2bb3bc38ae00aca6bc1bc7d26f4da56750f77f0b6a81a89ba937bd17b78be950/merged",
                "UpperDir": "/var/lib/docker/overlay2/2bb3bc38ae00aca6bc1bc7d26f4da56750f77f0b6a81a89ba937bd17b78be950/diff",
                "WorkDir": "/var/lib/docker/overlay2/2bb3bc38ae00aca6bc1bc7d26f4da56750f77f0b6a81a89ba937bd17b78be950/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "2f704ed68d4d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.5",
                "NJS_VERSION=0.7.1",
                "PKG_RELEASE=1~bullseye"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "nginx",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e"
            },
            "StopSignal": "SIGQUIT"
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "7bf243ecad4eaf68d1f3c0ddde5bdc103e7855862419409e1becda93a0d3312f",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "80"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/7bf243ecad4e",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "43bce532347d5b7cb2c2b38ab83b4bc332fe19be26dbc273a1a049c1924c6c21",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "f4645324feaef4dd22a2e8e1deafd7b4f68c7ab89862e1e6f13679fda4ff1ea0",
                    "EndpointID": "43bce532347d5b7cb2c2b38ab83b4bc332fe19be26dbc273a1a049c1924c6c21",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

docker build【高频率】

命令格式

docker build [OPTIONS] PATH | URL | -

命令说明

  • OPTIONS
    • -f:指定要使用的 Dockerfile 路径。
    • --force-rm:设置镜像过程中删除中间容器。
    • --rm:整个构建过程成功后删除中间环节的容器。
    • -t:设置镜像的名字及标签。

示例:docker build -f docker.Dockerfile . -t registry.cn-shanghai.aliyuncs.com/pongsky/genshinhelper:1.0.0

$ docker build -f docker.Dockerfile . -t registry.cn-shanghai.aliyuncs.com/pongsky/genshinhelper:1.0.0

[+] Building 6.6s (5/8)
[+] Building 10.8s (9/9) FINISHED
 => [internal] load build definition from docker.Dockerfile                                                                                                                                                                        0.1s
 => => transferring dockerfile: 1.65kB                                                                                                                                                                                             0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                  0.1s
 => => transferring context: 2B                                                                                                                                                                                                    0.0s
 => [internal] load metadata for registry.cn-shanghai.aliyuncs.com/pongsky/genshinhelper:2.0.5                                                                                                                                     2.4s
 => [auth] pongsky/genshinhelper:pull token for registry.cn-shanghai.aliyuncs.com                                                                                                                                                  0.0s
 => [1/3] FROM registry.cn-shanghai.aliyuncs.com/pongsky/genshinhelper:2.0.5@sha256:51b64505eed8c2ab3d93ad4d6d82e9fadedd0a533bcf85ce1b626dc1883b573a                                                                               7.8s
 => => resolve registry.cn-shanghai.aliyuncs.com/pongsky/genshinhelper:2.0.5@sha256:51b64505eed8c2ab3d93ad4d6d82e9fadedd0a533bcf85ce1b626dc1883b573a                                                                               0.0s
 => => sha256:51b64505eed8c2ab3d93ad4d6d82e9fadedd0a533bcf85ce1b626dc1883b573a 2.20kB / 2.20kB                                                                                                                                     0.0s
 => => sha256:05af8b2dccc64ec62088f487fde96d72eba1cad8f3305b473a328562b933d21c 7.29kB / 7.29kB                                                                                                                                     0.0s
 => => sha256:59bf1c3509f33515622619af21ed55bbe26d24913cedbca106468a5fb37a50c3 2.82MB / 2.82MB                                                                                                                                     1.2s
 => => sha256:d8c681bc2183ac2de0b5e117ed74647ee5dfbdbf8a3730ac81c54f3b3db989f7 11.69MB / 11.69MB                                                                                                                                   4.1s
 => => sha256:07a400e93df3fcc09e5f874878c049b15515236f55fbf76013c0779a7cc4a301 678.30kB / 678.30kB                                                                                                                                 0.5s
 => => sha256:c7f1ca1171d975af881f16ba8005f599918648448f8d9b0be5436dd8ba3bf1f0 231B / 231B                                                                                                                                         0.8s
 => => sha256:dc9256fcea2e541f17f0ed7d4dae23c03fb27a5ab8e7611e34f5a5e4d96d6678 2.35MB / 2.35MB                                                                                                                                     2.0s
 => => extracting sha256:59bf1c3509f33515622619af21ed55bbe26d24913cedbca106468a5fb37a50c3                                                                                                                                          0.7s
 => => sha256:b30f4df9527b7a4e63e7ba55184dd0e2d6b3060326d5686465169864f141e014 99B / 99B                                                                                                                                           1.7s
 => => sha256:cf7bc792610be9a3ab6a74d487203a66cd6115eb40469cc6b44a38ff67383577 180B / 180B                                                                                                                                         2.1s
 => => extracting sha256:07a400e93df3fcc09e5f874878c049b15515236f55fbf76013c0779a7cc4a301                                                                                                                                          0.6s
 => => sha256:63f470fc1d34a37ea09d36f72e4d575ad49412e0d74143bd9fcbaf0d9e554a3d 6.00kB / 6.00kB                                                                                                                                     2.4s
 => => sha256:4891bd3d558454877bdeda559053c38c4eb0914be411e8153d04869e12a7e57f 3.53MB / 3.53MB                                                                                                                                     5.0s
 => => extracting sha256:d8c681bc2183ac2de0b5e117ed74647ee5dfbdbf8a3730ac81c54f3b3db989f7                                                                                                                                          1.7s
 => => extracting sha256:c7f1ca1171d975af881f16ba8005f599918648448f8d9b0be5436dd8ba3bf1f0                                                                                                                                          0.0s
 => => extracting sha256:dc9256fcea2e541f17f0ed7d4dae23c03fb27a5ab8e7611e34f5a5e4d96d6678                                                                                                                                          0.5s
 => => extracting sha256:b30f4df9527b7a4e63e7ba55184dd0e2d6b3060326d5686465169864f141e014                                                                                                                                          0.0s
 => => extracting sha256:cf7bc792610be9a3ab6a74d487203a66cd6115eb40469cc6b44a38ff67383577                                                                                                                                          0.0s
 => => extracting sha256:63f470fc1d34a37ea09d36f72e4d575ad49412e0d74143bd9fcbaf0d9e554a3d                                                                                                                                          0.0s
 => => extracting sha256:4891bd3d558454877bdeda559053c38c4eb0914be411e8153d04869e12a7e57f                                                                                                                                          0.5s
 => [internal] load build context                                                                                                                                                                                                  0.0s
 => => transferring context: 3.52kB                                                                                                                                                                                                0.0s
 => [2/3] COPY config.json /app/genshincheckinhelper/config/config.example.json                                                                                                                                                    0.2s
 => [3/3] COPY custom.py /usr/local/lib/python3.10/site-packages/onepush/providers/custom.py                                                                                                                                       0.0s
 => exporting to image                                                                                                                                                                                                             0.1s
 => => exporting layers                                                                                                                                                                                                            0.0s
 => => writing image sha256:d0c4ec4578025fb0a490beb567b760f8b1728c1a6545e4b35d8d18e581c71bbe                                                                                                                                       0.0s
 => => naming to registry.cn-shanghai.aliyuncs.com/pongsky/genshinhelper:2.0.5_2021-12-29                                                                                                                                          0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

容器生命周期

docker容器生命周期

Dockerfile

官方 Dockerfile 参考资料

Docker Swarm 实战

初始化 Docker Swarm 集群

WARN

主节点执行 docker swarm init 命令。

主节点执行完命令后,控制台会打印 docker swarm join --token xxx 命令。从节点拷贝过去执行。(这里做演示,只采用单节点)

从节点执行 docker swarm join --token xxx 命令。

$ docker swarm init

Swarm initialized: current node (4pjwzxpn29q2bq26b15pp1kp6) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2v7325r8rvpmop0dvm42s8ac9gtt7bbpns6cadtr9836o0q5d0-5pnd2cy6m9ug102kolahyatcm 192.168.65.3:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

创建 Swarm 网络

在 Docker Swarm 部署中,如不指定网络,则每个服务默认会创建一个默认网络,如果有不同的服务需要互通,则会互通失败。所以创建一个 Swarm 网络,后续将服务加入进去。

image.png

$ docker network create -d overlay --attachable global

34p2q5z8oup6mzdqzjcno10aq

构建前端工程

image.png

文件目录层级

  • nginx
    • conf
      • springboot.conf
    • docker.Dockerfile
    • build.sh
$ sh build.sh

[+] Building 8.6s (7/7) FINISHED                                                                                                                                                                                                                        
 => [internal] load build definition from docker.Dockerfile                                                                                                                                                                                        0.0s
 => => transferring dockerfile: 102B                                                                                                                                                                                                               0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                  0.0s
 => => transferring context: 2B                                                                                                                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/nginx:1.21.5-alpine                                                                                                                                                                             4.8s
 => [internal] load build context                                                                                                                                                                                                                  0.0s
 => => transferring context: 460B                                                                                                                                                                                                                  0.0s
 => [1/2] FROM docker.io/library/nginx:1.21.5-alpine@sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333                                                                                                                       3.7s
 => => resolve docker.io/library/nginx:1.21.5-alpine@sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333                                                                                                                       0.0s
 => => sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333 1.65kB / 1.65kB                                                                                                                                                     0.0s
 => => sha256:544ba2bfe312bf2b13278495347bb9381ec342e630bcc8929af124f1291784bb 1.57kB / 1.57kB                                                                                                                                                     0.0s
 => => sha256:f3322597df46099a66ed5773c10a9d1cb587faca7be14ceba985e3d1fbfdbc36 7.35MB / 7.35MB                                                                                                                                                     3.0s
 => => sha256:d09cf91cabdcf5f64672598b8e4da9b0b7d8546e83ec49633bdd92abb994ba61 602B / 602B                                                                                                                                                         1.5s
 => => sha256:cc44224bfe208a46fbc45471e8f9416f66b75d6307573e29634e7f42e27a9268 8.89kB / 8.89kB                                                                                                                                                     0.0s
 => => sha256:59bf1c3509f33515622619af21ed55bbe26d24913cedbca106468a5fb37a50c3 2.82MB / 2.82MB                                                                                                                                                     1.5s
 => => extracting sha256:59bf1c3509f33515622619af21ed55bbe26d24913cedbca106468a5fb37a50c3                                                                                                                                                          0.1s
 => => sha256:3a97535ac2efcf94ab3e5f93a6ec4d934469de66909f17ba1229f86ee660970a 895B / 895B                                                                                                                                                         1.9s
 => => sha256:919ade35f869e23d663ea51fdf2e99aa183239a73b4b4780e052c8b248ed5b7e 668B / 668B                                                                                                                                                         2.0s
 => => sha256:40e5d2fe5bcd566dbde3e961f33ced0f1503fc6ee320a427b185a07afe2f96ae 1.40kB / 1.40kB                                                                                                                                                     2.4s
 => => extracting sha256:f3322597df46099a66ed5773c10a9d1cb587faca7be14ceba985e3d1fbfdbc36                                                                                                                                                          0.3s
 => => extracting sha256:d09cf91cabdcf5f64672598b8e4da9b0b7d8546e83ec49633bdd92abb994ba61                                                                                                                                                          0.0s
 => => extracting sha256:3a97535ac2efcf94ab3e5f93a6ec4d934469de66909f17ba1229f86ee660970a                                                                                                                                                          0.0s
 => => extracting sha256:919ade35f869e23d663ea51fdf2e99aa183239a73b4b4780e052c8b248ed5b7e                                                                                                                                                          0.0s
 => => extracting sha256:40e5d2fe5bcd566dbde3e961f33ced0f1503fc6ee320a427b185a07afe2f96ae                                                                                                                                                          0.0s
 => [2/2] COPY /conf etc/nginx/conf.d                                                                                                                                                                                                              0.0s
 => exporting to image                                                                                                                                                                                                                             0.0s
 => => exporting layers                                                                                                                                                                                                                            0.0s
 => => writing image sha256:c0ad17b109cd4dc69539d0c10ded7c28a8971c0f7c9f10d0cb35b92b4609d3e7                                                                                                                                                       0.0s
 => => naming to docker.io/library/ireadyit-nginx:prod-1.0.0                                                                                                                                                                                       0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

构建后端工程

springBoot 项目可借助 Google Jib 插件构建镜像

image.png

$ ./gradlew jibDockerBuild 

Welcome to Gradle 7.3.2!

Here are the highlights of this release:
 - Easily declare new test suites in Java projects
 - Support for Java 17
 - Support for Scala 3

For more details see https://docs.gradle.org/7.3.2/release-notes.html

Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details

> Task :jibDockerBuild

Containerizing application to Docker daemon as ireadyit-springboot, ireadyit-springboot:prod-1.1.0...
Base image 'registry.cn-shanghai.aliyuncs.com/pongsky/openjdk11-openj9:jre' does not use a specific image digest - build may not be reproducible
The base image requires auth. Trying again for registry.cn-shanghai.aliyuncs.com/pongsky/openjdk11-openj9:jre...
The credential helper (docker-credential-desktop) has nothing for server URL: registry.cn-shanghai.aliyuncs.com

Got output:

credentials not found in native keychain

Using base image with digest: sha256:fc6a99645bf7371e8027b89fa9bd7562d52b30e1640a2313562d18bb02b38cb3

Container entrypoint set to [java, -Xms330M, -Xmx512M, -Xmn100M, -XX:MetaspaceSize=100M, -XX:MaxDirectMemorySize=64M, -Dspring.profiles.active=prod, -Xshareclasses, -Xquickstart, -Duser.timezone=GMT+08, -Djava.security.egd=file:/dev/./urandom, -cp, @/app/jib-classpath-file, com.ireadyit.docker.Application]

Built image to Docker daemon as ireadyit-springboot, ireadyit-springboot:prod-1.1.0
Executing tasks:
[==============================] 100.0% complete


BUILD SUCCESSFUL in 11s
3 actionable tasks: 2 executed, 1 up-to-date

部署 MySQL

创建数据挂载文件夹

image.png

$ sh init.sh

拉取镜像

image.png

$ sh pull.sh

Error: No such image: mysql:8.0
8.0: Pulling from library/mysql
72a69066d2fe: Pull complete 
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:8.0
docker.io/library/mysql:8.0

部署服务

image.png

$ sh start.sh

Creating service mysql_mysql

服务名称组成:stack指令定义的stack名称_yml定义服务名称

部署后端工程

部署服务

image.png

$ sh start.sh

Creating service springboot_springboot

部署前端工程

部署服务

image.png

$ sh start.sh

Creating service nginx_nginx

验证服务

image.png

image.png

通过请求验证出服务已连通并且可用。

服务之间通过服务名称,即可互相访问,这是由于 Docker DNS server 将服务名称解析成容器内的 IP 实现的。

Docker Swarm 集群服务拓扑图

Docker Swarm 集群服务拓扑图

参考资料

Docker Documentation
Kubernetes 是什么?
Docker 概念术语
Docker 命令大全

Q.E.D.


好久不見,今日營業中