前言

很早以前,从开始学习编程的时候win系统上安装各种软件,配置各种环境变量,安装各大IDE,到之后学习了容器快速部署。到接触Linux系统,学会在VM等虚拟机上装Linux系统,学习Linux命令、git命令等各种相关语言。到本地开发编写代码完毕ssh连接上传Linux,Linux系统下部署上线。再到ssh连接Linux主机,win主机编程同步上传Linux系统,再到ssh连接主机完全交由云上Linux主机存储共享代码共同编辑和在Linux云服务器直接运行调试,。。。

以上是新手小白到逐渐深入的全过程。而以前还用VMvare、VBox等虚拟机,现在伴随着wsl的出现,以及旧笔记本报废,我突然想把开发环境直接迁移到wsl这种新奇的方式。

WSL基础知识和命令

WSL,win的窗口化执行Linux环境的能力。经历了WSL1=>WSL2的演变,WSL2有了真正的Linux环境(本质上也成为了虚拟机)。

安装WSL和更新WSL版本切换WSL版本可以参见官方文档

主要是如何修改Linux子系统安装的位置

wsl -l -v 列出wsl映像信息
输入 wsl --shutdown 使其停止运行,再次使用wsl -l -v确保其处于stopped状态。
wsl --export Ubuntu-22.04 D:\WSL\Ubuntu_WSL\Ubuntu.tar导出备份
wsl --unregister Ubuntu-20.04 注销原有的wsl
wsl --import Ubuntu-22.04 D:\WSL\Ubuntu_WSL D:\WSL\Ubuntu_WSL\Ubuntu.tar导入备份
wsl -d Ubuntu
这会启动名为"Ubuntu"的WSL发行版。
用户会变为root,通过Ubuntu2204 config --default-user cy
设置用户(这样做的前提是没有卸载原来的Ubuntu启动器和注册表)
还可以设置默认 Linux 发行版
wsl --set-default <Distribution Name>

不小心没有注销成功,影像vhd文件还在只能用,如何删除?

先确保停止运行,之后注销,之后磁盘管理找到它并右键分离

image-20230804110501012

之后就能删除导出的了vhd映射文件了。

WSL配置深度学习环境

碎念念

对于我这种非深度学习专业人士、不需要编译和特殊要求的人来说驱动感觉是配不配都一样,。新买的笔记本都还没配置竟然有人找我跑python代码就离谱,。

conda安装

具体步骤:

  • 安装Anaconda包管理工具,直接从官网找到Linux版本的下载链接复制,在wsl的Linux系统下通过wget命令下载,例如:

    wget https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh
    

    然后使用sh命令执行文件

    sh Anaconda3-2023.03-Linux-x86_64.sh
    

    接下来就是安装过程,只需要根据提示按回车或者输入yes即可。

    但是我需要自定义安装路径,我希望把软件都安装到/opt目录统一管理,所以在安装的过程中遇见询问安装路径时不要直接ENTER回车而是填写具体的路径,比如:/opt/anaconda3,要注意权限问题,如果没有权限实现修改文件权限所属,或者使用sudo在执行

    以下是以sudo命令运行conda安装脚本的示例:
    sudo bash Anaconda3-2023.07-2-Linux-x86_64.sh -b -p /opt/anaconda3
    上述命令中,Anaconda3-2023.07-2-Linux-x86_64.sh是你下载的conda安装脚本文件的名称,-b 参数表示安装过程不会询问任何问题,-p /opt/miniconda 参数指定了安装路径为/opt/miniconda。

  • 修改环境变量配置(自定义安装路径后需要)

    • 用户级别:打开 ~/.bashrc 文件,并修改其中的 Conda 环境变量。将旧的安装路径 /home/cy/anaconda3 修改为新的路径 /home/new_path/anaconda3。保存文件后执行以下命令使更改生效:source ~/.bashrc
    • 系统级别:则编辑/etc/profile文件
    • 用户级别会覆盖系统级别的配置
    • 修改完后使用source ~/.bashrc # 或对应的配置文件让配置文件生效
    • 验证:conda info --envs,命令是否正常
  • 通过conda创建和激活环境

    conda create --name cy310 python=3.10
    conda activate cy310
    # 还可以指定虚拟环境的安装路径,比如
    conda create --prefix /home/sj/envs/myenv python=3.8
    
  • 添加镜像源,提速下载(可以添加多条镜像源,下载按顺序访问)

    conda config --set show_channel_urls yes:这个命令用于设置 conda 显示 channel 的 URL。通过设置为 "yes",你可以在 conda 命令执行时看到正在使用的 channel URL。
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
    conda config --add channels https://mirrors.aliyun.com/anaconda/pkgs/free/
    conda config --add channels https://mirrors.aliyun.com/anaconda/pkgs/main/
    
  • 在需要的环境下安装各种深度学习库(不指定版本号默认获取可用的最新版本)

    conda install -c conda-forge librosa
    conda install -c conda-forge matplotlib
    conda install -c conda-forge numpy
    

    如果配置了多个镜像源或者需要安装特定版本,建议指定安装库的版本号避免冲突和避免代码不兼容问题

    conda install -c conda-forge librosa=0.8.1
    conda install -c conda-forge matplotlib=3.4.3
    conda install -c conda-forge numpy=1.21.2
    

    检查是否安装成功

    conda安装的话可以使用conda list命令罗列安装的库,后面加上具体的库名则只罗列具体的库,当然还可以使用查找匹配命令筛选
    在Linux/Unix/MacOS中:conda list | grep numpy
    在Windows中:conda list | findstr numpy
    

