Docker学习笔记

因学习Hyperledger fabric需要,学习极客学院Docker视频,所作笔记

Docker 简介

1.什么是容器技术
(1)一种虚拟化的方案;
(2)操作系统级别的虚拟化;
(3)只能运行相同或相似内核的操作系统;
(4)依赖于Linux内核特性:Namespace和Cgroups(Control Group);
2.linux容器技术 vs 虚拟机
磁盘占用空间更少,使用虚拟机部署应用,不但包含应用及依赖的库,还包含完整的操作系统;容器只需要包含应用和依赖的库;虚拟机需要模拟硬件的行为,对内存和CPU损耗更大。
容积技术本身比较复杂,依赖linux内核的很多特性,而且不易安装与管理和实现自动化,docker为了解决这些问题开发的。
3.什么是Docker
(1)将应用程序自动部署到容器;
(2)使用Golong编写;
(3)2013年初dotCloud编写的;
(4)基于Apache 2.0 开源授权协议发行
4.Docker的目标
(1)提供简单轻量的建模方式,简单易上手,docker容器启动快速,性能高,同时同一台宿主机可以运行多个容器;
(2)职责的逻辑分离,开发与运维分离;
(3)快速高效的开发生命周期,是程序具备可移植性,以容器的形式分发,有效缩短开发周期;
(4)鼓励使用面向服务的架构,推荐一个容器只运行一个程序;
5.Docker的使用场景
(1)使用docker容器开发、测试、部署服务;
(2)创建隔离的运行环境;
(3)搭建测试环境;
(4)构建多用户的平台即服务(Paas)基础设施;
(5)提供软件即服务(Saas)应用程序;
(6)高性能、超大规模的宿主机部署;

Docker 的基本组成

1.Docker Client客户端
2.Docker Daemon 守护进程
3.Docker Image 镜像
4.Docker Container 容器
5.Docker Registry 仓库

Docker 客户端/守护进程
docker是C/S架构的程序,docker客户端向docker服务器端即守护进程发出请求,守护进程处理完将结构返回,docker客户端可以对本地或远程进行访问。
Docker 镜像
镜像是容器的基石,镜像是一个层叠的只读文件系统,最低层是bootfs(引导文件系统),当一个容器被启动之后,引导文件系统会被卸载;第二层rootfs(Ubuntu),永远是只读的;上面是联合加载(union mount)。一个镜像可以放在另一个镜像的顶部,下面的镜像被称为“父镜像”,最底部的镜像,被称为“基础镜像”。
Docker 容器
容器通过镜像启动,是docker的执行单元,是启动和执行阶段。当容器启动时,会在最顶层加载一个可写层,当执行操作时,变化都在这一层上。当改变一个文件时,先从下面只读层复制到可写层,发生改变时,自读层内容会被可写层所隐藏。
Docker 仓库
仓库时保存镜像的地方,分为公有仓库和私有仓库两种,docker公司提供的docker hub这个仓库。
在这里插入图片描述

Docker容器相关技术简介

docker依赖的linux内核的两个特性,分别是命名空间Namespaces和控制组Control groups(groups)

命名空间(Namespaces)

编程语言都有命名空间的概念,命名空间是用来组织和重用代码的。如同名字一样的意思,NameSpace(名字空间),之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了。为了解决这个问题,引入了名字空间这个概念,通过使用 namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的,这样一来就不会引起不必要的冲突了。它提供了代码隔离
在操作系统中命名空间提供了系统资源的隔离,这些系统资源包括了进程、网络、文件系统等。命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。
docker的命名空间
1.pid 命名空间,进程隔离
不同用户的进程就是通过 pid 命名空间隔离开的,且不同命名空间中可以有相同 pid。所有的 LXC 进程在 Docker 中的父进程为Docker进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。
2. net 命名空间,管理网络接口
有了 pid 命名空间, 每个命名空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 命名空间实现的, 每个 net 命名空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。Docker 默认采用 veth 的方式,将容器中的虚拟网卡同 host 上的一 个Docker 网桥 docker0 连接在一起。
3.ipc 命名空间,管理跨进程通信的访问
容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC), 包括信号量、消息队列和共享内存等。然而同 VM 不同的是,容器的进程间交互实际上还是 host 上具有相同 pid 命名空间中的进程间交互,因此需要在 IPC 资源申请时加入命名空间信息,每个 IPC 资源有一个唯一的 32 位 id。
4. mnt 命名空间,管理挂载点
类似 chroot,将一个进程放到一个特定的目录执行。mnt 命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个命名空间中的容器在 /proc/mounts 的信息只包含所在命名空间的 mount point。
5.uts 命名空间,隔离内核和版本标识
UTS(“UNIX Time-sharing System”) 命名空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程。

