Docker网络与Docker Compose服务编排

chatgpt/2023/10/4 7:23:26

docker网络

docker是以镜像一层一层构建的,而基础镜像是linux内核,因此docker之间也需要通讯,那么就需要有自己的网络。就像windows都有自己的内网地址一样,每个docker容器也是有自己的私有地址的。
在这里插入图片描述
docker inspect [docker_ID]

在这里插入图片描述

Docker内地址是B类地址,比192开头的数量多。

在这里插入图片描述
docker有三种网络模式,bridge是桥接模式,是在docker引擎虚拟一个网卡,为每个docker容器分配一个ip,docker默认就是这种模式;host相当于NAT模式就是共享主机ip,docekr服务没有自己的ip公用主机的ip地址,然后通过分配端口来区分不同的服务进而通讯,在该模式下服务是docker容器私有的,端口是公开的。例如主机ip是192.168.42.128,那么docker1服务占用了80端接口,主机就不能在使用80端口。(启动容器docker run不需要端接口映射,端口公共公开的)。第三种none用户自己DIY 。

在这里插入图片描述

在这里插入图片描述

参考Docker四种网络模式

网络服务

拉取一个nginx镜像
在这里插入图片描述
启动容器
在这里插入图片描述
对于nginx服务首先是要能够在本机上访问的,对于回溯地址127.0.0.1和本机内网ip192.168.42.128都能访问才对,如下所示:
在这里插入图片描述
在这里插入图片描述
网络一般通过套接字访问,私网和公网通过NAT转接。

内网和外网之间的通信(端口映射原理)

当内部网络服务设置端口后,外部需要访问该服务,也需要通过该端口完成。那么对于docker来说其自己桥接分配的ip如172.17.0.2也应该可以访问,如下

在这里插入图片描述
因此,docker服务就可以通过桥接分配的自己的IP实现访问,docker内部的ip是由docek0网卡分配,所以docker的ip是可能发生变化的,那么在访问是,就无法确定ip和容器的对应关系,在构建容器时无法确定具体的ip只能创建成功后查看,所以不能仅仅通过ip确定容器。

容器名称一般是规定的,容器ip是docker0自动分配的,那么可以通过容器名的映射来获取服务,即使容器宕机,重构容器容器名不变也还是访问原来的服务。

docker通过docker --link自定义网络,就可以实现通过容器名访问容器服务,无需将ip固定。https://docs.docker.com/network/links/

在这里插入图片描述
官方文档上显示要移除了,有兴趣可以去官网查看。

容器编排

docker compose介绍

主机的docker引擎上可以启动若干个容器,而每个容器之间是相互独立的,那么就在运维时就需要对这些若干个容器独立管理。这显然是个棘手的事情。Docker Compose是一个单机容器的管理工具(管理主机上的所有容器),提供相应命令,包括整个集群容器的启动运行和停止。(Docker Swarm和Kubernetes是跨主机的容器容器管理平台)。

学过spring的肯定都知道IOC容器,compose就是类似的功能能管理各个容器又能保证容器的独立性。

在这里插入图片描述

Compose 使用的三个步骤:

  1. 使用 Dockerfile 定义应用程序的环境。

  2. 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

  3. 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

下载和安装

参考文档

官方文档

github下载docker-compose:

curl -SL https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

v2.17.2是版本,可以更换,compose和docker引擎对应的版本。

在这里插入图片描述

# 授予目录权限sudo chmod +x /usr/local/bin/docker-composesudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-composedocker-compose --version

在这里插入图片描述

如果上面命令拒绝访问切换超级用户。

显示docker-compse版本后就表示安装成功了。

高版本的docker会自动下载docker compose,如在这里插入图片描述
下载的dokcer24.0.4版本中就自动安装了docekr compose。
在这里插入图片描述

docker compose最终要的就是docker-compose.ymlDockerfile,前者定义所有容器的编排,后者定义单个容器的服务。

Dockerfile就不再介绍了,直接上docker-compose.yml,其是一种yml配置文件,对容器编排配置,然后通过docker-compose up启动服务群。

在这里插入图片描述

配置文件

官方语法

Docker Compose 的 YAML 文件包含 4 个一级 key是versionservicesnetworksvolumes

