当前位置:   article > 正文

Docker学习数据管理_nginx.conf: read-only file system

nginx.conf: read-only file system

使用Docker过程中,往往需要对数据进行持久化,或者多个容器之间进行数据共享,这就需要我们熟悉容器的数据管理操作

容器中管理数据主要的两种方式:

  • 数据卷(Data Volumes):容器内数据直接映射到本地主机环境
  • 数据卷容器(Data Volumes Containers):使用特定容器维护数据
    1、数据卷

将主机操作系统目录直接映射进容器,类似于Linux中的mount。数据卷很好的解耦了容器应用和数据。对数据卷内数据的操作(无论是在本地主机还是容器内),都会立即生效。

docker run -d -p 3307:3306 -v /my/custom:/etc/mysql/conf.d \
-v /my/own/datadir:/var/lib/mysql --restart always --name mysql01 mysql:5.7
  • 1
  • 2
`-v hostDir:containerDir`:hostDir不存在会自动创建,默认权限是rw,也可以改为ro,这样容器内部就无法对数据卷的数据进行修改了。
  • 1

```powershell
docker run -d -p 3307:3306 -v /my/custom:/etc/mysql/conf.d:ro \
-v /my/own/datadir:/var/lib/mysql --restart always --name mysql01 mysql:5.7
  • 1
  • 2
  • 3
  • 4

#数据卷创建

docker volume create [OPTIONS] [VOLUME]
docker volume create hello
docker run -d -p 3307:3306 -v hello:/etc/mysql/conf.d \
-v /my/own/datadir:/var/lib/mysql --restart always --name mysql01 mysql:5.7
  • 1
  • 2
  • 3
  • 4

#数据卷列表

docker volume ls
  • 1

#数据卷详情

docker volume inspect hello
  • 1

```powershell
[
    {
        "CreatedAt": "2020-04-08T06:43:08Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/hello/_data",
        "Name": "hello",
        "Options": {},
        "Scope": "local"
    }
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

#docker cp 用于容器与主机之间的数据拷贝

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
  • 1
  • 2
  • SRC_PATH 指定为一个文件

    • DEST_PATH 不存在:文件名为 DEST_PATH,内容为SRC的内容
    • DEST_PATH 不存在并且以 / 结尾:报错
    • DEST_PATH 存在并且是文件:目标文件内容被替换为SRC_PATH的文件内容。
    • DEST_PATH 存在并且是目录:文件复制到目录内,文件名为SRC_PATH指定的名字
  • SRC_PATH 指定为一个目录

    • DEST_PATH 不存在:DEST_PATH创建文件夹,复制源文件夹内的所有内容

    • DEST_PATH 存在是文件:报错

    • DEST_PATH 存在是目录

      • SRC_PATH 不以 /. 结束:源文件夹复制到目标里面
      • SRC_PATH/. 结束:源文件夹里面的内容复制到目标里面

      自动创建文件夹不会做递归。把父文件夹做好

2、数据卷容器
如果需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但他专门用来提供数据卷供其他容器挂载。

docker run -it -v /idata --name idata ubuntu

docker run -it --volumes-from idata --name d01 ubuntu
docker run -it --volumes-from idata --name d02 ubuntu
  • 1
  • 2
  • 3
  • 4

#使用–volumes-from参数所挂载的数据卷容器本身不需要保持在运行状态

3、数据卷的用法细节

docker run -d -P --name nginx nginx
#方便修改nginx的配置和html页面等
#容器中 /usr/share/nginx/html
#容器中 /etc/nginx

##参照一下各种写法

hostPath:containerPath

docker run -d -P --name nginx -v /opt/nginx/html:/usr/share/nginx/html nginx;
#为什么看到的是403而不是index页面内容。原来容器里面变为空了?主机的内容复制到容器中,导致,容器同步到了主机的空文件夹。
#特别是配置问津,必须提前保证我们主机挂载的目录里面提前有内容。
docker run -d -P --name nginx -v /opt/nginx:/etc/nginx nginx
#为什么docker ps看不到;出错了。open() “/etc/nginx/nginx.conf” failed (2: No such file or directory) nginx: [emerg] open() “/etc/nginx/nginx.conf” failed (2: No such file or directory)
#我就想自定义挂载路径,并且把他们挂载出来?
# 1、复制容器的文件

docker cp
1、启动一个nginx,先不挂载。
2、docker cp把运行中的nginx的内容复制出来

Usage:	docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
		docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker cp nginx:/usr/share/nginx/html /opt/hahanginx
  • 1
  • 2
  • 3

nginx:/usr/share/nginx/html/. 把html里面的内容复制到 /opt/hahanginx
nginx:/usr/share/nginx/html 把html文件夹复制到 /opt/hahanginx

完整过程
  • 1
mkdir /opt/nginx
docker cp nginx:/usr/share/nginx/html /opt/nginx 复制html
docker cp nginx:/etc/nginx/. /opt/nginx/conf
docker run -d -P --name nginx -v /opt/nginx/conf:/etc/nginx -v /opt/nginx/html:/usr/share/nginx/html nginx
  • 1
  • 2
  • 3
  • 4

匿名卷方式volume,挂载任意目录

docker run -d -P --name nginx02 -v 容器路径
eg:

docker run -d -P --name nginx02 -v /usr/share/nginx/html -v /etc/nginx nginx
  • 1

想要知道到底迎合到主机的哪里了?

docker inspect nginx02.
"Mounts": [
            {
                "Type": "volume",
                "Name": "9f4f8ac4c9cd9cb77df7a5386a5b68520c98ea1bb28e26b6593255c1d0ff9cdf",
                "Source": "/var/lib/docker/volumes/9f4f8ac4c9cd9cb77df7a5386a5b68520c98ea1bb28e26b6593255c1d0ff9cdf/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "68afef2bf4979e2c9369f6eb68f8a94adc61e63d3a1fb3dad7469e243442cf32",
                "Source": "/var/lib/docker/volumes/68afef2bf4979e2c9369f6eb68f8a94adc61e63d3a1fb3dad7469e243442cf32/_data",
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

#匿名挂载的缺点?不好维护。 docker volume可以维护他们
docker volume ls

#具名挂载。有卷。如果有可视化界面。我们就知道卷是干嘛,就不乱删除了。
#创建好的卷,会自动的和容器中需要挂载的这个文件夹做好同步。
docker volume create 卷名字, 创建一个卷。/var/lib/docker/volumes/自定义的卷名/_data
docker run -d -P --name nginx03 -v nginxconf:/etc/nginx -v nginxhtml:/usr/share/nginx/html nginx
最佳实战。

怎么判断挂载的是卷名而不是本机目录名
不以/开始就是卷名,以/开始就是主机名。

#改变文件的读写权限
#ro:readonly rw:readwrite; 指定容器对我们这个挂载出来的内容的读写权限

docker run -d -P --name nginx04 -v nginx04conf:/etc/nginx:ro -v nginx04html:/usr/share/nginx/html:rw nginx
  • 1

ro:效果

root@c721b01b2752:/etc/nginx# echo 123 > nginx.conf
  • 1

bash: nginx.conf: Read-only file system
容器内不能再对ro指定的所有进行修改了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/263973
推荐阅读
相关标签
  

闽ICP备14008679号