控制组Control groups(groups)

CGroups 最初叫Process Container,顾名思义就是将进程放到一个组里进行统一控制。后来改名叫Control Groups。CGroups 是 Control Groups 的缩写,它为资源管理提供了一个统一框架,可以把系统任务及其子任务整合到按资源等级划分的不同任务组内。并且对这些任务组实施不同的资源分配方案。CGroups可以限制、记录、隔离进程组所使用的物理资源(包括CPU、memory、I/O等)。
可以实现的功能包括,资源限制、优先级设定、资源计量、资源控制,可以理解为一种资源控制的阀门。

docker容器的能力

1.文件系统隔离:每个容器都有自己的root文件系统;
2.进程隔离:每个容器都运行在自己的进程环境中;
3.网络隔离:容器件的虚拟网络接口和IP地址都是分开的;
4.资源隔离和分组:使用cgroups将CPU和内存之类的资源独立分配给每个docker容器;
在这里插入图片描述

Docker 安装与配置

参考菜鸟教程等资源
Ubuntu:https://www.runoob.com/docker/ubuntu-docker-install.html
CentOS:https://www.runoob.com/docker/centos-docker-install.html

Docker 基本操作

1.启动容器
docker run IMAGE [COMMAND] [ARG...]
run 在新容器中执行命令
image 指定操作对象的镜像
command 表示容器启动后执行的命令
arg 表示容器启动后执行命令的参数
2.启动交互式容器
docker run -i -t IMAGE [COMMAND] [ARG...]
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
3.查看容器
docker ps [-a] [-l]
-a :显示所有的容器,包括未运行的
-l :显示最近创建的容器。
4.获取容器/镜像的元数据
docker inspect [OPTIONS] 容器名/容器ID [NAME|ID...]
-f :指定返回值的模板文件
-s :显示总的文件大小
--type :为指定类型返回JSON
5.自定义容器名
docker run name=自定义名 -i -t IMAGE [COMMAND] [ARG...]
6.重新启动停止的容器
docker start [-i] 容器名
7.删除停止的容器
docker rm 容器名
在这里插入图片描述

守护式容器

1.什么是守护式容器
能够长期运行
没有交互式会话
适合运行应用程序和服务
2.以守护形式运行容器
先启动一个交互式容器:docker run -i -t IMAGE /bin/bash
然后使用,Ctrl+P或者Ctrl+Q来退出交互式容器的bash,这样交互式容器就在后台运行
3.附加(链接)到运行中的容器
docker attach 容器名(可以是container ID/NAMES中的名字)
4.启动守护式容器
docker run -d 镜像名 [COMMAND][TAG...]
启动容器时,使用后台的方式来执行命令,-d只是以后台的形式来运行命令,命令结束后容器依旧会停止。
5.查看容器日志
docker logs [-f][-t][--tail] 容器名
-f --follow=true|false 默认为false,作用:跟踪日志的变化,并返回结果
-t --timestamps=true|false默认为false,作用:返回的结果上加上时间戳
--tail=“all”,作用:返回结尾处多少数量的日志
6.查看容器内进程
docker top 容器名
7.在运行中的容器内启动新进程
docker exec [-d][-i]-[-t] 容器名 [COMMAND][TAG...]
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开,进行互动
-t:在新容器内指定一个伪终端或终端。
使用Ctrl+P或者Ctrl+Q退出
例如:docker exec -i -t dc1 /bin/bash
8.停止守护式容器
docker stop 容器名/容器ID
docker skill 容器名/容器ID(比较快速)

在容器中部署静态网站

