rhel7.3-Docker(镜像仓库、镜像、容器)
2018年06月15日 00:41:10 ZZL95415 阅读数:1068
一.Docker
Docker 是一个开源的应用容器引擎,主要利用 linux 内核 namespace 实现沙盒隔离,用cgroup 实现资源限制。让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 容器通过 Docker 镜像来 创建。容器与镜像的关系类似于面向对象编程中的对象与类。由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资 源占用小。docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用 更少资源。隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库。Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用。和宿主机共用一部分资源,内核要求在3.10以上。
docker容器是docker镜像的实例化,docker容器开启方便,即创即用,随着要求进行删除添加。国内有很多容器云服务服务商:华为云,阿里云,时速云,腾讯云。近几年云服务是大热门,几乎各大厂商都有参与。镜像用来创建容器,是容器的只读模板,默认可以从 docker hub 上下载。docker 的镜像是增量修改,每次创建新的镜像都会在父镜像上构建一个增量的层,基于 AUFS 技术。
二.容器管理
1.docker的安装(用的rhel7.3的yum源)
2.内核要求3.10以上
3.容器的基本操作
(1)导入镜像,创建容器
docker load -i 镜像的tar包
(2)docker images ##查看本地镜像
(3)基于nginx镜像创建web容器(映射到8080端口)
(4)创建web容器的发布文件,把发布文件复制到web容器
(4)docker inspect web ##查看容器详情
(5)测试
(6)docker top web ##查看容器进程
(7)docker logs web ##查看容器指令输出
(8)docker stats web ##查看容器资源使用率
(9)docker diff web ##查看容器修改
(10)docker stop web ##停止容器
docker start web 启动容器
docker kill web 强制干掉容器
docker restart web 重启容器
docker pause/unpause web 暂停/恢复容器
docker rm web 删除容器
docker export web > web.tar ##导出容器
(11)创建容器,并且挂载发布目录(这样可以不断追加内容,不像cp命令那样仅有一个发布文件)
(12)docker run 在创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v
的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共
享一个目录。
docker commit 时卷的数据不会被保存
(13)在容器内提交容器到镜像,数据保存
(14)数据卷容器(容器可以直接使用--volumes-from参数去共享数据卷的数据)
(15)容器间互联:--link 参数可以在不映射端口的前提下为两个容器间建立安全连接, --link 参数可以连接一个
或多个容器到将要创建的容器。
4.容器的四种网络模式:
bridge 桥接模式、host 模式、container 模式和 none 模式。启动容器时可以使用 --net 参数指定,默认是桥接模式。bridge桥接模式: Docker Container 在使用时,并非为开发者包办了一切。最明显的是,该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。
host 模式:bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。
Container 网络模式:
(1) 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
(2)将新创建的DockerContainer(也是需要共享其他网络的容器)的 namespace,使用other container 的 namespace。
None 网络模式:
网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。
none网络模式的配置:
netns 是在 linux 中提供网络虚拟化的一个项目,使用 netns 网络空间虚拟化可以在本地虚拟
化出多个网络环境,目前 netns 在 lxc 容器中被用来为容器提供网络。
(1)获取容器的PID
(2)容器的网络空间
ip link add name veth0 type veth peer name veth1 ##建立网络链路
brctl addif docker0 veth0 ##把一端添加到docker0网桥
mkdir /var/run/netns
(3)给容器添加网卡,ip以及网关
(4)容器内查看ip
(5)外部去ping,进行测试
三.镜像管理(私人镜像仓库的搭建)
1.本地仓库的搭建:
(1)导入镜像仓库的tar包
(2)创建镜像仓库容器(默认5000端口,映射到本机的5000端口,默认的镜像仓库目录/var/lib/registry)
(3)docker开启之后iptables策略就不能随意清空,端口映射主要就是依据iptables来进行端口转发
(4)Docker 镜像的命名规则 localhost:5000/nginx:latest 中,localhost:5000 表示 Registry 的地
址和端口,latest是标签。
docker tag ##修改docker镜像的名称
docker push ##推送镜像
(5)测试:删除本地的nginx镜像文件,从本地仓库拉取
docker pull ##拉取镜像
2.镜像仓库的加密
server1:客户端; foundation78:镜像服务端
(1)生成ssl证书以及key
(2)把证书和密钥发送到certs目录统一保存,并且把证书复制到域名认证目录下
(3)创建镜像仓库容器,并且把证书和密钥所在目录进行挂载
(4)给将要推送的镜像重命名并进行推送(仓库的域名/镜像)
(5)把CA证书发给客户端(记得把redhat.com.crt文件名重新命名为ca.crt),客户端就可以拉取镜像,并在客户端做本地解析(仓库所在的域名的IP)
(6)客户端测试拉取镜像(为了方便使用把镜像名称改回来)
3.镜像仓库的加密登陆认证
server1:客户端; foundation78:镜像服务端
(1)生成用户名以及密码
(2)创建镜像容器,并挂载用户认证目录以及加密证书密钥所在目录
(3)服务端要登陆才可以推送镜像
(4)同样的,客户端登陆才能拉取镜像
(5)把镜像服务器域名证书复制到ca证书的信任目录下,访问域名就可以查询是否上传成功,以字典形式返回
4.镜像仓库的远程访问
(1)在/etc/docker/创建仓库所在IP以及端口,重启服务生效
(2)创建仓库的容器
(3)修改镜像名称,上传镜像到172.25.78.250:5000
(4)推送镜像
(5)能与之通信的主机都可以拉取此镜像文件
四.Dockerfile 编写(生成自定义镜像)
1.编写apache镜像文件
(1)vim Dockerfile ##dockerfile
(2)yum源
vim dvd.repo
(3)创建apache镜像(dockerfile和yum源文件最好在同目录)
docker build -t rhel7:apache Dockerfile
从dockerfile文件一步一步往下执行,相当于往基础镜像上面添加一层一层的命令
(4)镜像创建成功
(5)docker history rhel7:apache ##查看镜像的每一层镜像文件
(6)测试:用自己创建的镜像创建web容器
2.编写ssh镜像文件
(1)ssh的dockerfile文件
(2)yum源文件使用apache的即可
(3)创建ssh镜像
(4)镜像创建成功
(5)用ssh镜像创建容器进行测试(端口映射到222)
ssh -p 222 ##指定端口222成功登陆主机
3.同时推送包含多个服务的镜像
(1)supervisor的dockerfile文件
(2)yum源(supervisor软件从网上下载)
(3)supervisord的配置文件
(4)创建镜像supervisor
(5)成功创建镜像supervisor
(6)利用镜像supervisor去创建容器进行测试(可以同时映射多个端口)
五.docker-compose(同时管理多个dockerfile文件)
Docker Compose 将所管理的容器分为三层,工程(project),服务(service)以及容器。Docker Compose 是一个用来创建和运行多容器应用的工具。使用 Compose 首先需要编写Compose 文件来描述多个容器服务以及之间的关联,然后通过命令根据配置启动所有的容器。Dockerfile 可以定义一个容器,而一个 Compose 的模板文件(YAML 格式)可以定义一个包含多个相互关联容器的应用。
一键推送haproxy+web的负载均衡架构:
(1)vim docker-compose.yml
image ##指定镜像
volumes ##挂载共享文件
expose ##暴露的端口信息,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数
links ##链接 到其 它服务 中的容 器
ports ##端口映射
(2)haproxy服务的配置文件haproxy.cfg
(3)docker-compose up ##创建并启动容器(默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。)
docker-compose start 启动容器
如果不希望自动启动关联的容器,可以使用 –no-deps 选项
(4)测试负载均衡
(5)关闭apache,具有健康检查的功能
(6)docker-compose top ##查看容器状态
(7)haproxy的web监控页面
五.docker swarm集群
管 理 Docker 集群,它将一群 Docker 宿主机变成一个单一的,虚拟的主机。Swarm deamon 只是一个调度器(Scheduler)加路由器(router),Swarm 自己不运行容器,它只是接受 docker 客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm 由于某些原因挂掉了,集群中的节点也会照常运行,当 Swarm 重新恢复运行之后,
它会收集重建集群信息。
1.初始化swarm管理节点
2.把worker加入管理节点
3.查看节点状态(提前做好本地解析)
4.同时创建3个web容器(swarm会根据worker的负载能力去下发任务)
5.查看容器的状态
docker service ls ##查看容器的同步状态
6.容器在线扩张以及压缩
docker service scale web=9 ##web容器扩展到9个
7.创建swarm的监控容器
web页面去监控管理的集群每个容器的状态
8.在线镜像版本更新
docker service update --image rhel7:apache --update-delay 5s --update-parallelism 2 web ##更新的镜像文件是rhel7:apache ,每5s更新一轮,每轮更新2个容器
更新的过程:老版本关闭下线,新版本上线运行
就写到这里,总之docker的内容很庞大,值得去学习探索,是云服务的重要基础。