docker学习(四):DockerFile微服务实战及docker端口映射

news2024/12/28 4:07:11

文章目录

  • 前言
  • 1.Dockerfile介绍
  • 2.微服务实战案例
  • 3.docker端口映射
    • 3.1查看docker网络模式命令
    • 3.2docker网络模式

前言

大家好,这是我学习docker系列的笔记文章,目标是掌握docker,为后续学习K8s做准备。本文记录了springBoot微服务项目通过DockerFile生成镜像实战代码,并总结了宿主机和docker容器端口映射方法,感兴趣的朋友可以看一下以前的文章。
前文回顾:
docker入门(一):在centOS虚拟机上安装docker
docker入门(二):docker的常用命令
docker学习(三):docker镜像分层原理及本地镜像推送到阿里云或私服

1.Dockerfile介绍

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务。

  • 项目构建三部曲:
  1. 编写Dockerfile文件
  2. docker build命令构建镜像
  3. docker run依镜像运行容器实例
  • Docker执行Dockerfile的大致流程如下:
    (1)docker从基础镜像运行一个容器
    (2)执行一条指令并对容器作出修改
    (3)执行类似docker commit的操作提交一个新的镜像层
    (4)docker再基于刚提交的镜像运行一个新容器
    (5)执行dockerfile中的下一条指令直到所有指令都执行完成

  • DockerFile常用保留字指令
    FROM -基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
    MAINTAINER -镜像维护者的姓名和邮箱地址
    RUN -容器构建时需要运行的命令,有两种形式,一是后面加shell命令如RUN yum -y install vim,另一种是exec格式,如RUN [“./test.php”, “dev”, “offline”]
    EXPOSE -当前容器对外暴露出的端口
    WORKDIR -指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
    USER -指定该镜像以什么样的用户去执行,如果都不指定,默认是root
    ENV用来在构建镜像过程中设置环境变量,这个环境变量可以在后续的其他指令中使用
    ADD -将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
    COPY -类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
    VOLUME -容器数据卷,用于数据保存和持久化工作
    CMD -指定容器启动后的要干的事情,格式跟RUN相似,和前面RUN命令的区别:CMD是在docker run 时运行,RUN是在 docker build时运行

2.微服务实战案例

  • 假设我们已经开发了一个订单微服务,通过maven打包生成order.jar,现在要生成这个服务的镜像文件,需要先编写DockerFile文件,如下图所示:
    在这里插入图片描述
    注意要将微服务jar包和Dockerfile文件上传到同一个目录下。

  • 然后构建:docker build -t 新镜像名字:TAG .
    这里我取的新镜像名字是orderservice,命令是 docker build -t orderservice:20230203 .
    注意:命令后面有个空格+“.”, 表示镜像产生在当前目录

  • 编译完成后直接运行就可以了
    ·docker run -it orderservice:20230203

  • 访问测试 宿主机ip:8080/order #order是一个rest接口

3.docker端口映射

·docker启动后,会产生一个名为docker0的虚拟网桥

3.1查看docker网络模式命令

查看docker网络模式命令
学习docker网络配置的意义在于查看容器间的互联和通信以及端口映射,在容器IP变动时候可以通过服务名直接网络通信而不受到影响

3.2docker网络模式

docker容器内部的ip是有可能会发生改变的,了解docker的网络模式即可了解容器ip变化情况。总体分为4种模式:

  • bridge模式:使用–network bridge指定,默认使用docker0
  • host模式:使用–network host指定
  • none模式:使用–network none指定
  • container模式:使用–network container:NAME或者容器ID指定
  1. bridge模式

docker network inspect bridge #查看bridge网络详情

  • Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

  • docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的network(后面讲)eth0,eth1,eth2……代表网卡一,网卡二,网卡三……,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址

  • 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
    1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
    2 每个容器实例内部也有一块网卡,每个接口叫eth0;
    3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

  • 通过上述,将宿主机上的所有容器都连接到这个内部网络上,容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时docker中每个容器的网络是互通的。

  1. host模式
    直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace,它不会虚拟出自己的网卡而是使用宿主机的IP和端口。

#使用–network指定host网络模式
docker run -d -p 8083:8080 --network host --name tomcat83 billy/tomcat8-jdk8