1.设置容器的端口映射
在使用run的时候指定-p或-P来进行端口映射
-P:将为容器暴露的所有端口进行映射
eg:docker run -P -it centos /bin/bash
-p:指定映射哪些容器的端口
eg:(1)只指定容器端口(宿主机端口随机映射)
docker run -p 80 -it centos /bin/bash
(2)同时指定宿主机端口和容器端口
docker run -p 8080:80 -it centos /bin/bash
(3) 指定ip和容器的端口
docker run -p 0.0.0.0:80 -it centos /bin/bash
(4)指定ip:宿主机端口:容器端口
docker run -p 0.0.0.0:8080:80 -it centos /bin/bash
2.部署服务
(1)创建映射80端口的交互式容器
(2)安装nginx
(3)安装vim
(4)创建静态页面
(5)修改nginx配置文件
(6)运行nginx
(7)验证网站访问
3.搭建
(1)创建一个映射80端口的交互式容器:
docker run -p 80 --name web -it ubuntu /bin/bash
(2)安装nginx,vim
yum install -y nginx vim
(3)建立存放页面的目录和页面
mkdir -p /var/www/html
cd /var/www/html/
vim index.html

<html>
    <head>
        <title>Test docker-ng</title>
    </head>
    <body>
        <h1>IF you see this, you success run a nginx in docker!</h1>
    </body>
    </html>

(4)编辑nginx配置文件
vim /etc/nginx/nginx.conf
修改root /var/www/html;
(5) 运行nginx
nginx
ps -ef | grep nginx
使用CTRL+PCTRL+Q让容器运行在后台
(6)在物理机中查看容器
docker ps
docker port web
(7)验证网站是否可访问
curl 宿主机ip地址:宿主机端口号
curl 容器ip地址

Docker镜像与仓库

1.查看和删除镜像
1)镜像是容器的基石
2)镜像是层叠的只读文件系统
3)联合加载
2.镜像存储位置
/var/lib/docker
可以使用docker info命令查看docker存储位置和存储驱动
3.如何列出镜像
列出镜像docker images [OPTSIONS] [REPOSITORY]
OPTSIONS 选项
-a 显示所有镜像,默认不显示中间层的镜像
​ -f 在显示时的过滤条件
--no-trunc=false 不使用截断的模式显示,默认情况查看的是被截断的镜像(截断唯一ID)
-q 只显示唯一ID
REPOSITORY 仓库,一系列镜像的集合
在这里插入图片描述
注意:
REPOSITORY(镜像仓库):是一些关联镜像的集和,如:ubuntu是一个大仓库,每个镜像对应不同版本和REGISTRY(仓库)不同,这是docker组件中的仓库,提供docker镜像的存储服务。即:REGISTRY中有很多REPOSITORY,REPOSITORY中有很多IMAGE(相互独立)
TAG:镜像的标签,用来区分不同的镜像,一个REPOSITORY:TAG就是一个完整的镜像,对应一个完整的镜像ID,默认TAG使用latest

4.查看镜像的详细信息
查看容器/镜像:docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]
OPTIONS说明:
-f :指定返回值的模板文件。
-s :显示总的文件大小。
--type :为指定类型返回JSON。
5.删除镜像
删除镜像命令:docker rmi OPTIONS IMAGE
-f 强制删除
--no-prune=false 保留被打标签的父镜像

如何获取和推送Docker镜像

1.查找镜像
1)Docker Hub 的官方网站 https://hub.docker.com/
2)使用命令查找镜像:docker search [OPTIONS] TERM
OPTIONS
--automated :只列出 automated build类型的镜像;
--no-trunc :显示完整的镜像描述;
-s :列出收藏数不小于指定值的镜像。
2.拉取镜像
1)拉取镜像:docker pull [OPTIONS] <镜像名称>[:<Tag>]
OPTIONS
-a :拉取所有 tagged 镜像
--disable-content-trust :忽略镜像的校验,默认开启
3.加速镜像
使用–registry-mirror选项
1)修改:/etc/default/docker
2)添加:DOCKER_OPTS=" --registry-mirror=http://624869e7.m.daocloud.io"
https://www.daocloud.io
4.推送镜像
推送镜像命令:docker push [OPTIONS] NAME[:TAG]
OPTIONS
--disable-content-trust :忽略镜像的校验,默认开启

