Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 无法使用领事部署traefik_Docker_Docker Compose_Devops_Consul_Traefik - Fatal编程技术网

Docker 无法使用领事部署traefik

Docker 无法使用领事部署traefik,docker,docker-compose,devops,consul,traefik,Docker,Docker Compose,Devops,Consul,Traefik,我正试图在docker上部署一个traefik堆栈,并将Concur作为键/值存储。我的群集由三个节点和三个主节点组成: ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION rqg08lc4ixgjuo1azi57654z1 * tools-master-1 Ready

我正试图在docker上部署一个traefik堆栈,并将Concur作为键/值存储。我的群集由三个节点和三个主节点组成:

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
rqg08lc4ixgjuo1azi57654z1 *   tools-master-1      Ready               Active              Leader              18.03.1-ce
vi42z7f8dx6bgrhzbda8v7z15     tools-master-2      Ready               Active              Reachable           18.03.1-ce
khz5x5g28i64owyo8tykedern     tools-master-3      Ready               Active              Reachable           18.03.1-ce
每个节点都位于不同的服务器上。为了尽可能地限制我这方面的任何潜在错误,我尝试使用Traefik的官方文档并严格遵守它;我使用了以下链接:

swarm集群本身正在工作,我可以在其上部署其他服务,一切似乎都正常。然而,我无法让traefik工作

我已经把它固定在一个点上,我做了以下工作: -从一个新创建的空VM开始 -安装docker和类似的基本工具 -复制与traefik官方文档末尾的docker compose完全相同的docker compose,但有三个例外,见下文 -启动docker堆栈部署测试-c/path/to/my/docker-compose.yml

唯一的三个区别是: -我显然改变了电子邮件和域名,把我自己的 -我从Concur的卷中删除了行驱动程序,因为我的docker实例在我请求overlay2时似乎无法识别。。。然而,根据法律,它应该是默认的

问题是:特拉菲克似乎无法与领事沟通。以下是traefik的输出:

testing_traefik.0.yy6vfo4qo3kl@tools-master-1    | time="2018-06-06T20:53:05Z" level=error msg="Load config error: Get http://consul:8500/v1/kv/traefik?consistent=&recurse=&wait=30000ms: dial tcp: lookup consul on 127.0.0.11:53: no such host, retrying in 20.35838976s"
据我猜测,Concur无法找到,或者dns本身无法被traefik找到。然而,这些服务正在增加:

ID                  NAME                   MODE                REPLICAS            IMAGE               PORTS
e78d24w45wzd        testing_consul         replicated          1/1                 consul:latest
o1dzrdqeoiy0        testing_traefik        global              3/3                 traefik:1.5
om8qac3upy22        testing_traefik_init   replicated          0/1                 traefik:1.5
我想它可能来自于只支持主机的网络。所以我决定试着把traefik从每一个港口剥离,让它变得无用,但现在我只想让它和领事谈谈。我还删除了webgateway网络,再次测试。再也没有运气了。。。由于这是官方文档的例子,我真的不知道在哪里可以找到更多的东西

所以,问题来了。。。有人知道是什么导致了这个错误吗?还是其他让traefik在swarm集群上使用let's encrypt的方法

谢谢大家!

PS:docker安装+服务器配置使用terraform+ansible完成。我怀疑这两件事可能是问题的根源,但这可能有助于调查,我可以共享.tf/.yml文件

编辑:我还发现dns解析问题似乎出现在一个服务想要对话/识别另一个服务时,如果这两个服务不在同一个swarm节点上

我在docker compose中添加了一个debian服务,然后进入容器中。从那里: -当我尝试ping traefik traefik作为docker compose中的一个全局服务时,它会出现在每个节点上,我可以 -当我尝试ping shell我添加的容器时,它不是它的主机名,因此通过DNS发现,我可以 -当我尝试ping另一个节点上的领事时,我不能,dns解析失败

所以我怀疑我的docker配置有问题?如果这有帮助的话,这里是swarm agent中docker信息的输出,它们都是使用相同的ansible任务安装的,因此它们的信息应该是相同的:

Containers: 3
 Running: 2
 Paused: 0
 Stopped: 1
Images: 2
Server Version: 18.03.1-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: active
 NodeID: rqg08lc4ixgjuo1azi57654z1
 Is Manager: true
 ClusterID: nydyw0ufzgy6739u15xvt1pts
 Managers: 3
 Nodes: 3
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot Interval: 10000
  Number of Old Snapshots to Retain: 0
  Heartbeat Tick: 1
  Election Tick: 10
 Dispatcher:
  Heartbeat Period: 5 seconds
 CA Configuration:
  Expiry Duration: 3 months
  Force Rotate: 0
 Autolock Managers: false
 Root Rotation In Progress: false
 Node Address: 10.15.15.39
 Manager Addresses:
  10.14.109.15:2377
  10.15.1.25:2377
  10.15.15.39:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 773c489c9c1b21a6d78b5c538cd395416ec50f88
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: 949e6fa
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.4.127-mainline-rev1
Operating System: Ubuntu 16.04.4 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 995.2MiB
Name: tools-master-1
ID: YFOZ:HA4F:UG52:EAGR:6G5O:554H:XXFO:YCGW:Q5CB:YQDF:OB7W:TYMB
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
好的,多亏了这篇文章:我发现了这个问题

问题来自两个主要来源:

首先,节点之间的通信必须允许在端口7946 tcp/udp和4789 udp以及2377上进行,但在我的案例中已经这样做了

其次,默认子网的IP似乎会干扰docker的dns。需要进行如下更改:

networks:
  traefik:
    driver: overlay
    ipam:
      config:
        - subnet: 10.0.0.0/24

无论子网是什么,只要它没有ip 172.0.0.11,这是docker的dns ip

也许你可以共享你的docker-compose.yml,好吗?我在集群中遇到了其他问题,它根本找不到traefik/in-consul。所以所有试图从traefik容器访问它的东西都失败了。