docker容器学习拔高篇

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服务提供一个可视化页面,我们可以从浏览器中很直观的查看集群中各个服务的运行节点。

在这里插入图片描述

非常好的选择!Docker 是一个开源的容器化平台,可以帮助开发人员更轻松地构建、打包、交付和运行应用程序。学习 Docker 可以让你更好地理解容器化技术,并且在开发和部署应用程序时提供更高的灵活性和可移植性。 以下是一些学习 Docker 的步骤: 1. 安装 Docker:首先,你需要安装 DockerDocker 提供了适用于不同操作系统的安装程序,如 Docker Desktop for Windows 或 Docker Desktop for Mac。你可以访问 Docker 官方网站(https://www.docker.com/)获取详细的安装指南。 2. 学习 Docker 基本概念:在开始使用 Docker 之前,建议先了解一些基本概念,例如镜像(Image)、容器(Container)、仓库(Repository)等。可以阅读 Docker 官方文档或参考一些在线教程和博客来学习这些概念。 3. 创建和运行容器学习如何使用 Docker 创建和运行容器是非常重要的一步。你可以使用 Docker 命令行工具或者 Docker Compose 来创建和管理容器。尝试使用一些基本的命令,如 docker run、docker build 等,来构建和运行容器。 4. 使用 Docker 镜像:Docker 镜像是容器的基础,它包含了应用程序的运行环境和所有依赖项。学习如何使用 Docker Hub 或者其他镜像仓库来获取和使用现有的镜像,以及如何创建自定义的镜像。 5. Docker 网络和存储:学习如何配置 Docker 网络和存储可以帮助你更好地管理容器之间的通信和数据持久化。了解 Docker 网络模式、网络驱动和存储卷等概念,并尝试在容器之间进行通信和数据共享。 6. Docker Compose 和 Swarm:学习如何使用 Docker Compose 和 Docker Swarm 可以帮助你更好地编排和管理多个容器Docker Compose 可以定义和管理多个容器的配置,而 Docker Swarm 则可以将多个 Docker 主机组成一个集群,实现容器的高可用性和负载均衡。 7. 实践项目:尝试在实际项目中应用 Docker,例如将一个现有的应用程序容器化,或者使用 Docker 构建和部署一个完整的应用栈。通过实践,你可以更深入地理解 Docker 的各种用法和场景。 记得不断练习和探索,参考文档和教程可以帮助你更好地理解 Docker 的使用。祝你学习顺利!如果有任何问题,随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值