本机运行Nacos容器每次都要重新创建容器,该怎么办?

    Estimated reading time: 4 minutes

    背景是这样的,本机通过Docker 容器运行Nacos,我这里使用docker -e 来设置环境变量,来给容器传递参数。命令如下:

    docker run \
    --name nacos-server \
    -p 8848:8848 \
    -p 9848:9848 \
    -p 9849:9849 \
    -e MODE=standalone \
    -e SPRING_DATASOURCE_PLATFORM=mysql \
    -e MYSQL_SERVICE_HOST=xxx.xx.xxx.xx \
    -e MYSQL_SERVICE_PORT=3306 \
    -e MYSQL_SERVICE_USER=xxxx \
    -e MYSQL_SERVICE_PASSWORD=xxxx \
    -e MYSQL_SERVICE_DB_NAME=nacos \
    -e TIME_ZONE='Asia/Shanghai' \
    -v /Users/zhw/myDevelop/nacos2/logs:/home/nacos/logs \
    -v /Users/zhw/myDevelop/nacos2/data:/home/nacos/data \
    -d nacos/nacos-server:v2.1.2-slim

    但是,我在公司正常运行但是回家后启动容器时,却会发生Nacos无法启动成功的问题,日志显示的如此眼熟,Nacos初次使用时经常遇到的无法连接数据库的异常又出现了。数据库为什么会连不上呢?

    经过排查是 MYSQL_SERVICE_HOST 地址不对的问题,因为我的本机IP变了,因为使用公司网络和使用家中WIFI网络的本机IP是不一样的。

    我的Mysql数据库是在本机安装的,Docker容器运行Nacos使用宿主机IP连接Mysql数据库,宿主机IP发生变化了,容器自然连不上了。

    果然,删掉容器,将MYSQL_SERVICE_HOST 改为家中的本机IP后重新执行docker run ... 命令,容器Nacos正常启动,可以访问了。


    每次电脑换个网络连接,想启动容器还要修改连接数据库的IP地址,重新执行创建容器的命令,这太不优雅了,怎么办呢?

    我们在终端通过mysql命令连接数据库命令是mysql -h -u 这里的-h 就是指hostname,思路来了,何不在docker run命令中使用hostname 作为数据库连接地址参数呢。主机名可以自定义,而且不会随着电脑连接网络的变化而变化。

    立马尝试一下,分四步:

    1. 设置主机名
    2. 配置hosts文件IP映射
    3. 使用这个主机名创建Mysql连接账号并权限
    4. 修改 docker run 命令,数据库地址环境变量参数使用使用主机名
    5. docker run 启动,成功访问

    首先在终端命令查询本机的hostname是什么?如果没有就设置主机名

    获取主机名,发现没有设置

    scutil --get HostName
    not set

    设置主机名

    sudo scutil --set HostName bruce.local.mac

    获取主机名,成功返回刚刚设置的主机名

    scutil --get HostName
    bruce.local.mac

    在hosts文件设置 bruce.local.mac 映射到本机IP,ping 一下主机名,有数据返回,没有问题

    ping bruce.local.mac

    然后就要创建Mysql 用户名以及对应权限了。

    创建数据库用户

    CREATE USER nacos@'bruce.local.mac' IDENTIFIED BY 'nacos';

    授权

    grant all privileges on nacos.* to nacos@'bruce.local.mac';

    测试连接,成功连接

    mysql -u nacos -h bruce.local.mac -p

    修改 docker run 命令如下

    docker run \
    --name nacos-server \
    -p 8848:8848 \
    -p 9848:9848 \
    -p 9849:9849 \
    -e MODE=standalone \
    -e SPRING_DATASOURCE_PLATFORM=mysql \
    -e MYSQL_SERVICE_HOST=bruce.local.mac \
    -e MYSQL_SERVICE_PORT=3306 \
    -e MYSQL_SERVICE_USER=nacos \
    -e MYSQL_SERVICE_PASSWORD=nacos \
    -e MYSQL_SERVICE_DB_NAME=nacos \
    -e TIME_ZONE='Asia/Shanghai' \
    -v /Users/zhw/myDevelop/nacos2/logs:/home/nacos/logs \
    -v /Users/zhw/myDevelop/nacos2/data:/home/nacos/data \
    -d nacos/nacos-server:v2.1.2-slim

    执行docker run命令成功启动。

    这样下次电脑连接其他网络时,启动容器只需要docker start 就好了,不需要重新docker run 创建容器。