一文搞定快速使用 Docker Compose 玩转 Traefik v2(一)

本文涉及的产品
.cn 域名,1个 12个月
简介: 一文搞定快速使用 Docker Compose 玩转 Traefik v2(一)

Traefik 路由到 Docker 容器



微信图片_20220611112804.png


创建一个新的 docker 网络


docker network create traefik_net

Traefik 和 containers(容器)需要在同一网络上。Compose 会自动创建一个,但事实是隐藏的,以后可能会发生混乱。最好仅创建自己的网络并将其设置为每个 compose 文件中的默认网络。


使用 docker network inspect traefik_net 查看连接到该网络的容器


创建 traefik.yml


该文件包含所谓的静态 traefik 配置。

在此基本示例中,只有很少的关于 settings(设置)的解释。

因为 exposedbydefault 被设置为 false,标签 "traefik.enable=true" 将需要用于应该由 traefik 路由的容器。


这个文件将通过 bind mount 传递给 docker 容器,这将在我们为 traefik 使用 docker-compose.yml 时完成。


traefik.yml


## STATIC CONFIGURATION
log:
  level: INFO
api:
  insecure: true
  dashboard: true
entryPoints:
  web:
    address: ":80"
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false


稍后,当 traefik 容器运行时,使用命令 docker logs traefik, 检查是否有提示:"Configuration loaded from file: /traefik.yml"。您不想成为对 traefik.yml 进行更改的 moron,并且它什么也不做,因为实际上并未使用该文件。


创建 .env


它包含一些环境变量。

域名,API密钥,IP地址,密码…… 无论是针对一种情况的特定情况,还是针对另一种情况的不同情况,所有这些都理想地放在了这里。运行 docker-compose up 命令时,这些变量可用于 docker-compose。

这使得编写文件可以更自由地从一个系统移动到另一个系统,并且可以对 .env 文件进行更改, 因此,在大型编写文件或类似文件中忘记更改某些主机规则中的域名的错误可能性更小。


.env


MY_DOMAIN=example.com
DEFAULT_NETWORK=traefik_net


命令 docker-compose config 显示了填充变量后的 compose 状态。

这些变量仅在容器的初始构建期间填写。如果一个 env 变量也应该在运行的容器中可用,则需要在 compose 文件的 environment 部分声明它。


创建 traefik-docker-compose.yml


这是一个简单的典型 compose 文件。

端口 80 已映射,因为我们希望 traefik 负责端口上的内容-将其用作 entrypoint(入口点)。端口 8080 用于 traefik 显示信息的仪表板。需要挂载 docker.sock,因此它实际上可以完成与 docker 交互的工作。 traefik.yml 的挂载是给出静态 traefik 配置的原因。默认网络被设置为第一步中创建的网络,因为它将在所有其他 compose 文件中设置。


traefik-docker-compose.yml


version: "3.7"
services:
  traefik:
    image: "traefik:v2.1"
    container_name: "traefik"
    hostname: "traefik"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./traefik.yml:/traefik.yml:ro"
networks:
  default:
    external:
      name: $DEFAULT_NETWORK


运行 traefik-docker-compose.yml


docker-compose -f traefik-docker-compose.yml up -d 将会启动 traefik 容器。

traefik 正在运行,您可以在 ip:8080 上检查它,在那里您可以得到仪表板。

也可以用 docker logs traefik 检查日志。


通常你会看到指南只有一个名为 docker-compose.yml 文件。其中包含多个服务/容器。然后只需 docker-compose up -d 就可以开始了。当所有都是一个 compose 时,你甚至不需要费心去定义网络。但这一次,我更喜欢在学习新东西时采取小而独立的步骤。这就是为什么使用自定义命名的 docker-compose 文件,因为它允许更容易的分离。


您在教程中还可以看到没有提及 traefik.yml,而东西只是使用 traefik 的命令或标签从 docker-compose 传递的。


如: command: --api.insecure=true --providers.docker

但是这样一来,组合文件看起来会更加混乱,您仍然无法从那里进行任何操作,有时您仍然需要 traefik.yml。


所以...现在,使用结构良好的可读 traefik.yml

在 traefik 应该路由的容器上添加标签

以下是 whoami,nginx,apache,portainer 的示例。


- "traefik.enable=true"



启用 traefik


- "traefik.http.routers.whoami.entrypoints=web"



定义名为 whoami 的路由,该路由在入口点 Web(端口80)上侦听


- "traefik.http.routers.whoami.rule=Host(whoami.$MY_DOMAIN)"



定义此 whoami 路由规则,特别是当 url 等于 whoami.example.com(域名来自 .env 文件)时, 这意味着路由可以完成其工作并将其路由到服务。


不需要其他任何东西,traefik 可以从这些标签来自 docker 容器的上下文中了解其余信息。


whoami-docker-compose.yml


version: "3.7"
services:
  whoami:
    image: "containous/whoami"
    container_name: "whoami"
    hostname: "whoami"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.rule=Host(`whoami.$MY_DOMAIN`)"
networks:
  default:
    external:
      name: $DEFAULT_NETWORK


nginx-docker-compose.yml