conda配置

前面我自定义了安装路径,那其他环境配置我也想动一下,比如虚拟环境路径配置。

  • 查看配置:默认是家目录下用户目录,如/home/cy/.conda/envs

    conda config --show envs_dirs
    
  • 添加自定义路径(也可以通过文件编辑修改.condarc文件)

    conda config --add envs_dirs /opt/anaconda3/envs
    可以通过conda config --remove envs_dirs dir,移除指定环境路径
    
  • 如果 /opt/anaconda3/envs 的路径在列表中靠前,那么它的优先级已经比较高。如果不是,您可以通过运行以下命令将 /opt/anaconda3/envs 移到列表的前面,从而提高优先级(之后创建环境的时候默认就会创建到优先级最高的环境目录):

    conda config --prepend envs_dirs /opt/anaconda3/envs
    
  • 检查配置是否已经更改,运行以下命令查看环境路径配置:

    conda config --show envs_dirs
    

    现在,当您使用 conda 创建虚拟环境时,系统会优先在 /opt/anaconda3/envs 路径下查找并创建环境,这可以满足您希望的优先级顺序。

其实就是把这些路径标识起来让conda能够识别并从中扫描虚拟环境。也就是说我们可以直接创建环境,然后手动移动环境目录到环境配置中的其他目录,conda依旧能够识别。


还可以设置默认的虚拟环境(conda本身不支持),利用配置文件在启动的时候启动

为了方便,直接在etc/profile文件末尾追加,以便无论是root用户还是其他普通用户都能生效。

CONDA_PATH="/opt/anaconda3/bin"
export PATH="$CONDA_PATH:$PATH"
source $CONDA_PATH/activate cy310

conda备份和卸载

简单一提:Linux上一切皆文件,但是如果觉着直接把安装文件夹迁移到某一个目录就可以的话那会哭的

1、导出环境配置以作备份
conda env export --name cy310 > environment.yaml

2、Linux 上删除 Anaconda 或 Miniconda 的步骤:

  • 删除整个 Anaconda 或 Miniconda 的安装文件夹:
    rm -rfv ~/anaconda3

  • 可选)编辑 ~/.bashrc(如果主目录下没有 .bashrc 这个文件就编辑文件 .bash_profile),删除和 Anaconda 和 Miniconda 相关的部分;

  • (可选)在用户主目录删除下列隐藏文件和文件夹:

    .condarc 文件
    .conda/ 目录
    .continuum/ 目录
    rm -rfv ~/.condarc ~/.conda ~/.continuum
    

3、重新安装

4、恢复 Conda 环境:使用以下命令创建并恢复环境(注意可能会恢复到备份前原来的目录,如果发生改变,直接mv即可)

conda env create --name cy310 --file environment.yaml

如果环境下包配置很多,可能会陷入漫长等待,。

conda常用命令

  • 创建环境:conda create -n test python=3.6

  • 激活环境:conda activate base

  • 移除环境:conda remove --name test --all

  • 查看已有环境:conda env list

  • 查看配置:

    • conda config --show
    • conda config --show envs_dirs

