여기에서 뭔가 잘못 이해했는지 확실하지 않지만 이미지에서 새 컨테이너를 만들어 포트 매핑을 설정하는 것이 가능한 것처럼 보입니다. 기존 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에서 실행되는 내 고정 표시기 엔진을 다시 시작
hostconfig.json
하고 config.v2.json
이 작업을 할 수 있습니다. 자세한 내용을 보려면 @rohitmohta에서 제공 한 링크를 사용하십시오.
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
을 실행하는 TTY를 할 수 얻을 일단 당신 / var / lib / docker로 이동
나는 또한이 문제에 관심이있다.
으로 @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은 컨테이너 포트입니다.
docker start
있습니까?
실행중인 컨테이너에 포트 매핑을 적용 할 수 있는지 확실하지 않습니다. 새 컨테이너를 만드는 것과 다른 컨테이너를 실행하는 동안 포트 전달을 적용 할 수 있습니다.
$ docker run -p <public_port>:<private_port> -d <image>
컨테이너 실행을 시작합니다. 이 자습서에서는 포트 리디렉션에 대해 설명합니다.
docker run
새 컨테이너를 작성하고 시작합니다. docker create
다음에 수행하는 것과 같습니다 docker start
.
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.conf
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"
}
]
}
도커를 다시 시작하면 작동합니다.
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_PORT
하려면 MACHINE_PORT
어떤 부분을 변경해야합니까?
우리는 이것을 쉽게 달성하기 위해 ssh와 같은 편리한 도구를 사용합니다.
우분투 호스트와 우분투 기반 도커 이미지를 사용하고있었습니다.
새 포트를 매핑해야 할 때
도커 내부에서 다음 명령을 실행하십시오.
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으로 이것을 테스트했다.
Windows 및 Mac 사용자의 경우 매핑 포트를 변경하는 매우 쉽고 친숙한 또 다른 방법이 있습니다.
kitematic 다운로드
컨테이너의 설정 페이지로 이동하여 포트 탭에서 게시 된 포트를 직접 수정할 수 있습니다.
컨테이너를 다시 시작하십시오
짧은 답변 : 기존 Docker 컨테이너에 포트 매핑을 할당 할 수 없습니다
새 컨테이너가 필요합니다.
단순히 실행중인 컨테이너의 포트를 변경하려면 다음을 수행하십시오.
sudo docker stop NAME
sudo docker run -d -p 81:80 이름
어디서?
"-d"를 도커 배경 / 데몬으로
"-p"포트 매핑 활성화
브라우저로 액세스하는 데 사용하는 "81"외부 (노출) 포트
"80"내부 도커 컨테이너 청취 포트
docker run
명령 NAME
에 반해에서 컨테이너를 실행하는 화상의 이름 docker stop
(가) NAME
정지 용기의 이름을 말한다는.