docker
容器与虚拟机比较





参数介绍
-it 以交互模式开启,通过指令与容器中的Ubuntu进行交互
--name=myubuntu 给当前开启的容器命名
ubuntu 运行的哪个镜像资源
/bin/bash 使用这个文件夹下的shell指令形式
-i 表示以“交互模式”运行容器
-t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
--name 为创建的容器命名
-v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。
-d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
-p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
-e 为容器设置环境变量
--network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同



Docker 镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引 导系统,即 bootfs,这很像典型的 Linux/Unix 的引导文件系统。Docker 用户几乎永远不会和 引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系 统则会被卸载,以留出更多的内存供磁盘镜像使用。Docker 容器启动是需要一些文件的, 而这些文件就可以称为 Docker 镜像。
分割线······································

使用场景

基本组成

镜像

容器


仓库


技术相关





能力


安装
检查


ubuntu1804安装dockerhttps://blog.csdn.net/u010889616/article/details/80170767
docker有两个版本


刷新一下

查看版本

版本1.0 一个早起的版本
安装docker维护的版本


或者可以直接下载一个shell脚本来安装


版本1.5

每次执行的时候都需要root,可以设置添加非root账户

添加组,添加密码,重启docker
windows安装docker
boot2Docker



微软对docker的支持
启动容器


启动交互式容器


进入了容器内的linux环境
查看内部进程

退出会话
exit

查看容器

a 查看所有
l 查看最新

查看容器详细信息


系统的默认名不友好,可自定义容器名称


默认容器执行一次之后就停止了,
再次启动容器

删除容器,容器必须先停止才能删除



重新进入守护式启动的容器


直接进入守护式的容器

查看docker日志

--tail 不指定的话返回所有的日志, 指定数字返回固定数量的日志,指定0的话返回最新的日志
示例:
执行一个死循环,让不退出进程

一直输出打印的内容






查看容器内的进程


容器内启动新的进程



stop是给一个信号量,会阻塞等待容器停止,
kill 是直接停止,不用阻塞

返回容器名
端口映射

-P 全部端口映射

-p可以指定

示例:

1映射80端口

2 安装nginx

3 创建一个静态html文件


4 whereis 查看nginx的安装目录,配置文件目录


5 修改配置文件


6 重启nginx

7 宿主机查看端口映射

将容器的80端口映射为宿主机的49167端口
8 查看容器内的进程

9 本地访问页面


10 访问docker中的页面
docker inspect web 查看docker的配置信息

可以看到docker的ip以及映射的端口
直接访问ip,curl默认访问的就是80端口


可以看到,当重启容器后,原来运行的进程就会停止
重新运行nginx

再访问原来的ip,发现请求不到了,

查看容器的配置信息

可以看到,原来的ip跟端口都已经改变了,所以,再重启容器之后,原来的映射都变化了

再次访问

查看容器的信息

查看docker的文件夹内容

查看容器的挂载

镜像操作
列出镜像


仓库的解释:

标签的解释

默认的话docker使用的标签是 latest 最新的
可以看到,在同一个仓库下的不同tag对应的是同一个id,也就是说,我们可以给同一份镜像打上不同的tag
docker images --no-trunc
显示完整名称

docker images -a
显示所有镜像

docker images -q
只显示id

访问不同的仓库


查看镜像配置信息



删除镜像


docker rmi 仓库名:tag
这样只会删除一个标签,当所有的标签删除完之后,镜像文件才会被删除
可以看到删除了10.04的标签

rmi 唯一id
删除这个id对应的所有tag的镜像


一次删除多个镜像

docker 是没有删除所有镜像的操作
但是可以使用查看容器的-q命令,展示所有镜像,然后在删除,达到删除所有的目的,
注意$的使用


docker的查找

官网搜索 需要注册账号

查询结果

命令搜索

镜像拉取

docker pull 仓库名:tag
现在没有任何镜像

拉取镜像

会拉取仓库下所有的tag镜像

解决镜像拉取速度慢的问题


复制这个url
修改docker的配置文件

增加一项

重启docker


使用国内docker镜像运行的docker
再次下载docker镜像速度显著提高
镜像上传到docker hub




自构镜像的好处

构建方法

docker commit 容器名




使用dockerfile

创建一个dockerfile文件





查看生成的镜像

运行这个镜像

正常访问

docker的cs架构

用户可以是用client端即docker命令与守护进程通信。也可以使用api来访问,是restfull风格的
这样就可以通过应用来与docker守护进程进行通信



api的连接方式


查看主机进程


使用nc命令进入与守护进程通信的socket



管理进程


docker的启动选项








默认启动配置文件


添加启动参数,DOCKER_OPTS='-Label name = docker_server_1'用来指定docker进程的名字
重启服务,查看启动参数


远程访问docker 服务端
前提