wsl连接开发

wsl上的环境基本配置好了,那么如何在win上的IDE连接和使用wsl中Linux子系统配置好的环境呢?

现在新版本的IDE基本上都有wsl连接的便捷服务了。

image-20230817214057809

其实我觉着python直接用vscode就够了,不过专业点的话用Pycharm,不过得专业版才有wsl便捷链接,思路也是一样的

image-20230817214632194

如此一来就能直接在“远程”的Linux系统下同步创建、编辑和运行代码了,事实上远程ssh连接云上Linux服务器的线上开发也不就是这样吗啊哈哈。IDEA也是同理操作。

WSL开启ssh服务

虽然可以直接在win的窗口命令行直接执行命令操作Linux子系统甚至可以在文件管理中直接可视化操作文件,甚至于很多新版IDE都可以直接使用wsl链接方式链接开发,。但是我们真正开发都是在云端的Linux服务器上调试和部署。故而开启wsl的ssh服务可以更接近真实开发体验,模拟通过ssh连接远程开发和部署。当然了甚至可以再设置开机自启动和远程共享网络将win系统电脑充当“Linux服务器”

WSL配置SSH服务

1.1 重装openssh-server

sudo apt remove openssh-server      # 如果已经安装了,建设先卸载 sudo apt-get remove openssh-server 
sudo apt install openssh-server # new install

1.2 修改配置信息

sudo vim /etc/ssh/sshd_config  # sshd_config is a readonly file

打开文件后,可以用搜索修改如下的信息

Port 2222                   # 监听的端口,可以是其它的(默认是22,最好改成其他避免和win上可能有的ssh服务产生端口冲突)
ListenAddress 0.0.0.0       # 0.0.0.0 表示所有的地址
PasswordAuthentication yes  # 把原来的no改成yes,意思是可以用密码登录
PermitRootLogin yes         # 把原来的prohibit-password改成yes

把上面的都改完好,就重启ssh服务

sudo service ssh restart

SSH连接

在WSL中安装和配置openssh-server后,本机可以直接通过localhost、自定义端口号以及用户名和密码直接通过远程ssh工具连接。

但是现在远程的PC,还是无法通过ssh访问WSL的。

配置端口转发和设置防火墙规则

打开WSL

ifconfig  # 查看网络配置

在这里插入图片描述

如上图所示,这里WSL的网络配置情况。一般是172开头,这个就是WSL的IP地址,我们需要装windows的端口转发到WSL。打开Power Shell (用管理员)

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=IP connectport=2222  # IP为你的WSL的IP地址

完成上面后,还需要开户防火墙入站规则

netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2222

也可以在 控制面板 --> Windows Defender 防火墙 --> 高级设置 --> 入站规则中设置

image-20230830165203044

如上设置完后,应该可以远程通常本机的IP地址访问WSL了。

注:这里的IP地址不是WSL的IP,是本机的IP,可以在Power Shell下用ipconfig查看

可能出现的错误:ssh的时候,可以用-v debug一下,看看是什么问题

如下问题:

ssh_exchange_identification: read: Connection reset by peer

这个问题可能是在修改sshd_config里配置项Port(端口号)与我们映射的不一致。重新修改后,启动ssh服务后,再尝试连接即可。

另外我们可以通过类似方法再配置端口转发到WSL

如果要增加其它端口转发到WSL,可能 过过如下命令继续添加。注意是在Power Shell

netsh interface portproxy add v4tov4 listenaddress=* listenport=80 connectaddress=IP connectport=80  protocol=tcp  # IP为你的WSL的IP地址,增加监听80端口
# 删除转换端口
netsh interface portproxy delete v4tov4 listenport=80 protocol=tcp
# 查看转发规则
netsh interface portproxy show v4tov4

如下,还可以修改WSL ip地址

# 修改WSL ip地址
netsh interface ip add address "vEthernet (WSL)" 172.24.39.1 255.255.0.0

Linux开发习惯

配置wsl,还开启SSH服务,最后都是为了尽可能还原和模拟远程Linux服务器下开发环境。

LInux目录含义

