【问题标题】:How to connect app container and redis container together on Docker on the same host?如何在同一主机上的 Docker 上将 app 容器和 redis 容器连接在一起?
【发布时间】:2021-10-07 02:34:52
【问题描述】:

我有文件夹 redis-docker

文件:docker-compose.yml

version: '3'
services:
    redis:
        image: redis:latest
        ports:
            - 6379:6379
        volumes:
            - ./config/redis.conf:/redis.conf
        command: [ "redis-server", "/redis.conf" ]

文件:redis.conf

bind 0.0.0.0

我有文件夹 test-redis

文件:docker-compose.yml

version: '3'
services:
  web:
    build: .
    volumes:
      - .:/code 

文件:Dockerfile

FROM amd64/python:3

WORKDIR /code

COPY . .
RUN pip install --no-cache-dir -r requirements.txt

ENV LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
EXPOSE 6379

CMD [ "python", "./test.py" ]

文件:requirements.txt

redis

文件:test.py

import redis

# connect to redis
client = redis.Redis(host=redis, port=6379)

# set a key
client.set('test-key', 'test-value')

# get a value
value = client.get('test-key')
print(value)

我执行了 2 个命令

docker-compose up
docker exec -it redis-docker_redis_1 redis-cli ping

结果像 Pic2

Redis 工作得很好,但此时我不知道如何“test-redis”连接并使用这个“redis-docker”。我花了超过 48 小时研究,但无济于事。我是 Docker 新手。请帮帮我

谢谢

【问题讨论】:

  • 您必须使用 Redis 和 python 应用程序制作一个单一的撰写文件。否则,每个容器都有自己的个人网络Docker networking
  • 我知道,但现在我想制作 2 个单独的容器
  • 您可以拥有一个启动两个容器的docker-compose.yml 文件。这是一个非常正常的设置。

标签: python docker redis


【解决方案1】:

在这里发布问题几个小时后,我自己成功找到了解决方案。我会分享给大家,让像我这样的人以后节省时间

创建2个文件夹“redis-docker”“test-redis”

  1. “redis-docker”文件夹将包含以下文件

文件:docker-compose.yml

version: '3'
services:
    redis:
        image: redis:latest
        ports:
            - 6379:6379
        volumes:
            - ./config/redis.conf:/redis.conf
        command: [ "redis-server", "/redis.conf" ]

文件:Dockerfile

FROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

文件:redis.conf

bind 0.0.0.0
  1. "test-redis" 文件夹将包含以下文件

文件:docker-compose.yml

version: '3'
services:
  web:
    build: .
    volumes:
      - .:/code 

文件:Dockerfile

FROM amd64/python:3

WORKDIR /code

COPY . .
RUN pip install --no-cache-dir -r requirements.txt

ENV LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
EXPOSE 6379

CMD [ "python", "./test.py" ]

文件:requirements.txt

redis

文件:test.py

# connect to redis
client = redis.Redis(host='**you will have this parameter at the bottom**', port=6379)
# set a key
client.set('test-key', 'test-value')
# get a value
value = client.get('test-key')
print(value)

您将目录上传到您的服务器,在本例中,我将上传目录 /root/。你执行以下命令

cd /root/redis-docker
docker build --no-cache . -t redisserverimg
docker run -it --rm --name B1 redisserverimg

继续,你需要打开一个新的CMD

docker network inspect bridge 

你会看到像图片,保存那个IP172.17.0.2,然后用Python代码替换它

Picture1

继续,你需要打开一个新的CMD

cd /root/test-redis
docker build --no-cache . -t testredisimg
docker run -it --rm --name B2 testredisimg

全部完成,运行良好,2 个不同的容器。一个用于存储数据,另一个用于运行 Python。并且可以使用下面的命令来访问容器B1的redis-cli

docker exec -it B1 redis-cli 

感谢您的阅读。我希望我的这个小小的分享可以节省你一整天的时间

【讨论】:

  • 所有这些命令当你简单地制作一个 single compose file 并得到相同的结果?
  • 它不能解决我的问题,我需要2个不同的容器,如果只有1个容器我不会在这里问它
  • 我假设您没有尝试过单个合成文件,否则您会清楚地看到两个不同的容器。
  • (这是最后一条评论,请冷静点)。请重新阅读我所说的:一个 Composefile == 两个容器。询问如何连接两个容器:我和@DavidMaze 说这是 compose 上非常常见的场景,我们邀请您阅读有关它的文档,尤其是有关网络的文档(您遇到的问题)。逐个启动容器(不指定网络)获得桥接网络,而不是在单个合成文件上启动容器获得相同的网络。
  • 几个月后通读这篇文章,寻找不同问题的解决方案,我真的觉得 OP 的解决方案是 docker 的反模式。据我所知,这正是 docker-compose 的用例,其中两个服务都应该在一个 docker-compose 文件中进行管理。 IP 地址的复制粘贴与容器化服务方法并不真正兼容,这就是为什么单个 docker-compose 文件会为您管理它的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2020-08-31
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多