注意上述命令可以报:Published ports are discarded when using host network mode警告哦,因为host模式下通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。
解决的办法就是使用docker的其他网络模式,例如–network=bridge,这样就可以解决问题,或者直接无视。。。。O(∩_∩)O哈哈~
3. none模式
在none模式下,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo(127.0.0.1),即禁用了网络功能。
4. container模式
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
举例说明一下,先运行一个容器tomcat81,在启动容器tomcat81,通过–network container:tomcat81参数指定tomcat82的网络接口与tomcat81容器一致。

docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network container:tomcat81 --name tomcat82 billy/tomcat8-jdk8

照上述命令执行的化就报端口冲突了哈哈,发现这个坑了吗,他俩用一个端口,o(╥﹏╥)o

  1. 自定义网络
    自定义网络本身就维护好了主机名和ip的对应关系(容器间ip和域名都能通)

本小节分享到这里Docker基础学习就告一段落了,接下来就期待学习更新K8s系列啦,看完不点个赞再走吗😊
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Android的租车app

需求信息&#xff1a; 1.用户中心 进行登陆注销、修改信息、修改密码、上传用户信息:身份证、驾驶证等&#xff0c;并提供基本的验证真伪功能。2.租车交易 用户可以查看可以根据条件查看可以租用的汽车车辆信,息。完成租用车辆功能&#xff0c;(包括登记汽车使用的位置范围) 车…

基于数字孪生的智慧电网3D可视化运维系统

十四五规划提出&#xff1a;“加快推动数字产业化&#xff0c;培育壮大人工智能、大数据、区块链、云计算、网络安全等新兴数字产业”&#xff0c;这是深化电网领域以新能源为主体的国家新型电力系统战略。建设背景在2020年的联合国气候峰会上&#xff0c;我国正式提出了“3060…

听说,这届飞桨社区的框架贡献者真的很“卷”

飞桨平台的快速发展&#xff0c;与开源开放密不可分。飞桨框架建设并非只靠百度工程师&#xff0c;也离不开热爱飞桨、热爱开源的开发者们&#xff0c;他们用自己的方式参与飞桨框架建设&#xff0c;与飞桨共同成长。 为了鼓励更多的开发者参与到飞桨社区的开源建设中&#xff…

前端利器——炫酷的CodePen

前言众所周知&#xff0c;前端是一个很容易将自己的劳动成果呈现出来的一个职位&#xff0c;无论是写1行代码还是写100行代码&#xff0c;都可以通过页面来进行呈现&#xff0c;在工作中的劳作成果也是可以一眼就呈现给客户、用户的。比如一些精美的页面&#xff0c;炫酷的特效…

C++智能指针auto_ptr、unique_ptr、shared_ptr、weak_prt详解

目录 一.为什么要使用智能指针 二.auto_ptr 三.unique_ptr 四.shared_ptr 五.weak_ptr 智能指针均定义在头文件<memory>中&#xff1a; #include<memory> 同时每种智能指针都是以类模板的方式实现 一.为什么要使用智能指针 C的内存管理中&#xff0c;每当…

如何使用ArcGIS拼接栅格

1、概述数据的来源是多种多样的&#xff0c;特别是从网上下载的各种数据往往是分块的数据&#xff0c;在使用的时候需要进行数据的拼接&#xff0c;这里为大家介绍一下ArcGIS进行栅格拼接的方法&#xff0c;希望能对你有所帮助。2、直接拼接在ArcToolbox中点击“数据管理工具\栅…

某书x-s和web_session

开工发现某书web更新了,目前笔记信息接口: /api/sns/web/v1/feed 请求时headers中需要x-s、x-t,cookie中需要有web_session。 文章目录 web_sessionX-SJS代码Python代码web_session web_session和当前环境绑定,重新注册后浏览器中的ID也会更新。 其主要依赖的参数是webI…

WebDAV之葫芦儿·派盘 +Polaris Office

Polaris Office 支持WebDAV方式连接葫芦儿派盘。 推荐一款可以实现在Windows桌面PC,Mac,Android设备和iOS设备上同步的移动办公软件,还支持通过WebDAV添加葫芦儿派盘。 Polaris Office是一款功能全面的办公自动化套件,软件集成了

vue 动态组件component

这篇文章主要介绍了 vue 动态组件component &#xff0c;vue提供了一个内置的<component>,专门用来实现动态组件的渲染&#xff0c;这个标签就相当于一个占位符&#xff0c;需要使用is属性指定绑定的组件&#xff0c;想了解更多详细内容的小伙伴请参考下面文章的具体内容…