编辑配置文件,使用一个不同的进程名字


修改服务端配置

在docker1 端配置-H参数,docker默认使用端口2375


在docker2端进行远程访问

修改客户端配置

使用tcp连接

设置环境变量,不用每次指定socket

不像使用环境变量的时候就可以将其置为空,就可以不使用了
在docker1端修改了启动参数,添加了-H,在本机访问docker1的信息却访问不到了,想要访问,可以在配置文件中继续添加一个-H,指定本地的socket


DOCKERFILE

指令格式


只能指定已经存在的镜像,后续的所有指令都是基于这个镜像操作的





示例:

设置RUN,将原来两步的RUN设置为一步,



CMD类似于RUN,区别在于,RUN是在构建镜像的时候执行,CMD是在用镜像启动容器的时候执行




虽然在启动容器时执行CMD命令,但是如果启动容器时指定命令,DOCKERFILE中的CMD命令就会被覆盖


ENTRYPOINT 跟CMD的不同点在于,他的命令是强制性执行的,不会被覆盖

不过可以在启动容器命令中添加 --entrpoint 来强制覆盖
dockerfile中指定

可以看到,命令被没有被覆盖

可以将ENTRYPOINT 和 CMD 混合使用,

一个指定命令,另一个指定参数

ADD /COPY


在构建镜像的时候 用本地的index.html 替换掉nginx中的index.html文件

创建镜像,访问html'文件





指定docker使用的用户
在另一个镜像的基础上构建镜像的时候执行



访问docker启动的nginx服务,发现并没有替换掉,使用原版的镜像来构建onbuild没有执行

使用我们已经有的镜像来onbuild

重新build 启动容器,访问nginx

DOCKERFILE的构建过程:

dockerfile文件

安装过程


可以直接使用中间层镜像来启动的容器查看中监的步骤

中间层镜像可以用来

缓存
在第二次构建镜像的时候,有缓存就使用了缓存,可以看到,在第二次安装的时候,就不会再去下载nginx相关服务了

当命令值有例如 apt-update这些的时候,我们并不想让继续使用缓存,就可以显式的指明

又跟第一次构建一样了
也可以在dockerfile中指定环境变量


查看构建历史


docker的网络配置

docker0 inux的一个虚拟网桥




查看网桥,要使用brctl命令
sudo apt-get install bridge-utils



修改容器的ip地址
查看容器的ip

修改


修改成功

重启docker服务

ip又变了
自定义虚拟网桥



更改docker守护进程的启动配置


启动容器

容器的互联

- 环境准备
![]()
- 构造镜像
![]()
- 允许所有容器间的互联
-icc = true
![]()
![]()
在容器1 ping 容器2的ip,是可以ping通的
![]()
进入容器2 访问容器1运行的nginx服务,是可以访问到的

问题,重启容器ip是会变的

解决,link参数,映射到一个容器名,而不是ip了


直接ping这个名称,就可以ping到名称映射到的容器1

查看容器3的环境变量

查看host文件,可以看到link参数所做的修改


host文件

env环境

拒绝所有的容器间互联

修改配置文件


重启服务


容器间的连接被切断
允许特定容器间的连接

修改配置文件








docker与外部网络的连接


ip_forward是一个linux 的变量

iptables
来限制外部网络的访问


数据的三种流动方式:
1 数据以本机为目的地,
一个数据包进入网卡时,首先进入的是prerouting链, 判断目的地是否为本机,是,进入下面的input链,处理之后,再传给本机的程序,
2 数据发送的路径
数据从本机发出,经过output链,到达postrouting链,
3 转发路径
数据进入prerouting链,发现目的地不是本机,会进入forward链,再经postrouting链发出

表:
iptables将同样的操作抽象为iptables中的表,也就是链中包含的nat,mangle,raw所有这些同样的操作都在iptables中以这些名字命名的表中
链:
代表了数据处理中的一个个阶段,
规则:
每个链下的操作
我们主要用的就是iptables中的filter表





查看本机ip

在另外一台主机上访问本机的49153端口

使用iptables就指定特定的的ip执行特定的操作

到另一台主机查看ip信息

现在不让容器6对这个主机开放

用iptables给docker链中添加一条规则,
-s 就是阻止的主机ip,源ip,
-d 就是目的地ip,为刚才新建的容器6的ip,
-p指定协议使用TCP,
--dport 目的端口指定的就是80
-j指定的操作是DROP,就阻止这台主机访问容器6

查看容器6的端口映射

在另一台主机访问我们提供docker服务的49154端口

现在是访问不到了,被阻止了
docker容器的数据卷




假如在本机中不存在这个文件目录名,那么docker run 命令在执行的时候就会自动创建这个目录

在容器文件夹中创建文件

退出,在本机查看对应的文件夹

