没有手动命令的Docker服务未加入docker-compose中指定的网络

时间:2018-12-29 04:22:01

标签: docker docker-compose

今晚我一直在为此苦苦挣扎。

我有一个docker compose文件,其中包含一些服务,RabbitMQ和一些发送器/接收器测试服务。

我已经将docker-compose.yml文件剥离了很基本,所以它只是RabbitMQ和一项测试服务,但是我仍然遇到同样的问题:测试服务无法自动连接到网络,因此测试服务失败。我尝试在撰写文件中手动指定网络,但这似乎无济于事。一旦启动,它就会失败并显示错误。

奇怪的是,如果我先运行docker network connect <networkname> <containerID>,然后再运行docker container start <containerID>,它将加入网络并按预期运行。

这是我的docker-compose.yml

version: '3'

services:

  sender:
    image: sender_test
    depends_on:
      - some-rabbit
    volumes:
      - /var/log/sender

  some-rabbit:
    image: rabbitmq:3
    hostname: some-rabbit
    ports:
      - 5672:5672

以及在sender容器的日志中得到的错误:

/usr/local/bundle/gems/bunny-2.13.0/lib/bunny/session.rb:333:in `rescue in start': Could not establish TCP connection to any of the configured hosts (Bunny::TCPConnectionFailedForAllHosts)
    from /usr/local/bundle/gems/bunny-2.13.0/lib/bunny/session.rb:305:in `start'
    from ./sender.rb:23:in `initialize'
    from ./sender.rb:83:in `new'
    from ./sender.rb:83:in `<main>'
W, [2018-12-29T04:00:53.179458 #1]  WARN -- #<Bunny::Session:0x55e4c3ae45b8 guest@some-rabbit:5672, vhost=/, addresses=[some-rabbit:5672]>: Could not establish TCP connection to some-rabbit:5672: Connection refused - connect(2) for 172.24.0.2:5672

有人有什么想法会出问题吗?很高兴根据需要提供任何进一步的信息。

编辑:由于显然可以在其他系统上使用,因此将在此处发布文件的内容:

sender.rb

#!/usr/bin/env ruby
require 'bunny'

class QueueAdder
  def initialize
    @connection = Bunny.new(host: 'some-rabbit', automatically_recover: false)
    @connection.start
    @channel = @connection.create_channel
  end

  def start(queue_name)
    @queue_name = queue_name
    @queue = @channel.queue(queue_name, durable: true)
    @exchange = @channel.default_exchange
  end

  def add_to_queue(message)
    @channel.default_exchange.publish(message, routing_key: @queue.name, persistent: true)
  end
end

add = QueueAdder.new
add.start('test')
6.times do |i|
  add.add_to_queue(i.to_s)
  #puts "#{i+5}"
  puts 'a'
  sleep 1
end

Dockerfile

FROM ruby:2.5.1
RUN apt-get update
RUN dpkg --configure -a
ENV TZ=Europe/London
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN gem install pry bunny
WORKDIR /home/
COPY . .
CMD ["ruby", "./sender.rb"]

我正在使用docker image build -t sender_test .构建映像,并使用docker-compose up -d启动docker-compose。

1 个答案:

答案 0 :(得分:0)

depends_on参数仅告诉compose您sender_test容器依赖于另一个(即,它需要在其后旋转)

但它不链接容器。

要链接容器,您需要使用link参数

尝试:

version: '3'

services:

  sender:
    image: sender_test
    depends_on:
      - some-rabbit
    volumes:
      - /var/log/sender
    links:
      - some-rabbit

  some-rabbit:
    image: rabbitmq:3
    hostname: some-rabbit
    ports:
      - 5672:5672

顺便说一句,在您的Rabbit容器中,您也将端口暴露给了主机,而这可能并不需要(例如,将- 5672:5672替换为- 5672),以便仅将容器暴露给主机。另一个容器,但不在外面。

编辑:

更有可能的是,发件人代码没有等待服务启动并准备好接收连接,而不是网络问题