Linux系统的目录结构通常按照特定的设计原则进行了空间划分,不同目录用于不同的用途。以下是常见的Linux目录及其用途的概述:

  1. /(根目录): 根目录是整个文件系统的起始点,包含所有其他目录和文件。它通常不会占用太多空间,但存储了系统的核心文件。

  2. /bin(二进制文件): 存放系统启动和恢复时需要的二进制文件,例如Shell程序和基本的命令,如lscp等。

  3. /boot(引导文件): 包含Linux内核和引导管理器(通常是GRUB)所需的文件。这个目录存储了系统启动时所需的配置文件和内核镜像。

  4. /dev(设备文件): 包含设备文件,用于与硬件设备进行通信,例如硬盘、键盘、鼠标等。

  5. /etc(配置文件): 存放系统全局配置文件和各种应用程序的配置文件。这是系统管理员进行配置的重要目录。

  6. /home(用户主目录): 每个用户的主目录都位于这里,包括用户的个人文件和设置。

  7. /lib和/lib64(共享库): 存放系统和应用程序使用的共享库文件。/lib通常用于32位系统,而/lib64用于64位系统。

  8. /media和/mnt(可移动设备和挂载点): 这些目录用于挂载可移动设备(如USB驱动器)和其他文件系统。

  9. /opt(可选软件包): 通常包含第三方软件的安装目录,以便将它们与系统分开。

  10. /proc和/sys(虚拟文件系统): 这些目录提供了关于系统内核和运行时信息的虚拟文件。/proc包含有关进程和系统状态的信息,/sys用于与内核运行时参数进行交互。

  11. /root(超级用户主目录): 超级用户(root)的主目录。

  12. /sbin(系统二进制文件): 包含用于系统维护和管理的二进制文件,通常只有超级用户才能访问。

  13. /srv(服务数据): 存放一些系统服务的数据文件。

  14. /tmp(临时文件): 用于存放临时文件的目录,定期清理以释放磁盘空间。

  15. /usr(用户二进制文件和资源): 包含系统中大部分用户程序和资源文件,例如应用程序、库、文档等。

  16. /var(可变数据): 存放经常变化的数据,如日志文件、缓存、数据库等。

我的习惯

虽然上面的是规范,但有时候遵守适当的规范同时还可以稍作改变以便开发所需

docker配置统一管理

/mydata,是一种在Linux系统中组织容器数据的常见做法

可以在根目录下创建一个名为/mydata的目录,然后将Docker容器的挂载目录放置在其中,以便更好地组织容器数据并提高整个系统的可维护性。这可以避免在根目录下创建不必要的文件夹,同时确保数据与应用程序逻辑分开。

默认情况下,/data目录中的数据对于所有用户可能是不可访问的,因为Linux系统通常会对目录和文件设置适当的权限以确保安全性和隐私。要使/data目录中的数据对所有用户可访问,您需要设置适当的文件权限和用户组。

以下是一种方式来实现这一点:

  1. 创建/mydata目录(如果尚未创建):

    sudo mkdir /mydata
    
  2. 更改/data目录的权限,使其对所有用户可读、可写和可执行:

    sudo chmod 777 /mydata
    

    这会使目录对所有用户开放,但请注意,这可能会引入安全风险,因为任何用户都可以访问和修改该目录中的文件。

  3. 如果需要更精细的权限控制,您可以创建一个专用的用户组,并将/data目录的所有者更改为该用户组,然后为该用户组授予适当的权限。这将允许一组用户访问/data目录。

    sudo groupadd datausers
    sudo chown :datausers /mydata
    sudo chmod 770 /mydata
    

    在这个示例中,我们创建了一个名为datausers的用户组,并将/data目录的所有者更改为该组。然后,设置了770权限,这表示目录的所有者和该组的用户都具有读取、写入和执行权限,其他用户没有权限。

其实这更方便个人开发(其实home目录最方便)

从生产角度,应该放在opt或var目录下实现公共访问。

项目代码存放

/home目录

该目录是用户主目录,每个用户都有自己的主目录,可以在该目录下安装软件。这样做的好处是安装的软件只对当前用户可见,不会影响其他用户,但是需要注意的是,如果安装的软件需要超级用户权限,则需要每次以超级用户身份运行安装命令。例如/home/user/project,可以用来放置自己开发的项目代码

本地主机直接通过ssh连接远程LInux服务器的/home/user/project目录存放、编写代码,再把其他环境也装在LInux服务器上岂不美哉,。

