一、docker底层依赖的核心技术

1、命名空间 (Namespaces)

2、控制组 (Control Groups)

3、联合文件系统 (Union File System)

4、Linux 虚拟网络支持:本地和容器内创建虚拟接口

(1) 命名空间(Namespaces):

实现了容器间资源的隔离,每个容器拥有自己独立的命名空间 , 运行其中的应用就像是运行在独立的操作系统中一样 , 我们都可以看到文件系统,网卡等资源保证了容器之间互不影响,namesaces管理进程号 , 每个进程命名空间有一套自己的进程号管理方法 , 进

程命名空间是一个父子关系的结构 , 子空间中的进程对于父空间是可见的。

(2) 控制组 (Control Groups) :

控制组 (Control groups)--CGroups 是 Linux 内核的一个特性 ,主要用来对共享资源进行隔离、限制、审计等 。cgroups 允许对于进程或进程组公平( 不公平 ) 的分配 CPU 时间、内存分配和 I/O 带宽。

容器通过 cgroups 来得到所能够管理资源的分配和使用。因此容器所获得资源仅为所有系统资源的一个部分

1、资源限制 : 内存子系统为进程组设置内存使用上限,内存达到上限后再申请内存,就会发出 Out of Memory

2、 优先级 : 通过优先级让一些组得到更多 CPU 等资源

3、 资源审计 : 用来统计系统上实际把多少资源用到适合的目的上 , 可以使用 cpuacct 子系统记录某个进程组使用的 CPU 时间

4、 隔离 : 为组隔离名字空间 , 这样一个组不会看到其他组的进程 .网络连接和文件系统

5、 控制 : 挂起 . 恢复和启动等操作

(3)联合文件系统 (Union File System) :

  docker 中使用AUFS(another Union File System 或 v2 版本以后的Advanced multi-layered Unification File System) 控制为每一个成员目录设定只读 / 读写 / 写出权限 , 同时 AUFS 有一个类似分层的概念 , 对只读权限的分支可以逻辑上进行增量的修改.

二、docker的存储

docker两种存储资源类型:

1、Data Volume (数据卷)

2、Data Volume Dontainers --- 数据卷容器

(1) Data Volume (数据卷):

Data Volume 本质上是 Docker Host 文件系统中的目录或文件,使用类似与 Linux 下对目录或者文件进行 mount 操作。数据卷可以在容器之间共享和重用,对数据卷的更改会立马生效,对数据卷的更新不会影响镜像,卷会一直存在,直到没有容器使用。

Data Volume(数据卷)的特点:

1、Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。

2、容器可以读写 volume 中的数据。

3、volume 数据可以被永久的保存,即使使用它的容器已经销毁。

 Data Volume 的使用:

1、在宿主机根目录下创建一个目录(数据卷)

2、启动一个容器并将数据卷挂载到容器的目录下

3、验证  ( 持久化的需要映射目录)

#

(2)Data Volume Dontainers --- 数据卷容器

数据卷容器就是一个普通的容器,只不过是专门用它提供数据卷供其他容器挂载使用

Data Volume Dontainers使用:

1、创建一个名为 dbdata 的数据卷,并在其中创建一个数据卷挂载到 /dbdata

docker run -dti -v /dbdata --name dbser centos:latest

2、再启动两个容器,并使用数据卷容器

docker run -dti --volumes-from dbser --name db1 centos:latest

#

3、验证

#

容器 db1 和 db2 同时挂载了同一个数据卷到本地相同 /dbdata目录。三个容器任何一个目录下的写入,都可以时时同步到另外两个

三、docker 三种网络

  docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络,docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务,在启动容器的时候,如果不指定参数,在容器外部是没有办法通过网络来访问容器内部的网络应用和服务的

docker 安装时会自动在host上创建三个网络

docker   network  ls   (查看docker  网络)

(1) docker--none网络

none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他 任何网卡。容器创建时,可以通过 --network=none 指定使用 none 网络

none网络的应用

封闭的网络意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用 none 网络。

(2)docker--host网络

连接到 host 网络的容器,共享 docker host 的网络栈,容器的网络配置与host 完全一样。可以通过 --network=host 指定使用 host 网络

host 网络的应用

  直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,就可以选择 host 网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host上已经使用的端口就不能再用了。

Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置,比如管理 iptables

(3) docker--bridge 网络

docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定--network,创建的容器默认都会挂到 docker0 上

#

eth0@if29      与 veth04c5851 是一对 veth pair

