programing

기존 도커 컨테이너에 포트 매핑을 할당하려면 어떻게 해야 합니까?

testmans 2023. 7. 29. 08:15
반응형

기존 도커 컨테이너에 포트 매핑을 할당하려면 어떻게 해야 합니까?

여기서 제가 뭔가를 잘못 이해했는지는 모르겠지만 이미지에서 새 컨테이너를 생성하여 포트 매핑을 설정하는 것만 가능한 것 같습니다.기존 도커 컨테이너에 포트 매핑을 할당하는 방법이 있습니까?

저도 이 문제에 관심이 있습니다.

@Thasmo가 언급했듯이 포트 포워딩은 다음을 사용하는 경우에만 지정할 수 있습니다.docker run)docker create . 명령.
명령, 기타명령,docker start을 가지고 있지 않음-p 및 옵션docker port현재 전달만 표시합니다.

포트 포워딩을 추가하려면 항상 다음 단계를 따릅니다.

  1. 실행 중인 컨테이너 중지

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

    docker commit test01 test02
    

    참고: 위의 내용은,test02제가 만들고 있는 새로운 이미지입니다.test01컨테이너.

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

    docker run -p 8080:8080 -td test02
    

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

편집하여 변경할 수 .hostconfig.json에 줄을 서다./var/lib/docker/containers/[hash_of_the_container]/hostconfig.json또는/var/snap/docker/common/var-lib-docker/containers/[hash_of_the_container]/hostconfig.json당신이 도커를 스냅으로 설치했다면요.

는 [hash_of_the_container]를 할 수 .docker inspect <container_name>명령어와 "Id" 필드의 값은 해시입니다.

  1. 합니다.docker stop <container_name>).
  2. 도커 서비스 중지(Tacsiazuma의 의견에 따름)
  3. 파일을 변경합니다.
  4. 도커 엔진을 다시 시작합니다(구성 캐시 플러시/삭제).
  5. 합니다.docker start <container_name>).

따라서 이러한 접근 방식으로 이미지를 생성할 필요가 없습니다.여기서 재시작 플래그를 변경할 수도 있습니다.

추신. 호스트 컴퓨터에 따라 도커 엔진을 올바르게 다시 시작하는 방법에 대해 알아보려면 https://docs.docker.com/engine/admin/ 을 방문하십시오. Ubuntu 16.04에서 실행 중인 도커 엔진을 다시 시작하곤 했습니다.

"기존"이 "실행 중"을 의미하는 경우 포트 매핑을 추가할 수 없습니다.

그러나 예를 들어 새로운 네트워크 인터페이스를 동적으로 추가할 수 있습니다.실행 중인 컨테이너에서 서비스를 중지/재시작하지 않고 노출해야 하는 경우 파이프 구조입니다.

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

    선택적으로 default.confining nginx를 제거합니다.

    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

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

편집:

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

upstream my_service {
    server my_existing_container:9000;
}

server {
    listen 9000;
    proxy_pass my_service;
}

유이치의 에서.test01 반에컨테입니 다너이면다,▁is▁a니.test02이미지입니다.

에.docker run원래 컨테이너를 제거한 다음 컨테이너에 동일한 이름을 다시 할당할 수 있습니다.

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

(사用)-P수동으로 할당하는 대신 임의 포트에 포트를 노출합니다.

도커 깊이 구성에 익숙하지 않은 경우 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}

이것은 단지 속임수일 뿐 권장되는 방법이 아닙니다.컨테이너를 멈출 수 없었기 때문에 이것은 제 시나리오와 함께 작동합니다.

실행하는 경우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"
         } 
     ]
 }

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

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

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

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

Docker Desktop(Windows 10/MacOS)에서 컨테이너의 HostPort를 변경하려면 다음과 같이 하십시오.

# list all containers
$ docker ps -a
$ docker stop docker101tutorial 
# Use grep to get id of container
$ docker inspect docker101tutorial | grep -i id
        "Id": "sha256:fff0a4b22d6f3d2eb8d2748b8a8bbc9967ea87199988acee8e86ac70bce9c3eb",