项目部署

建议/usr/local,专门存放自己编写,运行的项目jar包、docker文件等,别忘了专门在该目录下新建一个文件夹来分门别类存放,例如:/usr/local/project/usr/localproject/docker,防止杂乱无章。

日志文件和配置文件

  1. 日志目录:考虑在服务器上为你的应用程序设置一个日志目录,用于存放应用程序的日志文件,例如 /var/log/project。这有助于方便查看和管理应用程序的日志信息。
  2. 配置文件目录:将应用程序的配置文件单独存放在一个目录中,例如 /etc/project。这样可以集中管理和备份配置文件,方便应用程序的配置管理。

脚本文件

脚本目录选择:一般来说,常见的做法是将脚本放在用户的主目录下或者一个专门用于存放脚本的目录中,具体选择取决于您的个人偏好和项目需求。

以下是一些常见的选择:

  1. 用户主目录:您可以将脚本放在当前登录用户的主目录下(通常为 /home/用户名/Users/用户名),这样方便访问和管理。例如:/home/user/start_containers.sh
  2. 自定义目录:您也可以创建一个专门用于存放脚本的目录,例如 /opt/scripts/usr/local/bin 等。这样做有助于组织和管理多个脚本文件。例如:/opt/scripts/start_containers.sh

我的建议:/usr/local/bin

确保将脚本文件设置为可执行权限,以便能够执行它。您可以使用以下命令为脚本添加执行权限:

chmod +x /path/to/start_containers.sh

当脚本位于系统的可执行路径中(例如 /usr/local/bin),您可以在任何位置直接运行脚本,而无需指定完整的路径。否则,您需要在执行脚本时指定脚本的完整路径。

小结

最后:这个没什么统一的绝对的约定,完全看公司(管理员)自己的标准.毕竟大部分应用无论安装到哪里,只要配置对,就都可以跑起来.
网上很多教程都是home一把梭的,我选择软件安装包用/opt统一管理用yum源的安装的就/usr/local,按默认位置走.

只要管理和文档跟得上,软件安装到哪里完全不是问题。重要的是配置文件和数据。

部署中间件

Note

这次在自己服务器,重新跑了一遍,回忆一下部署流程,。可改进的地方还有很多,比如:

  • 既然使用了docker部署,那么容器内部应该尽可能使用内部网络通信,避免物理主机向外暴露过多端口,这样只需要开启80,443,22等基础端口即可
  • 应该编写一份docker-compose文件和一些辅助的dockerfile文件以及.env,方便以后在任何一台主机上一键部署,而不是现在每次都跑一遍docker run命令
  • 暂时没啥时间再重跑很多服务了,而且我LInux云服务器内存快爆了,以后有空再把剩下没写的以及微服务体系补上

思考个问题

选择直接在物理机上部署?还是在docker容器部署呢?

  • 首先docker容器部署对于配置复杂尤其微服务之类来说,docker部署足够方便、灵活、迅捷。个人开发调试也足够所以我基本上选了他
  • 另一点就是docker的隔离性,可以方便解决jdk等依赖不同版本的应用启动问题。而且内部网络隔离,通过容器名内部访问,可以让外界物理机只向外开发22、80、443等端口,通过Nginx代理将请求在内部访问,更好防止外界“干扰”

但是,docker虽然方便,可像计算型,有状态的服务还是建议物理机部署尤其是线上环境,像mysql之类的其实建议物理机,性能更好释放。

对我个人,开发调试方便当然是docker了,。

当然了,其实docker、docker-compose甚至是k8s其实是为了微服务这样的大型服务进行容器编排才能更体现它的强大。

