在Mac上使用Docker部署Db2 Developer-C Edition遇到的问题
我来帮你逐个解决遇到的这两个问题,都是DB2开发版容器在Mac环境下常见的小坑:
问题1:Mac主机无法连接容器内的DB2数据库
你的连接失败主要是端口映射配置不对加上Mac Docker的网络特性导致的,按以下步骤排查:
修正端口映射规则
你原来的docker run命令里-p 50000是只指定了容器端口,主机端会随机分配一个端口,这就导致你用50000端口连接肯定失败。重新创建容器时,要明确把主机端口和容器端口绑定:docker run -h db2server_myDb \ --name db2server \ --restart=always \ --detach \ --privileged=true \ -p 50000:50000 \ # 这里改成「主机端口:容器端口」的绑定格式 --env-file .env_list \ -v docker_volume:/database \ store/ibmcorp/db2_developer_c:11.1.2.2如果不想重新创建容器,可以先执行
docker port db2server 50000查看当前主机映射的随机端口(比如输出0.0.0.0:32768),然后用这个端口连接。确认DB2允许远程连接
进入容器切换到db2inst1用户,检查并修改DB2的监听配置:docker exec -ti db2server bash -c "su db2inst1" # 检查当前服务名配置 db2 get dbm cfg | grep SVCENAME # 如果SVCENAME不是50000,更新配置 db2 update dbm cfg using SVCENAME 50000 # 重启DB2使配置生效 db2stop db2start使用正确的连接地址
在Mac上连接时,不要用172.17.0.1(这是Linux Docker的网关地址),直接用localhost或者你的Mac本机IP,端口用50000(或者上面查到的随机端口),用户名db2inst1、密码password、数据库testdb即可。
问题2:容器停止后无法重启
从日志看,核心错误是mkdir: cannot create directory '/var/log/supervisor': File exists,这是容器启动脚本里的supervisor初始化逻辑有问题,按以下方法修复:
尝试无交互启动容器
先停止容器,然后不用-ia参数启动:docker stop db2server docker start db2server # 实时查看启动日志 docker logs -f db2server很多时候
-ia参数会干扰supervisor的后台启动逻辑,无交互启动可能正常。手动修复supervisor的残留文件
如果还是启动失败,先进入容器(如果能进入的话):docker exec -ti db2server bash # 删除supervisor的无效socket文件和日志目录的锁文件 rm -rf /var/run/supervisor.sock rm -rf /var/log/supervisor/* # 重启supervisor服务 supervisord -c /etc/supervisor/supervisord.conf然后退出容器,再执行
docker restart db2server试试。修改启动脚本避免目录创建报错
容器的启动脚本可能用了mkdir /var/log/supervisor而不是mkdir -p,导致目录存在时报错。进入容器找到启动脚本(通常是/usr/local/bin/start_db2),找到对应的mkdir命令,改成:mkdir -p /var/log/supervisor保存后退出容器,重启即可。
检查挂载目录的权限
挂载的docker_volume目录权限可能不对,导致DB2启动时无法读写配置:docker exec -ti db2server chown -R db2inst1:db2iadm1 /database改完权限后重启容器。
内容的提问来源于stack exchange,提问作者nacho4d

