Docker的应用场景
- Web应用的自动化打包和发布
- 自动化测试和持续集成,发布
- 在服务型环境中部署和调整数据库或其他的后台应用
- 从头编译或者扩展现有的OpenShift或Cloud Foundry来搭建自己的PaaS环境、
Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
- 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
- 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
- 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
相关链接
Docker 官网:https://www.docker.com
Github Docker 源码:https://github.com/docker/docker-ce
Docker架构
Docker包括三个基本概念:
- 镜像(Image):Docker镜像(Image),就相当于是一个root文件系统,比如官方镜像Ubuntu:16.04就包含了一套完整的Ubuntu:16.04最小系统的root文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建,启动、停止、删除,暂停等。
- 仓库(Repository):仓库可以看作是一个代码控制中心,可以用来保存镜像。
Docker使用客户端-服务端(C/S)架构模式,使用远程API来管理和创建Docker容器。
Docker容器通过Docker镜像来创建。
容器和镜像的关系类似于面向对象编程中的类和对象,如下图所示:
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
Docker常用命令
Common Commands(常用命令)
-
run Create and run a new container from an image(从一个image镜像创建并启动一个新的container容器)
-
exec Execute a command in a running container(在一个运行的container容器执行一段命令)
-
ps List containers(列出container容器,-a列出全部容器,不加-a列出运行的容器)
-
build Build an image from a Dockerfile(从Dockerfile配置文件创建一个image镜像)
-
pull Download an image from a registry(从dockerhub等资源库下载一个image镜像)
-
push Upload an image to a registry(推送一个镜像至资源库)
-
images List images(列出images镜像)
-
login Log in to a registry(登陆进一个资源库)
-
logout Log out from a registry(从资源库推出)
-
search Search Docker Hub for images(从dockerhub中搜索images镜像)
-
version Show the Docker version information(看docker的版本信息)
-
info Display system-wide information(查看docker附带的插件信息)
**Commands **
- attach Attach local standard input, output, and error streams to a running container()
- 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
- export Export a container’s filesystem as a tar archive
- history Show the history of an image
- import Import the contents from a tarball to create a filesystem image
- inspect Return low-level information on Docker objects(返回container或images的元数据)
- kill Kill one or more running containers(杀死一个或更多个运行的container容器)
- load Load an image from a tar archive or STDIN
- logs Fetch the logs of a container(取出container容器运行日志)
- pause Pause all processes within one or more containers
- port List port mappings or a specific mapping for the container列出容器与宿主机的映射关系
- rename Rename a container(重命名一个容器)
- restart Restart one or more containers(重启一个或更多个container容器)
- rm Remove one or more containers(删除一个或更多个container容器)
- rmi Remove one or more images(删除一个或更多个image镜像)
- 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(对二次开发的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(更新一个或更多容器的配置)
- wait Block until one or more containers stop, then print their exit codes
Management Commands(管理命令)
- builder Manage builds
- buildx* Docker Buildx (Docker Inc., v0.11.0)
- checkpoint Manage checkpoints
- compose* Docker Compose (Docker Inc., v2.19.1)
- container Manage containers
- context Manage contexts
- dev* Docker Dev Environments (Docker Inc., v0.1.0)
- extension* Manages Docker extensions (Docker Inc., v0.2.20)
- image Manage images
- init* Creates Docker-related starter files for your project (Docker Inc., v0.1.0-beta.6)
- manifest Manage Docker image manifests and manifest lists
- network Manage networks
- plugin Manage plugins
- sbom* View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)
- scan* Docker Scan (Docker Inc., v0.26.0)
- scout* Command line tool for Docker Scout (Docker Inc., 0.16.1)
- system Manage Docker
- trust Manage trust on Docker images
- volume Manage volumes
**Swarm Commands **
- config Manage Swarm configs
- node Manage Swarm nodes
- secret Manage Swarm secrets
- service Manage Swarm services
- stack Manage Swarm stacks
- swarm Manage Swarm
Global Options
--config string Location of client config files (default "/Users/daoguang1/.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 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 "/Users/daoguang1/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/Users/daoguang1/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/Users/daoguang1/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
docker compose常用命令
Commands(命令)
- build Build or rebuild services
- config Parse, resolve and render compose file in canonical format
- cp Copy files/folders between a service container and the local filesystem
- create Creates containers for a service.
- down Stop and remove containers, networks
- events Receive real time events from containers.
- exec Execute a command in a running container.
- images List images used by the created containers
- kill Force stop service containers.
- logs View output from containers
- ls List running compose projects
- pause Pause services
- port Print the public port for a port binding.
- ps List containers
- pull Pull service images
- push Push service images
- restart Restart service containers
- rm Removes stopped service containers
- run Run a one-off command on a service.
- start Start services
- stop Stop services
- top Display the running processes 列出容器组合中每个容器的进程,需要在docker-compose.yaml所在目录执行
- unpause Unpause services
- up Create and start containers 创建或启动容器组合,需要在docker-compose.yaml所在目录执行
- version Show the Docker Compose version information 展示docker compose版本
Options(配置)
--ansi string Control when to print ANSI control characters ("never"|"always"|"auto") (default "auto")--compatibility Run compose in backward compatibility mode--dry-run Execute command in dry run mode--env-file stringArray Specify an alternate environment file.-f, --file stringArray Compose configuration files--parallel int Control max parallelism, -1 for unlimited (default -1)--profile stringArray Specify a profile to enable--progress string Set type of progress output (auto, tty, plain, quiet) (default "auto")--project-directory string Specify an alternate working directory(default: the path of the, first specified, Compose file)-p, --project-name string Project name
Nginx解析
docker-compose.yaml文件中的Nginx配置解析
下面是对这段 docker-compose.yaml
配置文件中 nginx
服务部分的详细解析:
服务定义
nginx:image: nginx:latestrestart: alwaysvolumes:- ./nginx/nginx.conf.template:/etc/nginx/nginx.conf.template- ./nginx/proxy.conf.template:/etc/nginx/proxy.conf.template- ./nginx/https.conf.template:/etc/nginx/https.conf.template- ./nginx/conf.d:/etc/nginx/conf.d- ./nginx/docker-entrypoint.sh:/docker-entrypoint-mount.sh- ./nginx/ssl:/etc/ssl # cert dir (legacy)- ./volumes/certbot/conf/live:/etc/letsencrypt/live # cert dir (with certbot container)- ./volumes/certbot/conf:/etc/letsencrypt- ./volumes/certbot/www:/var/www/htmlentrypoint: [ "sh", "-c", "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh" ]environment:NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_}NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false}NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443}NGINX_PORT: ${NGINX_PORT:-80}NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt}NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key}NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3}NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto}NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-15M}NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65}NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s}NGINX_PROXY_SEND_TIMEOUT: ${NGINX_PROXY_SEND_TIMEOUT:-3600s}NGINX_ENABLE_CERTBOT_CHALLENGE: ${NGINX_ENABLE_CERTBOT_CHALLENGE:-false}CERTBOT_DOMAIN: ${CERTBOT_DOMAIN:-}depends_on:- api- webports:- "${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}"- "${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}"
解析
1. 服务名称
nginx
: 定义了一个名为nginx
的服务。
2. 镜像
image: nginx:latest
: 使用最新的 Nginx 镜像。
3. 重启策略
restart: always
: 设置 Nginx 容器在任何情况下都会自动重启。
4. 卷挂载
volumes:
: 定义了多个卷挂载,将主机上的文件和目录映射到容器内的相应位置。./nginx/nginx.conf.template:/etc/nginx/nginx.conf.template
: 挂载 Nginx 配置模板文件。./nginx/proxy.conf.template:/etc/nginx/proxy.conf.template
: 挂载代理配置模板文件。./nginx/https.conf.template:/etc/nginx/https.conf.template
: 挂载 HTTPS 配置模板文件。./nginx/conf.d:/etc/nginx/conf.d
: 挂载 Nginx 配置文件目录。./nginx/docker-entrypoint.sh:/docker-entrypoint-mount.sh
: 挂载入口脚本。./nginx/ssl:/etc/ssl
: 挂载 SSL 证书目录(遗留方式)。./volumes/certbot/conf/live:/etc/letsencrypt/live
: 挂载 Certbot 生成的证书目录。./volumes/certbot/conf:/etc/letsencrypt
: 挂载 Certbot 配置目录。./volumes/certbot/www:/var/www/html
: 挂载 Certbot 的 Web 根目录。
5. 入口点
entrypoint: [ "sh", "-c", "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh" ]
: 自定义入口点脚本,执行以下操作:- 复制
docker-entrypoint-mount.sh
到/docker-entrypoint.sh
。 - 使用
sed
去除 Windows 行尾符。 - 赋予执行权限。
- 执行入口脚本。
- 复制
6. 环境变量
environment:
: 定义了一系列环境变量,用于配置 Nginx。NGINX_SERVER_NAME
: Nginx 服务器名称,默认值为_
。NGINX_HTTPS_ENABLED
: 是否启用 HTTPS,默认值为false
。NGINX_SSL_PORT
: HTTPS 端口,默认值为443
。NGINX_PORT
: HTTP 端口,默认值为80
。NGINX_SSL_CERT_FILENAME
: SSL 证书文件名,默认值为dify.crt
。NGINX_SSL_CERT_KEY_FILENAME
: SSL 证书密钥文件名,默认值为dify.key
。NGINX_SSL_PROTOCOLS
: 支持的 SSL 协议,默认值为TLSv1.1 TLSv1.2 TLSv1.3
。NGINX_WORKER_PROCESSES
: Nginx 工作进程数,默认值为auto
。NGINX_CLIENT_MAX_BODY_SIZE
: 客户端最大请求体大小,默认值为15M
。NGINX_KEEPALIVE_TIMEOUT
: 保持连接超时时间,默认值为65
秒。NGINX_PROXY_READ_TIMEOUT
: 代理读取超时时间,默认值为3600s
。NGINX_PROXY_SEND_TIMEOUT
: 代理发送超时时间,默认值为3600s
。NGINX_ENABLE_CERTBOT_CHALLENGE
: 是否启用 Certbot 挑战,默认值为false
。CERTBOT_DOMAIN
: Certbot 域名,默认值为空。
7. 依赖关系
depends_on:
: 定义了依赖的服务。api
: 依赖api
服务。web
: 依赖web
服务。
8. 端口映射
ports:
: 定义了端口映射。${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}
: 将主机的80
端口映射到容器的80
端口。${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}
: 将主机的443
端口映射到容器的443
端口。
总结
这段配置文件定义了一个 Nginx 服务,用于反向代理 API 和 Web 服务。它支持 HTTP 和 HTTPS,并且可以通过环境变量进行灵活配置。此外,还集成了 Certbot 用于自动获取和管理 SSL 证书。
架构核心精髓:
没有什么是加一层解决不了的问题
通过横向扩展,增加了服务器,这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。
我们希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点上,这个过程用户是无感知的,用户不知道是哪个服务器返回的结果,我们还希望可以按照服务器的性能提供不同的权重选择。保证最佳体验,所以使用了Nginx。
什么是Nginx?
Nginx(engine X)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,Nginx 1.0.4发布。
其特点是占有内存少,并发能力强,事实上Nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用Nginx网站的用户有:百度,京东,新浪,网易,腾讯,淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
Nginx是一个安装非常简单,配置文件非常简洁,还能够支持perl语法,Bug非常少的服务。Nginx启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
Nginx代码完全用C语言从头写成,官方数据测试表明能够支持高达50,000个并发连接数的响应。
Nginx的作用
HTTP代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理
正向代理是代理客户端,反向代理是代理服务端
正向帮客户端请求数据,反向帮服务端接请求
正向代理
我需要这个服务器转发 客户端A给服务器发信息 告诉客户端B要做什么事情 然后客户端B做完告诉服务器 然后服务器再告诉客户端A
正向代理就是我们自己电脑装个东西
反向代理就是服务器别人那边装个东西
反向代理
正向代理指的是 代理的客户端 服务器不知道具体是谁请求的 ,而反向代理指的是代理服务器 客户端不知道具体是哪一台服务器提供的服务
负载均衡
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,
hash。扩展策略,就天马行空,只有你想不到的没有他做不到的。
轮询
加权轮询
iphash
对客户端的IP进行hash操作,然后根据hash结果将同一个客户端的ip请求分发给同一台服务器进行处理,可以解决session不共享的问题。
动静分离,在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:CSS,HTML,JPG,JS等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,提高资源响应的速度。
目前,通过使用Nginx大大提高了我们网站的响应速度,优化了用户体验,让网站的健壮性更上一层楼。