Docker IP的改变使得锁定MySQL访问变得棘手



我试图将访问MySQL用户帐户锁定到一个IP地址,但似乎每次启动docker容器时,IP地址都会发生变化。

docker run -it company/my-app bash

设置mysql客户端

apt-get update
apt-get upgrade
apt-get install mysql-client

现在我将连接使用:

mysql -u blah -h database.host.com -p
Access denied for user 'blah'@'172.17.0.63' (using password: YES)

然后我将授予blah'@'172.17.0.63的所有权限,并且我可以从容器访问数据库。现在我将启动一个新的docker容器并重复上面的步骤,我将再次得到:

Access denied for user 'blah'@'172.17.0.64' (using password: YES)

每次启动docker容器,IP地址似乎都会增加。

我可以将主机限制为%.%.%.%,但这只是意味着任何IP地址都可以连接,这并不像我想要的那样安全。

是否有某种方法来限制访问mysql帐户只有一个docker容器或一组容器?

您可以配置一个小的dnsmasq实例供MySQL使用,并运行一个脚本,当容器的IP地址发生变化时自动更新DNS记录

我写了一个小脚本来做到这一点(粘贴在下面),它会自动更新与容器名称相同的DNS记录,并将它们指向容器的IP地址:

#!/bin/bash
# 10 seconds interval time by default
INTERVAL=${INTERVAL:-10}
# dnsmasq config directory
DNSMASQ_CONFIG=${DNSMASQ_CONFIG:-.}
# commands used in this script
DOCKER=${DOCKER:-docker}
SLEEP=${SLEEP:-sleep}
TAIL=${TAIL:-tail}
declare -A service_map
while true
do
    changed=false
    while read line
    do
        name=${line##* }
        ip=$(${DOCKER} inspect --format '{{.NetworkSettings.IPAddress}}' $name)
        if [ -z ${service_map[$name]} ] || [ ${service_map[$name]} != $ip ] # IP addr changed
        then
            service_map[$name]=$ip
            # write to file
            echo $name has a new IP Address $ip >&2
            echo "host-record=$name,$ip"  > "${DNSMASQ_CONFIG}/docker-$name"
            changed=true
        fi
    done < <(${DOCKER} ps | ${TAIL} -n +2)
    # a change of IP address occured, restart dnsmasq
    if [ $changed = true ]
    then
        systemctl restart dnsmasq
    fi
    ${SLEEP} $INTERVAL
done

然后,创建与容器名称相等的主机MySQL用户,例如,您的容器名称是blah,然后创建MySQL用户为'you'@'blah'

我认为你目前的做法是错误的。你可以简单地使用官方的MySQL容器并链接到你想要访问的容器:

docker run --name some-app --link some-mysql:mysql -d app-that-uses-mysql

这将在some-app/etc/hosts文件中添加一个名为"mysql"的条目,指向mysql容器,如docker链接文档中所述。

最新更新