docker域名解析,docker swarm网络模式

阅读(118)发布于 2023-09-25

通常情况下我们可以使用dockerhub来存储,不过如果是在公司内部使用,不想将镜像公开,可以手动搭建一个本地registry,如dockerregistry或harbor。本文简单介绍一下dockerregistry的搭建使用及常用配置。如果要使用其他存储,如AmazonS3bucket,GoogleCloudPlatform或其他docker支持的存储,也可以通过环境变量单独配置。x509报错解决:x509报错通常就是自签证书没有加入到dockerclient所在host的信任证书中,手动加入即可。

配图

仅列出我用过的几种方式

注意:

????每次更新/etc/hosts都要重启dnsmasq服务,重新加载/etc/hosts文件,

????需要更新/etc/docker/daemon.json,添加dns键值对,如

?

?

说明:

????需要更新/etc/docker/daemon.json,添加dns键值对,如

其实,docker部署跟yum部署,都是加载相同的配置文件,可以从日志中观察出来

可以把多个域名映射到同一个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/

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认证流程简图:

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域名解析的解答,如果对你有帮助,不妨关注本站,本站将为你整理更多内容。