Docker 入门指北
为什么用 Docker
首先让我们来回顾一下过往至今的服务部署方案。
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
-
传统部署时代:
早期,各个组织机构在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。 例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况, 结果可能导致其他应用程序的性能下降。 一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展, 并且维护许多物理服务器的成本很高。有如下缺点:
- 环境配置麻烦,不同操作系统或者版本不同导致安装方式不同。
- 资源分配不均匀,一个程序占用大部分资源的情况,可能导致其他应用程序性能下降。
-
虚拟化部署时代:
作为解决方案,引入了虚拟化。虚拟化技术允许你在单个物理服务器的 CPU 上运行多个虚拟机(VM)。 虚拟化允许应用程序在 VM 之间隔离,并提供一定程度的安全,因为一个应用程序的信息 不能被另一应用程序随意访问。
虚拟化技术能够更好地利用物理服务器上的资源,并且因为可轻松地添加或更新应用程序 而可以实现更好的可伸缩性,降低硬件成本等等。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。现还有如下缺点:
- 资源占用多,虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
- 冗余步骤多,虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
- 启动慢,启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
-
容器部署时代:
作为解决方案,引入了容器。容器类似于 VM,但是它们具有被放宽的隔离属性,可以在应用程序之间共享操作系统(OS)。 因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
容器因具有许多优势而变得流行起来。下面列出的是容器的一些好处:
- 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
- 持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性),支持可靠且频繁的 容器镜像构建和部署。
- 关注开发与运维的分离:在构建/发布时而不是在部署时创建应用程序容器镜像, 从而将应用程序与基础架构分离。
- 可观察性:不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
- 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
- 跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
- 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
- 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
- 资源隔离:可预测的应用程序性能。
- 资源利用:高效率和高密度。
自从 2013 年 Docker 问世以来,凭借其容器化运行时的特点,风靡世界,搜索指数一路高升。各个大厂现已经将生产环境用于容器部署,该技术已成为未来的大势所趋。
Docker 安装
-
Window 操作系统
-
Mac OS 操作系统
-
CentOS 操作系统
安装完成后,可执行 docker version
命令,验证是否安装成功。
Docker 概念
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 --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 search
从 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
命令执行分析
- 命令补全,判断用户是否输入
TAG
参数等等,没输入的话按照默认参数进行补全。 - 识别
OPTIONS
参数是否填写,填写的话,则增加该参数的操作。 - 首先
docker
会根据name:tag@digest
寻找远程仓库是否有该镜像。- 如果没有该镜像,则报错。
- 如果有该镜像,则通过
name:tag@digest
判断本地是否已存在该镜像。- 先比对本地仓库是否有相同
name:tag
参数的镜像,如果有的话,则再比对@digest
参数,如果镜像sha256
一致的话,则不从远程仓库下载镜像,复用本地镜像。
- 先比对本地仓库是否有相同
- 如果没有该镜像,则从远程仓库获取镜像。
- 如果是第三方镜像仓库,则会先判断是否需要登录,需要登录的话,会从本地已验证账号列表里面寻找与之匹配的账号密码,如果登录失败则拉取镜像失败。
docker images【高频率】
查看镜像列表。
命令格式
docker images [OPTIONS] [REPOSITORY[:TAG]]
命令说明
OPTIONS
:-a
:列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)。--digests
:显示镜像的摘要信息。-f
:添加过滤条件,使用key=value
方式进行过滤,key
如下:dangling
:显示标记为空的镜像,值只有true
和false
。- label:这个是根据标签进行过滤,其中
lable
的值,是docker
在编译的时候配置的或者在Dockerfile
中配置的。 before
:这个是根据时间来进行过滤,其中before
的value
表示某个镜像构建时间之前的镜像列表。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
命令执行分析
- 识别
OPTIONS
参数是否填写,填写的话,则增加该参数的操作。 - 显示相关镜像信息。
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
的镜像。
命令执行分析
- 命令补全,判断用户是否输入
TAG
参数等等,没输入的话按照默认参数进行补全。 - 根据源镜像信息拷贝一份到目标镜像信息。
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
:不移除该镜像的过程镜像,默认移除。
IMAGE
:IMAGE 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
:绑定一个数据卷,格式为宿主机路径:容器路径
。
IMAGE
:IMAGE 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
命令执行分析
- 命令补全,判断用户是否输入缺省属性
-p [tcp/udp]
参数等等,没输入的话按照默认参数进行补全。 - 首先
docker
会根据IMAGE
寻找本地是否有该镜像,如果有的话则默认使用本地镜像,默认没有的话,则去远程仓库获取镜像。- 如果没有该镜像,则报错。
- 根据
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
容器生命周期
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 网络,后续将服务加入进去。
$ docker network create -d overlay --attachable global
34p2q5z8oup6mzdqzjcno10aq
构建前端工程
文件目录层级
- nginx
- conf
- springboot.conf
- docker.Dockerfile
- build.sh
- conf
$ 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 插件构建镜像
$ ./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
创建数据挂载文件夹
$ sh init.sh
拉取镜像
$ 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
部署服务
$ sh start.sh
Creating service mysql_mysql
服务名称组成:
stack指令定义的stack名称
_yml定义服务名称
部署后端工程
部署服务
$ sh start.sh
Creating service springboot_springboot
部署前端工程
部署服务
$ sh start.sh
Creating service nginx_nginx
验证服务
通过请求验证出服务已连通并且可用。
服务之间通过服务名称,即可互相访问,这是由于 Docker DNS server 将服务名称解析成容器内的 IP 实现的。
Docker Swarm 集群服务拓扑图
参考资料
Docker Documentation
Kubernetes 是什么?
Docker 概念术语
Docker 命令大全
Q.E.D.