每个容器都有自己的本地主机
每个服务都在其自己的容器中运行。从Ubuntu容器的角度来看,redis未监听localhost。
使用Docker网络
为了使您的容器进行通信,它们应该在同一Docker网络上。这包括三个步骤:
- 创建一个Docker网络
- 提供您的容器名称
- 将容器连接到您创建的网络
完成此操作后,容器可以使用其名称彼此对话,就好像它们是主机名一样。
剥皮这只猫的方法不止一种…我将在这个答案中介绍两种,但是我可能还不了解其他几种方法(例如,使用Kubernetes或Swarm)。
手工做
您可以使用
docker network命令为此应用程序创建网络。
# Show the current list of networksdocker network ls# Create a network for your appdocker network create my_redis_app
运行redis容器时,请确保它具有名称,并且在此网络上。如果需要(可以使用
-p),可以在外部(对macOS)公开端口,但这仅是其他容器与redis对话所必需的。
docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
现在运行您的Ubuntu容器。您也可以随意命名,但是在此示例中我不会打扰,因为该示例未运行任何服务。
docker run -it --network my_redis_app ubuntu bash
现在,从Ubuntu容器内部,您应该可以使用name来访问redis
redis_server,就像它是DNS名称一样。
使用撰写来做
我倾向于使用Compose构建这样的设置,因为将其写入YAML文件(IMO)更容易。这是上面的示例,以docker-compose.yml格式重写:
version: '2'services: redis: image: <IMAGE ID> networks: - my_redis_app ports: 6379:6379 ubuntu: image: ubuntu:latest networks: - my_redis_appnetworks: my_redis_app: driver: bridge
有了这个,您就可以
docker-compose up -dredis使用特定的Docker网络运行并使Redis服务联机。如果网络尚不存在,则Compose会为您创建网络。
以这种方式运行Ubuntu容器的意义不大……当然是交互式的。但是我认为一旦进行了Redis操作,您将添加某种应用程序容器,也许还会添加一个像nginx这样的Web代理…也只需将其他代理置于其中
services,就可以将它们全部管理在一起。
由于
ubuntu是交互式的,因此可以以交互方式运行它:
# without -d, container is run interactivelydocker-compose run ubuntu bash
现在,在Ubuntu中,您应该能够使用其名称连接到Redis,在此示例中,该名称仅为
redis。



