前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >尝试了数种方法,我坚信使用Docker在Mac上构建Linux环境是最靠谱的

尝试了数种方法,我坚信使用Docker在Mac上构建Linux环境是最靠谱的

作者头像
MCNU云原生
发布2023-02-22 10:18:35
5.2K0
发布2023-02-22 10:18:35
举报
文章被收录于专栏:MCNU云原生

我的工作环境一直是Mac,Mac用于办公和程序开发的体验个人觉得是非常酷的。最近一直研究Elasticsearch,在Mac上搭建了Elasticsearch集群,搭建的过程中就发现了各种配置由于环境的不一致差别较大。我一直希望在安装部署软件的时候能够像在真实生产环境一样配置,这对于掌握实际的生产环境运维、分析能力非常重要,而生产环境目前大多数还是Linux系统。

于是我开始了我的捣鼓之路了~

一、Macbook安装Elasticsearch

Elasticsearch的安装和配置是支持Mac系统的,下载适配Mac的安装包即可,但是在我安装的过程中就发现了配置上存在不少与在Linux下的生产环境的配置都不一样的地方,虽然说最终也能运行,但是总是觉得差了一些。我碰到的差异点例如:

  1. Linux下需要修改/etc/security/limits.conf配置文件,配置文件描述符和最大线程数限制,而Mac系统却没有这个配置文件。
  2. Linux下打开/etc/sysctl.conf配置文件,修改vm.max_map_count以适配Elasticsearch对于虚拟内存空间的要求,Mac系统下没有这个配置文件。
  3. Linux需要修改相关配置以支持memory lock,Mac系统也不支持。

经过一番倒腾和资料查找,以上问题都没很好解决,我又尝试了其他的一些软件,也多多少少会有这些问题或者其他兼容性问题,于是我熄了在Mac上搭建相关软件的心。

二、安装双系统

因为之前有过在Windows下安装过Ubuntu双系统的经验,我自然而然考虑在Mac下安装双系统。原以为可以使用Mac自带的“启动转换助理”实现,结果发现这货只支持Windows!

还是乖乖使用U盘制作安装盘的方式,主要经历了以下环节:

  1. 制作Ubuntu镜像
  2. 进行磁盘分区
  3. 启动安装,开机按着Option键,选择EFI进行安装
  4. 开始愉快地使用(安装Elasticsearch玩得不亦乐乎)

快乐总是短暂的,在使用了一段时间以后开始发现问题了:

  1. 网络不太稳定
  2. 输入法有时候不太灵,可能是版本问题
  3. Macbook的存储空间太小,双系统分区以后空间不足
  4. Linux下办公需求无法满足,例如企业微信的使用等

整体来说能满足开发的需要,但是办公还是不太方便,效率太低,于是我在想能不能使用虚拟机呢?

三、安装虚拟机

以前使用过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安装Centos

容器是另外一种轻量级的虚拟化方案,所以这时候又想起了大名鼎鼎的Docker。能不能使用Docker安装Linux来搭建部署运行环境呢?想到就开始做。

1.安装docker

下载适配Mac系统的Docker安装包Docker.dmg,下载地址:https://docs.docker.com/desktop/install/mac-install/, 安装docker。

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

还可以通过命令行查看docker的版本

代码语言:javascript
复制
[lucas-os@macbook ~]$docker --version
Docker version 20.10.17, build 100c701

通过命令行查看docker的相关信息信息,看到这些信息代表docker已经成功安装了。

代码语言:javascript
复制
[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
2.拉取Centos 7镜像

注册dockerhub账号,在docker desktop上登陆,使用以下命令拉取Centos 7的镜像。

代码语言:javascript
复制
[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镜像

代码语言:javascript
复制
[lucas-os@macbook ~]$docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       7         eeb6ee3f44bd   10 months ago   204MB

可以看到镜像大小为204MB,镜像ID为"eeb6ee3f44bd",也可以从Docker GUI客户端查看:

3.启动Centos容器

使用以下命令,可以启动centos镜像,生成一个centos 7运行容器

代码语言:javascript
复制
[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命令可以查看容器

代码语言:javascript
复制
[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页面查看当前的容器

4.修改环境信息

我们希望通过Docker容器进行部署环境配置,那么就要求我们的改动必须能够持久化,而不是一旦重启容器就丢失改动。下面以安装Elasticsearch为例,讲解如何进行改动内容的持久化。

添加运行elasticsearch的用户

代码语言:javascript
复制
[root@32a628fe85cc /]# useradd elasticsearch-user
[root@32a628fe85cc /]# passwd elasticsearch-user
Changing password for user elasticsearch-user.

为了方便后续的配置文件编辑,安装vim

代码语言:javascript
复制
[root@32a628fe85cc /]$yum install vim

修改文件描述符和最大线程数限制

切换到root用户,修改/etc/security/limits.conf配置文件,添加以下内容并保存。

代码语言:javascript
复制
* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096
* soft memlock unlimited
* hard memlock unlimited

以上的配置是因为Elasticsearch的运行对最大的文件描述符以及最大线程数有要求,默认值4096和2048太小了,若无以上配置,启动过程中会报如下错误。

代码语言:javascript
复制
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]
5.持久化修改

对以上的修改进行持久化,可以使用docker commit保存修改,并生成新的镜像以确保不会在重启容器后丢失所修改的内容。

代码语言:javascript
复制
[lucas-os@macbook ~]$docker commit -m "add user for running elasticsearch" -a "lucas" 32a628fe85cc centos_elasticsearch
sha256:3931ccc55a5b62683cbbd6db7961082c95c8195c843ebbb868ee6d969524e7e1

再次查看docker镜像,发现已经生成了新的镜像centos_elasticsearch,这些修改的内容已经被持久化到了这个镜像里面。

代码语言:javascript
复制
[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
6.部署Elasticsearch

在宿主机(Mac)上创建挂载目录,并在其中创建app、data、logs目录用于存放elasticsearch安装目录,数据目录和日志目录。

代码语言:javascript
复制
[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目录下,解压缩以后创建软链接,便于后续的版本升级。

代码语言:javascript
复制
[lucas-os@macbook ~/app]$ln -s elasticsearch-8.1.0 elasticsearch

进入容器修改/mnt目录属主,便于挂载宿主机目录后elasticsearch-user使用。

代码语言:javascript
复制
[root@32a628fe85cc /]# chown -R elasticsearch-user:elasticsearch-user mnt

启动新的镜像并将宿主机目录/home/lucas-os/mnt目录挂载到容器中的目录/mnt下

代码语言:javascript
复制
[lucas-os@macbook ~/app]docker run -i -t -v /home/lucas-os/mnt:/mnt 3931ccc55a5b /bin/bash

修改Elasticsearch的配置文件elasticsearch.yml,这个配置比较简单,不过多讲解,下面是一个最简单的示例

代码语言:javascript
复制
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命令,但是会发现以下错误提示:

代码语言:javascript
复制
[root@d39110f25261 bin]#su elasticsearch-user
su: cannot open session: Permission denied

打开文件/etc/pam.d/su,注释以下内容即可

代码语言:javascript
复制
# session  include  system-auth

切换到elasticsearch-user用户,进入bin目录执行elasticsearch脚本启动,启动成功的话会在日志中看到以下类似的日志

代码语言:javascript
复制
[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。

代码语言:javascript
复制
{
  "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环境拉。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MCNU云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Macbook安装Elasticsearch
  • 二、安装双系统
  • 三、安装虚拟机
  • 四、使用Docker安装Centos
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档