可以看到,刚才在容器中创建的文件再本机文件夹中也存在了
查看容器的配置信息

包含了我们刚才定义的数据卷信息

可以使用inspect来查看容器的数据卷挂载信息
指定数据卷的访问权限

ro 表示 readonly 只读

查看容器的配置信息


使用dockerfile文件直接指定数据卷


volume 指定创建的数据卷
与 docker run 命令不同点在于,在docker file中创建的数据卷是不能映射到已经存在的本地的文件目录中的,在创建镜像时,会创建我们指定名字的数据卷,并且运行同样镜像创建的数据卷也是不一样的
构建镜像

生成容器
这时就不用再在命令行中使用 -v 指定数据卷了

查看容器配置


这是docker的数据卷地址就是docker自动创建的,写权限也是启用的
再启动一个新容器

查看配置信息

可以看到两个容器的数据卷信息是不一致的
也就是说容器在启动的时候,我们在镜像中指定的数据卷都会进行一次完整的初始化,这样的话数据卷就无法数据共享,为了解决这个,使用数据卷容器
数据卷容器



volumes-from 指定新建容器所连接的数据卷容器 container name就是数据卷容器的名字
使用数据卷镜像启动一个数据卷容器

在其中创建一个文件

使用存在的数据卷容器

再启动一个新容器,指定的还是数据卷容器

inspect查看容器的配置信息,用format信息指定我们要查看的选项,可以看到,两个volumes的id信息是一样的

即使我们删除了数据卷容器,挂载数据卷容器的容器仍然可以访问数据卷容器挂载的目录,就是说数据卷容器的作用就是传递数据卷配置信息的传递

使用 rm -v 删除容器8,并删除挂载的数据卷,在容器9中还是可以使用到挂载的数据卷信息,这是因为在docker中,如果一个数据卷还在被docker使用,那么他就会一直存在,数据卷容器就是起到一个传递数据卷挂载信息的作用

数据卷的备份与还原

volumes-from 指定我们要备份的容器名
-v 我们保存数据的路径,可以是本机的路径
tar 要备份容器中的目录压缩到我们指定的目录下

tar 命令 将 需要备份的容器与备份目录同时挂载在执行备份命令的容器上,而需要备份数据的数据容器,他的数据实际上也是存放在挂载在本机的目录上的数据卷

虚线部分实际上就是通过volumes-from实现的真实挂载情况,最后的结果就是:执行备份命令的容器即挂载了需备份的数据卷,同时挂载了一个备份数据存放的数据卷,在这个执行命令的容器中,执行copy,tar操作就可以实现数据的转移压缩

解压缩

实现原理跟备份是一样的。
容器的跨主机连接
1 使用网桥实现跨主机容器连接

在同一个docker的主机中,docker容器通过默认的docker0网桥来进行网络通信,那么我们要将连接容器的网桥也桥接到docker主机提供的网卡上,并且将网桥分配的ip地址于docker主机的ip地址设置为同一个ip段,那么就相当于将docker主机容器与docker主机的网络连接在一起
如图所示:在docker主机中分别创建网桥,并且使用这个网桥连接docker主机的物理网卡和docker容器,这就意味着,我们将不同docker主机中的容器都分配到了同一网段下,
测试:
环境

在虚机中配置网桥的连接
修改网络配置

在docker端配置
在docker的守护进程中指定两个选项

查看虚机1的网络配置

编辑网络配置文件


docker配置



查看虚机的配置信息

查看docker进程

开启容器

在容器中ping 外网的ip

配置另外一台虚机


使用open vswitch 实现跨主机容器连接
一个虚拟的交换机软件,开源的

原理图

如图所示:蓝色部分即为先前的虚拟网桥,容器通过虚拟网桥实现同主机间的连接,黄色 部分就是通过open vswitch创建的ovs网桥。ovs网桥通过gre隧道接口,实现跨主机的网络连接
gre
提供了一种点对点的再封装技术,着也是为什么,可以通过隧道技术实现部署在不同主机上并且拥有不同网段的ip容器之间的通信。

实例:
环境


docker主机1的配置

查看ovs

添加网桥
添加gre接口

设置接口,指定type类型, 指定远端的ip,。另一台虚拟docker主机的ip

查看当前ovs的状态

建立本机docker容器需要使用的虚拟网桥
新建一个网桥br0,并设置网络地址

为br0网桥添加ovs网桥的连接

查看当前网桥的连接状态

配置docker
用新建的网桥替代默认的docker0网桥

重启docker服务
启动一个docker容器

在容器中ping另一台主机的ip

发现不属于同一网段的现在是可以ping通的
使用weave实现跨主机容器连接

使用weave可以建立一个虚拟的网络,这个网络可以将运行在不同主机的docker容器连接起来,weave是github上一个开元项目






浙公网安备 33010602011771号