首页 文章

如何将端口映射分配给现有的Docker容器?

提问于
浏览
265

我不确定我是否在这里误解了一些东西,但似乎只能通过从图像创建一个新容器来设置端口映射 . 有没有办法将端口映射分配给现有的Docker容器?

12 回答

  • 0

    如果您只想更改正在运行的容器的端口,请执行以下操作:

    • 停止现有容器

    sudo docker stop NAME

    • 现在使用新端口映射重新启动

    sudo docker run -d -p 81:80 NAME

    在哪里:

    “-d”到background / deamon docker“-p”启用端口映射“81”外部(公开)端口,用于访问浏览器“80”内部docker容器监听端口

  • 2

    作为response @Fujimoto-Youichi的补充

    您也可以在创建容器时使用 $ docker run -P CONTAINER 随机映射端口,但要注意安全性!

    -P eq to --publish-all:“它将所有暴露的端口发布到随机端口”,

    然后运行 docker inspect CONTAINER 到fin端口映射,如下图所示:

    .
    docker inspect for a rabbitmq container show all ports mapping

    了解 docker run -P 的更多信息docker run

  • 1

    您可以通过直接编辑 /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json 处的 hostconfig.json 文件来更改端口映射

    您可以通过 docker inspect <container_name> 命令确定[hash_of_the_container],"Id"字段的值是哈希值 .

    1) stop the container 
    2) change the file
    3) restart your docker engine (to flush/clear config caches)
    4) start the container
    

    因此,您无需使用此方法创建图像 . 您也可以在此处更改重启标志 .

    附:您可以访问https://docs.docker.com/engine/admin/以了解如何根据主机正确重启docker引擎 . 我使用 sudo systemctl restart docker 重新启动在Ubuntu 16.04上运行的docker引擎

  • 2

    我也对这个问题感兴趣 .

    如上所述@Thasmo,只能使用 docker run 命令指定端口转发 .
    其他命令 docker start 没有 -p 选项, docker port 仅显示当前转发 .

    要添加端口转发,我始终按照以下步骤操作:

    • stop正在运行的容器
    docker stop test01
    
    docker commit test01 test02
    

    NOTE: 以上, test02 是我正在从 test01 容器构建的新图像 .

    从提交的图像

    docker run -p 8080:8080 -td test02
    

    第一个8080是本地端口,第二个8080是集装箱端口 .

  • 319

    如果你对Docker深度配置IPtables不满意,那么你的另一种方式就是你的朋友 .

    iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT} -j DNAT --to-destination ${CONTAINERIP}:${YOURPORT}
    
    iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source ${CONTAINERIP} --destination ${CONTAINERIP} --dport ${YOURPORT}
    
    iptables -A DOCKER -j ACCEPT -p tcp --destination ${CONTAINERIP} --dport ${YOURPORT}
    

    这只是一个技巧而不是推荐的方式,这适用于我的场景,因为我无法阻止容器,我希望也会帮助你 .

  • -3

    我不能相信一页中有多少错误的答案 . 如果您执行“docker run”,它将生成一个新图像 .

    如果要更改当前图像,请执行以下操作

    docker ps -a

    取容器ID并转到

    cd /var/lib/docker/containers/<conainerID><and then some:)>
    

    停止容器

    'docker stop <NAME>'
    

    更改文件

    vi config.v2.json
    
    "Config": {
    ....
    "ExposedPorts": {
    "80/tcp": {},
    "8888/tcp": {}
    },
    ....
    },
    "NetworkSettings": {
    ....
    "Ports": {
     "80/tcp": [
     {
     "HostIp": "",
     "HostPort": "80"
     }
     ],
    

    并更改文件

    vi hostconfig.json
    
    "PortBindings": {
     "80/tcp": [
     {
     "HostIp": "",
     "HostPort": "80"
     }
     ],
     "8888/tcp": [
     {
     "HostIp": "",
     "HostPort": "8888"
     }
     ]
     }
    

    重新启动你的docker它应该工作

  • 16

    如果“现有”是指“正在运行”,那么(目前)不可能添加端口映射 .

    但是,您可以动态添加新的网络接口,例如, Pipework,如果需要在正在运行的容器中公开服务而不停止/重新启动它 .

  • 11

    在Fujimoto Youichi的例子中, test01 是一个容器,而 test02 是一个图像 .

    在执行 docker run 之前,您可以删除原始容器,然后再次为容器指定相同的名称:

    $ docker stop container01
    $ docker commit container01 image01
    $ docker rm container01
    $ docker run -d -P --name container01 image01
    

    (使用 -P 将端口暴露给随机端口而不是手动分配) .

  • -8

    不确定是否可以将端口映射应用于正在运行的容器 . 您可以在运行与创建新容器不同的容器时应用端口转发 .

    $ docker run -p <public_port>:<private_port> -d <image>
    

    将开始运行容器 . This tutorial解释了端口重定向 .

  • 0

    编辑hostconfig.json似乎现在无法正常工作 . 它只会以暴露但未发布到主机的端口结束 . 承诺和重新创建容器对我来说不是最好的方法 . 没人提到 docker network

    The best solution would be using reversed proxy within the same network

    • 如果您之前的容器不在任何已命名的容器中,请创建一个新网络 .

    docker network create my_network

    • 将现有容器加入已创建的网络

    docker network connect my_network my_existing_container

    • 启动反向代理服务(例如nginx),发布所需的端口,加入同一网络

    docker run -d --name nginx --network my_network -p 9000:9000 nginx

    (可选)删除nginx中的default.conf

    docker exec nginx rm /etc/nginx/conf.d/default.conf

    • 创建一个新的nginx配置
    server
    {
        listen 9000;
    
        location / {
            proxy_pass http://my_existing_container:9000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
    

    将配置复制到nginx容器 .

    docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf

    • 重启nginx

    docker restart nginx

    Advantages :要发布新端口,您可以根据需要安全地停止/更新/重新创建nginx容器,而无需触及业务容器 . 如果nginx需要零停机时间,则可以添加更多反向代理服务加入同一网络 . 此外,容器可以加入多个网络 .

    编辑:

    要反向代理非http服务,配置文件有点不同 . 这是一个简单的例子:

    upstream my_service {
        server my_existing_container:9000;
    }
    
    server {
        listen 9000;
        proxy_pass my_service;
    }
    
  • 21

    对于Windows和Mac用户,现在有另一种非常简单友好的方式来更改映射端口:

    下载kitematic进入容器的设置页面,在ports选项卡上,可以直接修改已发布的端口 . 再次启动容器

  • 159

    我们使用像ssh这样的方便工具来轻松实现这一目标 .

    我使用的是ubuntu主机和基于ubuntu的docker镜像 .

    • 内部docker已安装openssh-client .

    • 外部docker(主机)安装了openssh-server服务器 .

    当需要映射出新端口时,

    在 - 的里面docker运行以下命令

    ssh -R8888:localhost:8888 <username>@172.17.0.1
    

    172.17.0.1是docker接口的ip(你可以通过在主机上运行 ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" " 来获得这个) .

    在这里,我将本地8888端口映射回主机8888.您可以根据需要更改端口 .

    如果你还需要一个端口,你可以杀死ssh并使用新端口再添加一行-R .

    我用netcat测试了这个 .

相关问题