用docker将数据挂载到容器

一. docker将数据挂载到容器的三种方式

1、Docker提供三种方式将数据从宿主机挂载到容器中

  • volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes) 保存数据的最佳方式。
  • bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中, 就像软连接一样。
  • tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统(不常用)。

区别:

  • volume : 是docker的宿主机文件系统一部分,只有docker可以进行更改,其他进程不能修改
  • bind mounts : 是挂载在宿主机文件系统的任意位置,除了docker所有进程都可以进行修改、

2、管理卷

docker volume create nginx-vol              # 创建一个数据卷 nginx-vol

docker volume ls                              # 查看宿主机数据卷信息

docker volume inspect nginx-vol               # 查看 nginx-vol 这个数据卷详细信息

ls /var/lib/docker/volumes/nginx-vol/_data     # 详细信息中会显示 nginx-vol 这个卷实际在宿主机位置

docker rm -f $(docker ps -a |awk '{print $1}')    # 删除所有容器

3、volumes:将容器中的数据持久化到宿主机中

1)用卷创建一个容器:

docker run -d --name=nginx-test -p 88:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx

run -d                            # 后台启动一个nginx容器

--name=nginx-test                             # 自定义容器名字(默认会是一段随机字符串)

-p  88:80                                             # 将宿主机的88端口映射到容器的80端口

--mount

src=nginx-vol,                               # 挂载数据卷名称nginx-vol

dst=/usr/share/nginx/html             # 将/usr/share/nginx/html文件挂载到nginx-vol数据卷中

nginx                                                     # 使用这个nginx镜像启动容器

vim /var/lib/docker/volumes/nginx-vol/_data/index.html       # 修改nginx的 index.html文件可以发现页面发生改变

http://192.168.56.12:88/

2)清理卷:

docker stop nginx-test                   # 关闭正在使用卷nginx-vol的容器nginx-test
docker rm nginx-test                        # 删除容器 nginx-test
docker volume rm nginx-vol                    # 删除卷 nginx-vol

4、bind mounts:将宿主机中的数据挂载到容器中

1)用卷创建一个容器:

docker run -d --name=nginx-test -p 88:80 --mount 
type=bind,src=/mnt/,dst=/usr/share/nginx/html nginx
run -d                                                  # 后台启动一个nginx容器
--name=nginx-test                              # 自定义容器名字(默认会是一段随机字符串)
-p  88:80                                              # 将宿主机的88端口映射到容器的80端口
--mount type=bind                       # 将/usr/share/nginx/html文件夹挂载到宿主机/mnt/文件夹中
src=/mnt/,                                   # 宿主机中挂载目录 /mnt/
dst=/usr/share/nginx/html           # 容器中/usr/share/nginx/html文件夹
nginx                              # 使用这个nginx镜像启动容器

docker exec -it nginx-test bash                       # 进入容器
cd /usr/share/nginx/html                                  # 进入容器的挂载目录
echo "hello I come here" > index.html            # 在目录中创建一个 index.html文件
http://192.168.56.12:88/                                  # 可以在页面访问到 index.html首页
vim /mnt/index.html                           # 修改 /mnt/index.html 就等同修改容器中的index.html页面

2)清理:

docker stop nginx-test                      # 关闭正在使用卷nginx-vol的容器nginx-test
docker rm nginx-test                                       # 删除容器 nginx-test

注意:

  • 如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
  • 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。

5、Volume特点:

  1. 多个运行容器之间共享数据。
  2. 当容器停止或被移除时,该卷依然存在。
  3. 多个容器可以同时挂载相同的卷。
  4. 当明确删除卷时,卷才会被删除。
  5. 将容器的数据存储在远程主机或其他存储上
  6. 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

6、Bind Mounts特点:

1. 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
2. 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。
3. 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时

二. 容器网络

1、网络模式

• bridge(常用)

  • –net=bridge
  • 默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。

• host(常用)

  • –net=host
  • 容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。

• none(不常用)

  • –net=none

  • 获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。

• container(不常用)

  • –net=container:Name/ID

  • 与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。

• 自定义网络(最佳方式)

  • 与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信。
'''开启Linux系统的IP转发功能 '''
# 1. 出于安全考虑,Linux系统默认是禁止数据包转发的。
# 2. 所谓转发即当主机拥有多于一块的网卡时,将收到的数据包转发给其他网卡
[root@linux-node4 ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward=1
[root@linux-node4 ~]# systemctl restart network
[root@linux-node4 ~]# sysctl net.ipv4.ip_forward   # 输出为1时则证明是成功的

测试 自定义网络 和 container:

##### 1、下载busybox镜像用于测试
docker pull busybox                       # 下载一个测试镜像,一些工具都有了
docker run -it busybox                    # 进入busybox 默认 bash
docker run -it --net=host busybox         # 以 host 网络模式进入bash

##### 2、自定义网络模式
docker network create bs-test                     # 创建一个网络 bs-test
docker run -it --name bs3 --net bs-test busybox   # 创建容器bst加入网络bs-test
docker run -it --name bs4 --net bs-test busybox   # 创建容器bst加入网络bs-test
ping bs3                                          # 在bs3和bs4容器中可以通过主机名ping通
ping bs4
docker start bs3                                  # 启动容器bs3
docker exec -it bs3 sh                            # 进入bs3 bash环境


####3、container网络模式
docker run -itd --name bs -p 99:80 busybox         # 创建一个名字为bs的容器,并将宿主机99端口映射到80端口
docker run -d --name nginx01 --net container:bs nginx    # 使用nginx镜像创建一个容器名nginx01,加入到bs容器中
http://192.168.56.12:99/
docker exec -it bs sh                     
# 注:bs容器中虽然没有nginx服务,但是可以访问nginx服务,因为nginx01容器加入了
发布了46 篇原创文章 · 获赞 10 · 访问量 1844

猜你喜欢

转载自blog.csdn.net/longlong6682/article/details/104730138