公众号「古时的风筝」,专注于后端技能,尤其是 Java 及周边生态。

个人博客:www.moonkite.cn

大家好,我是风筝

有些时分咱们需要在本地搭开发环境,比方平常学习新技能的时分。或者有时分公司的项目需要在本地建一套类似的,方便调试修改。

开发环境或许包含 MySQL、Redis、Nginx、MQ 、Elasticsearch等等,今日用的是 MySQL,明天又用PostgreSQL了,假如用啥都在本机装一下的话,倒也不是不能够,可是就十分麻烦了,并且有时分装置会遇到各种各样的问题,很是不爽。

有什么快速有高雅的办法没有?

便是咱们今日要说的 Docker 了,Docker 到现在为止,早就不是什么新技能了,甚至能够说是很遍及很大众的技能计划了。

我记住我最早开端用 Docker 现已是 2015年了,到现在现已快8年了。只能感叹,时间过得是真快呀!

Docker瞬间搭建本地开发环境

那段时间也把 Docker 安利给了不少同学、搭档,我只是这样告诉他们:“这玩意儿在本地搭一套开发环境真的很方便”,至于它后来开展成现在的规划,我也是没想到的。

假如你是个开发老手儿,相信你早就用起来了。而假如你是个新手,那也要赶快用起来了,不仅能节省建立环境的时间,还能学习学习,毕竟现在容器化部署办法很遍及了,多了解了解还是十分有必要的。

Docker 原理和根底指令

基本原理

用任何一种技能首要都要先了解它的技能原理,做到心中有数。

Docker 运用 Google 公司推出的 Go 言语进行开发实现,依据 Linux 内核的cgroup,namespace,以及 OverlayFS类的 Union FS 等技能,对进程进行封装阻隔,属于操作体系层面的虚拟化技能。由于阻隔的进程独立于宿主和其它的阻隔的进程,因此也称其为容器。

Docker 经常拿来和虚拟机来比较,由于它们两个的用处和用法都很相似,便是在一台实体机上发动多个虚拟体系(暂时这么说)。假如依据运用的层面来讲,你彻底能够把 Docker 作为虚拟机来用,然而实践的底层技能原理是彻底不一样的。

假设你现在变身了,站在了 Docker 和 虚拟机的内部,从里面向外看,发现虚拟机有自己的 CPU(虚拟CPU)、内存、硬盘,再往外才是宿主机的 CPU、硬盘、内存等。而假如是在Docker内部向外看,发现你无论站在当前实体机的哪个容器里,看到的都是宿主机的 CPU、硬盘、内存等。阐明 Dokcer 容器是直接拿宿主机的资源当自己的用,所以每个容器的硬件装备都是一样的,而虚拟机是彻底虚拟出来一套。

根底指令

Dokcer 的指令有一大堆,可是常用的就那几个。

镜像相关

获取镜像

docker pull 镜像称号

检查镜像列表

docker image ls

容器相关

检查容器

docker ps -a

新建并发动容器

sudo docker run -t -i ubuntu:12.04  /bin/bash

进入容器

docker exec -it 容器id bash

由于本文不是 Docker 的教程,所以只是抛砖引玉,详细的教程和文档网上到处都是。

装置 Docker Desktop

接下来开端本地实践了,用 Docker 快速搭一套本地环境。

有一些 Docker 的可视化客户端能够装置,帮咱们更方便更直观的办理镜像、容器,当然假如你很厉害的话,彻底用指令行也不是不行。

我就没这么厉害了,那些参数根本记不住,所以有必要要装客户端。我装置的是 Docker Desktop,官方客户端,支持 Mac、Linux、Windows,我大部分时分用 Mac,有时分也要用 Windows,所以Docker Desktop是不二选择。

假如你只用 Mac 的话,也能够装置 OrbStack(orbstack.dev/),据说比 Docker Desktop 要流通一些。

下载装置

拜访 Docker Desktop 官网 www.docker.com/products/do…

Docker瞬间搭建本地开发环境

下载完一键装置就能够了,Docker 环境直接帮你装好了,省心省事儿。下面是它的控制台界面。左边导航能够检查镜像列表、容器列表、映射的Volumes。

Docker瞬间搭建本地开发环境

咱们在指令行输入 docker -v,假如呈现正确的版本号,阐明 docker服务现已装置正常了。

Docker version 24.0.2, build cb74dfc

