Docker存储

docker提供数据卷来实现数据共享与持久化,而数据卷的挂载有两种方式:

  • 挂载主机目录(Bind mounts)
  • 数据卷容器(Data Volumes)

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新不会影响镜像
  • 卷会一直存在,只到没有容器使用

挂载主机目录

创建一个数据卷

docker run -d -P --name web -v /webapp docker.io/centos:6 /bin/bash
选项说明:
-d:将容器放入后台运行
-P:将容器中的端口暴露到宿主机的一个随机端口
-v:创建一个数据卷,这个数据卷会自动映射到宿主机的某个目录,一般在/var/lib/docker/vfs下

挂载一个宿主机目录作为数据卷

docker run -d -P --name web -v /data:/webapp docker.io/centos:6 /bin/bash #将宿主机的/data目录挂载至容器的/webapp目录

docker挂载数据卷的默认为权限为读写(rw),用户也可以通过ro指定为只读:
docker run -d -P --name web -v /data:/webapp:ro docker.io/centos:6 /bin/bash

数据卷容器

创建一个数据卷容器

docker run -it -v /dbdata --name dbdata docker.io/centos:6    #创建一个数据卷容器dbdata,并创建一个数据卷挂载至/dbdata

其他容器可以通过--volumes-from来挂载dbdata容器中的数据卷:

docker run -it --volumes-from dbdata --name db1 centos:6
docker run -it --volumes-from dbdata --name db2 centos:6

容器db1和db2都挂载同一个数据卷到/dbdata目录,三个容器任何一方在该目录的写入,其他 容器都能看到

--volumes-from参数可以多次使用,从多个容器挂载多个数据卷

如果删除了挂载的容器,数据卷并不会被自动删除,如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显示的使用docker rm -v 命令来指定同时删除关联的容器。

利用数据卷容器迁移数据

备份数据:

#先创建一个容器worker,并使用--volumes-from将dbdata挂载到worker容器,然后使用-v参数将容器的/backup目录映射到宿主机的backup目录。然后在容器中执行备份操作,这样就把数据备份到宿主机的/backup目录中了

docker run -it --volumes-from dbdata -v /backup:/backup --name worker centos:6
tar zcf /backup/backup.tar.gz /dbdata

还原数据:

#创建一个新容器,并用-v参数挂载本地的备份目录,然后执行解压操作,将备份文件解压至/dbdata目录
docker run -it -v /dbdata --name dbdata2 centos:6 /bin/bash #创建一个容器dbdata2
docker run -it --volumes-from dbdata2 -v /backup:/backup centos:6 tar xf /backup/backup.tar.gz

删除数据盘

查看主机上现有的数据盘

docker volume ls

默认情况下,在删除容器时,docker并不会删除其数据盘,查看没有容器在使用的数据盘方法如下:

docker volume ls -f dangling=true

如果想要删除没有使用的数据盘,使用如下指令:

docker volume rm VOLUME_NAME

删除掉容器时,同时删掉数据盘,则使用:

docker rm -v container_name

Docker网络

简介

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连接在了一个二层网络中。从docker0子网中分配一个ip给容器使用,并设置docker0的ip地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。而这种网络模式即称之为bridge网络模式。

除了bridge模式以外,docker原生网络,还支持另外两种模式: none和host

可以通过如下方法查看docker的网络:

root@k8s-m:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
93392a2471d3 bridge bridge local
05c5ebb39921 host host local
3cb2552dc6e9 none null local

bridge网络

bridge网络基本用法

网络结构示意图:

查看bridge网络信息:

# 通过如下命令会列出bridge网络的相关信息,其中"Containers"字段的表示是信息是指当前节点上有哪些容器使用了该网络
docker network inspect bridge

创建使用bridge网络容器的示例:

docker run -d --name web1 --net bridge nginx

基于bridge网络的容器访问外部网络

默认情况下,基于bridge网络容器即可访问外部网络,这是因为默认情况下,docker使用了iptables的snat转发来实现容器对外部的访问(需要内核开启net.ipv4.ip_forward=1)