如何构建Docker镜像

1.构建镜像的作用
1)保存对容器的修改,并再次使用
2)自定义对象的能力
3)对软件的形式打包并分发给服务及其运行环境
1.构建镜像的方法
通过容器构建镜像docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
通过dockerfile构建镜像
1)创建dockerfile文件(Dockerfile是由一行命令和语句组成的)
案例:我们基于centos镜像进行自动构建(dockerfile)
规划存放dockerfile文件的目录结构

[root@linux-node1 ~]# cd /root
[root@linux-node1 nginx]# mkdir -p dockerfile/nginx
[root@linux-node1 nginx]# pwd
/root/dockerfile/nginx

创建文件需注意:D需要大写,当我们构建dockerfile的时候,docker默认会在我们当前目录读取一个名为Dockerfile的文件。这时候的D必须大写。

[root@linux-node1 nginx]# vim Dockerfile
# This Dockerfile
 
# Base image
FROM centos
 
# Maintainer
MAINTAINER shhnwangjian xxx@163.com

# Commands
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx && yum clean all
RUN echo "daemon off;" >>/etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx"]

说明:
#井号代表注释
#Base image 除了注释的第一行,必须是FROM,意思就是我们需要告诉dockerfile基础镜像是什么
#Maintainer 维护信息
#Commands 命令
#ADD index.html 这个文件需要我们在当前目录下有才可以,我们配置我们可以准备好,然后使用ADD命令进行添加或修改 EXPOSE 对外端口号 CMD [“nginx”] 它要启动的命令是nginx (就算是nginx服务)

2)使用docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
--force-rm :设置镜像过程中删除中间容器;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

Docker的C/S模式

在这里插入图片描述
在这里插入图片描述
1.Remote API
1.RESTful风格API
2.STDIN、STDOUT、STDERR
在这里插入图片描述
在这里插入图片描述
2.连接方式:Socket
1) 默认:unix://var/run/docker.sock
2) tcp://host:port
3) fd://socketfd
在这里插入图片描述

Docker守护进程的配置和操作

1.查看docker守护进程语法
1)ps -ef | grep docker
2)sudo status docker
2.启动,停止重启docker的守护进程(使用service命令管理)
1)sudo service docker start
2)sudo service docker stop
3)sudo service docker restart
3.docker守护进程的启动选项
1)以守护的形式运行docker:docker -d [OPTIONS]

OPTIONS
1)运行相关:
-D,–debug=false
-e,–exec-driver=“native”
-g,–graph="/var/bin/docker"
–icc=true
-l,–log-level=“info”
-able=[]
-p,–pidfile="/var/run/dpcker.pid"
2)docker服务器连接相关:
-G,–group=“docker”
-H,–host=[]
–tls=flase

3)RemoateAPI相关:
–api-enable-cors=false

4)存储相关:
-s,–storage-driver=""
–selinux-enabled=flase
–storage-opt=[]

5)Registry相关:
–insecure-registry=[]

6)网络设置相关:
-b,–bridge=""
–ip=0.0.0.0
–ip-forward=ture
–ip-masq=ture
–iptables=ture
–ipv6=false
–mtu=0

3.修改docker守护进程的启动配置
修改配置文件:/etc/default/docker
在这里插入图片描述

Docker的远程访问

1.环境配置
1)第二台安装docker的服务器
2)修改docker守护进程启动选项
3)保证client API与Server API版本一致
2.修改服务器端配置
1)修改docker守护进程启动选项
-H tcp://host:port
unix://var/run/docker.sock
fd://socketfd
守护进程默认配置
-H unix://var/run/docker.sock
2)修改方法
修改/etc/sysconfig/docker文件,在最后增加一行DOCKER_OPTS

#docker-latest daemon can be used by starting the docker-latest unitfile.
#To use docker-latest client, uncomment below lines
#DOCKERBINARY=/usr/bin/docker-latest
#DOCKERDBINARY=/usr/bin/dockerd-latest
#DOCKER_CONTAINERD_BINARY=/usr/bin/docker-containerd-latest
#DOCKER_CONTAINERD_SHIM_BINARY=/usr/bin/docker-containerd-shim-latest DOCKER_OPTS="-H unix:///var/run/docker.sock -H 0.0.0.0:2375"

