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

8
我是新手,正在尝试启动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。那么如何启动带有转发端口的容器呢?谢谢!
4个回答

6
可能的问题是两个程序使用同一个端口。 在运行docker run命令时,可以更改端口设置。 例如,您可以将容器的端口8080绑定到计算机上的任意端口,如8081docker 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. 编辑位于 var/lib/docker/containers/[container ID]/hostconfig.json 的容器hostconfig.json文件
  4. PortBindings部分中, 要么编辑现有的HostPort以获得所需端口, 要么添加自己的端口(见下文)
  5. 保存并退出配置文件
  6. 重启docker: 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"
        }
    ]
}

从Docker 20.10开始,除非我在重启“dockerd”之前将“ExposedPorts”:{“3306 / tcp”:{},“443 / tcp”:{},“80 / tcp”:{}}添加到容器的config.v2.json中,否则这种方法对我无效。 - ternary
嘿,@ternary,随意编辑答案,如你所愿 :) - Pedram

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

0

要更改端口映射,您需要删除并重新创建容器。因此,请使用docker rm命令删除现有容器,然后使用新的端口设置运行docker run命令。


谢谢您的回答!我不想改变映射,我想使用相同的映射运行我的容器,但是当我尝试使用 docker start <ContainerID> 启动它时,我会得到我在问题中描述的错误。有什么想法吗? - Lucas P.
那个错误信息告诉我你之前使用了 docker run -p 80:8080 命令启动过它。可以通过执行 docker ps 命令来确认。 - David Maze
当我运行 docker ps 命令时,没有正在运行的容器,因为我已经确保在此之前运行了 docker stop 命令(或者重新启动了我的服务器,这实际上是我要解决的问题)。容器创建后是否应该已经转发其端口?如果是这样,为什么我无法再次启动它?我重申一遍,运行 docker ps 命令显示没有正在运行的容器。 - Lucas P.
1
你不能更改现有容器的端口映射。docker ps -a会显示已停止的容器。 - David Maze
好的,我猜可能是其他情况导致了问题,因为我不能启动停止的容器。我不想改变端口,我只是想重新启动它。但是我得到了上面描述的错误(端口80已经在使用中),所以我猜测当我第一次创建它时容器没有像预期那样使用端口8080。 - Lucas P.

0

尝试使用以下内容

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接