安装Docker

  • 卸载旧版本docker(可选)

    sudo apt-get remove docker-ce docker-ce-cli containerd.io
    
  • 请确保你有sudo权限来执行以下操作。

    1. 更新软件包列表:
    sudo apt update
    
    1. 安装必要的依赖包,以允许使用HTTPS通过apt安装Docker:
    sudo apt install apt-transport-https ca-certificates curl software-properties-common
    
    1. 添加Docker的官方GPG密钥:
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
    1. 添加Docker的APT存储库:
    echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    1. 更新一次软件包列表以确保Docker存储库已添加:
    sudo apt update
    
    1. 安装Docker:
    sudo apt install docker-ce docker-ce-cli containerd.io
    
    1. 安装完成后,启动Docker服务:
    sudo systemctl start docker
    
    1. 若要使Docker在系统启动时自动启动,可以运行:
    sudo systemctl enable docker
    
    1. 验证Docker是否已成功安装,可以运行以下命令,它将显示Docker的版本信息:
    docker --version
    

    现在,Docker已经成功安装在你的Ubuntu系统上,你可以开始使用它来容器化应用程序和服务。如果你需要使用docker命令而不需要sudo权限,可以将你的用户添加到docker组中:

    sudo usermod -aG docker $USER
    

    然后注销并重新登录以使更改生效。这将允许你在不使用sudo的情况下运行Docker命令。
    另外可以为Docker配置镜像源,可选的常用镜像源有:啊里、DockerProxy、网易源、百度源、腾讯源,以下是为Docke设置镜像源的一般步骤:

    1. 打开Docker配置文件:

      vim /etc/docker/daemon.json
      
    2. 如果文件为空或不存在,可以创建一个。在文件中添加以下内容,将镜像源的地址替换为你选择的镜像源地址(例如,阿里云、腾讯云等):

      {
        "registry-mirrors": [
          	"https://kidxbsby.mirror.aliyuncs.com",
              "https://dockerproxy.com",
              "https://hub-mirror.c.163.com",
              "https://mirror.baidubce.com",
              "https://ccr.ccs.tencentyun.com"
        ]
      }
      
    3. 保存并关闭文件。

    4. 重新启动Docker服务以使更改生效:

      sudo systemctl restart docker
      # 查看 Docker 信息,检查镜像源是否添加成功
      sudo docker info
      

安装Docker Compose

请确保你已经在系统中安装了 Docker,因为 Docker Compose 通常与 Docker 一起使用。

  1. 下载 Docker Compose 的二进制文件。你可以在 Docker 的官方 GitHub 存储库中找到最新的稳定版本。使用 curl 命令下载对应版本的二进制文件,例如:

    sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    请注意,这个命令会下载适用于你的操作系统的 Docker Compose 二进制文件。

  2. 赋予下载的 Docker Compose 二进制文件执行权限:

    sudo chmod +x /usr/local/bin/docker-compose
    
  3. 验证 Docker Compose 是否已成功安装:

    docker-compose --version
    

    这将显示安装的 Docker Compose 的版本信息。

现在,Docker Compose 已经成功安装在你的系统上,你可以使用它来管理多个容器组成的服务。

Portainer(可选)

Note
  • 一款docker可视化管理工具
  • 其实docker命令越用越熟练的我压根不太用的上,不过可视化界面面板管理还是挺香的,。

直接使用汉化版安装命令:

  1. 先创建目录用于挂载:
    mkdir -p /mydata/portainer
    
  2. 用的镜像是:6053537/portainer-ce
    docker run -d --restart=always --name="portainer" -p 9001:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /mydata/portainer:/data 6053537/portainer-ce
    

Elasticsearch

安装ES本体

暂时记录单体部署,后面补上集群部署

docker pull elasticsearch:7.4.2

  1. 创建挂载目录
    mkdir -p /mydata/elasticsearch/config
    mkdir -p /mydata/elasticsearch/data

  2. 写入文件,可被远程任何机器访问
    echo "http.host: 0.0.0.0" > /mydata/elasticsearch/config/elasticsearch.yml

  3. 运行,暴漏两个端口 9200 访问端口 9300 节点通信端口 单节点启动

    docker run --name elasticsearch -p 9200:9200 -p 9300:9300 --privileged=true \
      -e "discovery.type=single-node" \
      -e ES_JAVA_OPTS="-Xms64m -Xms128m" \
      -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
      -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
      -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
      -d elasticsearch:7.4.2
    

事实上,这将会启动失败,通过docker logs elasticsearch查看日志发现是无法读取挂载的目录,所以需要给挂载文件夹授予权限
否则没法启动

chmod -R 777 /mydata/elasticsearch/

然后重新启动:docker restart elasticsearch

然后设置开机自启: docker update elasticsearch --restart=always

之后通过9200端口访问

安装kibana

