存储

docker存储volume
#环境 centos7.4 , Docker version 17.12.0-ce
docker volume创建、备份、nfs存储#docker volume
数据存容器内,删容器即销毁全部数据
要保留的数据(数据持久化),需存储在容器外
docker volume是文件或目录,mount到docker容器中使用docker volume
bind muount #挂载任意目录或文件
Volumes #固定路径的目录,docker管理
tmpfs mounts #存放宿主机内存中
imagedocker volume 官网文档地址 https://docs.docker.com/storage/volumes/

#bind muount实例#docker挂载文件或目录到容器#创建目录及文件
mkdir -p /data/test1
echo 'docker volume'>/data/test1/test.txt#创建容器,-v 挂载目录(默认读写权限)
docker run -dit --name busybox1 -v /data/test1:/data/test1 busybox#查看
docker exec busybox1 cat /data/test1/test.txt#修改文件后,在查看本地是否更改
docker exec busybox1 echo my files>>/data/test1/test.txt
docker exec busybox1 cat /data/test1/test.txt
cat /data/test1/test.txt
为保证Dockerfile可移植,构建镜像不能使用bind muount#tmpfs mounts
# 使用--tmpfs
docker run -dit --name tmpfs-test --tmpfs /app busybox
#Volumes
#不指定挂载目录,默认目录/var/lib/docker/volumes//_data/
#docker volumes可管理,官方推荐#使用Volumes#不指定挂载目录,自动创建 volumes/<ID号>/_data/
docker run -dit --name busybox2 -v /data/test busybox
#在容器创建目文件
docker exec busybox2 touch /data/test/test2.txt
#在宿主机查看文件路径
find /var/lib/docker/volumes -name test2.txt
docker inspect busybox2 |grep  Source
#docker volume命令管理#创建volume
docker volume create volume-test1#查看参数
docker inspect volume-test1#使用volume
docker run -dit --name busybox3 -v volume-test1:/volume busybox#查看
docker inspect -f {{.Mounts}} busybox3#查看docker数据卷
docker volume ls#删除没使用的数据卷(谨慎使用)
docker volume prune
Bind mounts和volumes都通过-v或--volume挂载,tmpfs使用--tmpfs
三种都可以使用--mount挂载,格式更清晰,官方推荐使用#docker volume 数据共享
挂载相同目录
使用volume container
#数据卷容器 volume container# --volumes-from 容器名,就会传递容器的挂载目录(volume参数传递)#创建容器busybox4(不需要启动)
mkdir -p /data/test2
echo 'busybox4'>/data/test2/test.txt
docker create --name busybox4 -v /data/test2:/data/test2 busybox# --volumes-from 使用其它容器的volume
docker run -dit --name busybox5 --volumes-from busybox4 busybox#查看
docker exec busybox5 cat /data/test2/test.txt#挂载多个 数据卷容器
docker run -dit --name busybox6 --volumes-from busybox4 --volumes-from busybox1 busybox
docker exec busybox6 ls /data/  #查看
#docker volume 备份
备份volume挂载目录
使用容器--volumes-from备份
#使用数据卷容器备份busybox4的volumesdocker run --rm --volumes-from busybox4 -v $(pwd):/backup busybox \tar cvf /backup/backup.tar /data/test2/
.以上docker volume实例,全部在单台docker主机
docker集群环境,需要使用共享存储、分布式存储#docker volume使用NFS存储#NFS服务端,配置nfs共享
yum install nfs-utils rpcbind -y
mkdir -p /data/nfs/docker
echo "/data/nfs *(rw,no_root_squash,sync)">>/etc/exports
exportfs -r
systemctl start rpcbind nfs-server
systemctl enable rpcbind nfs-server
showmount -e localhost#nfs客户端
yum install -y nfs-utils rpcbind#创建volume 连接 172.16.50.43:/data/nfs
docker volume create --driver local \--opt type=nfs \--opt o=addr=172.16.50.43,rw \--opt device=:/data/nfs \volume-nfs#查看
docker volume ls
docker volume inspect volume-nfs#容器使用volume-nfs
docker run -dit --name busybox7 -v volume-nfs:/nfs busybox#查看
docker inspect -f {{.Mounts}} busybox7
df -h |grep /data/nfs#volume目录/var/lib/docker/volumes/volume-nfs/_data自动挂载到了nfs服务上#容器创文件测试
docker exec busybox7 touch /nfs/testfiles.txt
#使用volume driver 可实现更多的backend#删除测试容器,volumedocker rm -f -v tmpfs-test busybox{1,2,3,4,5,6,7}    #-f 强制删除,-v 删除volume
docker volume prune  

