一. 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特点:
- 多个运行容器之间共享数据。
- 当容器停止或被移除时,该卷依然存在。
- 多个容器可以同时挂载相同的卷。
- 当明确删除卷时,卷才会被删除。
- 将容器的数据存储在远程主机或其他存储上
- 将数据从一台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容器加入了