Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将端口映射分配给现有Docker容器?_Docker_Port_Lxc_Linux Containers - Fatal编程技术网

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

如何将端口映射分配给现有Docker容器?,docker,port,lxc,linux-containers,Docker,Port,Lxc,Linux Containers,我不确定我是否误解了这里的某些内容,但似乎只有通过从映像创建新容器才能设置端口映射。是否有方法将端口映射分配给现有Docker容器?不确定是否可以将端口映射应用于正在运行的容器。您可以在运行与创建新容器不同的容器时应用端口转发 $ docker run -p <public_port>:<private_port> -d <image> $docker运行-p:-d 将开始运行容器。解释端口重定向 如果“现有”是指“正在运行”,那么(当前)不可能添加端

我不确定我是否误解了这里的某些内容,但似乎只有通过从映像创建新容器才能设置端口映射。是否有方法将端口映射分配给现有Docker容器?

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

$ docker run -p <public_port>:<private_port> -d <image>  
$docker运行-p:-d
将开始运行容器。解释端口重定向

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


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

我也对这个问题感兴趣

如上所述,只能使用
docker run
(和
docker create
)命令指定端口转发。
其他命令,
docker start
没有
-p
选项,
docker port
仅显示当前转载

要添加港口转运,我始终遵循以下步骤

  • 流动容器

    docker stop test01
    
    docker commit test01 test02
    
  • 容器

    docker stop test01
    
    docker commit test01 test02
    
    注意:上面的
    test02
    是我从
    test01
    容器构建的一个新映像

  • 从提交的映像重新创建

    docker run -p 8080:8080 -td test02
    

  • 其中,第一个8080是本地端口,第二个8080是集装箱端口。

    在Fujimoto Youichi的示例中,
    test01
    是集装箱,而
    test02
    是图像

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

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

    (使用
    -p
    将端口公开给随机端口,而不是手动分配)。

    您可以通过在以下位置直接编辑
    hostconfig.json
    文件来更改端口映射:
    /var/lib/docker/containers/[hash_the_container]/hostconfig.json
    /var/snap/docker/common/var-lib-docker/containers/[hash_the_the_container]/hostconfig.json
    ,我相信,如果您将docker作为快照安装的话

    您可以通过
    docker inspect
    命令来确定[hash\u\u the\u container],并且“Id”字段的值就是hash

  • 停止容器(
    docker Stop
  • 停止docker服务(根据Tacsiazuma的评论)
  • 更改文件
  • 重新启动docker引擎(刷新/清除配置缓存)
  • 启动容器(
    docker Start
  • 因此,您不需要使用这种方法创建图像。您还可以在此处更改重新启动标志


    另外,您可以访问以了解如何根据主机正确重启docker引擎。我使用了
    sudo systemctl restart docker
    来重新启动在Ubuntu 16.04上运行的docker引擎。

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

  • 下载kitematic

  • 转到容器的“设置”页面,在“端口”选项卡上,您可以直接在那里修改已发布的端口

  • 再次启动容器


  • 如果您对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}
    
    这只是一个技巧,不是推荐的方法。这适用于我的场景,因为我无法停止容器。

    编辑hostconfig.json现在似乎不起作用。它仅以该端口公开而不是发布到主机结束。提交和重新创建容器对我来说不是最好的方法。没有人提到docker网络

    最好的解决方案是在同一网络中使用反向代理

  • 如果以前的容器不在任何命名的容器中,请创建新网络

    docker网络创建我的网络

  • 将现有容器连接到创建的网络

    docker网络连接我的网络我的现有容器

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

    docker run-d--名称nginx--网络我的网络-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重启nginx

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

    编辑:

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

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

    如果您运行
    docker run
    ,它将生成一个新的映像,这很可能不是您想要的

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

    docker ps-a

    获取目标容器的id并转到:

    cd /var/lib/docker/containers/<conainerID><and then some:)>
    
    并更改文件

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

    重新启动docker,它应该可以工作。

    我们可以使用ssh等方便的工具轻松完成这项工作

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

  • docker内部安装了openssh客户端
  • 外部docker(主机)安装了openssh服务器
  • 当需要绘制新端口时

    在docker内部运行以下命令

    ssh -R8888:localhost:8888 <username>@172.17.0.1
    
    ssh-R8888:localhost:8888@172.17.0.1
    
    172.17.0.1是docker接口的ip (您可以通过运行
    ifconfig docker0 | grep“inet addr”| cut-