我们知道,Docker相当于提供了一个 独立于宿主机的运行环境。当我们使用Docker部署了中间件例如nginx的容器后,一般都是需要修改配置文件的。那么我们想到的第一个方法就是进入容器去修改[1]。
1.进入容器内修改
首先我们需要有一个已经启动的容器。pull image后通过run-d -p --name启动可以得到一个后台启动的指定了暴露端口和名字的容器。
查看已启动的容器:
docker ps
如此会查看到容器的id
进入容器内部:
docker exec -it 容器id /bin/bash
我们想要修改的nginx.cong文件就在nginx下,此时vim nginx.conf。你会发现vim命令找不到。因为docker容器类似于Linux的最小化安装,很多命令是没有的。需要我们去把vim装上。后面的我没有继续弄,装上vim后就可以去修改配置文件了,可以参考这篇文章[1]。
我个人觉得这种方式不是很合适,因为在容器内安装其他东西破坏了容器的纯净。进入容器后是root权限,也给破坏容器造成了一定的可能性。因此我赞同这篇文章[1]的观点,倾向于将配置文件挂载出来。
2. 挂载容器内的配置文件
对于挂载配置文件,我的理解是相当于Windows中的快捷方式。本来宿主机(Linux)是无法直接修改容器内的配置文件的。
而通过挂载的方式,在宿主机中有一个对应容器内配置文件的文件,修改宿主机中的文件,重启容器(没错,要重启才能看到配置文件的更新。一般来说配置文件这种东西都是要重启才能重新读取和生效),可以发现容器内的文件也对应的被修改了(vim用不了,可以用cat查看)。
挂载容器内的配置文件,共有2种方式[2],docker run -v在创建容器时挂载到主机目录和文件中或者挂载到数据卷中,Dockerfile在创建镜像时通过VOLUME 命令生成匿名卷[3],
需要说明的是,以后两种方式进行挂载的,是不能自己指定目录位置的,一般是docker会在安装目录下的指定目录下面生成一个目录来绑定容器的匿名卷(这个指定目录不同版本的docker会有所不同),我当前的目录为:/var/lib/docker/volumes/{容器ID}[3]。
2.1 docker run -v
docker run -v也细分为2种方式,创造数据卷、挂载到宿主机目录/文件中[5]。
2.1.1 创造具名的数据卷
姑且称之为创造数据卷。具体方式如下[5]:
创造一个数据卷
docker volume create mynginx
查看所有数据卷
docke volume ls
可以看到我们具名的数据卷mynginx创建成功,而上面随机数命名的数据卷,是一些匿名数据卷。
查看这个数据卷的信息:
docker volume inspect mynginx
可以看到数据卷的位置如红色方框中所示
使用这个数据卷挂载容器并运行:
docker run -d -p 8081:80 --name "nginx-volume-demo" -v mynginx:/etc/nginx/ nginx
可以看到容器正常启动了
那么挂载的数据卷中的文件和目录呢?我们需要cd到之前inspect后显示的目录中去。但是需要root权限。
可以看到,这样,我们nginx容器中/etc/nginx目录下的子目录和文件都挂载到了mynginx这个卷中。以后修改配置文件,直接inspect mynginx即可得到卷的路径。
关于volume的其他命令可以参考这篇文章[6]。
这种方式也是我个人觉得最好用的一种方式,简单高效。
如果在容器目录前没有指明要挂载的数据卷或者目录/文件,则docker会创造一个随机数命名的数据卷[7],所以我个人认为这种方式其实。
这种方式我没有自测,不过由于随机数实在是难以记忆,不如自己自定义一个好记点的名字的数据卷喽。
2.1.2 挂载到宿主机目录
挂载到宿主机目录,是将容器中的目录和文件挂载到我们自己指定的目录和文件中去。
这种方式需要我们先把需要挂载的文件复制到宿主机中。我们依然以nginx容器为例,我们的目的是将nginx容器中/etc/nginx/目录下的nginx.conf文件,挂载到宿主机中/home/xxx/Desctop/nginx目录下,则我们需要先把nginx.conf文件复制粘贴到宿主机中/home/xxx/Desctop/nginx目录中。nginx.conf文件的内容,不管你是去网上搜也好,起了一个nginx容器进去复制也好[1],都要找到一个完整正确的对应文件的内容,写入宿主机中你想要挂载目录下的对应文件中,文件名要和Docker中的一致。这是因为Docker容器在启动时,是以宿主机中的文件为主,如果宿主机中的文件不存在或者不正确,则挂载到宿主机中文件的容器无法正常启动。
注:如果目录不存在docker 会创建,但是文件不存在不可以。
docker run -v命令如下所示:
docker run -d -p 8081:80 --name "nginx-demo" -v /home/xxx/Desktop/MiddleWare/Docker/nginx/nginx.conf:/etc/nginx/nginx.conf nginx:latest
这种方式相比创造一个数据卷出来就麻烦了很多。个人不太推荐。
2.2 Dockerfile中的VOLUME命令
举例[8]:
VOLUME ["/data"]
这种方式,是通过创造匿名(随机数命名)数据卷的方式挂载的,与2.1.1中介绍的不同在于,这个方式是在镜像构造阶段就完成了匿名挂载,因而相比2.1.1具有很好的可移植性[8]。
上面几种就是我目前了解的所有挂载目录和文件的方式,如有批评指正,欢迎评论。文章来源:https://www.toymoban.com/news/detail-473916.html
参考文章:
[1],docker nginx 配置文件在哪?如何修改?如何挂载?
[2],Docker 实现挂载的三种方式
[3],一文说清楚Dockerfile 中VOLUME到底有什么用?
[4],docker学习笔记18:Dockerfile 指令 VOLUME 介绍
[5],docker数据卷(数据挂载)
[6],Docker - Docker Volume及Volume命令详解
[7],Docker容器数据卷详解
[8],Dockerfile(14) - VOLUME 指令详解文章来源地址https://www.toymoban.com/news/detail-473916.html
到了这里,关于【Docker】Docker挂载和修改容器中的目录及配置文件的若干种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!