docker volume创建、备份、nfs存储

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1fb916fb0e13        6a                  "sh"                2 hours ago         Created                                 hello2
9fb1ff8de577        6a                  "sh"                2 hours ago         Up 7 minutes                            hello
[root@localhost ~]# docker start 1
1
[root@localhost ~]# docker stats
CONTAINER           CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
9fb1ff8de577        0.00%               56KiB / 993MiB      0.01%               648B / 0B           0B / 0B             0
^C
[root@localhost ~]# docker update -m 500m --memory-swap -1 9f
9f
[root@localhost ~]# docker stats
CONTAINER           CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
9fb1ff8de577        0.00%               56KiB / 500MiB      0.01%               648B / 0B           0B / 0B             0
CONTAINER           CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
9fb1ff8de577        0.00%               56KiB / 500MiB      0.01%               648B / 0B           0B / 0B             0
CONTAINER           CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
9fb1ff8de577        0.00%               56KiB / 500MiB      0.01%               648B / 0B           0B / 0B             0
CONTAINER           CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
9fb1ff8de577        0.00%               56KiB / 500MiB      0.01%               648B / 0B           0B / 0B             0————————————————
版权声明:本文为CSDN博主「cakincqm」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengqiuming/article/details/78987167

docker update可以动态资源限制

1.将数据从宿主机挂载到容器中的三种方式

将数据从宿主机挂载到容器中的三种方式
Docker提供三种方式将数据从宿主机挂载到容器中:
•volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
•bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
•tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。

2.Volume

Volume
管理卷:
# docker volume create nginx-vol
# docker volume ls
# docker volume inspect nginx-vol
用卷创建一个容器:
# docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
# docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
清理:
# docker stop nginx-test
# docker rm nginx-test
# docker volume rm nginx-vol
注意:
1.如果没有指定卷,自动创建。
2.建议使用--mount,更通用。
https://docs.docker.com/engine/admin/volumes/volumes/#start-a-container-with-a-volume

3.Bind Mounts

Bind Mounts
用卷创建一个容器:
# docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
# docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
验证绑定:
# docker inspect nginx-test
清理:
# docker stop nginx-test
# docker rm nginx-test
注意:
1.如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
2.如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。
https://docs.docker.com/engine/admin/volumes/bind-mounts/#start-a-container-with-a-bind-mount

小结

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

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

网络

我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:

· host模式,使用--net=host指定。
· container模式,使用--net=container:NAME_or_ID指定。
· none模式,使用--net=none指定。
· bridge模式,使用--net=bridge指定,默认设置。
· 还有一种:用户自定义模式

下面分别介绍一下Docker的各个网络模式。

1 host模式

格式:

docker run -it --name myubuntu --net=host ubuntu /bin/bash

众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

2 container模式

格式:

docker run -it --name myubuntu --net=container:NAME_OR_ID ubuntu /bin/bash

在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

3 none模式

格式:

docker run -it --name myubuntu --net=none ubuntu /bin/bash

这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

4 bridge模式

bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式。

4.1 bridge模式的拓扑

当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.101.105/24。

Docker完成以上网络配置的过程大致是这样的:

1. 在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。

2. Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。

3. 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
网络拓扑介绍完后,接着介绍一下bridge模式下容器是如何通信的。

4.2 bridge模式下容器的通信

在bridge模式下,连在同一网桥上的容器可以相互通信(若出于安全考虑,也可以禁止它们之间通信,方法是在DOCKER_OPTS变量中设置--icc=false,这样只有使用--link才能使两个容器通信)。
容器也可以与外部通信,我们看一下主机上的Iptable规则,可以看到这么一条

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

这条规则会将源地址为172.17.0.0/16的包(也就是从Docker容器产生的包),并且不是从docker0网卡发出的,进行源地址转换,转换成主机网卡的地址。这么说可能不太好理解,举一个例子说明一下。假设主机有一块网卡为eth0,IP地址为10.10.101.105/24,网关为10.10.101.254。从主机上一个IP为172.17.0.1/16的容器中ping百度(180.76.3.151)。IP包首先从容器发往自己的默认网关docker0,包到达docker0后,也就到达了主机上。然后会查询主机的路由表,发现包应该从主机的eth0发往主机的网关10.10.105.254/24。接着包会转发给eth0,并从eth0发出去(主机的ip_forward转发应该已经打开)。这时候,上面的Iptable规则就会起作用,对包做SNAT转换,将源地址换为eth0的地址。这样,在外界看来,这个包就是从10.10.101.105上发出来的,Docker容器对外是不可见的。
那么,外面的机器是如何访问Docker容器的服务呢?我们首先用下面命令创建一个含有web应用的容器,将容器的80端口映射到主机的80端口。

docker run -d --name web -p 80:80 fmzhen/simpleweb

然后查看Iptable规则的变化,发现多了这样一条规则:

-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.5:80

此条规则就是对主机eth0收到的目的端口为80的tcp流量进行DNAT转换,将流量发往172.17.0.5:80,也就是我们上面创建的Docker容器。所以,外界只需访问10.10.101.105:80就可以访问到容器中得服务。
除此之外,我们还可以自定义Docker使用的IP地址、DNS等信息,甚至使用自己定义的网桥,但是其工作方式还是一样的。

用户自定义模式

