初识Docker及项目部署流程

1.什么是Docker

Docker是一种轻量级的虚拟技术,它将应用程序及其依赖项打包成独立的、可移植的容器,实现了应用的快速部署、高效运行和灵活管理。

  • 轻量级:Docker 的轻量级确实体现在它不像虚拟机那样需要完整地创建一个新的操作系统实例并分配大量的资源。Docker 容器只获取其运行所需的资源和环境,而不需要完整的操作系统。这意味着在部署像 MySQL 这样的服务时,Docker 只需要提供一个足以支持该服务正常运行的轻量级环境。
  • 可移植性:Docker的可移植性体现在它将程序及所需依赖项打包成独立的,包含了运行应用所需的所有环境和配置,从而可以在不同的Docker主机上进行运行,无序担心环境的问题。
  • 资源隔离和封装:Docker 容器通过虚拟化技术实现了资源隔离,每个容器都有自己独立的资源分配(如 CPU、内存、磁盘等),互不干扰。这使得在同一台主机上可以运行多个容器,提高了资源利用率。

2.基本docker命令

  • docker images【查看本地docker镜像】
  • docker pull 镜像名称:版本号【如果不加冒号和版本号拉去的是最新的镜像】
  • docker ps 查看本机内正在运行的docker容器
  • docker run 镜像名称:版本(如果有版本一定要加上版本,run这一步骤就是把镜像放到docker容器内进行运行)
    这里面有几个参数
    -d:表示在后台运行 例如 docker run -d …
    -p:表示端口号 docker运行容器需要做端口号映射因为不做映射的话是无法访问到容器里的应用的 例如 docker run -d -p 新的端口:容器内的端口 镜像名称
    –name:给容器其名称
    –network:设置容器加入那个网络
    ps:如果docker run的镜像不存在在本地仓库那么会从远程仓库获取并且放到docker内的容器上运行,
    在创建容器时设置network后容器将只存在加入指定的网络,不存在默认网络。【如不理解请看docker网络容器互联】
  • docker exec -it 运行容器id /bin/sh 最后这个一般用bin/bash但是有时候容器内没有对应文件目录的话就需要将/bin/bash替换为实际要执行的命令。这个命令使用/bin/sh作为替代。这个命令就是进入到某个容器内部的。
  • docker inspect 容器id 这个命令是用来查询容器所属的宿主机的ip是多少的
    以上是部分docker常用命令,想研究掌握更多待持续更新

3.docker部署本地项目

之前一直有一个疑问就是docker的每个容器直接都是独立的,那么又是怎么把我们的项目及其依赖的环境和配置项都串联起来呢?
其实是这么实现的首先说一下大体流程,我们假设一个业务场景是这样的一个java服务需要依赖与mysql数据库,依据这么个场景我们需要把我们的java服务和mysql都部署到docker上并且实现网络互通及外部访问。
在这里插入图片描述

以上是一个大体流程图,下面开始详解:

  • 第一步将我们的项目打成jar包
    这里有一个需要注意的点那就是检查下pom文件中是否存在true这个标签,如果出现了并且还是true那么你就需要小心了。因为这个标签的含义是用于控制构建过程中某个特定模块是否被跳过。当的值为true时,表示该模块将不会被构建,下面我举两个场景
    示例一:
    在这里插入图片描述

上图使用了skiptests这个其实是专门跳过与测试相关的,而skip则是相对于通用的,这里表示我们在打jar包的时候会自动跳过测试的相关东西,也就是springboot的test目录下的文件。
示例二:
在这里插入图片描述

在示例二中我本地项目使用了skip注意看这会skip是把主启动类给忽略掉了所以可以正常打包但是启动的时候就会出问题找不到主启动类。
以上两个实例都是与maven相关的小知识此处不过多展开介绍,这样说明了我们在日常开发的时候都是环环相扣的一环有问题其他的也会出现问题。

  • 编写dockerfile文件
    这里就多说一下为什么要写这个文件。因为docker呢你可以把它理解为是一个平台类似于java的jvm虚拟机,向jvm虚拟机不仅可以跑java程序也可以跑其他语言的程序只不过其他语言要符合在jvm上运行的规范才可以。我们的数据库也好、中间件也好、程序包也好这些东西也都需要遵循docker的规范才能在docker上运行。那么这个规范其实就是将原始的包变成docker镜像,从而实现在docker上运行dockerfile就是制作docker镜像的核心,通过dockerfile在结合我们的程序包和docker命令就可以将一个普通应用或者包制作成一个docker镜像。
    还记得刚开始的时候我们提到docker能将应用程序及其依赖项打包成独立的容器,这句话就是在这个 地方体现的。下面介绍具体是怎么体现的
    比如说我们有一个java程序需要部署,那么我们要部署的环境就必须得有jdk才可以要不然java程序是无法运行的,那么此时就需要再dockerfile文件中编写脚本命令执行了,这里只列举简单的命令如下图
    在这里插入图片描述

