[docker] 기존 Docker 컨테이너에 포트 매핑을 어떻게 할당합니까?

여기에서 뭔가 잘못 이해했는지 확실하지 않지만 이미지에서 새 컨테이너를 만들어 포트 매핑을 설정하는 것이 가능한 것처럼 보입니다. 기존 Docker 컨테이너에 포트 매핑을 할당하는 방법이 있습니까?



답변

에서 hostconfig.json파일을
직접 편집하여 포트 매핑을 변경할 수 있습니다/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json

docker inspect <container_name>명령을 통해 [hash_of_the_container]를 결정할 수 있으며 “Id”필드의 값은 해시입니다.

1) stop the container
2) stop docker service (per Tacsiazuma's comment)
3) change the file
4) restart your docker engine (to flush/clear config caches)
5) start the container

따라서이 방법으로 이미지를 만들 필요가 없습니다. 여기서 재시작 플래그를 변경할 수도 있습니다.

PS https://docs.docker.com/engine/admin/ 을 방문 하여 호스트 시스템에 따라 도커 엔진을 올바르게 다시 시작하는 방법을 배울 수 있습니다 . 내가 사용하는 sudo systemctl restart docker우분투 16.04에서 실행되는 내 고정 표시기 엔진을 다시 시작


답변

나는 또한이 문제에 관심이있다.

으로 @Thasmo이 언급 한, 포트 포워딩 만 지정할 수 있습니다 docker run(와 docker create) 명령.
다른 명령 docker start-p옵션 이 없으며 docker port현재 전달 만 표시합니다.

포트 전달을 추가하려면 항상 다음 단계를 따르십시오.

  1. 컨테이너 실행 중지

    docker stop test01
    
  2. 컨테이너를 커밋

    docker commit test01 test02
    

    참고 :test02test01컨테이너 에서 구성하는 새로운 이미지입니다 .

  3. 커밋 된 이미지에서 다시 실행

    docker run -p 8080:8080 -td test02
    

여기서 첫 번째 8080은 로컬 포트이고 두 번째 8080은 컨테이너 포트입니다.


답변

“존재”가 “실행 중”을 의미하는 경우 (현재) 포트 매핑을 추가 할 수 없습니다.

그러나 서비스를 중지 / 다시 시작하지 않고 실행중인 컨테이너에 서비스를 노출해야하는 경우 Pipework 와 같은 새 네트워크 인터페이스를 동적으로 추가 할 수 있습니다 .


답변

실행중인 컨테이너에 포트 매핑을 적용 할 수 있는지 확실하지 않습니다. 새 컨테이너를 만드는 것과 다른 컨테이너를 실행하는 동안 포트 전달을 적용 할 수 있습니다.

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

컨테이너 실행을 시작합니다. 이 자습서에서는 포트 리디렉션에 대해 설명합니다.


답변

hostconfig.json을 수정 하면 지금 작동하지 않는 것 같습니다. 해당 포트만 노출되지만 호스트에 게시되지는 않습니다. 컨테이너를 커밋하고 재생성하는 것이 최선의 방법은 아닙니다. 아무도 언급하지 않았 docker network습니까?

가장 좋은 솔루션은 동일한 네트워크 내에서 역방향 프록시를 사용하는 것입니다

  1. 이전 컨테이너가 명명 된 컨테이너에없는 경우 새 네트워크를 만듭니다.

    docker network create my_network

  2. 기존 컨테이너를 생성 된 네트워크에 가입

    docker network connect my_network my_existing_container

  3. 동일한 네트워크에 가입하여 필요한 포트를 게시하는 역방향 프록시 서비스 (예 : 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

  4. 새로운 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

  5. nginx를 다시 시작하십시오

    docker restart nginx

장점 : 새로운 포트를 게시하기 위해 비즈니스 컨테이너를 건드리지 않고 원하는대로 nginx 컨테이너를 안전하게 중지 / 업데이트 / 재 작성할 수 있습니다. nginx에 대한 다운 타임이 0 인 경우 동일한 네트워크에 참여하는 더 많은 프록시 서비스를 추가 할 수 있습니다. 또한 컨테이너는 둘 이상의 네트워크에 참여할 수 있습니다.

편집하다:

http가 아닌 프록시 서비스를 되돌리려면 구성 파일이 약간 다릅니다. 다음은 간단한 예입니다.

upstream my_service {
    server my_existing_container:9000;
}

server {
    listen 9000;
    proxy_pass my_service;
}


답변

Fujimoto Youichi의 ​​예 test01는 컨테이너이지만 test02이미지입니다.

수행하기 전에 docker run원래 컨테이너를 제거한 다음 컨테이너에 동일한 이름을 다시 지정할 수 있습니다.

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

( -P수동 할당 대신 임의의 포트에 포트를 노출하는 데 사용).


답변

실행 docker run <NAME>하면 새로운 이미지가 생성되며 원하는 이미지가 아닐 수 있습니다.

현재 이미지를 변경하려면 다음을 수행하십시오.

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"
         }
     ]
 }

도커를 다시 시작하면 작동합니다.