外部网络访问基于bridge网络的容器

如果想让外界可以访问到基于bridge网络创建的容器提供的服务,则必须要告诉docker要使用的端口。

可以通过如下方法查看镜像会使用哪些端口:

docker inspect nginx | jq .[]."ContainerConfig"."ExposedPorts"

在创建容器的时候可以指定这个容器的端口与主机端口的映射关系:

docker run -d --name web -p 8888:80 nginx
-p: 可以指定主机与容器的端口关系,冒号左边是主机的端口,右边是映射到容器中的端口
-P:该参数会分配镜像中所有的会使用的端口,并映射到主机上的随机端口

这种端口映射基于iptables的dnat实现

查看容器的端口情况:

docker port web

如果创建容器时,-p参数后面只一个指定端口,意思是主机会随机一个端口,映射到容器的该指定端口:

docker run -d --name web -p 80 nginx

下面是一个基于端口映射的示例:

docker run -d --dns 8.8.8.8 -p 8080:80 -p 2022:22 --name webserver1 httpd:2.4

docker run -d --dns 8.8.8.8 -P --name webserver1 httpd:2.4

none网络

故名思议,none网络就是什么都没有的网络。使用none网络的容器除了lo,没有其他任何网卡,完全隔离。用于既不需要访问外部服务,也不允许外部服务访问自己的应用场景。

查看none网络信息:

docker network inspect none

创建使用none网络容器的示例:

docker run -d --name web_none --net none nginx

host网络

使用host网络的主机,与宿主机共享网络地址,可以获得最好的数据转发性能。缺点是,同一个宿主机上的多个容器共享同一个ip地址,如果多容器使用相同的端口,需要自行解决端口冲突问题。

同样的,可以通过如下方式查看host网络信息:

docker network inspect host

创建一个使用host网络容器的示例:

# 可以看到该容器没有自己的IP地址,因为它直接使用宿主机IP地址
docker run -d --name web_host -net host nginx

自定义网络

Docker除了提供三种的默认网络模式之外,也允许用户针对一些特定的应用场景去创建一些自定义的网络。这样属于这个网络的容器就可以单独隔离出来,它们之间可以相互通信,而不在这个网络的容器就不能直接访问到它们。一个容器可以属于多个网络,同一个自定义网络下的容器可以通过各自的容器名访问到对方,因为会使用到docker内嵌的一个dns功能。

Docker提供三种自定义网络驱动:

  • bridge
  • overlay
  • macvlan

自定义bridge网络

创建一个自定义网络

1、创建一个叫作my_net的自定义网络:

docker network create --driver bridge my_net    #--driver用于指定网络类型

可以通过docker network ls 查看到新创建的my_net网络相关信息,Subnet表示这个网络下的子网IP段,那么基于my_net自定义网络创建的容器IP都会以该IP段开头。

2、基于my_net网络创建容器:

docker run -d --name web2 --net my_net nginx

通过指定子网和网关的方式创建自定义网络

1、通过指定子网和网关的方式创建my_net2网络:

docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2

2、创建一个容器使用my_net2网络:

docker run --it --network=my_net2 busybox

3、创建一个容器的使用my_net2网络的同时指定其ip地址:

docker run --it --network=my_net2 --ip=172.22.16.8 busybox

使用自定义网络与默认网络互通

假设我们在默认的bridge网络中,还有一个httpd的容器:

docker run -d --name webserver httpd:2.4

此时默认网络中的容器与my_net2网络中的容器是无法互相通信的。宿主机上网络结构如下:

如果想让默认bridge网络的httpd与my_net2中的容器通信,可以给httpd容器添加一块自定义网络的网卡,使用如下指令:

docker network connect my_net2 webserver

如果要将webserver新添加的这块网卡移除,可以使用如下命令:

docker network disconnect bridge webserver

同一台宿主机容器互联

同一台宿主机上的容器互联有两种方式,第一种是基于ip,默认情况下,同一个宿主机上的容器ip是互通的。另一种方式是使用--link实现:

docker run -d --name db1 -e "MYSQL_ROOT_PASSWORD=123456" -P mysql:5.6

docker run -d --link db1:db1 --name webserver1 httpd:2.4

docker存储与网络的更多相关文章

  1. Docker存储和网络

    Docker存储资源类型 docker两种存储资源类型 用户在使用 Docker 的过程中,势必需要查看容器内应用产生的数据,或者需要将容器内数据进行备份,甚至多个容器之间进行数据共享,这必然会涉及到 ...

  2. docker (2)---存储、网络(利用docker容器上线静态网站)

    一.docker底层依赖的核心技术 1.命名空间 (Namespaces) 2.控制组 (Control Groups) 3.联合文件系统 (Union File System) 4.Linux 虚拟 ...

  3. 理解Docker(8):Docker 存储之卷(Volume)

    (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 ...

  4. 理解Docker(7):Docker 存储 - AUFS

    (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 ...

  5. Docker存储

    前言 上一篇文章中简单总结了一下docke的基础使用方法,这次我来总结一下有关docker存储方面的相关知识.本文同样建立在CloudMan的系列教程之上,有兴趣的可以直接移步. 有些人可能觉得这个很 ...

  6. Docker跨主机网络——overlay

    前言 在Docker网络--单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易.本文我为大家总结Docker跨主机通信相关知识.同样本文大部分内容以CloudM ...

  7. 6、Docker存储卷

    Why Data Volumes?  来自马哥教育 Data volumes Volume types  绑定挂载卷:在宿主机和容器上各指明绑定路径才能进行绑定. docker管理卷:在容器内指定挂载 ...

  8. Docker多主机网络

    网络术语概念 二层交换技术:工作在OSI七层网络模型的第二层,通过MAC地址进行帧转发 三层交换技术:也称为IP交换技术,工作在OSI七层网络模型的第三层,通过IP地址进行包转发.它解决了局域网中网段 ...

  9. docker——libnetwork插件网络功能

    从1.7.0版本开始,Docker正是把网络和存储这两部分的功能都以插件化形式剥离出来,允许用户通过指令来选择不同的后端实现.剥离出来的独立容器网络项目叫libnetwork,从名字就能看出,它希望将 ...

随机推荐

  1. Linux内核分析作业五

    扒开系统调用的三层皮(下) 给MenuOS增加time和time-asm命令 步骤 rm menu -rf //强制删除 git clone http://github.com/menging/men ...

  2. Android Studio下创建menu布局文件

    一.问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下 ...

  3. There are no enabled repos.

    今天要记录一下自己懵逼的一天,原来自己是Ubuntu系统,还以为是centos,导致命令错了 There are no enabled repos. Run "yum repolist al ...

  4. CentOS7.3安装rz、sz命令

    安装命令: yum install lrzsz 关于rz.sz: lrzsz是一款在linux里可代替ftp上传和下载的程序.lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议. ...

  5. TitleLayout——一个Android轻松实现通用、标准、支持沉浸式状态栏的标题栏库

    TitleLayout 多功能.通用的.可在布局或者使用Java代码实现标题栏:支持沉浸式状态栏,支持左侧返回按钮(不需要手动实现页面返回),左侧支持图片+文字.图片.文字:右侧支持图片.文字等. 堆 ...

  6. Spring Cloud Zipkin

    Zipkin the idea is from the googlge paper:Dapper https://yq.aliyun.com/articles/60165 https://www.e4 ...

  7. Maven2查看源码

  8. vuex最简单、最详细的入门文档

    如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 . 我在使用基于 vue.js 2.0 的UI框架 ElementUI 开发网站的时候 , 就遇到了这种问题 : 一 ...

  9. html css類和css()

    addClass():一個或者多個元素添加一個或者多個類 $("元素一,元素2,元素3").addClass(“類名1  類名2”) removeClass():一個或者多個元素刪 ...

  10. python之文件目录操作

    代码示例: # 改变当前目录操作 import os cur = os.curdir print("1.当前目录相对路径:", cur) par = os.pardir print ...