version: "3.7"
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    hostname: nginx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nginx.entrypoints=web"
      - "traefik.http.routers.nginx.rule=Host(`nginx.$MY_DOMAIN`)"
networks:
  default:
    external:
      name: $DEFAULT_NETWORK


apache-docker-compose.yml


version: "3.7"
services:
  apache:
    image: httpd:latest
    container_name: apache
    hostname: apache
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.apache.entrypoints=web"
      - "traefik.http.routers.apache.rule=Host(`apache.$MY_DOMAIN`)"
networks:
  default:
    external:
      name: $DEFAULT_NETWORK


portainer-docker-compose.yml


version: "3.7"
services:
  portainer:
    image: portainer/portainer
    container_name: portainer
    hostname: portainer
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - portainer_data:/data
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.portainer.entrypoints=web"
      - "traefik.http.routers.portainer.rule=Host(`portainer.$MY_DOMAIN`)"
networks:
  default:
    external:
      name: $DEFAULT_NETWORK
volumes:
  portainer_data:


运行容器


docker-compose -f whoami-docker-compose.yml up -d
docker-compose -f nginx-docker-compose.yml up -d
docker-compose -f apache-docker-compose.yml up -d
docker-compose -f portainer-docker-compose.yml up -d


停止所有容器运行:docker stop $(docker ps -q)


Traefik 路由到本地 IP 地址



当 url 应该瞄准其他东西而不是 docker 容器。


微信图片_20220611113342.png


定义 file provider,添加所需的路由和服务


所需要的是一个能够捕获某些 url 并将其路由到某些 IP 的 router。前面的示例显示了如何在端口 80 上捕获任何 url,但是没有人告诉它在符合规则的情况下该怎么做。Traefik 只是知道,因为它是在容器的上下文中使用标签完成的, 而且由于 docker 在 traefik.yml 中被设置为提供程序。


对于这种 “在某些 IP 上发送流量”,需要 traefik 服务, 并且要定义 traefik 服务,需要一个新的提供程序, 即 file provider - 只是一个(fucking stupid)文件,告诉 traefik 该怎么做。


某种常见的做法是将 traefik.yml 本身设置为 file provider,以便进行处理。

在提供者下有一个新的 file 部分,并设置了 traefik.yml 本身。

然后添加动态配置的东西。


一个名为 route-to-local-ip 的 router,有一个简单的子域主机名规则。符合该规则(在本例中为确切的网址 test.example.com)的内容将发送到 loadbalancer 服务, 该服务会将其路由到特定的 IP 和特定的端口。

traefik.yml


## STATIC CONFIGURATION
log:
  level: INFO
api:
  insecure: true
  dashboard: true
entryPoints:
  web:
    address: ":80"
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
  file:
    filename: "traefik.yml"
## DYNAMIC CONFIGURATION
http:
  routers:
    route-to-local-ip:
      rule: "Host(`test.example.com`)"
      service: route-to-local-ip-service
      priority: 1000
      entryPoints:
        - web
  services:
    route-to-local-ip-service:
      loadBalancer:
        servers:
          - url: "http://10.0.19.5:80"


路由的优先级设置为 1000,这是一个非常高的值,超过了任何其他可能的路由。

不幸的是 .env 变量在这里不起作用,否则主机规则中的域名和 IP 将来自变量。因此,抬起头来,您肯定会忘记更改这些。


运行 traefik-docker-compose


测试是否有效


docker-compose -f traefik-docker-compose.yml up -d


Traefik 中间件




任何容器的身份验证中间件的示例。

微信图片_20220611113414.png

创建一个新文件 users_credentials


包含 username:passwords 对,htpasswd 格式

在下面的示例中,密码 krakatoa 设置为下面所有3个帐户

users_credentials


me:$apr1$L0RIz/oA$Fr7c.2.6R1JXIhCiUI1JF0
admin:$apr1$ELgBQZx3$BFx7a9RIxh1Z0kiJG0juE/
bastard:$apr1$gvhkVK.x$5rxoW.wkw1inm9ZIfB0zs1


挂载 users_credentials

traefik-docker-compose.yml


version: "3.7"
services:
  traefik:
    image: "traefik:v2.1"
    container_name: "traefik"
    hostname: "traefik"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./traefik.yml:/traefik.yml:ro"
      - "./users_credentials:/users_credentials:ro"
networks:
  default:
    external:
      name: $DEFAULT_NETWORK


在应该进行身份验证的任何容器中添加两个标签


  • 第一个标签将名为 auth-middleware 的新中间件附加到已存在的 whoami 路由器上。
  • 第二个标签为该中间件提供了 basicauth 类型,并告诉它用于认证用户的文件在哪里。

无需在此处安装 users_credentials,它是 traefik 所需的文件, 这些标签是一种将信息传递给 traefik 的方式,它应该在容器的上下文中进行操作。


whoami-docker-compose.yml


version: "3.7"
services:
  whoami:
    image: "containous/whoami"
    container_name: "whoami"
    hostname: "whoami"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.rule=Host(`whoami.$MY_DOMAIN`)"
      - "traefik.http.routers.whoami.middlewares=auth-middleware"
      - "traefik.http.middlewares.auth-middleware.basicauth.usersfile=/users_credentials"
