首先需确认宿主机上哪些端口已被占用,以及占用进程是什么。常用命令如下:
sudo lsof -i :<端口号>(如sudo lsof -i :80);sudo netstat -tuln | grep <端口号>。若端口被已有的Docker容器占用,需先停止并删除该容器:
docker stop <容器ID或名称> # 停止容器
docker rm <容器ID或名称> # 删除容器
例如,若容器ID为abc123,则执行docker stop abc123 && docker rm abc123。
启动容器时,通过-p或--publish选项修改端口映射,将容器内部端口映射到宿主机未被占用的端口。例如:
80端口映射到宿主机8080端口:docker run -d -p 8080:80 nginx;8080端口映射到宿主机8081端口:docker run -d -p 8081:8080 my_image。创建自定义网络,让容器在隔离的网络环境中使用相同内部端口(无需映射到宿主机同一端口)。步骤如下:
docker network create app-network;docker run -d --network app-network --name web -p 8080:80 nginx
docker run -d --network app-network --name api -p 8081:80 httpd
此时,web和api容器均可使用内部80端口,但映射到宿主机不同端口,互不冲突。若容器内应用(如Spring Boot、Node.js)的端口固定,可通过修改应用配置文件调整端口,再重新构建并启动容器。例如:
src/main/resources/application.yml中的server.port(如改为8083);app.js或server.js中的app.listen端口(如改为8083);docker build -t my-image . && docker run -d -p 8083:8083 my-image。旧容器、网络或镜像可能占用端口或导致冲突,可通过以下命令清理:
docker system prune -a(执行前需确认无重要数据);docker container prune;docker network prune。以上方法覆盖了CentOS Docker端口冲突的常见场景,可根据实际情况选择对应方案。操作前建议备份重要数据,避免误操作导致数据丢失。