[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
현재 전달 만 표시합니다.
포트 전달을 추가하려면 항상 다음 단계를 따르십시오.
-
컨테이너 실행 중지
docker stop test01
-
컨테이너를 커밋
docker commit test01 test02
참고 : 위
test02
는test01
컨테이너 에서 구성하는 새로운 이미지입니다 . -
커밋 된 이미지에서 다시 실행
docker run -p 8080:8080 -td test02
여기서 첫 번째 8080은 로컬 포트이고 두 번째 8080은 컨테이너 포트입니다.
답변
“존재”가 “실행 중”을 의미하는 경우 (현재) 포트 매핑을 추가 할 수 없습니다.
그러나 서비스를 중지 / 다시 시작하지 않고 실행중인 컨테이너에 서비스를 노출해야하는 경우 Pipework 와 같은 새 네트워크 인터페이스를 동적으로 추가 할 수 있습니다 .
답변
실행중인 컨테이너에 포트 매핑을 적용 할 수 있는지 확실하지 않습니다. 새 컨테이너를 만드는 것과 다른 컨테이너를 실행하는 동안 포트 전달을 적용 할 수 있습니다.
$ docker run -p <public_port>:<private_port> -d <image>
컨테이너 실행을 시작합니다. 이 자습서에서는 포트 리디렉션에 대해 설명합니다.
답변
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"
}
]
}
도커를 다시 시작하면 작동합니다.