docker 启动 oracle容器报1521: bind: address already in use错误的解决

AgenticCoding·十二月创作之星挑战赛 10w+人浏览 463人参与

docker start oracle19c
Error: unable to start container "113bf6abbd5961b60fcc7cee23eae34e7e29631a0e0dd3b721487b559e3dc423": cannot listen on the TCP port: listen tcp4 :1521: bind: address already in use

参考文章解决docker服务端口占用问题,bind:Address already in use介绍的步骤。
用docker ps查看运行中的进程,发现有一个oracle12c的容器正在运行中,将其停止,再启动oracle19c容器就不报错了。

docker ps
CONTAINER ID  IMAGE                                                                       COMMAND     CREATED     STATUS            PORTS                                                                                                   NAMES
03796669a3be  registry.cn-hangzhou.aliyuncs.com/lhrbest/oracle_12cr2_ee_lhr_12.2.0.1:2.0  init        2 days ago  Up 5 minutes ago  0.0.0.0:5522->22/tcp, 0.0.0.0:1521->1521/tcp, 0.0.0.0:3389->3389/tcp, 0.0.0.0:5500-5501->5500-5501/tcp  oracle12c
docker stop 03796669a3be
03796669a3be
docker start oracle19c
oracle19c
docker exec -it oracle19c /bin/bash
[oracle@113bf6abbd59 ~]$ cd /par
[oracle@113bf6abbd59 par]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Dec 23 14:06:07 2025
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

为什么我没有启动oracle12c的容器,它却在后台运行?这就要追溯到当时运行它的命令行, 有个restart=always选项导致启动Docker,它就自动启动了。

docker run -itd --name oracle12c  \
--privileged=true \
--restart=always \

AI对这个选项给出的说明如下

Docker --restart=always 参数

在 Docker 中,--restart=always 参数用于确保容器在退出时总是重新启动。无论容器是因为故障退出还是 Docker 守护进程重启,该参数都能保证容器自动重启。这对于生产环境中的关键应用非常重要,因为它能确保应用的持续运行。

使用示例

启动容器时添加 --restart=always 参数

在启动容器时,可以通过添加 --restart=always 参数来确保容器在退出时自动重启。例如:

docker run -d --restart=always tomcat

此命令将启动一个 Tomcat 容器,并确保它在退出时自动重启。

修改已创建的容器

如果容器在创建时没有添加 --restart=always 参数,可以使用以下命令进行修改:

docker container update --restart=always 容器名字

例如:

docker container update --restart=always my_container

此命令将更新容器的重启策略,使其在退出时自动重启。

配置文件修改

除了使用命令行参数,还可以通过修改容器的配置文件来设置重启策略。首先需要停止容器,然后编辑 /var/lib/docker/containers/容器ID/hostconfig.json 文件,将 RestartPolicy 修改为 always。

"RestartPolicy": {
"Name": "always",
"MaximumRetryCount": 0
}

修改完成后,重新启动容器即可生效。



使用 --restart=always 参数可以确保 Docker 容器在退出时自动重启,无论是因为故障还是 Docker 守护进程重启。这对于需要高可用性的应用非常重要。可以在启动容器时添加该参数,也可以通过命令或修改配置文件来设置。
### 问题分析 在使用 `docker-compose` 启动 Elasticsearch 容器时,出现错误信息 `Error starting userland proxy: listen tcp 0.0.0.0:9200: bind: address already in use`,表明主机的 9200 端口已经被其他进程占用,导致 Docker 无法将容器端口映射到该端口上。这种情况通常出现在以下场景中: - 本地已经运行了另一个 Elasticsearch 实例或其他服务占用了 9200 端口。 - 其他 Docker 容器正在使用相同的端口。 - 某些系统级服务(如 Hyper-V、VMware、Apache 或 Nginx)可能绑定了相关端口。 --- ### 解决方法 #### 查看并终止占用端口的进程 在 Linux 或 macOS 上执行以下命令查找占用 9200 端口的进程: ```bash netstat -tulnp | grep :9200 ``` 若发现有进程占用,可通过如下命令终止: ```bash kill -9 <PID> ``` 在 Windows 上可使用以下命令查看端口占用情况: ```cmd netstat -ano | findstr :9200 ``` 找到对应的 PID 后,使用以下命令终止进程: ```cmd taskkill /PID <PID> /F ``` 此操作可释放被占用的端口,使 Docker 能够正常绑定[^1]。 #### 更改 Elasticsearch 的端口映射 如果无法释放 9200 端口,可以在 `docker-compose.yml` 文件中修改端口映射配置,例如将主机端口更改为 9201: ```yaml ports: - "9201:9200" - "9300:9300" ``` 这样可以避免与现有服务冲突,同时保持容器内部服务正常运行[^2]。 #### 检查是否有重复运行的容器 运行以下命令查看是否已有 Elasticsearch 容器在运行: ```bash docker ps -a | grep elasticsearch ``` 如果存在旧容器,可以先停止并删除它: ```bash docker stop <container_id> docker rm <container_id> ``` 确保没有重复的容器实例在运行,以避免端口冲突。 #### 避免与其他 Docker 服务冲突 确保其他 Docker 项目或服务未使用相同的端口。可以通过如下命令列出所有正在运行的容器及其端口映射: ```bash docker ps ``` 若发现冲突,调整对应服务的端口配置或停止相关容器。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值