通过docker-compose配置文件volumes参数
docker-compose.yml文件:
配置文件示例:
volumes:
- /var/run/:/host/var/run/
- /channel-artifacts:/var/hyperledger/configs
- /data/logs:/tmp/logs/
把容器中/tmp/logs目录映射到宿主机根据目录下的/data/logs目录下。这两个目录会共享数据。
当使用命名卷并检查它时,它的工作方式与预期类似。
在docker部署nacos的时候遇到了这个样子的问题No route to host 导致了nacos容器无法连接宿主机的docker数据库。
然后我就进入到了nacos容器里面,ping了宿主机的地址,结果是通着的,然后使用telnet测试了3306端口,结果也会报出这个异常。
原因是什么呢?明明数据库外部可以正常连接访问,但是宿主机内部容器确实无法访问?
二. 原因分析
在进行docker部署的时候我们采用的是bridge网桥的模式。
启动docker时,docker进程会创建一个名为docker0的虚拟网桥,用于宿主机与容器之间的通信。当启动一个docker容器时,docker容器将会附加到虚拟网桥上,容器内的报文通过docker0向外转发。
如果docker容器访问宿主机,那么docker0网桥将报文直接转发到本机,报文的源地址是docker0网段的地址。而如果docker容器访问宿主机以外的机器,docker的SNAT网桥会将报文的源地址转换为宿主机的地址,通过宿主机的网卡向外发送。
因此,当docker容器访问宿主机时,如果宿主机服务端口会被防火墙拦截,从而无法连通宿主机,出现No route to host的错误。
而访问宿主机所在局域网内的其他机器,由于报文的源地址是宿主机ip,因此,不会被目的机器防火墙拦截,所以可以访问。
三. 解决方案
1> 关闭宿主机的防火墙
systemctl stop firewalld
2> 在防火墙上开发指定的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=3307/tcp --permanent
firewall-cmd --reload
注:在进行完防火墙的操作之后最好是要进行以下docker的重启,systemctl restart docker,否则容器到因为虚拟网桥失效而导致的iptables failed问题
四. 小结
docker的容器网络连接一直是一个问题,容器与容器之间,容器与宿主机之间,容器跨主机访问,所以在涉及到容器的网络连接的时候要注意网络的问题。
前言:
Nacos(注册中心)是通过 【 IP+PORT】 的形式调用其他服务。
问题:
Docker容器使用虚拟IP, 当Docker中的服务A,向Nacos注册的时候,Nacos获取到了Docker的内部IP, 导致另外一个服务B,想通过注册中心调用服务A, 但由于服务B从nacos注册中心获取到的是服务A的内部IP,这样导致了两个处于公网的微服务之间,无法互相访问!
解决办法:
将Docker中的服务网络配置与宿主机共用同一个IP, 此时服务向nacos注册的时候,nacos将会获取到宿主机的公网IP, 所以问题迎刃而解。
我的docker是使用docker-compose来启动的,具体配置如下:
version: '3'
services:
iap-system:
build:
context: ./
dockerfile: Dockerfile-system
restart: always
ports:
- 19002:19002
container_name: iap-system
hostname: iap-system
image: iap-system
network_mode: "host" # 与宿主机共有一个IP
当然,配置了上述网络类型后, nacos是可以拿到宿主机的IP, 但是此时拿到的是宿主机的内网IP, 解决办法如下:
spring:
cloud:
inetutils:
ignored-interfaces: eth.* # 忽略网卡,eth.*,正则表达式
preferred-networks: ${discovery.server-ip} # 选择符合前缀的IP作为服务注册IP, discovery.server-ip就是你的公网IP
解释:
启动 Docker的时候,用 --network 参数,可以指定网络类型
--network host
host: 主机网络使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。 例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。
结果:
Nacos注册中心获取到宿主机IP, 微服务之间调用成功!
如有帮助,请赞赏鼓励!
可以使用以下两种方式:
1、如果docker网络采用的是主机模式即--network=host,那么这时候注册就是宿主机的ip。
2、nacos服务发现时添加ip即可。spring:
cloud:
nacos:
discovery:
ip: ${HOST:10.128.1.122}
1.修改配置文件
#编辑docker配置文件
vim /etc/docker/daemon.json
#配置文件内容:graph代表docker指定的安装目录
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"graph":"/opt/docker"
}
2.然后开始安装docker
#安装yum工具
yum install yum-utils -y
#配置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker
yum install -y docker-ce-19.03.9 docker-ce-cli-19.03.9 containerd.io
#加载镜像:
systemctl daemon-reload
#启动docker并且设置开机启动
systemctl enable docker && systemctl start docker
3.启动docker后观察docker的安装目录已经ok了。
二、第二种方式:使用软连接的方式
1.首先安装docker
#安装yum工具
yum install yum-utils -y
#配置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker
yum install -y docker-ce-19.03.9 docker-ce-cli-19.03.9 containerd.io
#加载镜像加速站点:
systemctl daemon-reload
#启动docker并且设置开机启动
systemctl enable docker && systemctl start docker
默认的安装目录应该是: /var/lib/docker 。
为了完全确定,可以使用以下的命令查询真正的安装路径:
sudo docker info | grep "Docker Root Dir"
#将docker安装目录移动到/opt/docker
mv /var/lib/docker /opt/docker
#创建软连接
ln -s /opt/docker /var/lib/docker
#最后启动docker
systemctl start docker
2.查看/var/lib/docker目录大小,大小为0kb
#进入目录
cd /var/lib/docker
#查看当前目录大小,0kb
du -sh
以上就是两种docker指定安装目录的姿势。
但是,运行 CentOS 7 的服务器不会受到影响。他们与 RHEL 7 生命周期并行更新。RHEL 7 将在 2024 年结束其最后一个维护周期。
但是,如果您使用的是 CentOS 8,那么 2022 年有哪些替代方案?不幸的是,即使您找到了,服务器应用程序迁移也将是另一个挑战。然而,这里有一些选项可以在 2022 年取代 CentOS。
CentOS 8 Linux 的最佳替代品
1、Ubuntu/Debian
当然,每当我们谈论替代 CentOS 的服务器操作系统替代品时,Ubuntu LTS 版本将是第一选择。此外,Ubuntu OS 的使用和处理比 CentOS 容易得多,至少对我来说是这样。APT 包管理器以相当快的方式安装包。
另一方面,Ubuntu 拥有庞大的社区,提供在线教程和指南,用户可以在这些社区的帮助下自行解决各种问题和障碍,同时在 Ubuntu 或 Debian 上设置基于服务器的应用程序。
Ubuntu 当前长期支持的版本是 22.04 LTS,开发人员将在公共支持下支持到 2025 年,如果您想将其进一步扩展到 2030 年,则可以使用付费选项。
Ubuntu 每两年发布一个 LTS 版本,而标准版本是每六个月发布一次,支持期限为九个月。
2、Oracle linux
与具有 RPM 包管理的 CentOS 8 Linux 最接近的替代选项是 Oracle Enterprise。它也是免费和开源的,但为了获得支持,用户必须付费,否则,其余的一切都可以像 CentOS 一样免费使用。Oracle Linux 是从 RHEL 的源代码编译而来的,因此可以说它是 Red Hat Linux 的克隆,并且还提供了早期的安全更新。作为一个类似的基础,用户可以毫不费力地将他们的应用程序从 CentOS 8 迁移到 Oracle Linux 上的最新版本。
3、OpenSUSE
OpenSUSE 是一个一直被低估的多功能 Linux 操作系统,其中一个原因是与 Ubuntu 和 CentOS 相比,社区不那么广泛,以及在线教程和指南数量。它由 SUSE Software Solutions Germany GmbH 提供支持。默认情况下,OpenSUSE 使用 Delta RPM 和 ZYpp 包管理作为 SUSE 上的命令行包管理器。
它带有三个包管理工具,ZYpp 作为标准命令行工具,YaST 用于前端,RPM 用于更底层。
OpenSUSE 的次要版本每 12 个月发布一次,而主要版本大约在36-48 个月之后发布,这个发布周期类似于 Ubuntu。
4、AlmaLinux – CloudLinux 操作系统
基于 CentOS 操作系统且主要由托管服务提供商或 VPS 用户使用的 CloudLinux 操作系统宣布:
我们计划发布一个免费的、开源的、社区驱动的、1:1 二进制兼容的 RHEL® 8 分支(以及未来的版本)……我们将创建一个独立的、完全免费的、完全兼容二进制的操作系统使用 RHEL® 8(和未来版本)。我们将赞助此类操作系统的开发和维护。我们将努力建立一个围绕操作系统的社区,由社区成员组成管理委员会。
尽管如此,使用基于 CentOS 8 Linux 托管解决方案的 CloudLinux 的用户不必担心,因为他们将在 2029 年之前获得稳定且经过良好测试的更新。
5、Rocky Linux
在 RedHat 宣布放弃 CentOS 8 LTS 版本之后,立即有消息称 CentOS 的联合创始人 Gregory Kurtzer 将推出另一个基于 RHEL 软件包的 Linux 分支,称为“ Rocky Linux”,就像他对 CentOS 所做的那样。我希望这一次他不会像之前那样把同样的东西卖给 RedHat 或 IBM。Rocky Linux 是一种开源企业操作系统,旨在与 Red Hat Enterprise Linux 100% 兼容。
Rocky Linux 通过定期更新和 10 年的支持生命周期提供稳定的稳定性,所有这些都是免费的。
社区支持: 社区、赞助商和合作伙伴已投入长期承诺,以确保项目留在社区中。
轻松迁移: 毫不费力地从其他 Enterprise Linux 发行版迁移。我们免费提供易于使用的迁移脚本。
6、VzLinux
Virtuozzo 仅在内部使用 VzLinux 作为容器和虚拟机的客户操作系统。因此,由于它不是从外部分发的,因此这就是我们从未听说过 VzLinux 的原因。它也是基于 RedHat 的 Linux,如 Alma 和 Rocky Linux。
VzLinux 是一个免费的多用途发行版,经过优化,可在裸机服务器、虚拟机或容器上运行。它旨在支持密集的企业级应用程序和工作负载。Virtuozzo 已经准备好从 CentOS 迁移过程“无需停机”的发行版,并且它以 RHEL 的更新速度以及与 CentOS 相比的速度而自豪。
有兴趣试用 VzLinux ISO 的人可以访问Virtuozzo 提供的 VzLinux 官方下载页面或 repo。
7、Springdale Linux
Springdale Linux 以前称为 PUIAS Linux 是另一种 Linux 操作系统。它是由可用于 Red Hat Enterprise Linux 的源代码包构建的。除了官方的上游包,它还提供了其他几个附加包的存储库。该版本由美国高等研究院和普林斯顿大学维护。
作为管理员,您可以在您的服务器或桌面上试用它,更新不会像 CentOS 一样成为问题,它也依赖于其上游 RHEL Linux。需要注意的是,这个项目比 CentOS 更老。
总结
如果您使用的是 Amazon Cloud,那么 Amazon Linux 就在那里,而 GCP 提供了所有主要选项。另一方面,CentOS 7直到2024年才会到期,因此无需急于寻找和切换到 CentOS 替代品,尤其是服务器。当然,在 4 年内我们也将有更多可靠和稳定的选择来替代 CentOS 7,直到现在,使用 CentOS 6 的用户仍然可以考虑采用 Ubuntu、Debian、Oracle 或 OpenSUSE。尽管如此,没有什么大问题的桌面用户可以简单地将 CentOS 8 Linux 存储库迁移到 CentOS Stream 以进行定期更新。
1、将excel数据导入数据库中;
2、利用uuid生成的32随机数作主键;
3、利用CURRENT_TIMESTAMP()生成时间;
具体操作
1、根据需要创建表结构
2、将excel数据导入刚创建的表中
注意: 为了能够将excel中的数据导入数据库中,创建数据库表时,暂时将主键去掉,只保留主键字段。
3、在id中生成uuid
UPDATE 表名 SET 列名= UUID();
注意:生成id时,不要直接将uuid()产生的序列中的’’-“通过Replace方法去掉,不然生成的id的将全部相同。
4、将生成的id中的”-"替换掉
UPDATE 表名 SET 列名 = (SELECT REPLACE(对应列名,'-',''));
5、生成时间
UPDATE 表名 SET 列名1 = CURRENT_TIMESTAMP();
当我们安装了redis服务后,发现在其配置文件redis.windows.conf(或redis.conf)设置了密码:requirepass ******
但是打开redis-cli.exe后输入命令config get requirepass发现:
这说明配置文件中密码设置后没有生效。
原因:问题在于我们启动redis服务时是直接在其安装目录中双击redis-server.exe启动的,这样启动的结果是,配置文件不会指定,此时redis并不会自动使用安装目录下的redis.windows.conf(或redis.conf)文件
红线框住的的提示说的很明确“ Warning: no config file specified”没有指定配置文件
解决方法:
法1:实际上我们直接在安装目录中启动redis服务时错误的,正确的方式是打开“运行”,键入“cmd”切到安装目录后输出redis-server.exe redis.windows.conf,回车,就可以了。
法2:在redis安装目录下新建文件startup.bat后,右击“编辑”,或者先用记事本建立该文件,再把扩展名改一下,文件里面写上:redis-server.exe redis.windows.conf。保存,以后再运行就直接运行这个文件,不要再直接运行redis-server.exe了,就可以了。
2、原因:后台传过去的json数据用了阿里的fastjson转换,但是解析list中引用的数据时,jvm会自动将其处理为“循环引用”,因此,也就出现了问题{" r e f " : " ref":" ref":".data[0].children[0]"},数据以引用的方式传给前台,前台却无法解析到那段引用的数据。
循环引用就是:当一个对象包含另一个对象时,fastjson就会把该对象解析成引用。
二、解决方案
JSON.toJSONString(list,SerializerFeature.DisableCircularReferenceDetect)
用这种转换方式,把list替换成你要转换的数据就可以了。