haz*_*haz 6 networking rabbitmq docker docker-compose
我想在一个容器中运行RabbitMQ,在另一个容器中运行工作进程。工作进程需要访问RabbitMQ。
我希望这些可以通过管理docker-compose。
docker-compose.yml到目前为止,这是我的文件:
version: "3"
services:
rabbitmq:
image: rabbitmq
command: rabbitmq-server
expose:
- "5672"
- "15672"
worker:
build: ./worker
depends_on:
- rabbitmq
# Allow access to docker daemon
volumes:
- /var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
因此,我公开了RabbitMQ端口。工作进程使用以下URL访问RabbitMQ:
amqp://guest:guest@rabbitmq:5672/
Run Code Online (Sandbox Code Playgroud)
它们在官方教程中使用的是它们,但localhost已被替换为rabbitmq,因为容器应该可以使用与容器名称相同的主机名来发现:
默认情况下,Compose为您的应用设置单个网络。服务的每个容器都加入默认网络,并且都可以被该网络上的其他容器访问,并且可以在与容器名称相同的主机名下被发现。
每当我运行此命令时,都会出现连接拒绝错误:
Recreating ci_rabbitmq_1 ... done
Recreating ci_worker_1 ... done
Attaching to ci_rabbitmq_1, ci_worker_1
worker_1 | dial tcp 127.0.0.1:5672: connect: connection refused
ci_worker_1 exited with code 1
Run Code Online (Sandbox Code Playgroud)
我发现这很有趣,因为即使我将其指定为主机名,它也会使用IP地址127.0.0.1(我认为)是。我不是Docker网络方面的专家,所以也许这是理想的。localhostrabbitmq
如果需要,我很乐意提供更多信息!
编辑
有几乎相同的问题在这里。我认为我需要等到rabbitmq启动后才能开始worker。我尝试通过运行状况检查来做到这一点:
version: "2.1"
services:
rabbitmq:
image: rabbitmq
command: rabbitmq-server
expose:
- "5672"
- "15672"
healthcheck:
test: [ "CMD", "nc", "-z", "localhost", "5672" ]
interval: 10s
timeout: 10s
retries: 5
worker:
build: .
depends_on:
rabbitmq:
condition: service_healthy
Run Code Online (Sandbox Code Playgroud)
(请注意其他版本)。但是,这行不通-总是会因为不健康而失败。
cra*_*eem 13
这是正确的工作示例:
version: "3.8"
services:
rabbitmq:
image: rabbitmq:3.7.28-management
#container_name: rabbitmq
volumes:
- ./etc/rabbitmq/conf:/etc/rabbitmq/
- ./etc/rabbitmq/data/:/var/lib/rabbitmq/
- ./etc/rabbitmq/logs/:/var/log/rabbitmq/
environment:
RABBITMQ_ERLANG_COOKIE: ${RABBITMQ_ERLANG_COOKIE:-secret_cookie}
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER:-admin}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS:-admin}
ports:
- 5672:5672 #amqp
- 15672:15672 #http
- 15692:15692 #prometheus
healthcheck:
test: [ "CMD", "rabbitmqctl", "status"]
interval: 5s
timeout: 20s
retries: 5
mysql:
image: mysql
restart: always
volumes:
- ./etc/mysql/data:/var/lib/mysql
- ./etc/mysql/scripts:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mysqldb
MYSQL_USER: ${MYSQL_DEFAULT_USER:-testuser}
MYSQL_PASSWORD: ${MYSQL_DEFAULT_PASSWORD:-testuser}
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
timeout: 20s
retries: 10
trigger-batch-process-job:
build: .
environment:
- RMQ_USER=${RABBITMQ_DEFAULT_USER:-admin}
- RMQ_PASS=${RABBITMQ_DEFAULT_PASS:-admin}
- RMQ_HOST=${RABBITMQ_DEFAULT_HOST:-rabbitmq}
- RMQ_PORT=${RABBITMQ_DEFAULT_PORT:-5672}
- DB_USER=${MYSQL_DEFAULT_USER:-testuser}
- DB_PASS=${MYSQL_DEFAULT_PASSWORD:-testuser}
- DB_SERVER=mysql
- DB_NAME=mysqldb
- DB_PORT=3306
depends_on:
mysql:
condition: service_healthy
rabbitmq:
condition: service_healthy
Run Code Online (Sandbox Code Playgroud)
啊哈!我修好了它。@Ijaz完全正确-RabbitMQ服务需要一段时间才能启动,而我的工作人员会在运行之前尝试进行连接。
我尝试使用延迟,但是当RabbitMQ花费的时间比平时长时失败。
这也表明存在较大的体系结构问题-如果排队服务(在我的情况下为RabbitMQ)在生产期间脱机怎么办?现在,我的整个网站都失败了。需要一些内置的冗余和轮询。
如该相关答案所述,我们可以在docker-compose中使用运行状况检查3+:
version: "3"
services:
rabbitmq:
image: rabbitmq
command: rabbitmq-server
expose:
- 5672
- 15672
healthcheck:
test: [ "CMD", "nc", "-z", "localhost", "5672" ]
interval: 5s
timeout: 15s
retries: 1
worker:
image: worker
restart: on-failure
depends_on:
- rabbitmq
Run Code Online (Sandbox Code Playgroud)
现在,在容器保持不正常状态的worker同时,容器将重新启动几次rabbitmq。成功时(即排队rabbitmq时)立即变得健康nc -z localhost 5672!
这里的答案对我有用并且更简单:
如果您只需要进行基本检查,您可以使用rabbitmq-diagnostics -q ping 命令。
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 30s
timeout: 30s
retries: 3
Run Code Online (Sandbox Code Playgroud)