之前的一篇文章,我讲过了Docker的基本使用,今天继续讲讲Docker的四种网络,以及配置时,会遇到的坑,以及解决办法。如果对Docker的基本概念与使用感兴趣的可以看我另一篇文章 3分钟读懂docker使用https://zhuanlan.zhihu.com/p/636860099
Docker网络模型
Docker有这四大网络模型,Docker的在不指定网络模型的情况下,默认是bridge模式。这就会容易出问题比如
场景1:安装Kafka
1.安装zookeeper
docker pull zookeeper:3.4.12
docker run --name zookeeper -d -p 2181:2181 zookeeper:3.4.12
2.安装kafka
docker pull wurstmeister/kafka:2.13-2.7.0
docker run -d --name kafka \
-p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=127.0.0.1:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092 \
--env KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka:2.13-2.7.0
问题:
在执行上面kafka的容器创建语句时,你就会发现一直启动失败,然后出现下面提示语:Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error) 。
原因:
这个提示语,就是因为docker模式的网络模式是桥接模式,不同的容器之间会有不同的ip,网上的很多教程都是直接写的127.0.0.1,如果是在linux上直接配置是可行的,但是对于docker如果创建容器不专门指定网络模式情况下,是行不通的。
解决办法:
办法1:docker inspect zookeeper --format='{{ .NetworkSettings.IPAddress }}' 执行该命令,就能得到zookeeper容器的ip地址,然后使用该ip地址进行配置
办法2:在docker run命令创建容器时,使用--net=host,这样来指定其他的网络模式,来解决这个问题。
场景2:docker中的nginx配置ssl证书
1.nginx.conf文件:
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name cloud.tencent.com;
#请填写证书文件的相对路径或绝对路径
ssl_certificate cloud.tencent.com_bundle.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key cloud.tencent.com.key;
ssl_session_timeout 5m;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080/;
}
}
2.创建nginx容器
docker run -p 80:80 --name nginx -d nginx
问题:
你会发现,nginx启动失败,你的https请求,一直刷新不出页面。
原因:
因为docker默认是桥接模式,所以proxy_pass http://127.0.0.1:8080/; 是跳转不成功的,需要替换成linux的内网地址。docker run命令没有添加443端口,导致外部的443端口与容器的443端口没有映射关系。使得ssl证书的解析会失败。