version是必须指定的,而且总是位于文件的第一行。它定义了 Compose 文件格式(主要是 API)的版本。注意,version 并非定义 Docker Compose 或 Docker 引擎的版本号。

services用于定义不同的应用服务。Docker Compose 会将每个服务部署在各自的容器中。

networks用于指引 Docker 创建新的网络。默认情况下,Docker Compose 会创建 bridge 网络。 这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用 driver 属性来指定不 同的网络类型。

volumes用于指引 Docker 来创建新的卷。

第二级参数如下

在这里插入图片描述

Docker和Docker Compose关系及应用

菜鸟教程

如下所示,通过docker-compose.yml启动两个容器,redis服务,并部署一个·基于go的web项目,实现对redis的操作,yml文件如下:

version: '3'
services:go-web:image: go-web:1.0container_name: gowebports: - "8000:8000"depends_on: - redisredis:image: redisports:- "6379:6379"command: redis-server /etc/redis/redis.conf

基于go项目构建的dcoker镜像的Dokcerfile文件

FROM ubuntuEXPOSE 8000
RUN sed -i 's#http://archive.ubuntu.com/#http://mirrors.tuna.tsinghua.edu.cn/#' /etc/apt/sources.list
RUN apt updateWORKDIR /usr/local/goCOPY main index.html .ENTRYPOINT ["./main"]

go项目打包后就是二进制文件不需要配置go环境。

Dockerfile构建完镜像后,通过docker compose up -d启动两个容器,如下图

在这里插入图片描述

两个服务启动

在这里插入图片描述

在这里插入图片描述

微软官方教程

k8s

k8s系列文章第五篇(docker-compose)

kubernetes容器技术系列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-5314062.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

二级制部署kubernetes(1.20)

😘作者简介:一名运维工作人员。 👊宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。 🙏创作不易,动动小…

AD21原理图的高级应用(一)端口的应用

(一)端口的应用 1.放置端口2.自动给端口添加页码 说明,博主的AD版本是AD21,所有的工程都基于AD21,虽然AD软件几乎不存在版本兼容性问题,但还是建议大家使用对应版本的软件来学习。 资料仅供学习使用。 1.…

拯救者Y9000K无线Wi-Fi有时不稳定?该如何解决?

由于不同品牌路由器的性能差异,无法完美兼容最新的无线网卡技术,在连接网络时(特别是网络负载较大的情况下),可能会出现Wi-Fi信号断开、无法网络无法访问、延迟突然变大的情况;可尝试下面方法进行调整。 1…

白盒测试的几种逻辑覆盖标准及特点

白盒测试是一种测试方法,用于评估软件的质量,特别是内部工作机制和程序代码的正确性。它也被称为透明盒测试或结构测试。白盒测试的原理是测试人员必须能够访问被测试软件的源代码及其详细说明,以便能够理解和分析代码,并发现可能…

cmake应用:集成gtest进行单元测试

编写代码有bug是很正常的,通过编写完备的单元测试,可以及时发现问题,并且在后续的代码改进中持续观测是否引入了新的bug。对于追求质量的程序员,为自己的代码编写全面的单元测试是必备的基础技能,在编写单元测试的时候…

如何利用Requestly提升前端开发与测试的效率

痛点 B站最牛的Python接口自动化测试进阶教程合集(真实企业项目实战) 前端测试 在进行前端页面开发或者测试的时候,我们会遇到这一类场景: 在开发阶段,前端想通过调用真实的接口返回响应在开发或者生产阶段需要验证前…

一起学算法(计算排序篇)

概念: 计数排序(Counting sort)是一个非基于比较稳定的线性时间的排序算法 非基于比较:之前学的排序都是通过比较数据的大小来实现有序的,比如希尔排序等,而计数排序不需要比较数据的大小而进行排序&…

提升开发效率,Lombok的链式编程和构建模式

目录 链式编程 定义 代码示例 ​编辑 Accessors(chaintrue) 开启链式编程 ​编辑 Accessors(chain true,fluent true) 去除set和get 构建模式 定义 代码示例 ​编辑 踩坑 Singular 定义 代码示例 踩坑默认值情况 ​编辑 With 定义 代码示例 链式编程 定义 链…
推荐文章