docker pull kibana:7.4.2
# 一定记得改成自己的虚拟机(服务器地址)
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://elasticsearch:9200 -p 5601:5601 -d kibana:7.4.2

设置开启自启动
docker update Id号 --restart=always

一定记得改成自己的虚拟机(服务器地址)

正确理解:服务器直接设为服务器地址没毛病,如果是虚拟机或者本机wsl设置成了静态ip也没毛病,但如果是动态ip的话那么每次都会变化就不好了,。

那你说本机设置成localhost行不行?——不行

因为kibana是在docker容器中运行,这个localhost指向的是kibana容器自己的ip。

对于本机来说正确的做法使用elasticsearch容器名充当host访问,正常来说这应该是没问题的了,但是有的时候docker可能犯病

为了遵守“规范”,我们需要创建一个供 Elasticsearch 和 Kibana 使用的 network。这个 network 将被用于 Elasticsearch 和 Kibana 之间的通信,然后让双方都连接到这个网络。

docker network create elastic
docker network connect elastic elasticsearch
docker network connect elastic kibana

需要等一会才能访问5601端口即可。

附:汉化

kibana 7 中官方加入了中文的选项

中文包在 /usr/share/kibana/node_modules/x-pack/plugins/translations/translations/zh-CN.json

只需要在配置文件 kibana.yml 中加入,进入容器操作。

i18n.locale: "zh-CN"

同理的,你也可以选择挂载目录,ELASTICSEARCH_HOSTS也可以在配置文件中修改,最后重启容器即可。

分词器 Ik 支持中文分词

下载zip直接解压,放到挂载的plugins文件夹下面(下载对应版本)

https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.4.2

image-20230902213406016

重启Electicsearch即可,可以去kibana的dev-tools工具测试一下

image-20230902213503979

MYSQL

  1. 拉取 MySQL Docker 镜像: 打开终端并运行以下命令,从 Docker Hub 下载 MySQL Docker 镜像:

    docker pull mysql
    
  2. 创建 MySQL 容器: 一旦镜像下载完成,您可以通过以下命令创建一个 MySQL 容器:

    docker run --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=XXX -v /mydata/mysql8:/var/lib/mysql --restart=unless-stopped -d mysql
    
    
  3. 检查 MySQL 容器是否运行: 使用以下命令检查容器是否正在运行:

    docker ps
    

如果容器正在运行,您就成功创建了一个 MySQL 容器。

  1. 连接到 MySQL 容器: 您可以使用以下命令连接到 MySQL 容器:
    docker exec -it mysql8 mysql -u root -p
    

然后输入您在第 3 步中设置的密码,即可进入 MySQL 数据库。

外部连接通过localhost将映射端口即可访问mysql容器服务

附:如果想查看Docker容器中mysql的ip可以执行命令:docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql8

顺便一提创建数据库时建议选择:(参考:MySQL几种编码格式的区别

  • 存储字符集:utf8mb4

  • 排序字符集:utf8mb4_unicode_ci

Redis

1、Redis主体安装

1、在虚拟机中新建文件夹、文件
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf

2、下载镜像
docker pull redis

3、启动并挂载
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf

4、直接进去redis客户端。
docker exec -it redis redis-cli

5、添加配置,插入下面内容
// 默认是不持久化的。在配置文件中输入appendonly yes,就可以aof持久化了。最后加上密码
// 修改完docker restart redis,docker -it redis redis-cli
vim /mydata/redis/conf/redis.conf
appendonly yes
requirepass 密码

6、保存 重启
docker restart redis

7、设置redis容器在docker启动的时候启动
docker update redis --restart=always

2、可视化工具,开源

Nginx

docker pull nginx:1.10
# 随便启动一个nginx实例,只是为了复制出配置,放到docker里作为镜像的统一配置
docker run -p 80:80 --name nginx -d nginx:1.10

cd /mydata/nginx
docker container cp nginx:/etc/nginx /mydata/nginx/nginx
# 然后在外部 /mydata/nginx/nginx 有了一堆文件——>移动下目录
mv /mydata/nginx/nginx /mydata/nginx/conf
# 停掉nginx
docker stop nginx
docker rm nginx

# 创建新的nginx
docker run -p 80:80 -p 443:443 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10

# 注意一下这个路径映射到了/usr/share/nginx/html,我们在nginx配置文件中是写/usr/share/nginx/html,不是写/mydata/nginx/html

docker update nginx --restart=always

# 测试Nginx是否成功
cd /mydata/nginx/html/
vim index.html
#随便写写,测试 http://192.168.56.10:80

RabbitMQ

Docker安装RabbitMQ

docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 \
-p 4369:4369  -p 25672:25672 -p 15671:15671 -p 15672:15672 \
rabbitmq:management

说明:

  • 4369,25672 (Erlang发现&集群端口)
  • 5672,5671(AMQP端口)
  • 15672(web管理后台端口)
  • 61613,61614(STOMP协议端口)
  • 1883,8883(MQTT协议端口)

设置开机自启动:

docker update rabbitmq --restart=always

访问管理页面:host:15672;账号:guest 密码: guest
另外配置常用的延时插件:可参考RabbitMQ 安装延迟队列插件实现延时消息_闪耀的瞬间的博客-CSDN博客

# 拷贝插件
docker cp /rabbitmq_delayed_message_exchange-3.8.0.ez 982b190bf852:/plugins
# 进入容器并启动插件
docker exec -it rabbitmq /bin/bash
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
# 重启
docker restart rabbitmq

注意插件的版本号要和RabbitMQ保持版本对应。

img

RocketMQ 4.5.1

安装 NameServer

docker run -d -p 9876:9876 --name rmqnamesrv foxiswho/rocketmq:server-4.5.1

安装 Brocker。

1)新建配置目录。

