Docker:如何启动现有容器并转发端口?

Luc*_* P. 6 port docker rancher

我是 docker 新手,我正在尝试开始永久安装 Rancher。要创建 docker 容器,我运行以下命令:

docker run -d --name rancher-server -p 8080:8080 rancher/server

请注意,我想将容器的 8080 端口转发到我主机的 8080,因为 80 被我主机上的 nginx 占用。

现在,当我停止上述容器并尝试使用它再次启动时,出现docker start <Container ID>以下错误:

Error response from daemon: driver failed programming external connectivity on endpoint rancher-server (c18940f957ed1f737fd5453ea29755adea762d758643a64984d5e3ce8bd3fdbe): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use Error: failed to start containers: c93794a8c0ad

我知道这是因为 nginx 使用端口 80,所以我的问题是如何启动我现有的容器并告诉它转发它的端口?

运行docker start -d -p 8080:8080 c93794a8c0ad给了我以下错误:unknown shorthand flag: 'd' in -d

那么如何启动一个带有转发端口的容器呢?谢谢!

Ped*_*ram 6

问题可能是两个程序正在同一端口上运行。您可以在运行docker run命令时更改端口设置。例如,您可以将8080容器的端口与计算机上的任意端口绑定,例如8081

docker run -d --name rancher-server -p 8081:8080 rancher/server

左侧端口号是 docker主机端口(您的计算机),右侧是 docker容器端口。

可以修改端口

您可以更改docker 容器的端口而不删除它。quin452 的说法- 稍作修改:

  1. 获取容器ID:

    docker ps -a

  2. 停止容器:

    docker stop [container name]

  3. 编辑容器hostconfig.json文件,位于

    var/lib/docker/containers/[container ID]/hostconfig.json

  4. 在该PortBindings部分中,将现有端口编辑HostPort为您想要的端口,或自行添加它们(见下文)

  5. 保存并退出配置文件

  6. 重新启动码头工人:

    sudo systemctl restart docker

  7. 启动容器:

    docker start [container name]

配置文件示例:

"PortBindings": {
    "3306/tcp": [
        {
            "HostIp": "",
            "HostPort": "23306"
        }
    ],
    "443/tcp": [
        {
            "HostIp": "",
            "HostPort": "2443"
        }
    ],
    "80/tcp": [
        {
            "HostIp": "",
            "HostPort": "280"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)


Luc*_* P. 1

我删除了容器,并使用 Rancher 文档推荐的命令创建了一个新容器sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server,现在在正确的端口上按预期停止和启动容器工作。我不知道之前是什么问题,但现在可以了。