기존 도커 컨테이너에 포트 매핑을 할당하려면 어떻게 해야 합니까?
여기서 제가 뭔가를 잘못 이해했는지는 모르겠지만 이미지에서 새 컨테이너를 생성하여 포트 매핑을 설정하는 것만 가능한 것 같습니다.기존 도커 컨테이너에 포트 매핑을 할당하는 방법이 있습니까?
저도 이 문제에 관심이 있습니다.
@Thasmo가 언급했듯이 포트 포워딩은 다음을 사용하는 경우에만 지정할 수 있습니다.docker run
)docker create
. 명령.
명령, 기타명령,docker start
을 가지고 있지 않음-p
및 옵션docker port
현재 전달만 표시합니다.
포트 포워딩을 추가하려면 항상 다음 단계를 따릅니다.
실행 중인 컨테이너 중지
docker stop test01
컨테이너를 커밋합니다.
docker commit test01 test02
참고: 위의 내용은,
test02
제가 만들고 있는 새로운 이미지입니다.test01
컨테이너.커밋된 이미지에서 다시 실행
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" 필드의 값은 해시입니다.
- 합니다.
docker stop <container_name>
). - 도커 서비스 중지(Tacsiazuma의 의견에 따름)
- 파일을 변경합니다.
- 도커 엔진을 다시 시작합니다(구성 캐시 플러시/삭제).
- 합니다.
docker start <container_name>
).
따라서 이러한 접근 방식으로 이미지를 생성할 필요가 없습니다.여기서 재시작 플래그를 변경할 수도 있습니다.
추신. 호스트 컴퓨터에 따라 도커 엔진을 올바르게 다시 시작하는 방법에 대해 알아보려면 https://docs.docker.com/engine/admin/ 을 방문하십시오. Ubuntu 16.04에서 실행 중인 도커 엔진을 다시 시작하곤 했습니다.
"기존"이 "실행 중"을 의미하는 경우 포트 매핑을 추가할 수 없습니다.
그러나 예를 들어 새로운 네트워크 인터페이스를 동적으로 추가할 수 있습니다.실행 중인 컨테이너에서 서비스를 중지/재시작하지 않고 노출해야 하는 경우 파이프 구조입니다.
hostconfig.json 편집이 지금 작동하지 않는 것 같습니다.해당 포트는 노출되지만 호스트에 게시되지 않는 것으로 끝납니다.컨테이너를 커밋하고 다시 만드는 것은 저에게 최선의 방법이 아닙니다.언급된 사람 없음docker 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
선택적으로 default.confining nginx를 제거합니다.
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
장점:새 포트를 게시하려면 비즈니스 컨테이너를 건드리지 않고 원하는 대로 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와 같은 편리한 도구를 사용합니다.
나는 우분투 호스트와 우분투 기반 도커 이미지를 사용하고 있었습니다.
- 도커 내부에는 opensh-client가 설치되어 있습니다.
- 외부 도커(호스트)에 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으로 이것을 테스트했습니다.
- 도커 엔진과 컨테이너를 정지합니다.
- 에 가다
/var/lib/docker/containers/${container_id}
디렉터리 및 편집hostconfig.json
- 편집
PortBindings.HostPort
당신이 변화를 원한다고 말입니다. - 도커 엔진과 컨테이너를 시동합니다.
포테이너 방법
포테이너를 사용하는 사용자가 있다면 이 솔루션이 "Gui-friendly and safe"라는 것을 알게 되었습니다.
- Portainer의 컨테이너로 이동
- 용기를 정지합니다.
- "복제/편집"을 선택합니다.
- 필요한 포트를 추가하고 배포합니다.
- 바꾸기 또는 취소 여부를 묻는 메시지가 나타나면 바꾸기를 선택합니다.
- 인생을 즐기세요
컨테이너에 이런 상황이 발생했습니다.
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_PORT
8050이고CONTAINER_PORT
8000입니다.찾기 위해서.CONTAINER_IP
사용하다docker inspect
지휘권
iptables 규칙을 제거하려면 다음 명령을 사용합니다.
iptables -t nat -D DOCKER 1
Windows 및 Mac 사용자의 경우 매핑 포트를 쉽게 변경할 수 있는 또 다른 방법이 있습니다.
키트매틱 다운로드
컨테이너의 설정 페이지로 이동하여 포트 탭에서 게시된 포트를 직접 수정할 수 있습니다.
컨테이너를 다시 시작합니다.
기존 도커 컨테이너에 포트 매핑을 할당하려면 어떻게 해야 합니까?
매우 간단합니다.두 가지가 있습니다. 하나는 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
'programing' 카테고리의 다른 글
페이지 하단으로 바닥글 플러시, 트위터 부트스트랩 (0) | 2023.07.29 |
---|---|
파이썬을 사용하는 이 코드에서 'wb'는 무엇을 의미합니까? (0) | 2023.07.29 |
테스트 환경에서 MariaDB를 사용하고 운영에서 sql server를 사용하는 방법, 두 가지 모두에 대해 하나의 선택을 사용하는 방법 - Java, Spring (0) | 2023.07.29 |
jQuery를 사용하여 href 값을 얻는 방법은 무엇입니까? (0) | 2023.07.29 |
PHPExcel 병합 셀에서 텍스트 중심 지정 방법 (0) | 2023.07.29 |