Networking with docker-compose
默认情况下,docker-compose只是设置一个单独的网络为所有的程序,每个容器都可以看到其他所有的容器。
默认网络的名字由docker-compose配置文件所在目录决定。因此,如果目录叫作py_docker, 当我们执行docker-compose的时候,网络就叫做py_docker_default。
之前我们提到了端口,当创建WordPress容器的时候。为了更好的解释网络,我们使用docker-compose.yml来玩转WordPress程序:
在上面的配置文件中,我们有两个服务:db和wordpress。
在WordPress服务里,我们把端口80映射成8000。毫无疑问,在来浏览器里面访问WordPress需要访问8000端口。
在db服务的配置中没有关于端口的设置。在官网上,可以查到,mysql的端口3306被暴露出来。这个是MySQL的默认端口。可以通过如下链接查看更多https://hub.docker.com/r/library/mysql。
NOTE
我们没有给DB做端口映射,因为没有必要;我们只是希望WordPress程序可以和DB进行通信就好了。仅仅需要DB在容器环境中被映射,那样,wordpress可以和其进行通信,配置是:WORDPRESS_DB_HOST:db:3306。
NOTE
在docker-compose文件中,下面介绍如何将容器和容器进行通信:
- 注意镜像运行时哪个端口你想让它暴露出来。
- 参考服务连接的容器;在当前场景下,db服务被WordPress服务连接。
- Since we named the service db, we reference this connection as db:3306.
- Therefore, the format is <service>:<port exposed by that service>.
Run the WordPress Containers
接下来,我们来看看容器之间是如何连接、同步和沟通的。
在compose文件里,有没有注意到restart选项,这个选项一共有如下几个可选值:
- no
- always
- on-failure
- unless-stopped
如果不指定,默认是no。在任何情况下都不会重启。但是,咱们这里的db服务指定了restart:always,所以容器总是会在异常的时候重启。
让我们看看Django的网络是如何工作的。下面是它的docker-compose.yml文件:
可能你没有在WordPress站点里看到网络部分出现。下面是一段片段:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'HOST': 'db', 'PORT': 5432, } }
问题是,我们是怎么知道名字是postgres,HOST是db,端口是5432的呢?
These are the default values set in the postgres image and containers we run.
这个是我们运行的postgres镜像的默认值。
为了更清楚, 您可以在官方的 Postgres Docker 库中查看这一行:
You can obtain a Postgres Docker sample from GitHub at: https://github.com/docker-library/postgres/blob/master/10/docker-entrypoint.sh#L101.
之前说过,Host是DB,因为服务名字是db(由我们运行的postgres镜像决定)。
You can obtain a Postgres Docker example from GitHub at: https://github.com/docker-library/postgres/blob/master/10/Dockerfile#L132:
配置文件间接证明了这单。
本文暂时没有评论,来添加一个吧(●'◡'●)