赞
踩
我们知道,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]。
上面几种就是我目前了解的所有挂载目录和文件的方式,如有批评指正,欢迎评论。
参考文章:
[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 指令详解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。