#

  veth pair 是一种成对出现的特殊网络设备,可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if29)在容器中,另一头( veth04c5851)挂在网桥 docker0 上,其效果就是将 eth0@if29也挂在了docker0 上。

# 查看网络配置信息 ( 设置容器ip 网段、网关)

docker network inspect bridge

#

注:容器创建时,docker 会自动从 172.17.0.0/16 中分配一个 IP,这里 16 位的掩码保证有足够多的 IP 可以供容器。

四、创建 user-defined网络 (自定义网络)

通过 bridge 驱动创建类似前面默认的 bridge 网络

1、利用bridge驱动创建名为my-net2网桥(docker会自动分配网段)

docker network create --driver bridge my-net2

# 查看网络配置信息

# 查看网桥

2、利用bridge驱动创建名为my-net3网桥(user-defined (自定义)网段及网关)

docker network create --driver bridge --subnet 172.33.1.0/ --gateway 172.33.1.1 my-net3

# 查看网络配置信息

# 查看网桥

3、启动容器使用新建的my-net3网络

docker run -it  --network=my-net3  busybox:latest

4、启动容器使用my-net3网络并指定ip(只有使用 --subnet 创建的网络才能指定静态 IP,如果是docker自动分配的网段不可以指定ip)

docker run -it --network=my-net3  --ip 172.33.1.100  busybox:latest

5、让已启动不同vlan的busybox容器,可以连接到my-net2(其实在busybox中新建了my-net2的网卡)(添加网卡。访问不同的网段)

# #docker network connect my-net3  08493ae30117   ( 连接)

6、使用--name指定启动容器名字,可以使用docker自带DNS通信,但只能工作在user-defined 网络,默认的 bridge 网络是无法使用 DNS 的。

#docker run -it --network=my-net3 --name=bbox1 busybox:latest

#docker run -it --network=my-net3 --name=bbox2 busybox:latest

7、容器之间的网络互联

&1、创建一个 db 容器

docker run -dti --name db centos:latest

&2、创建一个 web 容器,并使其连接到 容器db

docker run -dti --name web --link db:dblink centos:latest /bin/bash

--link db:dblink 实际是连接对端的名字和这个链接的名字,也就是和 db 容器建立一个叫做 dblink 的链接

# 测试

注:此链接通信是单向的

8、容器端口映射

在启动容器的时候,如果不指定参数,在容器外部是没有办法通过网络来访问容器内部的网络应用和服务的,当容器需要通信时,我们可以使用 -P (大) &&-p (小)来指定端口映射

(1)   -P : Docker 会随机映射一个 49000 ~ 49900 的端口到容器内部开放的网络端口

(2)   -p :则可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。

支持的格式

IP : HostPort : ContainerPort

IP : : ContainerPort

IP : HostPort :

&1、 查看映射

docker port   CONTAINER ID/NAMES

&2、映射所有接口地址,此时绑定本地所有接口上的 5200 到容器的 5200 接口,访问任何一个本地接口的 5000 ,都会直接访问到容器内部

docker run -dti -p : centos:latest  /bin/bash

&3、多次使用可以实现多个接口的映射

docker run -dti -p :  -p : centos:latest  /bin/bash

&4、映射到指定地址的指定接口

此时会绑定本地 192.168.226.147 接口上的 5100 到容器的 5100 接口

docker run -dti -p 192.168.226.147:: centos:latest /bin/bash

&5、映射到指定地址的任意接口

此时会绑定本地 192.168.226.147 接口上的任意一个接口到容器的 5500 接口

docker run -dti -p 192.168.226.147:: centos:latest /bin/bash

实验、通过端口映射实现访问本地的 IP:PORT 可以访问到容器内的 web

1、将容器80端口映射到主机8090端口

docker run -itd -p 192.168.226.147:: --name http-test httpd:latest

2、查看刚运行docker容器

docker  ps

3、进入 容器

4、容器内部编辑网页文件 index.html

5、到宿主机上打开浏览器输入 IP:PORT 访问验证

http://192.168.226.147:8090/

6、宿主机上传静态网站测试文件

7、解压

8、把解压的目录上传至容器下的网站根目录

docker cp jd 67b3daf15a40:/usr/local/apache2/htdocs

9、进入容器,删除原来的index.html 文件

10、展开目录

11、web 访问

http://192.168.226.147:8090/

