1.Docker中同种类型不同tag的镜像并非可互相替代
这个问题描述的挺绕的,看了好几遍才理解笔者的问题。意思就是不同版本的Mysql镜像不能混用。用户的环境如果想依赖不同版本Mysql镜像,一定要在测试一遍,因为镜像变了,内容也变了。所以我更认为这是使用方法的问题,不是Docker的坑。
2.不同时间段使用tag为latest的镜像,效果不尽相同
这个是Docker设计成这样,在分布式计算中,自动升级镜像后是无法知道下次启动的job会启动那个镜像。所以增加了这个设计。我认为还是使用方法的问题,不是Docker的坑。或者说,掌握最佳实践,如宏亮说的,不要用latest tag。
3.使用fig部署依赖性强的容器时出错
我在实际使用fig做开发是也遇到这个问题,我觉得fig就是一个不可用的工具。如果你大量使用fig会知道我想吐槽。目前还不如直接Build。
4.Swarm管理多个Docker Node时,Docker Node注册失败
我没有用过,没法发表意见。
5.Docker容器的DNS问题
这个坑有点冤枉Docker,设计成这样了。但到了中国,确实变成了坑。实际使用中,不要用Docker镜像去访问外网的内容,最好做到本地访问。
大部分见解一致,关于docker-compose(fig),我觉得没那么糟糕,当你有几十个系统,依赖关系错综复杂时,docker-compose(fig)是挺好的选择。
对于docker-compose(fig)服务依赖的问题,我自己是这么解决的:
在容器启动时,执行下面的脚本来检测links是否都已经启动了,都启动后自己才启动。
set -e
env | grep TCP=tcp:// | cut -d"/" -f3 | sed 's/:/ /g' | sort | uniq | grep -v 2888 | grep -v 3888 > /tmp/docker_links.tmp
try_connect_server_delay=5
if [ ${TRY_CONNECT_SERVER_DELAY} ]
then
try_connect_server_delay=${TRY_CONNECT_SERVER_DELAY};
fi
cat /tmp/docker_links.tmp | while read line
do
echo "try to connection $line on TCP..."
while true;
do
host=`echo $line | cut -d" " -f1`
port=`echo $line | cut -d" " -f2`
python -c "import socket;s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);s.connect(('$host', $port))" >/dev/null 2>/dev/null && break || echo "$line has not startup yet, waiting $try_connect_server_delay seconds and try again.... `env | grep TCP=tcp:// | grep $host | grep $port | sort | uniq | head -1`"
sleep $try_connect_server_delay
done
echo "$line startup done"
done
wait_links_init_time=90
if [ ${WAIT_LINKS_INIT_TIME} ]
then
wait_links_init_time=${WAIT_LINKS_INIT_TIME};
fi
echo "wait links init themself in $wait_links_init_time seconds, like mysql import sql"
sleep $wait_links_init_time
echo "all links startup done..."
最后等待这部分可以视情况是否需要:wait links init themself, like mysql import sql。