docker域名解析,docker swarm网络模式
阅读(118)发布于 2023-09-25
通常情况下我们可以使用dockerhub来存储,不过如果是在公司内部使用,不想将镜像公开,可以手动搭建一个本地registry,如dockerregistry或harbor。本文简单介绍一下dockerregistry的搭建使用及常用配置。如果要使用其他存储,如AmazonS3bucket,GoogleCloudPlatform或其他docker支持的存储,也可以通过环境变量单独配置。x509报错解决:x509报错通常就是自签证书没有加入到dockerclient所在host的信任证书中,手动加入即可。
为docker容器提供域名解析服务
仅列出我用过的几种方式
注意:
????每次更新/etc/hosts都要重启dnsmasq服务,重新加载/etc/hosts文件,
????需要更新/etc/docker/daemon.json,添加dns键值对,如
?
?
说明:
????需要更新/etc/docker/daemon.json,添加dns键值对,如
其实,docker部署跟yum部署,都是加载相同的配置文件,可以从日志中观察出来
Nginx反向代理docker容器进行域名解析绑定的实现方法
可以把多个域名映射到同一个IP地址上
docker镜像名称由REPOSITORY和TAG组成[REPOSITORY[:TAG]],TAG默认为latest
在宿主机创建持久化conf--配置目录html--静态网站目录logs--日志目录cert--存放证书目录
将容器内的nginx.conf与default.conf文件分别拷贝到主机/mnt/nginx与目录/mnt/nginx/conf下,分别执行
conf目录下创建nginx.conf文件
首先要在域名管理中做好域名简析
在conf.d目录下创建域名为ab.baidu.com的配置文件ab.baidu.com.conf文件包含ssl证书
在conf.d目录下创建域名为gh.baidu.com的配置文件gh.baidu.com.conf文件包含ssl证书
ginx.conf并没有在etc/nginx/conf目录下。
允许https访问的default.conf文件
将服务器的配置文件挂载到容器中,这样我们修改配置文件会方便一些。
退出nginx容器,将容器中的文件nginx.conf先拷贝到宿主机中,conf.d目录下的default.conf文件拷贝出来
执行dockerstopef命令停止刚刚创建的nginx容器,ef是容器Id,然后执行dockerrmef移除容器,
-v/docker-root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
/docker-root/nginx/conf/nginx.conf宿主机中的ngix配置文件挂载到容器的/etc/nginx/nginx.conf配置文件
-v/docker-root/nginx/conf/conf.d:/etc/nginx/conf.d
/docker-root/nginx/conf/conf.d宿主机中的配置目录conf.d挂载到容器的/etc/nginx/conf.d目录上
-v/docker-root/nginx/cert:/cert/
映射ssl证书文件
命令,重新创建nginx容器
这样就可以将配置文件、log、静态页面映射到宿主机中。需要修改或者查看直接在宿主机中修改或者查看就可以了。需要注意的是,配置文件虽然映射到宿主机中,但是如需配置路径,还需配置成容器中的路径。
注意发布到云服务器上服务器安全组是否开放了443端口。
把vue生成的dist目录下的文件上传到服务器
/root/docker-root/vue-mcyl-src
文件目录dist目录Dockerfile文件
转到此目录下
使用下面的命令生成镜像
启动容器
dockerrun-dmcyl-vue:v1.0
conf.d目录下的配置文件default.conf
防火墙原因,需要将通信的端口开放
解决办法:
firewall-cmd--zone=public--add-port=9080/tcp--permanent
firewall-cmd--zone=public--add-port=8080-8080/tcp
参考http://www.ttlsa.com/web/multiple-https-host-nginx-with-a-ip-configuration/
docker registry使用指南
dockerregistry的作用就是存储我们的镜像。通常情况下我们可以使用dockerhub来存储,不过如果是在公司内部使用,不想将镜像公开,可以手动搭建一个本地registry,如dockerregistry或harbor。本文简单介绍一下dockerregistry的搭建使用及常用配置。
搭建registry最基础的命令为:
dockerrun-d-v/data/registry:/var/lib/registry-p5000:5000registry:2
registry定义的对外服务端口为5000,我们也可以通过环境变量REGISTRY_HTTP_ADDR来修改服务端口。
如果要使用其他存储,如AmazonS3bucket,GoogleCloudPlatform或其他docker支持的存储,也可以通过环境变量单独配置(推荐用yaml的形式来配置)。
注:私有仓库,推送镜像时,要在/etc/docker/daemon.json或C:\ProgramData\docker\config\daemon.json文件中添加以下配置,并重启docker。
创建服务端证书的第三步,可能会报错unabletoopen'/etc/pki/CA/index.txt',需要手动创建该文件touch/etc/pki/CA/index.txt,并创建一个序列文件来标记CA证书echo'1000'>/etc/pki/CA/serial。
证书生成也可以参考:https://www.jianshu.com/p/1163d1ae8029
为了提高regsitry的安全性,可以开启访问控制,用户需要登陆后才可以使用registry。
首先,创建一个密码文件,里面包含一条用户名密码(stark/catherine)。
windows系统下需要修改编码格式:
dockerrun--rm--entrypointhtpasswdhttpd:2-Bbntestusertestpassword|Set-Content-EncodingASCIIauth/htpasswd
然后启动容器,带上用户认证。
配置一个域名解析:echo127.0.0.1myregistry.com>>/etc/hosts,然后使用docker登录dockerloginmyregistry.com:5000,用户名/密码就是前面配置的stark/catherine。
注:使用身份认证,建议开启TLS,否则登录信息明文传输(header中),一样不安全。
x509报错解决:x509报错通常就是自签证书没有加入到dockerclient所在host的信任证书中,手动加入即可。对于linux用户,只需要拷贝根证书文件到/etc/docker/certs.d/myregistrydomain.com:5000/ca.crt中即可。
最后,也可以在浏览器中访问https://localhost:5000/v2/_catalog或是https://localhost:5000/v2/docker/registry/tags/list查看仓库信息。
以上只是最简单的用户认证,只能使用我们预先定义好的用户来访问。
我们也可以在regsitry之前使用一个代理,来实现更高级的身份认证;或者将registry集成到我们自己的身份认证和访问控制系统中,由我们的鉴权服务来签发token给用户,然后用户使用签发的token访问我们的registry。harbor就提供了这样一整套服务,如果有此方面的需求,可以考虑使用harbor。
不知到为啥,容器起来了,但访问不了
完整的配置选项参考。
配置文件和环境变量的对应关系。配置文件中的内容为:
上述配置文件如果通过环境变量来配置,则对应的环境变量为:
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry
格式为REGISTRY_variable,其中variable为配置的变量,通过_连接yaml文件中的各层变量得到。
token认证流程简图:
docker swarm网络模式
dockerswarm网络模式
swarmservice的路由办法通常有两种,VIP和DSN
这是缺省情况设置,当用户创建service的时候,这个service会被分配一个VIP,然后每一个具体的container都有一个独立的IP,ingress会负责从VIP到各个container之间的路由。
举例来说:
并且看到了它的属性。
创建两个service:
nslookup查看域名解析:
从这个例子我们可以看到:
我们再进入container看看:
每一个container有两块网卡:
eth0:10.0.1.3这就是我们前面看到的servicecontainerIP地址,是属于网络my-network的。
eth1:172.18.0.4,这是另一个网络地址;是谁的呢,是网络docker_gwbridge。(另外bridge网络使用的是172.17网段)
也就是说每一个container属于两个网络,my-network和docker_gwbridge,分别用来service路由,和连接主机网络。
补充一点网卡eth1:172.18.0.4,对应的网关地址是172.18.0.1,那个这个网关地址172.18.0.1是谁呢,它就是主机网络上的docker_gwbridge,在主机上运行ifconfig可以看到:
bridge网络的网段地址从172.17.X.X/16开始,第一个内置的docker0使用了172.17.X.X,后面每新增一个bridge网络就新增一个网地址,172.18.X.X,172.19.X.X,。。。
至此两个bridge网络都比较清楚了。
另外如果发布service的时候指定了主机端口映射,那么container里面会有三块网卡分别属于:
做一个总结:
发布service的时候:
注意swarmVIP使用的一个限制:
也就是说无法做到同一个client过来的请求保持路由到同一个container去。
适合使用自己的DSNLoad-Balance算法,例如HAProxy。
创建使用DSN轮询的service。
由参数--endpoint-mode决定。
先看一下两个container的ip地址:
两个contaienr的ip地址分别是:
再看DSN解析结果:
每次运行ping解析出的IP地址在两个container之间轮换,也就没有虚IP概念了,而且swarm自动实现了DSN轮询的功能。
再看一个nslookup结果:
可见nslookup直接把两个container的地址都解析出来,说明一个域名(servicename)对映有两个IP地址。对照前面使用VIP的,一个servicename只对映一个IP地址,就是VIP地址,而不管具体有多少个container实例。
以上就是关于docker域名解析的解答,如果对你有帮助,不妨关注本站,本站将为你整理更多内容。