重新启动docker:

sudo service docker restart

2.修改客户端配置
1)方法一:a、使用docker客户端命令选项
-H tcp://host:port
unix://var/run/docker.sock
fd://socketfd
客户端默认配置
-H unix://var/run/docker.sock
验证:访问服务器端的docker的info:

docker -H tcp://IP地址:端口号  info

3)方法二:使用环境变量DOCKER_HOST
export DOCKER_HOST="tcp://IP地址:端口号(一般是2375)"

dockerfile指令

1.指令格式
(1)Comment:注释
注释是以#开头,后面跟着注释内容
(2)INSTUCTION argument:指令
指令是以大写的指令名开始,后面是指令参数

(1) FROM

1)FROM有两种格式

FROM 镜像名
FROM 镜像名:标签

这个镜像必须是已经存在的镜像,后续指令都是基于这个镜像来执行。这个镜像也叫基础镜像。必须是dockerfile中第一条非注释指令。

(2)MAINTAINER
MAINTAINER指令用于指定生成镜像的作者名称,其格式为:
MAINTAINER <name>
指定镜像的作者信息,包含镜像的所有者和联系信息。

(3) RUN
RUN指令指定当前镜像中运行的命令,包含了两种模式,一种是shell模式和exec模式

shell格式:就像在命令行中输入的Shell脚本命令一样。
命令格式:

RUN <command> (shell)
    /bin/sh -c command

比如:

  RUN echo '<h1>Hello Docker!</h1>' > /usr/share/nginx/html/index.html
  RUN echo hello

exec格式:像是函数调用的格式
格式:

RUN ["executable","param1","param2"]

例如:

  RUN  ["/bin/bash","-c","echo hello"]

(4) EXPOSE
格式:

EXPOSE <port> [ <port>...]

指定运行改镜像的容器使用的端口,在容器运行时仍需手动的指定容器的端口映射,使用dockerfile 的EXPOSE指令来指定的端口只是告诉docker该容器中的应用程序,会使用特定的端口。
例如:

docker run -p 80 -it centos /bin/bash

(5) CMD
CMD指令与RUN指令相似,也具有两种格式:

CMD  ["executable","param1","param2"](exec模式)
CMD command param1 param2(shell 模式)
CMD ["param1","param2"] (提供给ENTERYPOINT的默认参数)

Docker不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,就需要指定运行的程序及参数。CMD就是指定容器启动时候的默认命令。RUN指令中,指定的命令是在镜像构建过程中运行的,CMD指令,指定的命令是在容器运行时运行的。如果使用docker run命令启动容器时,如果指定了容器运行时的命令,那么CMD指令中的指令将会被覆盖,不会执行。CMD指令是用来运行容器默认行为的。
(6) ENRERYPOINT
命令格式

shell格式:ENTRYPOINT command param1 param2
exec格式:ENTRYPOINT ["executable","param1","param2"]

ENRERYPOINTCMD指令非常相似,区别是ENRERYPOINT不会被CMD指令中的启动指令将会被覆盖,可以使用docker run --entrypoint指令来覆盖。
(7)ADD
格式:

ADD <src>... <dest>
ADD ["<src>"... "<dest>"](适用于文件路径中有空格的情况)

该指令都是将文件或目录复制到使用dockerfile构建的镜像中,支持两种参数,来源地址和目标地址,文件或者目录的来源可以是本地地址也可以是URL。如果是本地地址,必须是构建目录中的相对地址,对于远程URL,docker并不推荐使用,更建议使用curlwget之类的命令来获取文件,而目标路径需要指定镜像中的绝对路径。
ADD包含类似tar的解压功能
(8)COPY
格式为:

COPY src desc
COPY  ["<src>"... "<dest>"](适用于文件路径中有空格的情况)

