我试图将访问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链接文档中所述。