docker容器目录映射研究

一、通过 docker 命令创建容器

方法一: 不映射目录
访问 http://0.0.0.0:80时,页面正常可浏览(前提是/usr/share/nginx/html目录下有可访问的web页)。

1
2
3
4
5
#方法一
docker run -itd \
-p 80:80 \
--name diy \
nginx

方法二:
1, 当/root/diy_html目录有内容时,宿主机目录覆盖容器目录.访问 http://0.0.0.0:80时,页面正常可浏览.
2, 当/root/diy_html目录不存在或者无内容时,容器目录会变为空.访问 http://0.0.0.0:80时,返回 403 Forbidden.

1
2
3
4
5
6
#方法二
docker run -itd \
-p 80:80 \
-v /root/diy_html:/usr/share/nginx/html \
--name diy \
nginx

方法三:
1, 如果 diy_html 有数据,宿主机覆盖容器。
2, 如果 diy_html 没有数据,容器覆盖宿主机。
访问 http://0.0.0.0:80时,页面正常可浏览。

-v diy_html:/usr/share/nginx/html相当于执行 docker volume create diy_html 在宿主机上创建目录 /var/lib/docker/volumes/diy_html/_data 与容器目录/usr/share/nginx/html映射

1
2
3
4
5
6
#方法三
docker run -itd \
-p 80:80 \
-v diy_html:/usr/share/nginx/html \
--name diy \
nginx

以上宿主机的目录数据不受容器的停止或删除的影响,数据会一直存在。

二、通过 docker compose 创建容器

compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#version: '3'
volumes:
nginxhtmldata:
#相当于执行 docker volume create nginx_html
#注意:此设置当容器停止或删除,/var/lib/docker/volumes/nginx_html/_data 目录会变为空
   name: nginx_html
   driver: local
driver_opts:
o: bind
type: none
#注意:此设置需要宿主机目录要事先存在(此目录不会因为容器的停止与删除而被清空)
device: /www/nginx/html

services:
nginx:
       image: nginx
       hostname: nginxHost
# 映射端口 【宿主机端口:容器端口】
ports:
- "80:80"
# 容器名称
container_name: my_nginx
restart: always
# 相当于 docker run -i
stdin_open: true
# 相当于 docker run -t
tty: true
# 目录挂载 【宿主机目录:容器目录】
volumes:
           # 方法一:
           # 最常用的形式
           # 注意:宿主机目录会自动生成,如果目录没有内容,则容器目录也会被清空。
- /www/web1:/var/www/html1

# 方法二:
           # 效果等同于方法一,不同的是宿主机 /www/web2 目录要提前创建
           - type: bind
source: /www/web2
             target: /var/www/html2

           # 方法三:
           # 有以下两种情况和注意事项:
         # 1、如果宿主机目录无内容,容器的目录 覆盖 宿主机目录
         # 2、如果宿主机目录有内容,宿主机目录 覆盖 容器的目录
- type: volume
             source: nginxhtmldata # 上面定义的宿主机目录(此目录要提前创建)
             target: /usr/share/nginx/html # 容器目录

           # 方法四:
           # 是方法三的简写形式
           - nginxhtmldata:/usr/share/nginx/html

1
2
#创建容器
docker compose -f compose.yml up -d

1, 方法三和方法四,当容器停止或删除时
/var/lib/docker/volumes/nginx_html/_data 数据被清空(这与通过docker命令创建容器的情况不同)
/www/nginx/html 数据会一直存在
2, 方法一、方法二 不受容器停止或删除的影响,宿主机数据一直存在。