# run plain ubuntu docker image with shell and change it's namespace to docker host
# https://stackoverflow.com/questions/60408574/how-to-access-var-lib-docker-in-windows-10-docker-desktop/60411313#60411313
# https://forums.docker.com/t/the-location-of-images-in-docker-for-windows/19647/4
$ docker run -it --privileged --pid=host ubuntu nsenter -t 1 -m -u -i sh
# We want to find out the directory of docker101tutorial container. We are looking for:
# `"Image":"sha256:fff0a4b22d6f3d2eb8d2748b8a8bbc9967ea87199988acee8e86ac70bce9c3eb"`
# in /var/lib/docker/containers/*/config.v2.json
$ find /var/lib/docker/containers/ -name config.v2.json -exec grep -H fff0a4b22d {} \;
/var/lib/docker/containers/c1eda20b30f058bce9f8ece3b47a21641df5b399770e12ab57416a954d3c8bbf/config.v2.json
# edit it
$ vi /var/lib/docker/containers/c1eda20b30f058bce9f8ece3b47a21641df5b399770e12ab57416a954d3c8bbf/hostconfig.json
  • 를 누릅니다.i삽입 모드용.
  • "HostPort":"80""HostPort":"8092"
  • 를 누릅니다.Escape 리고쓰기를 씁니다.:wq.르다를 .Enter.
  • 안 함 작/중 안docker101tutorial 금지로 . 그렇지 않으면 변경됩니다.HostPort반환됩니다.
  • 도커 데스크톱 트레이 아이콘을 마우스 오른쪽 버튼으로 클릭하고 다시 시작을 클릭합니다.
  • Docker Desktop의 컨테이너 목록에서 컨테이너를 확인합니다.는 "" "" " " " " " " 로 되어야 합니다.8092.
  • 컨테이너를 시작합니다.이제 포트에 매핑됩니다.8092주최의

@holdfenytolvaj 답변을 기반으로 합니다.

우리는 이것을 쉽게 달성하기 위해 ssh와 같은 편리한 도구를 사용합니다.

나는 우분투 호스트와 우분투 기반 도커 이미지를 사용하고 있었습니다.

  1. 도커 내부에는 opensh-client가 설치되어 있습니다.
  2. 외부 도커(호스트)에 opensh-server 서버가 설치되어 있습니다.

새 포트를 매핑해야 할 경우

도커 내부에서 다음 명령을 실행합니다.

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

172.17.0.1은 도커 인터페이스의 IP였습니다(실행하면 이를 얻을 수 있습니다).ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "호스트에 있음).

여기서 저는 로컬 8888 포트를 호스트 8888에 매핑했습니다. 필요에 따라 포트를 변경할 수 있습니다.

포트가 하나 더 필요하면 SSH를 종료하고 새 포트로 -R 행을 하나 더 추가할 수 있습니다.

저는 netcat으로 이것을 테스트했습니다.

  1. 도커 엔진과 컨테이너를 정지합니다.
  2. 에 가다/var/lib/docker/containers/${container_id}디렉터리 및 편집hostconfig.json
  3. 편집PortBindings.HostPort당신이 변화를 원한다고 말입니다.
  4. 도커 엔진과 컨테이너를 시동합니다.

포테이너 방법

포테이너를 사용하는 사용자가 있다면 이 솔루션이 "Gui-friendly and safe"라는 것을 알게 되었습니다.

  1. Portainer의 컨테이너로 이동
  2. 용기를 정지합니다.
  3. "복제/편집"enter image description here을 선택합니다.
  4. 필요한 포트를 추가하고 배포합니다.
  5. 바꾸기 또는 취소 여부를 묻는 메시지가 나타나면 List item바꾸기를 선택합니다.
  6. 인생을 즐기세요

컨테이너에 이런 상황이 발생했습니다.

127.0.0.1:8050->8000

그리고 iptalbes 규칙 하나로 그것을 해결했습니다.

iptables -t nat -I DOCKER 1 -p tcp --dport ${HOST_PORT} -j DNAT --to-destination ${CONTAINER_IP}:${CONTAINER_PORT}

이 예에서는HOST_PORT8050이고CONTAINER_PORT8000입니다.찾기 위해서.CONTAINER_IP사용하다docker inspect지휘권

iptables 규칙을 제거하려면 다음 명령을 사용합니다.

iptables -t nat -D DOCKER 1

Windows 및 Mac 사용자의 경우 매핑 포트를 쉽게 변경할 수 있는 또 다른 방법이 있습니다.

  1. 키트매틱 다운로드

  2. 컨테이너의 설정 페이지로 이동하여 포트 탭에서 게시된 포트를 직접 수정할 수 있습니다.

  3. 컨테이너를 다시 시작합니다.

기존 도커 컨테이너에 포트 매핑을 할당하려면 어떻게 해야 합니까?

매우 간단합니다.두 가지가 있습니다. 하나는 800,8080 등의 로컬 서버 포트입니다.두 번째는 매핑하려는 컨테이너 포트입니다.도커 포트 매핑

 docker run -p 8080:8080 <Image ID> 

사용할 수 있는 이미지 ID를 가져오려면

docker ps

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

반응형