该指令都是将文件或目录复制到使用dockerfile构建的镜像中,支持两种参数,来源地址和目标地址,文件或者目录的来源可以是本地地址也可以是URL。如果是本地地址,必须是构建目录中的相对地址,对于远程URL,docker并不推荐使用,更建议使用curlwget之类的命令来获取文件,而目标路径需要指定镜像中的绝对路径。
单纯复制文件,Docker推荐使用COPY
(9)VOLUME
使用方法:

VOLUME ["/data"]

VOLUME指令用来向基于镜像创建的容器创建卷,一个卷可以存在于一个或多个容器的特定目录,这个目录可以绕过联合文件系统,并提供如共享数据或者对数据持久化的功能。
(10)WORKDIR

WORKDIR /path/to/workdir

WORKDIR指令来用来在镜像创建一个镜像时,在容器内部设置工作目录。通常会指定绝对路径,如果使用了相对路径,工作路径就会一直传递下去。
(11)ENV

ENV <key> <value>
ENV <key>=<value>...

用来设置环境变量,可以作用于构建过程中或者执行过程中
(12)USER

USER daemon
例如:USER nginx
            USER user
            USER user:group
            USER user:gid
            USER uid
            USER uid:gid
            USER uid:group

用来指定镜像会以什么用户来运行
(13)ONBUILD

ONBUILD [INSTRUCTION]

能够为镜像添加触发器,当一个镜像被其他镜像作为基础镜像时会被执行,会在构建过程中插入指令。

Dockerfile构建过程

1.dockerfile执行过程
(1)从基础镜像运行一个容器(FROM)
(2)执行一条指令,对容器做出修改
(3)执行类似docker commit的操作,提交一个新的镜像层
(4)基于提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令,直至所有指令执行完毕

注:docker built会删除中间层的容器,但是不会删除中间层的镜像。
因此可以使用中间层镜像进行调试
好处:1.查找错误
2.构建缓存
因为docker的每一步都会形成镜像。中间层的镜像就是构建缓存,以后执行过程中如果使用可以增加速度。
3.不构建缓存
使用命令:

docker build --no--cache

4.查看镜像构建的过程

docker history [image]

Docker容器的网络连接

1.docker容器的网络基础
docker容器的互联
docker容器于外部网络的连接

docker容器的网络基础

docker0就是linux虚拟网桥,OSI七层模型中的网桥,网桥就是数据链路层的设备。
1.linux虚拟网桥的特点
(1)可以设置IP
(2)相当于拥有一个隐藏的IP地址
2.docker0的地址划分:
IP:172.17.42.1 子网掩码:255.255.0.0
MAC:02:42:ac:11:00:00到02:42:ac:11:ff:ff
由子网掩码可以看出提够了2的16次方的IP地址(65534)
在这里插入图片描述
3.修改docker0地址

  sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0

4.添加虚拟网桥

sudo brctl addbr dr0
sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0

5.更改docker守护进程的启动配置
/etc/default/docker中添加DOCKER_OPS值

-b=br0(网桥名称)

Docker容器的互联

1.允许所有容器互联
2.拒绝容器间互联
3.允许特定容器间的连接

1.环境准备
用于测试的docker镜像dockerfile

FROM ubuntu:14.04
 apt-get install -y ping
 RUN apt-get update 
 apt-get install -y nginx
 apt-get install -y curl
 EXPOSE 80
 CMD /bin/bash

2.允许所有容器互联
在默认条件下,同一宿主机的容器默认可以互联。

--icc=true  默认配置

当我们停止一个容器再重新启动的时候,这个容器的IP地址会发生改变。之前的连接会失效,是一个不可靠的连接。因此提供了一种另外的方式。

 --link
 docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMOND]

CONTAINER_NAME: 需要连接的容器名字
ALIAS: 在容器中连接的代号
查看在容器中产生的哪些影响
$ env
查看环境变量,可以看到大量以WEBTEST*开头的环境变量,这些环境变量是在容器启动时,由docker添加的。我们还可以查看在/ect/host文件,这里添加了webtest的地址映射。当docker重启启动容器时 /ect/host所对应的ip地址发生了变化。也就是说,针对于指定了link选项的容器,在启动时docker会自动修改ip地址和我们指定的别名之间的映射。环境变量也会做出相应的改变。
3.拒绝所有容器间互联
Docker守护进程的启动选项

