
我的工作环境一直是Mac,Mac用于办公和程序开发的体验个人觉得是非常酷的。最近一直研究Elasticsearch,在Mac上搭建了Elasticsearch集群,搭建的过程中就发现了各种配置由于环境的不一致差别较大。我一直希望在安装部署软件的时候能够像在真实生产环境一样配置,这对于掌握实际的生产环境运维、分析能力非常重要,而生产环境目前大多数还是Linux系统。
于是我开始了我的捣鼓之路了~
Elasticsearch的安装和配置是支持Mac系统的,下载适配Mac的安装包即可,但是在我安装的过程中就发现了配置上存在不少与在Linux下的生产环境的配置都不一样的地方,虽然说最终也能运行,但是总是觉得差了一些。我碰到的差异点例如:
vm.max_map_count以适配Elasticsearch对于虚拟内存空间的要求,Mac系统下没有这个配置文件。经过一番倒腾和资料查找,以上问题都没很好解决,我又尝试了其他的一些软件,也多多少少会有这些问题或者其他兼容性问题,于是我熄了在Mac上搭建相关软件的心。
因为之前有过在Windows下安装过Ubuntu双系统的经验,我自然而然考虑在Mac下安装双系统。原以为可以使用Mac自带的“启动转换助理”实现,结果发现这货只支持Windows!
还是乖乖使用U盘制作安装盘的方式,主要经历了以下环节:
快乐总是短暂的,在使用了一段时间以后开始发现问题了:
整体来说能满足开发的需要,但是办公还是不太方便,效率太低,于是我在想能不能使用虚拟机呢?
以前使用过VMware Workstation在Windows上安装过虚拟机,体验还是很不错的,可惜它不支持Mac。
目前支持Mac比较好的虚拟机软件主要有Parallels Desktop、VirtualBox、VMware Fusion Pro,其中VirtualBox是免费软件。

怀着白嫖的心理,尝试了VirtualBox,安装还是非常方便的,整个流程也非常顺畅,也不需要制作启动盘,关键是删除也非常方便,还能同时使用Mac功能办公,完美~
但是开心的时光总是短暂的~最大的问题出现了,那就是:性能,VirtualBox在Macbook上的性能不得不吐槽啊,太吃资源了,太卡了,卡得不太能接受,所以果断放弃了。
后来又尝试了一下Parallels Desktop,体验是好了很多,毕竟是花了钱的,性能也不错,最大的硬伤是贵啊,新的许可证是498元起,适用于开发人员的Parallels Desktop Pro是698元起,VMware Fusion 12 Pro 则需要199美元,也是比较难以下手。
还有没有其他免费可以白嫖的好的方案呢?
容器是另外一种轻量级的虚拟化方案,所以这时候又想起了大名鼎鼎的Docker。能不能使用Docker安装Linux来搭建部署运行环境呢?想到就开始做。
下载适配Mac系统的Docker安装包Docker.dmg,下载地址:https://docs.docker.com/desktop/install/mac-install/, 安装docker。

安装过程中会要求输入系统密码授权,安装成功以后可以看到如下界面,默认进入Container容器TAB,目前全新安装还未有运行的容器。

