前言:Docker容器一旦创建后对容器内文件配置和参数进行修改没有宿主机那么方便,本文提供了几种常见的容器内文件的修改方式,在使用过程中可以根据情况灵活选择。
1
进入容器内修改
容器创建
根据nginx镜像创建容器
[root@k8s-node2 ~]# docker run -itd -p 80:80 --name=nginx01 nginx:latest8be63cc8acf6dc466ab4bf722e92de425a27ec522eb2884c17a27c1f29e57553
修改文件
容器创建完成后我们需要对nginx.conf配置进行修改,直接进入容器进行修改
[root@k8s-node2 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8be63cc8acf6 nginx:latest "/docker-entrypoin..." 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp nginx01[root@k8s-node2 ~]# docker exec -it 8be63cc8acf6 bashroot@8be63cc8acf6:/# cd /etc/nginx/root@8be63cc8acf6:/etc/nginx# lsconf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utfroot@8be63cc8acf6:/etc/nginx# vim nginx.conf bash: vim: command not found
可以看到我们使用vim命令修改的时候,提示vim命令没有找到,因为docker镜像在构建的时候,为了减少层级,遵循精简的原则,体积越小容器启动会越快,所以很多组件没有安装。
安装vim命令
可以使用yum -y install vim或者apt-get install vim命令安装
root@8be63cc8acf6:/etc/nginx# apt-get install vimReading package lists... DoneBuilding dependency tree Reading state information... DoneE: Unable to locate package vimroot@8be63cc8acf6:/etc/nginx# apt-get install vimReading package lists... DoneBuilding dependency tree Reading state information... DoneThe following additional packages will be installed: libgpm2 vim-common vim-runtime xxdSuggested packages: gpm ctags vim-doc vim-scriptsThe following NEW packages will be installed: libgpm2 vim vim-common vim-runtime xxd0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.Need to get 7425 kB of archives.After this operation, 33.8 MB of additional disk space will be used.Do you want to continue? [Y/n] y....
当出现上面提示时,需要先apt-get update获取到最新的软件包,等更新完毕以后再敲命令:apt-get install vim命令即可
然后你就可以直接使用vim编辑nginx.conf配置文件了
2
docker cp方式
Linux上可以使用cp命令进行文件复制和备份,docker也可以使用cp命令在宿主机和docker容器件进行文件的复制
命令格式docker cp 容器ID或名称:容器目录 物理机目录docker cp 物理机目录 容器ID或名称:容器目录
举例,如图当容器内没有vim命令的时候,我们可以将容器内文件复制到物理机,修改后再复制回容器的方式,支持双向复制。
[root@k8s-node2 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8be63cc8acf6 nginx:latest "/docker-entrypoin..." About an hour ago Up About an hour 0.0.0.0:80->80/tcp nginx01fcd01514c5cc training/webapp "python app.py" 9 days ago Up 9 days 0.0.0.0:5000->5000/tcp cranky_darwin[root@k8s-node2 ~]# docker cp 8be63cc8acf6:/etc/nginx/nginx.conf /root[root@k8s-node2 ~]# lsanaconda-ks.cfg docker initial-setup-ks.cfg nginx.conf
3
卷映射方式
Docker提供了数据持久化的方式,让docker内数据管理更加便利,容器创建的时候做好目录映射或者文件映射,直接修改物理机文件,容器内的文件会相应变化,这种方式的好处就是即使容器被删除了,物理机上的数据仍然不会丢失。
卷映射这种方式相当于,将物理机/etc/nginx/nginx.conf配置文件映射到容器内路径的nginx.conf,当时你也可以直接映射目录到容器内的目录。
[root@k8s-node2 nginx]# docker run -itd -p 8080:80 -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf --name=webtest nginx:latestd805df368a6f140de2f92384e2f53c1c503fe42a4d983363eb0fc44de54afb73[root@k8s-node2 nginx]# [root@k8s-node2 nginx]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd805df368a6f nginx:latest "/docker-entrypoin..." 22 seconds ago Up 21 seconds 0.0.0.0:8080->80/tcp webtest
如上通过命令-v创建容器,将宿主机nginx.conf文件映射到容器内部nginx服务/etc/nginx/目录下。
说明:
- -v 本地目录:容器目录。挂载主机的本地目录:目录到容器的目录,本地目录的路径必须是绝对路径
- 容器的路径如果不存在会自动创建
当我们需要修改容器内的nginx.conf配置文件时,直接修改宿主机/etc/nginx/nginx.conf配置即可,如图,我们在宿主机插入hello数据,进入容器内部检查,容器内数据也发生了变化,是不是很方便。
[root@k8s-node2 nginx]# echo hello >>nginx.conf [root@k8s-node2 nginx]# cat nginx.conf | grep hellohello[root@k8s-node2 nginx]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd805df368a6f nginx:latest "/docker-entrypoin..." 14 minutes ago Up 14 minutes 0.0.0.0:8080->80/tcp webtest[root@k8s-node2 nginx]# docker exec -it d805df368a6f bashroot@d805df368a6f:/# cd /etc/nginx/root@d805df368a6f:/etc/nginx# cat nginx.conf | grep hellohello
往期精选
June 2020
- Docker入门篇之docker安装
- Docker基础使用篇
- Apache日志存储优化方案