docker学习:dockerfile微服务实战及docker端口映射(代码片段)

拒绝冗余 拒绝冗余     2023-04-05     424

关键词:

文章目录

前言

大家好,这是我学习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网络配置的意义在于查看容器间的互联和通信以及端口映射,在容器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系列啦,看完不点个赞再走吗😊

docker学习笔记总结(代码片段)

...扩容(基于redis集群)4.redis集群之主从缩容(基于redis集群)5.DockerFile介绍6.DockerFile构建过程解析7.DockerFile保留字简介8.DockerFile保留字案例演示9.虚悬镜像10.Docker微服务实战1.docke 查看详情

docker详解与部署微服务实战

2013年发布至今,Docker一直广受瞩目,被认为可能会改变软件行业。但是,许多人并不清楚Docker到底是什么,要解决什么问题,好处又在哪里?今天就来详细解释,帮助大家理解它,还带有简单易懂的实例,教你如何将它用于日... 查看详情

springcloudalibaba微服务实战教程系列

一、应用系列     Docker安装MySql完整教程、实操 使用到的mysql数据库的安装方案。     Docker安装AlibabaNacos教程  docker安装单实例或集群的Nacos的注册中心方便快速开始。    实现Nacos服... 查看详情

docker妙用springboot构建微服务实战

它是啥?SpringBoot是Spring开源组织的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。为啥用它?五大优点:1、起步... 查看详情

go微服务实战,docker

...架micro操纵fastdfs网站短信验证。。。6租房网的业务7部署docker8k8s的集群部署基本介绍 大小7.2GB,MP4格式 扫码时备注或说明中留下邮箱付款后如未回复请至https://shop135452397.taobao.com/联系店主  查看详情

docker:dockerfile使用介绍(代码片段)

...:Docker入门教程介绍了Docker基本概念,其中镜像、容器和Dockerfile。我们使用Dockerfile定义镜像,依赖镜像来运行容器,因此Dockerfile是镜像和容器的关键,Dockerfile可以非常容易的定义镜像内容,同时在我们后期的微服务实践中,Do... 查看详情

微服务实战:选择微服务部署策略

 微服务实战(一):微服务架构的优势与不足微服务实战(二):使用APIGateway微服务实战(三):深入微服务架构的进程间通信微服务实战(四):服务发现的可行方案以及实践案例微服务实践(五):微服务的事件驱动... 查看详情

chrisrichardson微服务实战系列

微服务实战(一):微服务架构的优势与不足微服务实战(二):使用APIGateway微服务实战(三):深入微服务架构的进程间通信微服务实战(四):服务发现的可行方案以及实践案例微服务实践(五):微服务的事件驱动数据... 查看详情

springcloud微服务实战

第1章课程介绍课程导学和学习建议第2章微服务介绍什么是微服务,单体架构优缺点,常见的几种架构模式。第3章服务注册与发现介绍微服务中的服务注册与发现机制,SpringCloudEureka组件的使用以及如何保证高可用第4章服务拆分以... 查看详情

3.20go微服务实战(微服务实战)---日志和监控

第20章 日志和监控20.1 日志实践20.2 指标 20.2.1 指标数据类型 20.2.2 命名约定 20.2.3 存储和查询 20.2.4 Grafana20.3 日志记录 20.3.1 具有关联ID的分布式跟踪 20.3.2 ElasticSearch、Logstash和Kibana 20.3.3 Kibana 20.4 异常    查看详情

3.20go微服务实战(微服务实战)---日志和监控

第20章 日志和监控20.1 日志实践20.2 指标 20.2.1 指标数据类型 20.2.2 命名约定 20.2.3 存储和查询 20.2.4 Grafana20.3 日志记录 20.3.1 具有关联ID的分布式跟踪 20.3.2 ElasticSearch、Logstash和Kibana 20.3.3 Kibana 20.4 异常    查看详情

3.21go微服务实战(微服务实战)---持续交付

第21章 持续交付21.1 持续交付简介 21.1.1 手动部署 21.1.2 持续交付的好处 21.1.3 持续交付面面观 21.1.4 持续交付的过程21.2 容器编排的选项和基础架构21.3 Terraform 21.3.1 提供者 21.3.2 Terraform配置入口点 21.3.3 VPC模块 21.3.... 查看详情

3.21go微服务实战(微服务实战)---持续交付

第21章 持续交付21.1 持续交付简介 21.1.1 手动部署 21.1.2 持续交付的好处 21.1.3 持续交付面面观 21.1.4 持续交付的过程21.2 容器编排的选项和基础架构21.3 Terraform 21.3.1 提供者 21.3.2 Terraform配置入口点 21.3.3 VPC模块 21.3.... 查看详情

重新理解微服务之它还那么纯粹吗?

系列文章.Net微服务实战之技术选型篇.Net微服务实战之技术架构分层篇.Net微服务实战之DevOps篇.Net微服务实战之负载均衡(上).Net微服务实战之CI/CD.Net微服务实战之Kubernetes的搭建与使用.Net微服务实战之负载均衡(下).Net微服务... 查看详情

微服务实践:微服务的事件驱动数据管理

 微服务实战(一):微服务架构的优势与不足微服务实战(二):使用APIGateway微服务实战(三):深入微服务架构的进程间通信微服务实战(四):服务发现的可行方案以及实践案例微服务实践(五):微服务的事件驱动... 查看详情

扩展的微服务实例需要更新 1

】扩展的微服务实例需要更新1【英文标题】:scaledmicroservicesinstancesneedstoupdate1【发布时间】:2020-12-0907:27:58【问题描述】:我有一个独特的问题,试图看看什么是最好的实现。我的表格有50万行。每行代表我需要从中获取有关该... 查看详情

JHipster 微服务实体

】JHipster微服务实体【英文标题】:JHipstermicroservicesentities【发布时间】:2018-01-0204:43:10【问题描述】:我阅读了BFFpattern,我有一个疑问,如果一个微服务仅适用于iOS,而另一个微服务仅适用于Android,如果这两个服务使用相同的... 查看详情

一本专为java/spring开发人员准备的微服务实战指南

...发现、监控、分布式跟踪、安全性、管理等。这本《Spring微服务实战》(第2版)可以帮你解决这些难题。《Spring微服务实战》(第2版)是一本专为Java/Spring开发人员准备的微服务实战指南,书中将介绍Spring中... 查看详情