用户可以通过Docker网络驱动器或其他的网络驱动器自定义网络。你可以将许多容器连接到同一个网络上,一旦连接到了自定义的网络上,容器之间就可以通过对方的IP地址和主机名来进行通信了。 
如果容器连接到了用户自定义的网络上,容器的/etc/hosts文件会加入在同一个网络中的其他所有容器的IP地址。 
由于容器有可能随时改变/etc/hosts文件,容器中的程序可能会读取到不完整的甚至空的/etc/hosts文件。通常重新读取可以解决这个问题。

转载于:https://www.cnblogs.com/linux985/p/11398447.html

Docker 存储 网络相关推荐

  1. Kubernetes Docker 容器网络终极之战(十四)

    与 Docker 默认的网络模型不同,Kubernetes 形成了一套自己的网络模型,该网络模型更加适应传统的网络模式,应用能够平滑的从非容器环境迁移到 Kubernetes 环境中. 自从 Dock ...

  2. Docker源码分析(八):Docker Container网络(下)

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part8 1.Docker Client配置容器网络模式 Docker目前支 ...

  3. Docker容器网络解析

    Docker 容器网络的发展历史 在 Dokcer 发布之初,Docker 是将网络.管理.安全等集成在一起的,其中网络模块可以为容器提供桥接网络.主机网络等简单的网络功能. 从 1.7 版本开始,D ...

  4. 1.04 docker的网络

    1.网络分类 单机 Bridge Network Host Network None Network 多机 Overlay Network 2.网络基础 公有IP和私有IP public IP:互联网 ...

  5. Docker网络体系结构:设计可扩展、可移植的Docker容器网络

    原文地址 译者:本人翻译水平有限,目的仅是为了学好Docker,如有错误请见谅. 翻译版本:v1.01(将不断优化翻译质量) 本文包含以下内容 Docker容器就是将应用及其所依赖运行环境的完整文件系 ...

  6. Docker存储方式选型建议

    注:本文来源于网络分享 [编者的话]Docker存储方式提供管理分层镜像和容器的可读写层的具体实现.最初Docker仅能在支持AUFS文件系统的Ubuntu 发行版上运行,但是由于AUFS未能加入Li ...

  7. docker的网络架构配置

    http://xiaorenwutest.blog.51cto.com                  docker 网络架构模 默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器 ...

  8. docker(4)docker的网络,自定义网桥

    Docker 的网络 运行 ifconfig 找到 docker0 : 虚拟网卡默认网卡名称为docker0 查看docker 的网桥: 我这里默认们没有进行安装 网桥管理设备:进行安装一下: yum ...

  9. 手工模拟实现 Docker 容器网络!

    大家好,我是飞哥! 如今服务器虚拟化技术已经发展到了深水区.现在业界已经有很多公司都迁移到容器上了.我们的开发写出来的代码大概率是要运行在容器上的.因此深刻理解容器网络的工作原理非常的重要.只有这样将 ...

最新文章

  1. OpenStack服务组件介绍
  2. 职场社交是一个真实需求吗?
  3. 启明云端分享| ESP32-S2直驱USB摄像头
  4. Java里的堆(heap)栈(stack)和方法区(method)
  5. eclipse lombok 标红_无法使Lombok项目在Eclipse上运行
  6. win10安装影子系统导致的蓝屏
  7. DOS处理 CMD提速 BAT恶搞
  8. WSJ0数据集简单介绍
  9. python for ArcGIS 绘制上海市环线地图
  10. 如何计算CAN总线的负载率以及每帧耗时和每秒最多传输帧数
  11. redis数据库的概述
  12. JSP实用教程-JSP语法
  13. RapidMiner 5.3.015源代码下载并且正确的运行
  14. 51单片机RS485远程双机多机温度采集主从机多节点蜂鸣器报警
  15. vue官网学习笔记(九)组件基础
  16. GDT陶瓷气体放电管与MOV压敏电阻串联时的导通顺序-优恩
  17. CS 传导抗扰度测试失败的原因及对策
  18. jdbc连接MySQL后的增、删、改、查
  19. 详解fiddler抓包工具
  20. html编码后台转换,html unicode编码转换方法

热门文章

  1. CV Code | 计算机视觉开源周报 20190603期
  2. linux服务器开发板,linuxnfs服务器的建立,虚拟机、开发板间的通信
  3. 练习图200例图纸讲解_建筑安装工程图例及符号手册,最全数据整理,施工图纸从此无忧...
  4. Python精简入门学习(三)
  5. http response 返回 没有内容_HTTP 教程2
  6. 229页,CMU博士张昊毕业论文~探索机器学习并行化的奥秘
  7. 一文带你领略人工神经网络激荡70年
  8. 【资源】《可解释的机器学习》,让机器学习不再神秘!
  9. 【资源下载】512页IBM沃森研究员Charu最新2018著作《神经网络与深度学习》(附下载链接)
  10. 毫秒级检测!你见过带GPU加速的树莓派吗?