记一次在nginx的docker镜像中加入支持ipv6的配置

1.最近在做的项目是容器化部署,遇到一个需要nginx支持ipv6的需求。

2.首先想到拉取最新的nginx镜像配置,并在nginx的配置文件中开启ipv6支持,对于nginx本身来说是开启了ipv6的支持,但是在实际测试时发现用ipv6访问并不通

3.后来才发现nginx镜像中nginx也是运行在此镜像的操作系统中的,简单来说nginx镜像里有自己的操作系统,而nginx只是运行在其中而已,所以要想支持ipv6,必须让nginx镜像的操作系统也支持ipv6才行

4.要想让镜像的操作系统支持ipv6,那就必须在镜像运行的容器中把net.ipv6.conf.all.disable_ipv6这个配置的值改为0,默认值是1

5.把net.ipv6.conf.all.disable_ipv6改为0,需要使用命令sysctl net.ipv6.conf.all.disable_ipv6=0

6.但是最新的nginx镜像是不支持sysctl命令的,那就需要安装,我们就运行一个基于这个镜像的容器,然后进到容器内安装sysctl命令

7.经过查找资料,发现最新的nginx镜像的系统版本为debian,安装sysctl的命令为

apt-get install procps

但是执行报错:E: Unable to locate package procps

8.这个时候要先更新下软件安装源,执行:apt-get update ,然后再进行安装apt-get install procps

9.安装完了之后执行sysctl net.ipv6.conf.all.disable_ipv6查看是否成功

10.这个时候我们这个容器就是装好sysctl的了,然后执行docker commit命令提交成新的镜像,我们新的镜像就是可以支持修改ipv6配置的镜像了

11.需要注意的是在基于此镜像运行容器时,需要加入--privileged参数,举例:

docker run  --privileged -itd 605c77e624dd

因为不加入就没有权限修改容器内的相关参数,会报:

sysctl: permission denied on key "net.ipv6.conf.all.disable_ipv6"

12.之前的设想是在生成新镜像之前把配置net.ipv6.conf.all.disable_ipv6修改好再commit成新镜像,那么新镜像就直接可以用,后来测试发现,新镜像在运行时还是会恢复默认值,所以必须要在容器运行起来之后修改这个参数了

你可能感兴趣的:(docker,nginx,docker,java)