networks:
  default:
    external:
      name: $DEFAULT_NETWORK


nginx-docker-compose.yml


version: "3.7"
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    hostname: nginx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nginx.entrypoints=web"
      - "traefik.http.routers.nginx.rule=Host(`nginx.$MY_DOMAIN`)"
      - "traefik.http.routers.nginx.middlewares=auth-middleware"
      - "traefik.http.middlewares.auth-middleware.basicauth.usersfile=/users_credentials"
networks:
  default:
    external:
      name: $DEFAULT_NETWORK


运行容器,现在需要登录名和密码


docker-compose -f traefik-docker-compose.yml up -d
docker-compose -f whoami-docker-compose.yml up -d
docker-compose -f nginx-docker-compose.yml up -d


相关文章
|
28天前
|
Kubernetes 监控 Docker
Docker Compose与Kubernetes的比较
【6月更文挑战第11天】本文探讨了Docker Compose与Kubernetes在容器编排中的角色。Docker Compose适合简单部署和开发环境,提供一键启动多容器的便利;而Kubernetes则适用于大规模生产环境,具备自动化运维、集群管理和负载均衡等功能。Python在容器编排中扮演重要角色,示例代码展示了如何使用Python的Docker SDK和Kubernetes客户端进行部署、扩展和日志管理。通过Python,开发者可以实现自定义监控、自动水平扩展和实时日志监控等高级功能,增强了容器编排的灵活性和自动化。
51 1
Docker Compose与Kubernetes的比较
|
7天前
|
运维 Kubernetes 负载均衡
docker、docker compose、k8s有什么区别?
Docker 这个东西所扮演的角色,容易理解,它是一个容器引擎,也就是说实际上我们的容器最终是由Docker创建,运行在Docker中,其他相关的容器技术都是以Docker为基础,它是我们使用其他容器技术的核心。
38 1
|
13天前
|
安全 关系型数据库 开发者
Docker Compose凭借其简单易用的特性,已经成为开发者在构建和管理多容器应用时不可或缺的工具。
Docker Compose是容器编排利器,简化多容器应用管理。通过YAML文件定义服务、网络和卷,一键启动应用环境。核心概念包括服务(组件集合)、网络(灵活通信)、卷(数据持久化)。实战中,编写docker-compose.yml,如设置Nginx和Postgres服务,用`docker-compose up -d`启动。高级特性涉及依赖、环境变量、健康检查和数据持久化。最佳实践涵盖环境隔离、CI/CD、资源管理和安全措施。案例分析展示如何构建微服务应用栈,实现一键部署。Docker Compose助力开发者高效驾驭复杂容器场景。
30 1
|
13天前
|
存储 监控 安全
Docker Compose:轻松实现容器编排的利器
【7月更文挑战第2天】 1. **基础与概念**:服务(多容器实例)、网络(灵活通信)、卷(数据持久化)和配置(安全管理)。 2. **实战指南**:安装Compose,编写`docker-compose.yml`文件,启动应用,并介绍依赖、环境变量、健康检查和数据持久化。 3. **最佳实践**:环境隔离、CI/CD集成、资源管理、日志监控、安全策略及案例分析,展示完整应用栈搭建。
35 1
|
22天前
|
NoSQL Redis Docker
使用 Docker Compose 接管现有容器的文档
使用 Docker Compose 接管现有容器的文档
28 2
|
17天前
|
消息中间件 监控 RocketMQ
Docker Compose 一键快速部署 RocketMQ
Docker Compose 一键快速部署 RocketMQ
29 0
|
1月前
|
关系型数据库 持续交付 数据库
简化多容器应用部署:深入理解 Docker Compose
简化多容器应用部署:深入理解 Docker Compose
148 0
|
29天前
|
NoSQL 关系型数据库 Redis
Docker的通俗理解和通过宿主机端口访问Redis容器的实例
本文目标:引导初学者入门Docker,理解镜像、容器和宿主机概念,学习常用Docker命令,特别是如何创建并从Redis容器通过宿主机端口访问。 关键点: - Docker核心:镜像(类)、容器(实例)、宿主机(运行环境)。 - `docker pull` 拉取镜像,如 `redis:3.0`。 - `docker run -d --name` 后台运行容器,如 `my-redis`。 - `-p` 参数做端口映射,如 `6379:6379`。 - `docker exec -it` 交互式进入容器,如 `bash` 或执行命令。
113 4
|
26天前
|
前端开发 安全 数据库
Web架构&前后端分离站&Docker容器站&集成软件站&建站分配
Web架构&前后端分离站&Docker容器站&集成软件站&建站分配
|
18天前
|
jenkins 持续交付 开发者
利用Docker容器化部署应用的实战指南
【6月更文挑战第27天】本文详述Docker应用部署,涵盖Docker基本概念、安装、镜像制作及运行。通过编写Dockerfile构建镜像,使用`docker build`、`run`、`push`及`stop`命令管理。集成CI/CD工具如Jenkins,实现自动化构建、测试和部署,提升开发效率与部署质量。Docker助力轻量级、可移植的微服务架构。