--icc=false

修改vim /etc/default/docker,在末尾添加配置 DOCKER_OPTS="–icc=false"。
需要重启docker的服务 sudo service docker restart.即使是link也ping不通。
4.允许特定容器间的连接
Docker守护进程的启动选项

--icc=false --iptables=true

--link 在容器启动时添加link
docker利用iptables中的机制,在icc=false时,阻断所有的docker容器间的访问,仅仅运行利用link选项配置的容器进行相互的访问。
注: 如果出现ping不通的情况,可能为iptables的问题(DROP规则在docker之前了)。

Docker容器与外部网络的连接

1.ip_forward

--ip-forward=true
sysctl net.ipv4.conf.all.forwarding

ip_forward本身是Linux系统中的一个变量,它的值决定了系统是否会转发流量。在Docker守护进程的默认参数中也有ip_forward选项,默认值是true.

2.iptables
iptables是与linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含iptables的功能。
在这里插入图片描述
每一个大的方块中,就是iptables中的一个链(chain),每一个链实际上就是数据处理中的一个环节,而在每个环节中又包含了不同的操作。
允许端口映射访问
限制IP访问容器
filter表中包含的链
(1)INPUT
(2)FORWARD
(3)OUTPUT

docker容器的数据卷

1.什么是数据卷
docker的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,容器之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为容器的一部分保存下来,那么当容器被删除之后,数据也就没了,为了能够保存数据,在docker容器中使用卷。卷就是目录或者文件,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持久化数据或共享数据的特点。
2.数据卷的架构
在这里插入图片描述
数据卷存在于宿主机中,独立于容器,和容器的生命周期是分离的,数据卷存在于宿主机的文件系统中,数据卷可以目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换。
3.数据卷的特点:
1.容器启动的时候初始化的,如果容器使用的镜像包含了数据,这些数据也会拷贝到数据卷中。
2.容器对数据卷的修改是及时进行的。
3.数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。
4.数据卷是宿主机中的一个目录,与容器生命周期隔离。
5.数据卷可以在容器之间共享和重用
6.可以对数据卷里的内容直接进行修改
7.卷会一直存在,及时挂载数据卷的容器已经被删除
4.通过命令行挂载的方式

docker run -it -v  /宿主机绝对路径目录:  /容器内目录  镜像名

我们再挂载的时候还可以给数据卷加上权限,假如我们要宿主机只能读取容器的数据卷内容不能修改,我们可以添加只读权限

docker run -it -v /宿主机绝对路径目录 : /容器内目录  :ro 镜像名

5.利用dockerFile的形式添加

dockerFile对于docker镜像而言就如同java中某个类的.class文件对应上该类的.java文件。
首先在linux服务器根目录上新建docker文件夹并建立DockerFile文件,使用volume命令(出于可移植可分享的的考虑,用以上 -v /宿主机绝对路径目录 : /容器内目录 的这种方式不能够直接在dockerFile中直接实现,因为宿主机目录是依赖于特定的宿主机的,并不能保证所有的宿主机都存在这样特定的目录)
编写的dockerFile文件如下

FROM  镜像名
VOLUME ["/生成的目录路径"]  -- privileged=true
CMD echo "success build"
CMD /bin/bash

相当于命令行:
docker run -it -v /宿主机目录路径 : /生成的目录路径
然后我们通过命令行docker build执行我们写好的dockerFile文件(docker build和docker commit两个命令都可以建立docker镜像,docker commit 需要在容器内进行,docker build 不需要)

docker build -f  /docker/DockerFile -t  命名空间/镜像名

执行后输入docker images就可以发现自己通过DockerFile所build的镜像,里面有挂载数据卷,那么问题来了宿主机所对应的目录是什么呢?同上,我们可以通过docker inspect来查看当前容器的Volumes,里面会有宿主机的数据卷目录。
参考https://www.cnblogs.com/yaowen/p/8431710.html

Docker的数据卷容器

1.什么是数据卷容器
命名的容器挂在数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据的容器,就叫做数据卷容器。
2.挂载数据卷容器的方法

 docker run --volumes-from [container name] 

