小韦云博文

docker关于重启配置生效的终结测试

小韦云科技-区块链+小程序+公众号+商城+分销+直播+企业官网+外贸电商-为您提供优质的开发服务-电话/微信联系:18123611282

在使用docker过程中,修改了配置文件的话,有很多重启的方法,下面对这些重启的方法全部做个测试,看看它们之间的区别

以nginx容器为例子,测试从镜像,容器,docker-compose编排以及nginx的配置修改,如何重启才能生效。

文章太长,先来看看结论吧

  • 修改Dockerfile只能删除镜像和容器,并重新生成镜像才能生效
  • 修改docker-compose.yml只能先down再up才能生效,其它重启操作都无效
  • 修改nginx配置,任何重启操作都可以生效

镜像准备

先创建Dockerfile创建一个nginx镜像,先只创建镜像,不要任何配置信息

FROM nginx

然后构建镜像并运行它

docker build -t test-nginx:latest .
docker run -itd --name test-nginx test-nginx:latest /bin/bash
docker ps | grep test-nginx

可以看到它已经在运行,并且容器是暴露了80端口

测试1:修改Dockerfile如何才能生效

把上面创建Dockerfile增加一行暴露443端口,修改如下:

FROM nginx
EXPOSE 443

直接重启容器试试

docker restart test-nginx
docker ps | grep test-nginx


可以看到443端口没有生效

删除容器再启动试试

docker stop test-nginx
docker rm test-nginx
docker run -itd --name test-nginx test-nginx:latest /bin/bash
docker ps | grep test-nginx


同样可以看到443端口没有生效

删除容器和镜像再启动试试

docker stop test-nginx
docker rm test-nginx
docker rmi test-nginx:latest
docker build -t test-nginx:latest .
docker run -itd --name test-nginx test-nginx:latest /bin/bash
docker ps | grep test-nginx


可以看到这次443端口配置已经生效

总结

由于Dockerfile是用来生成镜像的,一旦镜像生成,后面的操作都与它无关了,修改Dockerfile就要删除镜像重新生成才能生效

测试2:修改docker-compose.yml如何才能生效

先创建docker-compose.yml,用来运行容器并只对外暴露8080端口(不使用80端口是因为本机其它服务已经占用80端口),内容如下

version: "3.8"
services:
  test-nginx:
    container_name: test-nginx
    image: test-nginx:latest
    ports:
      - 8080:80

先把上面创建的容器先删除,然后使用docker-compose来启动容器

docker stop test-nginx
docker rm test-nginx
docker-compose up -d
docker-compose ps


可以看到已经启动,只有80对外暴露,443没有暴露

把上面创建docker-compose.yml增加一行暴露443端口,修改如下:

version: "3.8"
services:
  test-nginx:
    container_name: test-nginx
    image: test-nginx:latest
    ports:
      - 8080:80
      - 443:443

通过docker重启试试

docker restart test-nginx
docker-compose ps


无效,443没有对外暴露

通过docker-compose重启试试

docker-compose restart
docker-compose ps


同样无效,443没有对外暴露

使用docker-compose关闭再启动试试

docker-compose down
docker-compose up -d
docker-compose ps


可以看到已经生效,443已经对外暴露

总结

docker-compose配置的参数只有在容器从镜像开始运行时才生效,容器已经存在的情况下(包括运行或停止状态),无法哪些重启操作都不会再加载docker-compose里的配置参数

测试3 修改nginx配置如何生效

通过上面的操作,nginx已经在运行中,我们可以通过8080端口进行正常访问

但因为nginx并没有配置443端口,因此虽然容器已经支持443端口,但nginx还不能识别

直接在容器中修改配置并重启试试

docker exec test-nginx bash -c "sed -i -r '/listen[ ]+80;/a listen  443;' /etc/nginx/conf.d/default.conf"
docker restart test-nginx
docker-compose ps


可以看到能生效

直接在容器中修改配置并使用docker-compose重启试试

由于上面修改已经生效,需要先删除容器恢复原形

docker-compose down
docker-compose up -d
docker-compose ps

然后重新配置然后重启

docker exec test-nginx bash -c "sed -i -r '/listen[ ]+80;/a listen  443;' /etc/nginx/conf.d/default.conf"
docker-compose restart
docker-compose ps


也可以正常生效

使用nginx本身的reload试试

同样先恢复再试

docker-compose down
docker-compose up -d
docker-compose ps
docker exec test-nginx bash -c "sed -i -r '/listen[ ]+80;/a listen  443;' /etc/nginx/conf.d/default.conf"
docker exec test-nginx bash -c "nginx -s reload"


访问也能正常

使用docker-compose重启试试

先增加一个nginx配置文件:default.conf,这个文件后面使用挂载的试覆盖nginx原带的配置文件,内容如下

server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

把docker-compose.yml文件修改为

version: "3.8"
services:
  test-nginx:
    container_name: test-nginx
    image: test-nginx:latest
    ports:
      - 8080:80
      - 443:443
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf

然后执行命令先恢复

docker-compose down
docker-compose up -d
docker-compose ps

增加443并使用docker-compose restart重启试试

sed -i -r '/listen[ ]+80;/a listen  443;' default.conf
docker-compose restart

执行后生效了

总结

nginx里的配置无法使用哪种方式重启都是可以正常生效的,主要是因为容器内的进程在容器重启时也会重启。并且通过上面操作可知,直接修改容器里的文件,在容器被删除后再启动后(docker-compose down),就会恢复。因为在容器里的任何操作,如果没有通过挂载永久保存到主机上,容器重新生成后都会丢失。

本文由小韦云原创,转载请注明出处:http://bctos.cn/doc/12/1924,否则追究其法律责任

关键词:docker 重启 restart reload

广告位招商