如何解决docker-compose中的“驱动程序编程外部连接失败”?

k0p*_*kus 5 ubuntu docker docker-compose

我正在使用 docker@19.03.2 build 6a30dfc) 和 docker-compose@1.19.0, build 9e633ef。

给定一个docker-compose.yml(过去很长时间工作正常并且自 2019 年 4 月以来没有变化)文件,该文件只启动一个 mariadb 容器,并且应该向主机公开 mysql 端口:

pe-db:
    image: mariadb:10.3
    ports:
        - 3306:3306
    environment:
        MYSQL_DATABASE: dev_db
        MYSQL_PASSWORD: password
        MYSQL_USER: dev
        MYSQL_ROOT_PASSWORD: root_password
Run Code Online (Sandbox Code Playgroud)

然而在运行时:

 docker-compose up
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

Recreating fcac8d931b6a_ratepipeline_pe-db_1 ... error

ERROR: for fcac8d931b6a_ratepipeline_pe-db_1  Cannot start service pe-db: driver failed programming external connectivity on endpoint ratepipeline_pe-db_1 (6e649313e4cccd484d0672183cd24daf21c5e8ad3dc1e01fda57d0c942194b6d): Bind for 0.0.0.0:3306 failed: port is already allocated

ERROR: for pe-db  Cannot start service pe-db: driver failed programming external connectivity on endpoint ratepipeline_pe-db_1 (6e649313e4cccd484d0672183cd24daf21c5e8ad3dc1e01fda57d0c942194b6d): Bind for 0.0.0.0:3306 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.
Run Code Online (Sandbox Code Playgroud)

通过以下方式检查端口3306上运行的内容时:

sudo netstat -nlp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      3042/docker-proxy
Run Code Online (Sandbox Code Playgroud)

我看到了码头代理。本地没有其他 mysql 数据库在运行。我可以杀死docker-proxy通过:

sudo killall docker-proxy
sudo netstat -nlp | grep 3306
Run Code Online (Sandbox Code Playgroud)

然后我在 port 上看不到任何东西在运行3306。然而docker-compose up会再次遇到同样的错误,声称端口已经在使用中,即使netstat不会在端口上显示任何用户。

我还尝试通过以下方式重新启动 docker 守护进程

 sudo service docker restart
Run Code Online (Sandbox Code Playgroud)

并重新启动我的系统。问题仍然存在。

我该如何解决这个问题?

k0p*_*kus 5

就我而言,我确实运行了一个 mysql 容器。它不会显示在 netstat 上,但我可以通过

docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                    NAMES

b59b7973d88b        mysql:5.7                   "docker-entrypoint.s…"   10 days ago         Up 8 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp                                        squbsstub_db_1
Run Code Online (Sandbox Code Playgroud)

然后我可以通过它的 杀死那个容器CONTAINER ID,在这种情况下:

docker kill b59b7973d88b
Run Code Online (Sandbox Code Playgroud)

然后我以前的 docker-compose 项目就会正常运行。