想要了解更多的dockerfile请自行查看,这里说一下form后面跟的就是我们需要部署程序的依赖,这里我们就需要使用jdk那么我们就在form后面写上jdk的镜像名称,这个镜像你可以从dockerhub上面去找非常的多,然后第二个命令就是将我们本地的jar放到容器里面,第四个命令就是写好映射端口因为宿主机是无法直接访问docker容器的所以只能通过端口映射。
这里为防止有的朋友不理解含义在特意解释下。Docker 可以安装在服务器或电脑上,每个启动的容器都会有自己的 IP 地址。由于这些容器处于隔离的网络环境中,直接在本地服务器或电脑上访问容器的 IP 地址可能无法通行。通过端口号映射,我们可以在本地选择一个端口号,并将其与 Docker 容器内的某个端口号建立关联。这样,当访问本地的这个端口号时,实际上是在访问 Docker 容器内对应的端口号。
例如,在控制器的请求中,虽然 IP 地址写的是宿主机的 IP,但通过端口号映射,请求实际上会被导向容器内的相应端口,从而实现功能的正常运行。
这种端口号映射机制使得外部可以访问 Docker 容器提供的服务,方便了容器内部应用与外部世界的通信。

最后一个命令命令是不是很眼熟没错他就是我们本地的java -jar 【jar名称】,就是在容器启动后会执行这个命令。

4.制作docker镜像

经以上过程相信大家对dockerfile这块有个了解了,其实思想就是这么个思想。下面我将介绍下如何制作docker镜像
当jar包和dockerfile都准备好后,下面我们就需要结合docker命令来进行镜像制作了
首当其中的第一个命令是
docker build -t axservice:v2 .
这个命令的含义是构建一个docker镜像docker build -t这个几个是必备的,后面的两部分axservice【镜像名称】、:v2 【表示自定义的版本号】最后还有一个点是干嘛的呢其实那个点就是说在本目录下寻找dockerfile文件并执行里面的命令,我给大家看下我建的目录结构你们就知道了。
在这里插入图片描述
在执行完构建的命令后我们就会得到一个docker镜像,可以使用docker images命令查询,这个镜像里面除了我们的jar包还有我们所需要的jdk环境。
在这里插入图片描述
下面紧接着就需要执行创建容器的命令,这个在第二部分基本docker命令里有体现,大家可自行查阅。
docker run -d -p 9000:9000 --name service axservice:v2
这样我们的容器就创建成功了但是启动的时候会报错因为我们还缺少mysql服务。

5.容器网络互通

mysql数据库就需要我们自己去docker的镜像仓库拉去一个mysql镜像,并且配置容器启动这样就具备了mysql服务。因为我们的mysql服务是一个独立的容器我们的java项目也是一个独立的容器那么怎么将他们建立关联呢,这时就用到了docker的网络,关于网络我这里只说目前用到的因为本人还未过多深入。
我们可以通过docker命令查看docker容器的ip,同时还会发现每个容器都有一个bridge的网络配置
在这里插入图片描述

并且仔细观察两个容器他们的gateway网关都是一样的只是ip值不一样,这说明他们是属于同一个网段并且可以实现网络互通的,这是因为在安装docker的时候docker会给我们创建一个虚拟网桥,被称为docker0 ip是172.17.0.1 /16这个/16说明这个ip的前16位是不可动的所以只要有容器创建就会连接到虚拟网桥由此实现容器网络互通。
所以这时我们只需要将我们java程序配置文件的mysql服务的地址换成其在docker容器内的对应ip就可以了,比如我的mysql在docker里面是172.17.0.2那么我需要更换配置并且从新打包从新制作镜像从新创建容器才可以连接到mysql服务,这样我们的容器才能真正启动成功并且不影响我们程序功能的使用。
那么到此就结束了吗?其实不然,因为这个ip是docker容器给我们分配的那么大家细想一下如果我的mysql服务被重启了或者说我的mysql服务器是在最后一个启动那么目前mysql服务现有的这个ip就很有可能被其他容器占用,那么这对这种我们就需要自定义网络了,在docker中是支持我们自定义网络并且哪些加入网络的容器可以通过容器名称来访问对方就不需要再写ip了。【仅仅是加入自定义网络的容器可以通过容器名称访问】
在这里插入图片描述

这些是关于docker命令与网络操作这块相关的,首先我们需要创建一个网络然后将我们已经在运行的容器加入到这个网络中
在这里插入图片描述

								图1【创建自定义网络,最后的是名称可自定义】

在这里插入图片描述

								图2【查看docker中的网络可以看到自己新创建的】

在这里插入图片描述

								图3【将容器都加入自定义网络中】

完成以上步骤就实现了创建自定义网络并且将在运行的容器加入网络的过程了,那么此时就不需要再配置文件中写ip了,直接将ip换位容器名称然后从新打包制作镜像启动容器
在这里插入图片描述

最后有一个需要注意的点,我们基本docker命令里有个docker run命令里面有个参数是指定network,这个是指我们在网络创建好后再启动容器的时候就可以直接加入到某一个网络中,不用向docker network connect这个命令只能等容器启动后才能加入。这里有个区别就是如果在启动时加入某个网络那么就不会存在默认的网络了,如果是在启动后才加入那么就会有两个网络。
在这里插入图片描述

总结

以上呢就是关于docker基本常识及部署的过程,目前只是设计到单体不涉及集权包括项目配置卷等等,所以目前是初识Docker篇章。喜欢的小伙伴可以关注点赞剩下的我会持续深耕并分享。

  • 26
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值