Apache Mesos,MESOS-DNS,MARATHON和Docker

在我的环境中,以独立模式运行mesos-slave,mesos-master marathon和mesos-dns。 我部署的MySQL应用程序马拉松作为docker集装箱运行。

MySql的应用程序configuration如下。

{ "id": "mysql", "cpus": 0.5, "mem": 512, "instances": 1, "container": { "type": "DOCKER", "docker": { "image": "mysql:5.6.27", "network": "BRIDGE", "portMappings": [ { "containerPort": 3306, "hostPort": 32000, "protocol": "tcp" } ] } }, "constraints": [ [ "hostname", "UNIQUE" ]], "env": { "MYSQL_ROOT_PASSWORD": "password" }, "minimumHealthCapacity" :0, "maximumOverCapacity" : 0.0 } 

然后我部署应用程序称为MySQL客户端。 Mysql客户端应用程序需要连接到MySQL应用程序。

mysql的应用程序configuration如下。

 { "id": "mysqlclient", "cpus": 0.3, "mem": 512.0, "cmd": "/scripts/create_mysql_dbs.sh", "instances": 1, "container": { "type": "DOCKER", "docker": { "image": "mysqlclient:latest", "network": "BRIDGE", "portMappings": [{ "containerPort": 3306, "hostPort": 0, "protocol": "tcp" }] } }, "env": { "MYSQL_ENV_MYSQL_ROOT_PASSWORD": "password", "MYSQL_PORT_3306_TCP_ADDR": "mysql.marathon.slave.mesos.", "MYSQL_PORT_3306_TCP_PORT": "32000" }, "minimumHealthCapacity" :0, "maximumOverCapacity" : 0.0 } 

我的mesos-dns config.json。 如下

 { "zk": "zk://127.0.0.1:2181/mesos", "masters": ["127.0.0.1:5050"], "refreshSeconds": 60, "ttl": 60, "domain": "mesos", "port": 53, "resolvers": ["127.0.0.1"], "timeout": 5, "httpon": true, "dnson": true, "httpport": 8123, "externalon": true, "listener": "127.0.0.1", "SOAMname": "ns1.mesos", "SOARname": "root.ns1.mesos", "SOARefresh": 60, "SOARetry": 600, "SOAExpire": 86400, "SOAMinttl": 60, "IPSources": ["mesos", "host"] } I can ping with service name mysql.marathon.slave.mesos. from host machine. But when I try to ping from mysql docker container I get host unreachable. Why docker container cannot resolve hsot name? 

我尝试使用set dns参数来应用程序。 但它不工作。

编辑

我可以ping mysql.marathon.slave.mesos。 从主/从主机。 但是我不能从mysqlclient泊坞窗容器。 它说无法达到。 我怎样才能解决这个问题?

不知道你的实际问题是什么,通过猜测,我想你想知道如何解决一个Mesos DNS服务名称到MySQL客户端的实际端点。

如果是这样,你可以使用我的mesosdns-resolver bash脚本从Mesos DNS中获取端点:

 mesosdns-resolver.sh -sn mysql.marathon.mesos -s <IP_ADDRESS_OF_MESOS_DNS_SERVER> 

你可以在你的create_mysql_dbs.sh脚本中使用它(不pipe它做什么)来获得你的mysql应用程序运行的实际的IP地址和端口。

你可以像传入一个环境variables

 "MYSQL_ENV_SERVICE_NAME": "mysql.marathon.mesos" 

然后像这样在图像/脚本中使用它

 mesosdns-resolver.sh -sn $MYSQL_ENV_SERVICE_NAME -s <IP_ADDRESS_OF_MESOS_DNS_SERVER> 

另外请注意,马拉松不一定是运行一次性操作的正确工具(我假设你用第二个应用程序初始化你的数据库)。 Chronos会是更好的select。