关于docker的疑问

关于docker的疑问

我的gitlab和redis都安装在一个服务器上,但因为gitab也有redis,好像容器内的两个redis端口冲突了,导致gitlab启动后,网页无法打开(之前都是好的,在我安装新的redis时才出问题)。

我尝试用Dockerfile文件基于redis镜像,配置了另一个端口,用EXPOSE关键字,但尝试后还是没用,端口还是在6379上,这是为啥,我的认知是通过Dockerfile基于redis镜像配置了一个新镜像,然后这个新镜像的容器会使用我用EXPOSE定义的端口。想请问下我这一块理解错的问题在哪,以及有什么方法能解决这个端口冲突。


还有另一个问题

Dockerfile文件里,不是有CMD关键字吗。假如我基于一个redis镜像,写一个Dockerfile文件,在最后我并没有使用CMD关键字,那么在run这个新镜像时候,是否会使用先前引用redis镜像(FROM)自带的CMD关键字?换个说法也就是,通常我们配置在Dockerfile文件里的CMD关键字,是否会替换掉原先引用时镜像的CMD关键字?

因为我在看官网对这个关键字的解释时,是说,有多个CMD关键字时,会使用最后一个,就是不知道与FROM镜像里面的CMD有没有关联

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

关于你的问题,我有几个建议:

  1. 简化你问题的描述,用精炼的语言去进行表述。

  2. 用截图 + 配置来进行说明


我的gitlab和redis都安装在一个服务器上,但因为gitab也有redis,好像容器内的两个redis端口冲突了,导致gitlab启动后,网页无法打开(之前都是好的,在我安装新的redis时才出问题)。

我尝试用Dockerfile文件基于redis镜像,配置了另一个端口,用EXPOSE关键字,但尝试后还是没用,端口还是在6379上,这是为啥,我的认知是通过Dockerfile基于redis镜像配置了一个新镜像,然后这个新镜像的容器会使用我用EXPOSE定义的端口。想请问下我这一块理解错的问题在哪,以及有什么方法能解决这个端口冲突。

——标黑的地方就是错的地方,你去看看docker相关视频,我们有一个-p参数,在docker-compose中是ports参数,主要的作用就是来作映射的,为什么要去改Dockerfile呢,麻烦。


还有另一个问题

Dockerfile文件里,不是有CMD关键字吗。假如我基于一个redis镜像,写一个Dockerfile文件,在最后我并没有使用CMD关键字,那么在run这个新镜像时候,是否会使用先前引用redis镜像(FROM)自带的CMD关键字?

——这里要清楚一点一个Dockerfile只有一个CMD是它的执行入口,通常这个CMD是用来传递参数的。你是基于的那个镜像,那个里面的环境什么的全部搬过来。比如你基于mysql的镜像,那么mysql的镜像就相当于,给你已经装好了一个Mysql一样,跟上一个Dockerfile的CMD参数无关。

换个说法也就是,通常我们配置在Dockerfile文件里的CMD关键字,是否会替换掉原先引用时镜像的CMD关键字?

——参考上面一条的解释,一般来说这个CMD用来传递参数,比如:CMD: ["redis-server", "--requirepass", "root"],这样redis容器就有了一个固定的启动密码是root。


因为我在看官网对这个关键字的解释时,是说,有多个CMD关键字时,会使用最后一个,就是不知道与FROM镜像里面的CMD有没有关联

——一个镜像与另一个镜像从物理上都是隔离的,不同的文件系统,没有关联。


第一个问题有点偏差,我又重新尝试了,本地配置的gitlab网页无法打开是因为yml文件,我起初因为有两个redis,且相同的service名字,所以修改了gitlab的yml文件的service名称,现在修改回来就好了。可我不太理解为什么,service关键字不是可以随便定义吗,为什么到了gitlab上就不行了,打开网页时显示访问被拒绝。

——我不知道你的配置文件是什么,你去看看有没有depends_on这个属性,这里的属性,指定了容器间或者说服务间互访的名称,所以不能瞎改service的名称,最好全配置文件查找 。


另外,docker中容器内部的端口相同,是不会有影响吗?我服务器上,这两个redis容器的端口都是6379,可目前看来,好像没啥问题

——不会,你自己也尝试了,我们课程中演示的不就是2个mysql然后同时用一个docker-compose启动映射到不同的端口吗?

请老师帮我解答下


提问者 平地一声雷d 2020-04-20 14:58:50

第一个问题有点偏差,我又重新尝试了,本地配置的gitlab网页无法打开是因为yml文件,我起初因为有两个redis,且相同的service名字,所以修改了gitlab的yml文件的service名称,现在修改回来就好了。可我不太理解为什么,service关键字不是可以随便定义吗,为什么到了gitlab上就不行了,打开网页时显示访问被拒绝。

另外,docker中容器内部的端口相同,是不会有影响吗?我服务器上,这两个redis容器的端口都是6379,可目前看来,好像没啥问题

请老师帮我解答下

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师