示例
mysql挂载
version: '3.1'
services:
db:
image: mysql:5.7.36
restart: always
ports:
- 3310:3306
environment:
MYSQL_ROOT_PASSWORD: xxx
volumes:
- ./conf:/etc/mysql
- ./data:/var/lib/mysql
启动命令:
docker-compose up -d
场景1:当前目录下没有conf、data目录
启动后会创建这两个目录,同时data目录下会有初始数据库数据,但conf中没有任何内容,进入容器的/etc/mysql也找不到任何内容,说明是正确挂载了,只是conf中没有任何内容,所以mysql启动的时候使用的是默认的配置文件。
场景2:当前目录下有conf、data目录,且data目录中有自定义的backup.sql文件
mysql启动报错,从data目录中初始化数据库时没有找到对应的数据库文件,所以启动出错
场景3:当前目录下有conf、data目录,且conf中有自定义的mysql.cnf
mysql启动正常,且使用自定义的配置文件进行启动,data目录中也会自动生成数据库初始文件
nginx挂载
version: '3'
networks:
nginx_bridge:
driver: bridge
services:
nginx:
image: nginx:stable-alpine
container_name: nginx-alpine
restart: always
privileged: true
environment:
- TZ=Asia/Shanghai
ports:
- 8080:80
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./log:/var/log/nginx
networks:
- nginx_bridge
启动命令:
docker-compose up -d
场景1:当前目录下没有conf.d、log目录
启动后会创建这两个目录,同时log目录下会有两个日志文件,但conf.d中没有任何内容,进入容器的/etc/nginx/conf.d也找不到任何内容,说明是正确挂载了,只是conf.d中没有任何内容,所以nginx启动的时候没有配置默认的default.conf文件,此时访问:
curl http://localhost:8080
是访问不到的,因为默认没有配置server
场景2:当前目录下有conf.d、log目录,且conf.d中配置了default.conf
default.conf文件如下:
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
此时访问:
curl http://localhost:8080
是可以访问的,因为配置了server
如果不挂在conf.d,那么也是可以访问到http://localhost:8080的,此时使用默认的default.conf
总结
上述示例场景说明了几个问题: (1)如果挂载的配置文件目录下为空,且在容器中该目录下有必要的启动配置文件,那么容器是启动后访问也是不正常的(nginx) (2)如果挂载的数据文件目录下不为空,且容器会使用数据文件目录下的数据进行数据构建,那么如果数据不完整则会导致启动失败(mysql) 综上所述: 如果容器在启动过程中需要,那么挂载的时候确保里面有必要的文件。如果启动过程中不需要,那么容器启动后会自动在挂载目录中生成文件。
最佳实践:先使用默认配置启动,再从容器中cp出配置文件,然后根据需要修改配置文件再启动。数据文件同理。
|