기존 Docker 컨테이너에 포트 매핑을 어떻게 할당합니까?
여기에서 뭔가 잘못 이해했는지 확실하지 않지만 이미지에서 새 컨테이너를 만들어 포트 매핑을 설정하는 것이 가능한 것처럼 보입니다. 기존 Docker 컨테이너에 포트 매핑을 할당하는 방법이 있습니까?
나는 또한이 문제에 관심이있다.
으로 @Thasmo이 언급 한, 포트 포워딩 만 지정할 수 있습니다 docker run명령.
다른 명령 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
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에서 실행되는 내 고정 표시기 엔진을 다시 시작
"존재"가 "실행 중"을 의미하는 경우, 현재 포트 매핑을 추가 할 수 없습니다.
그러나 서비스를 중지 / 다시 시작하지 않고 실행중인 컨테이너에 서비스를 노출해야하는 경우 Pipework 와 같은 새 네트워크 인터페이스를 동적으로 추가 할 수 있습니다 .
실행중인 컨테이너에 포트 매핑을 적용 할 수 있는지 확실하지 않습니다. 새 컨테이너를 만드는 것과 다른 컨테이너를 실행하는 동안 포트 전달을 적용 할 수 있습니다.
$ docker run -p <public_port>:<private_port> -d <image>
컨테이너 실행을 시작합니다. 이 자습서에서는 포트 리디렉션에 대해 설명합니다.
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을 수정 하면 지금 작동하지 않는 것 같습니다. 해당 포트만 노출되지만 호스트에 게시되지는 않습니다. 컨테이너를 커밋하고 재생성하는 것이 최선의 방법은 아닙니다. 아무도 언급하지 않았 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선택적 으로 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.confnginx를 다시 시작하십시오
docker restart nginx
장점 : 새로운 포트를 게시하기 위해 비즈니스 컨테이너를 건드리지 않고 원하는대로 nginx 컨테이너를 안전하게 중지 / 업데이트 / 재 작성할 수 있습니다. nginx에 대한 다운 타임이 0 인 경우 동일한 네트워크에 참여하는 더 많은 역방향 프록시 서비스를 추가 할 수 있습니다. 또한 컨테이너는 둘 이상의 네트워크에 참여할 수 있습니다.
편집하다:
http가 아닌 프록시 서비스를 되돌리려면 구성 파일이 약간 다릅니다. 다음은 간단한 예입니다.
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
Docker 깊이 구성 IPtable에 익숙하지 않은 경우 다른 방법으로 친구가 될 수 있습니다.
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"
}
]
}
도커를 다시 시작하면 작동합니다.
우리는 이것을 쉽게 달성하기 위해 ssh와 같은 편리한 도구를 사용합니다.
우분투 호스트와 우분투 기반 도커 이미지를 사용하고있었습니다.
- 내부 도커에는 openssh-client가 설치되어 있습니다.
- 외부 도커 (호스트)에는 openssh-server 서버가 설치되어 있습니다.
새 포트를 매핑해야 할 때
도커 내부에서 다음 명령을 실행하십시오.
ssh -R8888:localhost:8888 <username>@172.17.0.1
172.17.0.1은 docker 인터페이스의 IP였습니다 ( ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "호스트에서 실행 하여 얻을 수 있음 ).
여기에 로컬 8888 포트가 호스트 8888에 다시 매핑되었습니다. 필요에 따라 포트를 변경할 수 있습니다.
하나 이상의 포트가 필요하면 ssh를 종료하고 새로운 포트를 사용하여 -R 라인을 하나 더 추가 할 수 있습니다.
나는 netcat으로 이것을 테스트했다.
- 도커 엔진과 해당 컨테이너를 중지하십시오.
/var/lib/docker/containers/${container_id}디렉토리로 이동하여 편집hostconfig.jsonPortBindings.HostPort변경을 원하는 것으로 편집하십시오 .- 도커 엔진 및 컨테이너를 시작하십시오.
Windows 및 Mac 사용자의 경우 이제 매핑 포트를 변경하는 매우 쉽고 친숙한 방법이 있습니다.
연을 다운로드
컨테이너의 설정 페이지로 이동하여 포트 탭에서 게시 된 포트를 직접 수정할 수 있습니다.
컨테이너를 다시 시작하십시오
@ Fujimoto-Youichi 의 답변 을 보완하는
$ docker run -P CONTAINER컨테이너를 만드는 동안 포트를 무작위로 매핑하는 데 사용할 수도 있지만 보안 ascpect에주의하십시오!
-Peq to--publish-all: "모든 노출 된 포트를 임의의 포트에 게시합니다",
그런 다음 docker inspect CONTAINER아래 이미지와 같이 핀 매핑 을 실행 하십시오.
docker rundocker run -P 에서 더 읽어보기
단순히 실행중인 컨테이너의 포트를 변경하려면 다음을 수행하십시오.
- 기존 컨테이너 중지
sudo docker stop NAME
- 이제 새로운 포트 매핑으로 다시 시작
sudo docker run -d -p 81:80 이름
어디서?
"-d"를 도커 배경 / 데몬으로
"-p"포트 매핑 활성화
브라우저로 액세스하는 데 사용하는 "81"외부 (노출) 포트
"80"내부 도커 컨테이너 청취 포트
'Programming' 카테고리의 다른 글
| 자바 : notify () 대 notifyAll () 다시 (0) | 2020.02.28 |
|---|---|
| 실제 터미널 화면 지우기 (0) | 2020.02.28 |
| Android Studio에서 모듈을 삭제하는 방법 (0) | 2020.02.28 |
| Bash의 경로 문자열에서 파일 접미사와 경로 부분을 어떻게 제거합니까? (0) | 2020.02.28 |
| 공개적으로 보이는 유형 또는 멤버에 대한 XML 주석이 누락되었습니다. (0) | 2020.02.28 |