ChatGPT小白免费使用教程

本教程介绍chargpt使用教程 :不需要翻墙,不需要注册,也不需要缴纳费用 通过本教程您将会使用chargpt写代码 搜索问题写论文 。 我展示了两个问题 问题一 :用python写一个学生信息管理系统 问题二:用python进行中文分词

【iMessage苹果相册推】CSR邮箱必须与证书分属的AppID相同。 若是您可以在步伐中吸取令牌,则此步伐是成功的。

推荐内容IMESSGAE相关 作者✈️IMEAX推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容3.日历推 *** …

Echarts修改柱状图柱子的宽度

第009个点击查看专栏目录Echarts的柱状图通常我们不去设置柱子的宽度&#xff0c;都是以默认的状态来处理。柱条的宽度&#xff0c;不设时自适应。 series-bar. barWidth 自适应 设定值可以是绝对值例如 10 或者百分数例如 ‘60%’。百分数基于自动计算出的每一类目的宽度。 …

Mac使用Maven出现command not found的问题

问题 Maven一直使用的好好的&#xff0c;但某一天开始突然挂了&#xff0c;出现command not found的问题&#xff08;事后推测可能是在多次修改.bash_profile后导致的误删配置&#xff09; 尝试1&#xff1a;先是问度娘&#xff0c;得到的答案清一色的是添加如下行到.bash_pro…

第九层(11):STL之常用遍历算法

文章目录前情回顾常用算法常用遍历算法for_eachtransform下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的智能制造专业学生&#xff0c;在学习C/C的路上会越走越远&#xff0c;后面不定期更新有关C/C语法&#xff0c;数据结构&#xff0c;算法…

Git基本信息和日常操作记录

文章目录一、Git1、干啥的2、Git 与svn 的区别二、Git操作记录注意2.1、配置别名2.2、初始化本地git仓库&#xff08;创建新仓库&#xff09;2.3、配置用户名2.4、配置邮件2.4、clone远程仓库2.5、查看配置2.6、暂存修改撤回2.7、配置 git log 日志快捷命令2.8、git 自定义配置…

一刷代码随想录——二叉树

理论基础【1】分类满二叉树完全二叉树优先级队列其实是一个堆&#xff0c;堆就是一棵完全二叉树&#xff0c;同时保证父子节点的顺序关系。二叉搜素树二叉搜索树是有数值的&#xff0c;二叉搜索树是一个有序树。平衡二叉搜素树&#xff08;AVL&#xff09;C中map、set、multima…

Allegro走线规则管理器中网络不会被同步高亮的解决办法

Allegro走线规则管理器中网络不会被同步高亮的解决办法 在用Allegro做PCB设计的时候,在走线的时候,规则管理器中的网络能被高亮起来的话会十分直观,尤其是在做等长设计的时候。 但是有时候会遇到走线的时候,规则管理器中的网络不会同步高亮的情况 如下图: 下面介绍遇到这…

Baklib教您:如何构建有效的帮助中心知识库?

好的帮助中心网站架构良好并精心呈现&#xff0c;使客户可以轻松浏览网站并找到他们要搜索的内容。帮助中心应始终易于搜索&#xff0c;为客户提供品牌知识库的可访问版本&#xff0c;该帮助中心应以用户体验为核心。该站点通常会包含常见问题解答、文章和各种说明&#xff0c;…

SNMP源码分析

源码下载 http://www.net-snmp.org/download.html 源码目录结构 net-snmp程序逻辑 &#xff08;1&#xff09;main主函数 #ifdef WIN32SERVICE //windows系统下使用snmp static int SnmpDaemonMain(int argc, TCHAR * argv[]) #else //linux系统 int main(int argc, char …

吊打面试官,四面拿到阿里、字节 offer 后我还是选择了美团

祸兮福之所倚福兮祸之所伏 上学的时候对这句话不以为然&#xff0c;但是在社会上走的时间越长越觉得有道理 前不久好兄弟和领导闹矛盾裸辞了&#xff0c;身为好兄弟的我总不能干看着吧&#xff0c;总要帮他找工作的。(你们应该不会想我和他一起裸辞吧) 大学的师兄有好几个在大…