通过-volumes-from指令来指定新建容器所连接的数据卷容器container name是已经挂载了数据卷的容器的容器名。

Docker数据卷的备份和还原

1.数据备份方法

 docker run --volumes-from [container name] -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar [container data volume]
--volumes-from  : 挂载一个容器。
-v :指定保存数据的路径。
tar  cvf :是容器运行时执行的命令,执行的是一个压缩文件tar命令,将要备份容器中的目录压缩到指定的目录下。

在这里插入图片描述
要备份的数据容器的数据,是备份在一个容器上,这个容器是挂载了要备份数据的容器。
执行备份命令的容器既挂载了一个需要备份的数据卷(volumes-from本就是对数据地址的引用)又挂载了一个备份数据的数据卷。(数据卷就是数据,一个文件或者文件夹)
2.解压缩命令实现备份数据的还原:

 docker run --volumes-from [container name] -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar [container data volume]

Docker容器的跨主机连接

1.使用网桥实现跨主机容器连接
由于Docker容器通过docker0 网桥实现同一主机间中,容器的ip地址分配和访问,所以,如果希望Docker跨主机访问,最简单的方式就是将不同主机的docker0 设置为同一网段。
那么怎么实现跨主机呢?我这里将本机网卡也通过网桥来连接,那么,整体网络拓扑结构就是这样:
在这里插入图片描述
但是通过这种桥接,所有网卡都要在一个网段下,所以要对每个Docker守护进程对ip的分配做出限制
下面,我们就来实现这个结构:
操作:
我用的是两台centos7.1的服务器

host1:10.20.23.144 eth0
host2:10.20.23.213 eth0

具体操作如下:
以下,以Host1 为例,Host2 上操作相似,只是网卡名字不一样,我在这里,没有使用默认的docker0 网桥,而是新建了虚拟网桥.

brctl addbr br1

为网桥分配一个同网段ip
host1

ifconfig br1 192.168.2.1 netmask 255.255.255.0

host2

ifconfig br1 192.168.2.2 netmask 255.255.255.0 

host1,host2都要操作:
桥接本地网卡:

brctl addif br1 eth0

这里,我们就准备好了网桥设置
下面我们来修改Docker的配置,使用我们新建的网桥代替docker0:
修改 /etc/sysconfig/docker文件

host1
cat /etc/sysconfig/docker
DOCKER_OPTS="--registry-mirror=http://aad0405c.m.daocloud.io -b=br1 --fixed-cidr='192.168.2.64/26' "
host2
DOCKER_OPTS="--registry-mirror=http://aad0405c.m.daocloud.io -b=br1 --fixed-cidr='192.168.2.128/26' "

这里,-b 用来指定容器连接的网桥名字
     --fixed-cidr用来限定为容器分配的IP地址范围

保存文件并重启Docker服务

systemctl restart docker

下面,就可以来验证:
分别在两个Host上启动一个容器

docker run -it dockersdd/cct1

在容器中运行ping命令查看连接情况

[root@5dc021f7ecf8 /]# ping 172.17.0.6
PING 172.17.0.6 (172.17.0.6) 56(84) bytes of data.
64 bytes from 172.17.0.6: icmp_seq=1 ttl=64 time=0.047 ms

优点:
配置简单,不依赖第三方软件
缺点
1.与主机在同网段,需要小心划分IP地址
2.需要有网段控制权,在生产环境中不易实现
3.不易管理

使用Open vSwitch实现跨主机容器连接

什么是Open vSwitch
Open vSwitch即开放虚拟交换标准!具体点说,Open vSwitch是在开源的Apache2.0许可下的产品级质量的多层虚拟交换标准!它旨在通过编程扩展,使庞大的网络自动化(配置、管理、维护),同时还支持标准的管理接口和协议(如NetFlow, sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag)。总的来说,它被设计为支持分布在多个物理服务器,例如VMware的vNetwork分布式vSwitch或思科的Nexus1000V。
原理
在这里插入图片描述
在这里插入图片描述
试验环境
在这里插入图片描述
操作
在这里插入图片描述

使用weave实现跨主机容器连接

在这里插入图片描述


版权声明:本文为weixin_42094659原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。