docker (2)---存储、网络(利用docker容器上线静态网站)的更多相关文章

  1. Docker深入浅出系列 | 单节点多容器网络通信

    目录 教程目标 准备工作 带着问题开车 同一主机两个容器如何相互通信? 怎么从服务器外访问容器 Docker的三种网络模式是什么 Docker网络通信原理 计算机网络模型回顾 Linux中的网卡 查看 ...

  2. docker简单介绍---网络端口管理

    一.查看docker支持的网络类型 docker network ls bridge:容器使用虚拟交换机的进行通信 host:使用宿主机的网络 none:只给容器分配一个lo的网卡,无法和外界进行通信 ...

  3. [转帖]Docker四种网络模式

    Docker(十四)-Docker四种网络模式 https://www.cnblogs.com/zhuochong/p/10069293.html 计算机网络相关的知识 非常有用.. Docker 安 ...

  4. centos7下安装docker(12docker网络)

    docker 网络荣覆盖范围可分为:单个host上的容器网络和跨多个host的网络 docker 安装时会自动在host上创建三个网络,我们可以使用docker network ls查看到 1.non ...

  5. Docker(十四)-Docker四种网络模式

    Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls 命令查看: none模式,使用--net=none指定,该模式关闭了容器的网络功能. host模式 ...

  6. Docker默认存储路径修改

    Docker默认存储路径: # docker info...... Data loop file: /var/lib/docker/devicemapper/devicemapper/data.... ...

  7. k8s集群上线web静态网站

    环境准备 一台部署节点,一台master节点,还有两台节点node1,node2 完好的k8s集群环境 思路1: 在node1和node2节点上通过宿主机与容器之间目录映射和端口映射上线静态网站(或动 ...

  8. docker容器网络—单主机容器网络

    当我们在单台物理机或虚拟机中运行多个docker容器应用时,这些容器之间是如何进行通信的呢,或者外界是如何访问这些容器的? 这里就涉及了单机容器网络相关的知识.docker 安装后默认 情况下会在宿主 ...

  9. 利用 Docker 搭建 IPFS 私有网络

    利用 Docker 搭建 IPFS 私有网络 本文原始地址:https://sitoi.cn/posts/40630.html 下载项目 项目地址:https://github.com/Sitoi/p ...

随机推荐

  1. LeetCode(3)Longest Substring Without Repeating Characters

    题目: Given a string, find the length of the longest substring without repeating characters. For examp ...

  2. Cocos2D 添加 UIView

    cocos2d是使用继承于ccnode的结点类型的层.但是我想用一个opengl来绘制,就简单的情况来说必须得加一个uiview.现转载如下: 第一部分:: 使用Cocos2D开发游戏和应用程序的时候 ...

  3. css字体文本格式 鼠标样式

    缩进 text-indent 属性规定文本块中首行文本的缩进.(允许使用负值.如果使用负值,那么首行会被缩进到左边.) length 定义固定的缩进.默认值:0.% 定义基于父元素宽度的百分比的缩进. ...

  4. Selenium启动项参数设置

    再Selenium中使用不同的Webdriver可能会有不一样的方法,有些相同的操作会得到不同的结果, 本文主要介绍的是Chrome()的使用方法. 其他的Webdriver可以参考官方文档 Chro ...

  5. python数据类型小结

    变量 变量是 为了存储程序 运算过程中的一些中间结果,为了方便日后调用. 变量的命名规则1.要有描述性2.变量名只能_,数字,字母组成,不可以是特殊字符(#)3.不能以中文为变量名4.不能以数字开头5 ...

  6. Unity3D for iOS初级教程:Part 1/3

    转自Unity 3d for ios 这篇文章还可以在这里找到 英语 Learn how to use Unity to make a simple 3D iOS game! 这篇教材是来自教程团队成 ...

  7. 性能学习之--loaderunner中run-time setting常用功能

    先打开run-time setting界面 一.Run Logic   设置迭代次数,只控制action的迭代次数,init和end只执行一次. 如果迭代次数设置10,10个并发用户,那么init和e ...

  8. 【luogu】P1772物流运输(最短路+DP)

    题目链接 对于本题我们设ext[i][j]计算第i个码头在前j天总共有几天不能用(其实就一前缀和),设dis[i][j]是从第i天到第j天不变运输路线的最短路径,设f[i]是前i天运输货物的最小花费. ...

  9. BZOJ3122 [Sdoi2013]随机数生成器 【BSGS】

    题目 输入格式 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 输出 ...

  10. 【bzoj3545】[ONTAK2010]Peaks 线段树合并

    [bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...