接下来有一件事儿是有必要要做的,那便是设置国内镜像源,道理大家都懂,你要是用国外的镜像源,一天都不一定能搞下来一个。

点击「设置」按钮,在左边选择「Docker Engine」

Docker瞬间搭建本地开发环境

,然后在右侧的装备框中添加如下装备,加到最下面即可:

"registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://cr.console.aliyun.com/"
  ]

加完后,点击「Apply & restart」,这时分会重启 Docker 服务。

装置一个服务

MySQL、Nginx、Redis、Zookeeper 这些都是服务,每一个都能够按照这种办法装置,不管你的项目需要多少个服务,一个个装置就好了,很快的呦。

正好我最进要学一下 PostgreSQL,我就直接发动一个 docker 容器了,不在本地装置了。当然了,像数据库这种I/O型的应用是不建议容器化的,可是本地开发测验无所谓。

在这个搜索框输入关键词,查找对应的镜像,我在这里输入关键词 PostgreSQL。假如装置 Nginx 那便是输入 Nginx,以此类推。

Docker瞬间搭建本地开发环境

看,出来了一大堆,我一般都是找第一个,也便是下载量最大的这个。

Docker瞬间搭建本地开发环境

能够 pull 或者 run,pull 是拉取镜像,run 是拉取镜像+发动容器。

Docker瞬间搭建本地开发环境

我一般都是直接 run,点一下 run,等一会儿,由于前面现已设置了国内镜像源,所以速度很快,十几秒钟。(依据网速快慢不同,由于要下载镜像文件,有的应用有上百M)

下载完之后,由于选的是 run,所以直接弹出了发动参数。

Docker瞬间搭建本地开发环境

设置镜像称号

容器称号(Container name)便是为了咱们一看到它就知道是干什么的,用来方便办理的,我就直接命名为 PostgreSQL了。

设置端口映射(Ports)

服务自身有自己的端口,例如 MySQL 是3306,这是服务自身在容器内的发动端口,但最终咱们要经过宿主机去拜访服务,所以要将这个容器内的端口绑定到一个宿主机端口,这叫做端口映射,这样一来,咱们就能够经过宿主机的端口拜访到容器内的端口了。比方我将 MySQL 容器的 3306 端口映射到宿主机的 13306 端口,之后我在设置数据库衔接的时分,就用本机 IP:13306就能拜访 MySQL 容器了。

在我这个 PostgreSQL 容器上,我将本机的 15432和容器的 5432端口绑定,之后就能够用 15432做衔接端口了。

目录映射(Volumes)

许多服务都会用到存储目录,可是容器自身就在宿主机上,所以需要将服务在容器内的目录映射到宿主机的目录上,这叫目录映射。例如将 Nginx 容器的 /etc/nginx目录映射到宿主机的 /apps/nginx/目录上,那之后我在宿主机拜访 /apps/nginx目录时,就能看到 Nginx 容器的装备文件了。

在我这个PostgreSQL 容器上,我将 /etc/postgresql/postgresql.conf装备文件映射到了我本地的一个目录上。

环境变量

一个服务发动或许会用到发动变量,这些变量能够经过环境变量的办法进行装备。例如,咱们发动一个 Java jar 包,要装备 JVM 相关的参数,这些参数就能够放到环境变量中,供发动的时分运用。

由于 PostgreSQL 需要密码,所以这里就设置一个密码的环境变量 POSTGRES_PASSWORD

都设置好之后,点击run按钮,发动容器。

然后咱们看到容器现已发动了,有相应的日志打印出来。

Docker瞬间搭建本地开发环境

然后点击左边的Containers,能够看到现已发动的容器和一些基本装备。

Docker瞬间搭建本地开发环境

然后就能够经过客户端进行衔接了。

Docker瞬间搭建本地开发环境

Docker瞬间搭建本地开发环境

别的,还能够在容器概况中检查容器的内部文件、状态、装备信息、日志等,以及进入指令行。

Docker瞬间搭建本地开发环境

最后

第一次或许比较慢,了解了之后就十分快了,比你在本地直接装置装备要快的多,并且一些软件装置装备起来十分繁琐,会浪费许多不必要的时间。

还有许多开源的结构、应用提供docker版本,掌握了这个办法后,能够很快的装置这些结构、应用来验证和运用,用户体会直接上升一个数量级。