【Docker】学习笔记-p1,java电商项目面试一般会问题以及回答

=======================================================================

1.什么是Docker


微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦

  • 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突
  • 在数百上千台服务中重复部署,环境不一定一致,会遇到各种问题

1.1 应用部署的环境问题

大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:

  • 依赖关系复杂,容易出现兼容性问题

  • 开发、测试、生产环境有差异

例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难

1.2 Docker解决依赖兼容问题

而Docker确巧妙的解决了这些问题,Docker是如何实现的呢?

Docker为了解决依赖的兼容问题的,采用了两个手段:

  • 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包

  • 将每个应用放到一个隔离容器去运行,避免互相干扰

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VsuUf1WD-1636786350805)(file://C:\Users\30287\Desktop\Java%E5%AD%A6%E4%B9%A0%E8%A7%86%E9%A2%91\day03-Docker%E8%AE%B2%E4%B9%89\assets\image-20210731142219735.png?lastModify=1636783280)]

这样打包好的应用包中,既包含应用本身,也保护应用所需要的Libs、Deps,无需再操作系统上安装这些,自然就不存在不同应用之间的兼容问题了

虽然解决了不同应用的兼容问题,但是开发、测试等环境会存在差异,操作系统版本也会有差异,怎么解决这些问题呢?

1.3 Docker解决操作系统环境差异

要解决不同操作系统环境差异问题,必须先了解操作系统结构。以一个Ubuntu操作系统为例,结构如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oAkwlTEc-1636786350811)(file://C:\Users\30287\Desktop\Java%E5%AD%A6%E4%B9%A0%E8%A7%86%E9%A2%91\day03-Docker%E8%AE%B2%E4%B9%89\assets\image-20210731143401460.png?lastModify=1636783354)]

结构包括:

  • 计算机硬件:例如CPU、内存、磁盘等

  • 系统内核:所有Linux发行版的内核都是Linux,例如CentOS、Ubuntu、Fedora等。内核可以与计算机硬件交互,对外提供内核指令,用于操作计算机硬件

  • 系统应用:操作系统本身提供的应用、函数库。这些函数库是对内核指令的封装,使用更加方便

应用于计算机交互的流程如下:

  1. 应用调用操作系统应用(函数库),实现各种功能

  2. 系统函数库是对内核指令集的封装,会调用内核指令

  3. 内核指令操作计算机硬件

Ubuntu和CentOSpringBoot都是基于Linux内核,无非是系统应用不同,提供的函数库有差异:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-66G8kXlG-1636786350814)(file://C:\Users\30287\Desktop\Java%E5%AD%A6%E4%B9%A0%E8%A7%86%E9%A2%91\day03-Docker%E8%AE%B2%E4%B9%89\assets\image-20210731144304990.png?lastModify=1636783430)]

此时,如果将一个Ubuntu版本的MySQL应用安装到CentOS系统,MySQL在调用Ubuntu函数库时,会发现找不到或者不匹配,就会报错了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S9YFnd87-1636786350817)(file://C:\Users\30287\Desktop\Java%E5%AD%A6%E4%B9%A0%E8%A7%86%E9%A2%91\day03-Docker%E8%AE%B2%E4%B9%89\assets\image-20210731144458680.png?lastModify=1636783445)]

Docker如何解决不同系统环境的问题?

  • Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包

  • Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行

如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uXDnCeBb-1636786350819)(file://C:\Users\30287\Desktop\Java%E5%AD%A6%E4%B9%A0%E8%A7%86%E9%A2%91\day03-Docker%E8%AE%B2%E4%B9%89\assets\image-20210731144820638.png?lastModify=1636783484)]

1.4 总结

Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

  • Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

言尽于此,完结

无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。

  • 第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

image

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

image

搜集费时费力,能看到此处的都是真爱!

…(img-h43m1nxu-1711089810681)]

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

[外链图片转存中…(img-G32Dh13v-1711089810682)]

