docker容器拔高学习
docker中常见软件的应用
mysql相关
mysql的主从复制原理:
mysql的主从复制搭建:
redis相关
使用redis搭建集群:
redis集群动态扩容:
redis集群动态缩容:
利用redis来实现分布式缓存:
Dockerfile
什么是dockerfile
dockerfile是一个自己制作搭建docker镜像的文本文件,用一系列的指令和参数等构成的脚本。
可以将它和docker commit作类比,docker commit也是构建镜像,它是在已知构建好的镜像的容器上修改,修改后形成新的镜像
而dockerfile则是由一个基础镜像,通过一系列的指令参数,给这个镜像配置环境,搭建成自己的具有自己需要的功能的镜像。
何时采用dockerfile:例如在微服务中,我们可能要配置很多参数,并且这些参数是可能实时动态变化的,而且微服务还需要和许多中间件之间建立练习,这时候dockerfile比较方便。
2.docker build命令构建镜像。
3.docker run 镜像运行实例。
底层执行dockerfile的大致流程
1.docker从基础镜像运行一个容器,
2.执行一条指令并对容器作出修改
3.执行类似docker commit 的操作提交一个新的镜像层
4.docker再基于刚提交的镜像运行一个新容器
5.执行dockerfile中的下一条指令直到所有的指令都执行完成。
如何通过dockerfile构建镜像
1.编写dockerfile文件。如图所示
FROM关键字后面跟基础镜像,表示从基础镜像开始。
ENV关键字 用来构建环境变量,其他指令也可以直接使用这些环境变量
RUN关键字 是用于在构建镜像时执行指定的命令,是在docker build 的过程中执行,每一个RUN指令会在镜像中构建一个新的层,并将 这个命令的结果应用到这个层中。
EXPOSE 关键字 当前容器对外暴露的端口。
CMD关键字指定容器启动后要干的事,指令格式与RUN相似,可以有多个CMD指令,但只有最后一个生效,CMD指令会被docker run之后的参数替代。
从编写dockerfile文件的过程中,我们看到了过程中有许多的关键字,
下面就介绍一下有哪些详细的关键字:
FROM,MAINTAINER,RUN,EXPOSE,WORKDIR,USER,ENV,VOLUME,ADD,COPY,CMD,ENTRYPOINT
懒得具体写它们的具体作用了,直接百度就能搜到,这里直接贴个图哈
2.用docker build命令构建镜像
3.用docker run 镜像运行实例。
提到镜像这里插一个虚悬镜像:镜像名称和标签都为 的镜像就是虚悬镜像。当我们在重构镜像的过程中有可能产生虚悬镜像。
这种镜像没有实际的价值,一般需要将其删除。
这里展示一下对虚悬镜像的操作:![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5CHP%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20240811164243016.png&pos_id=img-jGiiyDpW-1723381462651
这里我觉得完全可以把虚悬镜像当作普通的镜像,用正常操作镜像的方式对它操作。
学完dockerfile也算是了解了基本的docker操作
这里用一个图总结:
docker网络
bridge(桥接模式)
默认的网络模式,docker会创建一个虚拟网桥(通常是docker0),容器会连接到这个网桥,容器可以通过它的ip地址相互通信,也可以通过端口映射与外部的访问
详细解读:
1 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根
据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网
关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通
信。
2 docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。
在宿主机ifconfig,就可以看到docker0和自己create的network(后面讲)eth0,eth1,eth2……代表网
卡一,网卡二,网卡三……,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址
3 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
3.1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机
和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
3.2 每个容器实例内部也有一块网卡,每个接口叫eth0;
3.3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一 一匹配。
通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自
拿到分配的ip,此时两个容器的网络是互通的。
host(主机模式)
容器直接使用宿主机的ip的端口,没有网络隔离。容器内的服务将直接绑到宿主机的ip的地址上,不再需要额外进行NAT 转换。容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
none(无网络模式)
容器没有网络接口,无法访问外部网络,可以用于需要隔离的场景。这个容器没有进行任何网络相关的设置。需要我们自己手动进行网络设置。这种网络模式很少用,了解即可。
container模式
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
自定义网络模式
默认使用bridge网络模式,容器内部的ip在某些情况下会发生变化,如果此时通过容器的ip地址进行通信可能会遇到问题,如果我们想和某个容器之间建立通信的话,应该怎么做呢?可以使用容器名称建立通信(类似于微服务中通过服务名称实现服务之间的远程调用)。
我们可以理一下自定义网络的步骤:1.创建自定义网络 使用docker network create
2.运行容器并连接到自定义网络
docker run -d -p 8081:8080 --network wen_network --name tomcat81 billygoo/tomcat8-jdk8
自定义网络后台启动容器1
docker run -d -p 8082:8080 --network wen_network --name tomcat82 billygoo/tomcat8-jdk8
自定义网络后台启动容器2
自定义网络的特点:在同一个自定义网络中,容器可以通过容器名相互访问。比如不是同一个自定义网络,可以用ping+网络ip,ping通,而如果是同一个自定义网络,可以用ping+容器名。总之:自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能ping通)
docker-compose容器编排
什么是docker-compose
docker-compose就是实现对Docker容器集群的快速编排,可以管理多个 Docker 容器组成一个应用,需要定义一个 YAML格式的配置文件docker-compose.yml,**写好多个容器之间的调用关系。**然后,只要一个命令,就能同时启动/关闭这些容器。
一个文件:docker-compose.yml 描述多个容器之间的运行规则。
两个要素:服务(service) 一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器。
工程(project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Docker Compose使用的三个步骤
1.编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
2.使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
3.最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线 。
Docker Compose的常用基本命令
Compose常用命令
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose
exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
使用Docker Compose进行具体的服务编排
Docker轻量级可视化工具Portainer
Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环
境,包括单机环境和集群环境。
使用docker命令安装
docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
访问首页
设置admin用户的密码
使用ip地址+9000来访问
具体页面为这样,就是docker的一个图形化页面工具,方便操作,没啥好细说的。
Docker容器监控之CAdvisor+InflfluxDB+Granfana
CAdvisor InflfluxDB Granfana是什么
CAdvisor监控收集+InflfluxDB存储数据+Granfana展示图表
使用Docker Compose搭建CIG监控平台
访问CIG的展现服务
就是分别访问 CAdvisor lnflfluxDB Granfana三个网页
Swarm mode
swarm mode是什么
Swarm Mode是一种容器编排技术,是内置于docker的一个工具,使用Swarm时不需要安装任何东西,Swarm已经内置到我们系统里面了,只不过我们没有运行在Swarm 模式下,我们一般运行在单机模式下。因此swarm就是初学者接触容器编排的第一个工具。
运行Docker的主机可以主动初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行Docker的主机就成为一个Swarm集群的节点 (node) 。节点分为管理 (manager) 节点和工作 (worker) 节点,管理节点用于Swarm集群的管理,docker swarm命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个Swarm集群可以有多个管理节点,但只有一个管理节点可以成为leader,leader通过raft协议实现。工作节点是任务执行节点,管理节点将服务 (service)下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。
具体可以用图像展示:
任务(Task)是Swarm中的最小的调度单位,目前来说就是一个单一的容器。
服务(Services)是指一组任务的集合,服务定义了任务的属性。
服务有两种模式:
replicated services按照一定规则在各个工作节点上运行指定个数的任务。
global services每个工作节点上运行一个任务。
两种模式通过docker service create的–mode参数指定。
创建Swarm集群
1.在已经安装好Docker的主机上执行行 docker swarm init 命令将成为管理节点。
已经是管理节点的主机不能再创建工作节点
docker swarm init --advertise-addr 192.168.10.145
2.添加工作节点,在其他的Docker主机中分别执行如下命令,创建工作节点并加入到集群中。
docker swarm join --token SWMTKN-1- 3cgjy8qej9x6v52dk1o33jv5bb0630kt4eovjvnfoky3cihohi-ccczg5p1scxzc96ch92g1kkrv 192.168.10.145:2377
3.用docker node ls 可以查看集群
4.部署服务。
可以使用 docker service 命令来管理Swarm集群中的服务,该命令只能在管理节点运行。
也可以新建服务
docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
还有查看服务,服务伸缩,删除服务
docker service ps 查看某个服务的详情。
docker service logs 查看某个服务的日志。
docker service scale 对一个服务运行的容器数量进行伸缩
docker service rm 从Swarm集群移除某个服务。
在Swarm集群中也可以使用compose文件(docker-compose.yml)来配置、启动多个服务。
我们使用docker service create一次只能部署一个服务,使用docker-compose.yml我们可以一次启动多个关联的服务。
docker stack deploy 部署服务
docker stack deploy -c docker-compose.yml wordpress 其中 -c 参数指定compose文件名。
docker stack ls 查看服务
我们也可以在Swarm集群中部署visualizer说明。visualizer服务提供一个可视化页面,我们可以从浏览器中很直观的查看集群中各个服务的运行节点。