在使用docker过程中,修改了配置文件的话,有很多重启的方法,下面对这些重启的方法全部做个测试,看看它们之间的区别
以nginx容器为例子,测试从镜像,容器,docker-compose编排以及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端口
把上面创建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就要删除镜像重新生成才能生效
先创建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 restart test-nginx
docker-compose ps
无效,443没有对外暴露
docker-compose restart
docker-compose ps
同样无效,443没有对外暴露
docker-compose down
docker-compose up -d
docker-compose ps
可以看到已经生效,443已经对外暴露
docker-compose配置的参数只有在容器从镜像开始运行时才生效,容器已经存在的情况下(包括运行或停止状态),无法哪些重启操作都不会再加载docker-compose里的配置参数
通过上面的操作,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 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
也可以正常生效
同样先恢复再试
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"
访问也能正常
先增加一个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