programing

나가는 호스트/포트를 컨테이너에서 다른 포트로 매핑하는 방법

linuxpc 2023. 7. 25. 20:41
반응형

나가는 호스트/포트를 컨테이너에서 다른 포트로 매핑하는 방법

저는 mariadb 데이터베이스에 연결되는 작은 웹 앱을 가지고 있습니다.톰캣은 한 컨테이너에서 실행하고 마리애드브는 다른 컨테이너에서 실행합니다.Tomcat은 Context.xml 파일에 지정된 JDBC URL을 사용하여 현재 fqhn 및 포트 3306을 지정하는 mariadb 인스턴스를 참조합니다.

이제 이 구성을 복제해야 합니다. 상자에 4개의 컨테이너, 2개의 실행 중인 Tomcat 및 2개의 실행 중인 Mariadb로 구성된 2개의 웹 앱 인스턴스가 있습니다.각 Tomcat 인스턴스가 서로 다른 포트를 통해 연결할 수 있도록 "도커 실행"에서 간단한 포트 매핑을 수행하는 것은 매우 쉽습니다. mariadb 인스턴스도 마찬가지입니다.

나에게 명확하지 않은 것은 나가는 호스트:포트 참조를 Tomcat 컨테이너에서 mariadb 인스턴스로 매핑하는 방법입니다.이미지의 Context.xml 파일은 현재 전체 호스트 이름과 기본 포트 3306을 사용하여 데이터베이스의 JDBC URL을 지정합니다.

두 인스턴스 모두에서 작동하도록 단일 이미지를 변경할 수 있지만 단일 JDBC URL이 포함된 단일 이미지가 있어야 합니다.첫 번째 컨테이너 쌍에서는 3306에서 실행되는 원래 mariadb 인스턴스에 도달해야 합니다.두 번째 컨테이너 쌍은 포트 3306을 지정하더라도 포트 3307에 연결해야 합니다.

이것이 "--link" 명령줄 옵션으로 어떻게 수행됩니까?

업데이트:

기존 애플리케이션이 실행되지 않으면 이 작업이 더 쉬워지고, 작동할 때까지 이 작업을 해킹할 수 있습니다.방해를 최소화하기 위해 이 단계를 신중하게 밟아야 합니다.xml 파일.context.의 JDBC ."로 바꿨어요.jdbc:mysql://db:3306/estimatordb".

데스크톱(또는 Jenkins 인스턴스)에 Gradle을 사용하여 응용 프로그램 WAR 파일을 빌드하지만 Docker 이미지는 Jenkins 인스턴스에만 빌드됩니다.저는 systemd 파일로 대상 호스트의 컨테이너를 실행하면서 "도커 실행..."을 수행했습니다.Jenkins 빌드에서 ssh를 통해 이미지 이름을 "도커 풀"한 다음 "도커 스톱"하여 기존 컨테이너를 중지하여 새 이미지로 다시 시작합니다.

그 사이에 제가 빌드하는 이미지 이름을 변경할 예정입니다(이름에 "2"만 추가). 일단 "ssh 도커 스톱"에 대해 언급하고 있습니다.저는 그것이 작곡과 함께 무엇으로 해석될지 확신할 수 없습니다.분명히 "도커 합성 중지"가 시작점이지만, 이 빌드에서 합성 파일을 변경할 경우 혼란이 발생합니다.

제 "docker-compose.yml" 파일은 제 프로젝트의 소스 파일이기 때문에, "ssh docker-compose-f -" 파이프를 제 컴포지트 파일에서 할 것 같습니다.

다음은 "docker-compose.yml" 파일을 위해 함께 작성한 내용이지만, 저는 이를 전혀 검증하지 않았습니다.

version: '2'
services:
  estimator:
    image: tomcat-estimator2
    ports:
      - "8889:8080"
      - "445:443"
    volumes:
      - /etc/localtime:/etc/localtime
    depends_on:
      - db
    links:
      - db:db
  db:
    image:  mariadb:10.1.22
    ports:
      - "3307:3306"
    volumes:
      - /etc/localtime:/etc/localtime
      - /opt/app/estimator/databases/estimator/mysql:/var/lib/mysql  
  estimator-automation:
    image: tomcat-estimator2
    ports:
      - "8890:8080"
      - "446:443"
    volumes:
      - /etc/localtime:/etc/localtime
    depends_on:
      - db-automation
    links:
      - db-automation:db
  db-automation:
    image:  mariadb:10.1.22
    ports:
      - "3308:3306"
    volumes:
      - /etc/localtime:/etc/localtime
      - /opt/app/estimator/databases/estimator-automation/mysql:/var/lib/mysql

포트 번호는 기존 응용 프로그램의 포트 번호와 1+입니다. 이 포트 번호는 제대로 작동할 것이라는 확신이 들 때까지 삭제하고 싶지 않습니다.

이에 대한 의견은 유용할 것입니다.

일반적으로 애플리케이션 실행에 필요한 리소스 지정과 같은 사용 사례는 대개 명령줄 매개 변수 또는 환경을 통해 전달하는 방법을 제공하여 처리됩니다(특히 도커 컨텍스트에서).이에 대한 자세한 내용은 12가지 요소 앱의 훌륭한 매니페스토, 특히 구성 섹션참조하십시오.

구체적인 문제에 대해서는 이 질문과 같이 Tomcat 구성에 이 정보를 주입할 수 있는 방법이 있을 것입니다.따라서 이미 서로 다른 포트에서 두 개의 데이터베이스 컨테이너를 실행하고 해당 연결 문자열을 두 개의 Tomcat 컨테이너에 전달하여 문제를 해결할 수 있습니다.

하지만 이것이 아직 완전한 해결책은 아닙니다.Tomcat 컨테이너와 데이터베이스의 조합을 하나의 배포로 생각하면 도커 가상 네트워크를 사용하여 데이터베이스의 포트를 외부에 게시하지 않고도 이러한 설정을 연결할 수 있습니다.두 있는 경우 하여 해당 할 수 할 수 .mydatabase:3306도커 가상 네트워크 내에서.이는 이러한 네임스페이스를 처리하고 전체 스택을 하나의 컴포지트 파일로 정의할 수 있는 도커 컴포지트와 같은 시스템을 사용할 때 특히 쉽습니다.파이썬 애플리케이션이 redis 인스턴스에 액세스할 때 정확히 이를 수행하는 시작을 확인하십시오.

마운트를 고유하게 바인딩할 수 있습니다.context.xml각각의 컨테이너에.-v선택.

호스트의 예:

$ mkdir /tmp/container
$ cd /tmp/container
$ vi container1_context.xml # Edit JDBC url
$ vi container2_context.xml # Edit JDBC url
$ docker run ... -v /tmp/container/container1_context.xml:<path/to/context.xml> tomcat
$ docker run ... -v /tmp/container/container2_context.xml:<path/to/context.xml> tomcat

언급URL : https://stackoverflow.com/questions/45925985/how-to-map-an-outgoing-host-port-from-a-container-to-a-different-port

반응형