给现有docker容器添加端口映射的方法(使用docker network)

在配置code-server的docker容器时,发现需要增加端口映射作开发用。docker容器在建立后就无法再通过-p参数更改端口映射,更改端口映射的方法有使用docker commit后重新docker run、修改容器的hostconfig.json等、使用pipework等。本文记录利用docker network和nginx来实现改变现有docker容器的端口映射的方法。

0x00 配置一个network

首先,建立一个新的网络:

docker network create my_network

然后将需要端口映射的容器code-server连接到网络:

docker network connect my_network code-server

0x01 配置反代服务

要实现端口映射,我们需要一个反代服务连接到刚刚建立的网络。这里我使用了我比较熟悉的nginx。我需要暴露8081端口,通过传入-p参数实现:

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

之后,在本地创建一个code-server.conf文件,内容如下:

server
{
    listen 8081;

    location / {
        proxy_pass http://code-server:8081;
        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;
    }
}

其中,proxy_pass字段,容器名:端口是要转发的容器以及端口,listen字段的端口是向外暴露的端口,需要与docker run-p参数中指定的端口保持一致。

我这里转发的是http请求。因为使用nginx来进行反代,理论上这里可以实现nginx能完成的任何操作() 例如,我参考的文章也给出了一个代理非http服务的例子:

upstream my_service {
    server my_existing_container:9000;
}

server {
    listen 9000;
    proxy_pass my_service;
}

之后,将配置文件复制到容器内部并重启nginx容器:

docker cp ./code-server.conf nginx:/etc/nginx/conf.d/my_conf.conf
docker restart nginx

0x02 修改端口映射

在需要修改端口映射时,只需重新创建一个nginx容器,然后重复上面的步骤。


参考链接:

  1. https://stackoverflow.com/questions/19335444/how-do-i-assign-a-port-mapping-to-an-existing-docker-container

本文链接:

https://www.direcore.xyz/archives/28/
1 + 7 =
快来做第一个评论的人吧~