mkdir -p /mydata/rocketmq/conf

2)新建配置文件 broker.conf

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 此处为本地ip, 如果部署服务器, 需要填写服务器外网ip
brokerIP1 = xx.xx.xx.xx

3)创建容器。

docker run -d \
-p 10911:10911 \
-p 10909:10909 \
--name rmqbroker \
--link rmqnamesrv:namesrv \
-v /mydata/rocketmq/conf/broker.conf:/etc/rocketmq/broker.conf \
-e "NAMESRV_ADDR=namesrv:9876" \
-e "JAVA_OPTS=-Duser.home=/opt" \
-e "JAVA_OPT_EXT=-server -Xms512m -Xmx512m" \
foxiswho/rocketmq:broker-4.5.1

安装 rocketmq 控制台。

docker pull pangliang/rocketmq-console-ng
docker run -d \
--link rmqnamesrv:namesrv \
-e "JAVA_OPTS=-Drocketmq.config.namesrvAddr=namesrv:9876 -Drocketmq.config.isVIPChannel=false" \
--name rmqconsole \
-p 8088:8080 \
-t pangliang/rocketmq-console-ng

运行成功,稍等几秒启动时间,浏览器输入 localhost:8088 查看。

上面涉及到了-link、-e、-i-t(一般合起来-it)等我很少用到的docker选项,需要再好好复习捏,可参考:如何正确使用docker run -i -t -d 参数 - iiiiiiiivan - 博客园 (cnblogs.com)

Nacos 2.1.2

通过简易版方式安装,

docker run \
-d -p 8848:8848 \
-p 9848:9848 \
--name nacos2 \
-e MODE=standalone \
-e TIME_ZONE='Asia/Shanghai' \
nacos/nacos-server:v2.1.2

运行成功,稍等几秒启动时间,浏览器输入 http://localhost:8848/nacos/index.html 查看控制台。

MinIo

部署上线

  • 项目打成jar包,再通过dockerfile、docker-compose文件一键构建镜像和部署,手动执行sh脚本
  • 结合Git同步的工作流:
    • 上传代码相关文件至GitHub等托管平台
    • Linux编写sh脚本周期pull拉取git仓库最新代码比较,更新则自动通过docker-compose文件重新自动部署

默认启动账户

默认是以普通用户也就是安装启动时创建的用户登录

这对我们来说很麻烦,我们希望直接以root启动

在原来的启动命令中加上-u root即可

image-20240216122746770

但其实更多是使用WindTerm这样的工具通过ssh连接wsl

WSL覆盖本机服务问题(优先级似乎比较高)

WSL中已经启动了一个Nginx,默认80端口已经被他占用了

即便通过vscode启动了前端项目(没显示报错)

其实我们直接在浏览器访问的时候其实已经被覆盖掉了,我们访问的是wsl中的Nginx容器