搜集费时费力,能看到此处的都是真爱!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Docker-compose是一个用于定义和运行多个Docker容器的工具,可以用来部署Java项目。具体步骤如下: 1. 编写Dockerfile文件,用于构建Java应用程序的Docker镜像。 2. 编写docker-compose.yml文件,定义Java应用程序容器的配置和依赖关系。 3. 在本地使用docker-compose命令启动容器,测试Java应用程序是否能够正常运行。 4. 将Docker镜像上传到Docker Hub或私有仓库中。 5. 在目标服务器上安装Dockerdocker-compose。 6. 从Docker仓库中拉取Java应用程序的Docker镜像。 7. 在目标服务器上使用docker-compose命令启动Java应用程序容器。 8. 验证Java应用程序是否能够正常运行。 以上是使用docker-compose部署Java项目的基本步骤,具体实现方式可以根据实际情况进行调整。 ### 回答2: Docker Compose 是一个使用 Docker 容器化部署简化工具,它可以帮助我们快速编排 Docker 容器环境。 准备工作: 1. 安装 Java 8 或以上版本 2. 安装 Docker 3. 安装 Docker Compose 步骤: 1. 在项目根目录下创建一个 docker-compose.yml 文件,文件中的内容类似如下: ``` version: "3" services: myapp: build: context: . dockerfile: Dockerfile ports: - "8080:8080" environment: - DATABASE_URL=jdbc:mysql://mysql/mydb - DATABASE_USER=root - DATABASE_PASSWORD=root depends_on: - mysql mysql: image: mysql:5.7 ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=mydb ``` 其中,有两个服务被定义,一个是 myapp 服务和一个 mysql 服务。myapp 使用当前目录中的 Dockerfile 来构建镜像,Dockerfile 是一个用来告诉 Docker 镜像如何构建的文件。在这个 example 中,myapp 镜像需要设置数据库连接信息,需要依赖一个名为 mysql 的服务。 2. 创建 Dockerfile 文件,在项目根目录创建 Dockerfile 文件,文件内容大致如下: ``` FROM openjdk:8-jre-alpine COPY target/myapp.jar myapp.jar CMD ["java", "-jar", "myapp.jar"] ``` 其中,FROM 声明使用基础镜像,COPY 告诉 Docker 将本地的 myapp.jar 文件复制到镜像中,并设置镜像启动时默认执行的命令。 3. 运行 docker-compose up,启动应用: ``` $ docker-compose up ``` 4. 访问应用 在浏览器中访问 `http://localhost:8080`,即可访问部署好的应用。 以上就是部署 Java 项目的 Docker Compose 部署简述。 ### 回答3: Docker Compose 是 Docker 容器编排工具,可以通过 YAML 文件定义一组容器并进行管理。因此,利用 Docker Compose 部署 Java 项目非常方便且易于管理。 首先,我们需要准备一个 Dockerfile。Dockerfile 指令统计展示如下: FROM openjdk:8-jdk-alpine WORKDIR /app COPY target/demo.jar /app EXPOSE 8080 CMD ["java", "-jar", "demo.jar"] 接下来,我们需要编写一个 docker-compose.yml 文件来定义一个 Docker 服务。docker-compose.yml 指令统计展示如下: version: '3' services: demo: build: context: . dockerfile: Dockerfile ports: - "8080:8080" restart: always 该文件共定义了一个服务,服务名为 demo,使用上述 Dockerfile 构建该服务,并将端口映射至本地主机的 8080 端口,并始终处于重新启动状态。 接下来,我们需要进入项目根目录,执行以下命令来启动服务: docker-compose up 这将构建并启动服务。之后,你只需要访问本地主机的 8080 端口便可访问项目。 注意,本文提供的示例仅供参考,具体情况需要根据实际情况进行修改。 总之,Docker Compose 可以简化 Java 项目的部署和管理工作,为企业迅速迭代和成功上线提供帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值