还可以通过命令行查看docker的版本
[lucas-os@macbook ~]$docker --version
Docker version 20.10.17, build 100c701
通过命令行查看docker的相关信息信息,看到这些信息代表docker已经成功安装了。
[lucas-os@macbook ~]$docker info
Client:
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc., v0.8.2)
compose: Docker Compose (Docker Inc., v2.6.1)
extension: Manages Docker extensions (Docker Inc., v0.2.7)
sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)
scan: Docker Scan (Docker Inc., v0.17.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.17
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc version: v1.1.2-0-ga916309
init version: de40ad0
Security Options:
seccomp
Profile: default
cgroupns
Kernel Version: 5.10.104-linuxkit
Operating System: Docker Desktop
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.843GiB
Name: docker-desktop
ID: VC26:3L7Y:6AAC:MHLQ:7IGE:7YQD:AQ36:UXAR:GOGJ:BSGV:EK7H:ICWE
Docker Root Dir: /var/lib/docker
Debug Mode: false
HTTP Proxy: http.docker.internal:3128
HTTPS Proxy: http.docker.internal:3128
No Proxy: hubproxy.docker.internal
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
hubproxy.docker.internal:5000
127.0.0.0/8
Registry Mirrors:
https://bytkgxyr.mirror.aliyuncs.com/
https://registry.docker-cn.com/
http://hub-mirror.c.163.com/
Live Restore Enabled: false
注册dockerhub账号,在docker desktop上登陆,使用以下命令拉取Centos 7的镜像。
[lucas-os@macbook ~]$docker pull centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
鉴于国内网络问题,拉取Centos7的镜像可能速度比较慢,可以配置国内的镜像地址进行加速,例如网易的镜像地址:http://hub-mirror.c.163.com。
配置镜像地址也比较简单,选择Docker Desktop -> Perferences... -> Daemon -> Registry mirrors。在列表中填写镜像地址即可,修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。
拉取完成以后可以通过以下命令查看centos 7镜像
[lucas-os@macbook ~]$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 eeb6ee3f44bd 10 months ago 204MB
可以看到镜像大小为204MB,镜像ID为"eeb6ee3f44bd",也可以从Docker GUI客户端查看:

使用以下命令,可以启动centos镜像,生成一个centos 7运行容器
[lucas-os@macbook ~]$docker run -ti centos:7 /bin/bash
[root@32a628fe85cc /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
使用docker ps命令可以查看容器
[lucas-os@macbook ~]$docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32a628fe85cc centos:7 "/bin/bash" 6 minutes ago Up 6 minutes competent_ramanujan
也可以通过Docker GUI的Container页面查看当前的容器

我们希望通过Docker容器进行部署环境配置,那么就要求我们的改动必须能够持久化,而不是一旦重启容器就丢失改动。下面以安装Elasticsearch为例,讲解如何进行改动内容的持久化。
添加运行elasticsearch的用户
[root@32a628fe85cc /]# useradd elasticsearch-user
[root@32a628fe85cc /]# passwd elasticsearch-user
Changing password for user elasticsearch-user.
为了方便后续的配置文件编辑,安装vim
[root@32a628fe85cc /]$yum install vim
修改文件描述符和最大线程数限制
切换到root用户,修改/etc/security/limits.conf配置文件,添加以下内容并保存。
* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096
* soft memlock unlimited
* hard memlock unlimited以上的配置是因为Elasticsearch的运行对最大的文件描述符以及最大线程数有要求,默认值4096和2048太小了,若无以上配置,启动过程中会报如下错误。
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[1]: max number of threads [2048] for user [elastic] is too low, increase to at least [4096]对以上的修改进行持久化,可以使用docker commit保存修改,并生成新的镜像以确保不会在重启容器后丢失所修改的内容。
[lucas-os@macbook ~]$docker commit -m "add user for running elasticsearch" -a "lucas" 32a628fe85cc centos_elasticsearch
sha256:3931ccc55a5b62683cbbd6db7961082c95c8195c843ebbb868ee6d969524e7e1
再次查看docker镜像,发现已经生成了新的镜像centos_elasticsearch,这些修改的内容已经被持久化到了这个镜像里面。
[lucas-os@macbook ~]$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_elasticsearch latest 3931ccc55a5b About a minute ago 436MB
centos 7 eeb6ee3f44bd 10 months ago 204MB
在宿主机(Mac)上创建挂载目录,并在其中创建app、data、logs目录用于存放elasticsearch安装目录,数据目录和日志目录。
[lucas-os@macbook ~]$mkdir mnt
[lucas-os@macbook ~]$cd mnt
[lucas-os@macbook ~]$mkdir app data logs
下载elasticsearch-8.1.0-linux-x86_64.tar存放在app目录下,解压缩以后创建软链接,便于后续的版本升级。
[lucas-os@macbook ~/app]$ln -s elasticsearch-8.1.0 elasticsearch
进入容器修改/mnt目录属主,便于挂载宿主机目录后elasticsearch-user使用。
[root@32a628fe85cc /]# chown -R elasticsearch-user:elasticsearch-user mnt
启动新的镜像并将宿主机目录/home/lucas-os/mnt目录挂载到容器中的目录/mnt下
[lucas-os@macbook ~/app]docker run -i -t -v /home/lucas-os/mnt:/mnt 3931ccc55a5b /bin/bash
修改Elasticsearch的配置文件elasticsearch.yml,这个配置比较简单,不过多讲解,下面是一个最简单的示例
cluster.name: student-cluster
node.name: node-1
node.attr.rack: r1
path.data: /Users/lucas-os/app/elasticsearch/data
path.logs: /Users/lucas-os/app/elasticsearch/logs
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["127.0.0.1"]
cluster.initial_master_nodes: ["node-1"]
action.destructive_requires_name: false
进入容器以后默认是root用户,需要切换到elasticsearch-user用户启动elasticsearch,使用su命令,但是会发现以下错误提示:
[root@d39110f25261 bin]#su elasticsearch-user
su: cannot open session: Permission denied
打开文件/etc/pam.d/su,注释以下内容即可
# session include system-auth
切换到elasticsearch-user用户,进入bin目录执行elasticsearch脚本启动,启动成功的话会在日志中看到以下类似的日志
[2022-07-17T15:48:15,435][INFO ][o.e.n.Node ] [node-1] started在浏览器中输入https://192.168.56.11:9200/ ,输入账号和密码,Elasticsearch默认开启了x-pack,需要输入账号和密码,在日志中可以找到默认生成的账号和密码,默认账号为elastic。
输入账号和密码以后结果返回如下,可以看到Elasticsearch集群已经成功启动,版本8.1.0。
{
"name" : "node-1",
"cluster_name" : "student-cluster",
"cluster_uuid" : "L-7AQqfmSIihTQKpenjbMA",
"version" : {
"number" : "8.1.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "3700f7679f7d95e36da0b43762189bab189bc53a",
"build_date" : "2022-03-03T14:20:00.690422633Z",
"build_snapshot" : false,
"lucene_version" : "9.0.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
使用以上的方法,每次修改以后将改动内容commit生成新的镜像就可以在Mac下通过Docker轻松部署Linux环境拉。