it-source

다른 컨테이너에서 도커 컨테이너 액세스

criticalcode 2023. 9. 18. 21:30
반응형

다른 컨테이너에서 도커 컨테이너 액세스

저는 두 개의 다른 이미지를 바탕으로 두 개의 도커 컨테이너를 만들었습니다.웹 서버용 DB와 다른 DB 중 하나입니다.두 컨테이너 모두 제 macosx에서 실행되고 있습니다.

나는 호스트 머신에서 db컨테이너에 접속할 수 있고 같은 방법으로 호스트 머신에서 웹서버에 접속할 수 있습니다.

그런데 웹서버에서 db 연결은 어떻게 해야 하나요?

제가 db컨테이너를 시작한 방법은

docker run --name oracle-db -p 1521:1521 -p 5501:5500 oracle/database:12.1.0.2-ee

저는 wls 컨테이너를 시작했습니다.

docker run --name oracle-wls -p 7001:7001 wls-image:latest

호스트에서 db에 접속할 수 있습니다.

sqlplus scott/welcome1@//localhost:1521/ORCLCDB

호스트에서 다음과 같이 wls에 액세스할 수 있습니다.

http://localhost:7001/console

쉬워요.실행 중인 컨테이너가 2개 이상 있는 경우 다음 단계를 완료합니다.

docker network create myNetwork
docker network connect myNetwork web1
docker network connect myNetwork web2

이제 당신은 web1에서 web2 컨테이너로 또는 그 반대로 연결합니다.

다음을 실행하여 찾을 수 있는 내부 네트워크 IP 주소를 사용합니다.

docker network inspect myNetwork

네트워크 브리지로 연결된 컨테이너에는 내부 IP 주소와 포트만 액세스할 수 있습니다.

를 들어, 가 다음과 같이할 때: 를 가 web1 과 합니다 되었다고 합니다 되었다고 과 가 를 docker run -p 80:8888 web1으로 포트 함) 및 (파일가 8888행에서myNetwork. 의 IP는 172.0.0.2이며, 할 수 . 웹2의 IP는 172.0.2입니다.curl 172.0.0.2:8888).

가장 쉬운 방법은 --link를 사용하는 것입니다. 그러나 새로운 버전의 도커는 이 기능에서 멀어지고 있으며 스위치는 곧 제거될 것입니다.

아래 링크는 두 개의 컨테이너를 연결하는 좋은 방법을 제공합니다.첨부 부분은 이미지에 항목을 추가하는 데 유용하므로 생략할 수 있습니다.

https://web.archive.org/web/20160310072132/https ://deis.com/blog/2016/connecting-docker-containers-1/

당신이 관심을 가지는 부분은 두 컨테이너 사이의 통신입니다.가장 쉬운 방법은 웹 서버 컨테이너에서 DB 컨테이너를 이름으로 참조하는 것입니다.

예:

은 db컨테이너의 을 "db"로 지었습니다.db1 컨테이너고버너너버de고rbr너 .web0브리지 네트워크에 . 즉, 웹이름을 컨테이너에 할 수 . 두 컨테이너 모두 브리지 네트워크에 있어야 합니다. 즉, 웹 컨테이너가 DB 컨테이너의 이름을 참조하여 DB 컨테이너에 연결할 수 있어야 합니다.

앱의 웹 이 있으면 의 경우 에 이 의 DB 입니다 할 을 입니다 할 을 의 에 db1.

이전 버전의 도커를 사용하는 경우 --link를 사용해야 합니다.

예:

1단계:docker run --name db1 oracle/database:12.1.0.2-ee

웹 앱을 시작할 때.용도:

2단계:docker run --name web0 --link db1 webapp/webapp:3.0

그리고 웹 앱은 DB와 연동될 것입니다.하지만 말씀드린 것처럼 --link 스위치는 곧 제거될 예정입니다.

대신 도커 컴포지트를 사용하면 네트워크를 구축할 수 있습니다.그러나 시스템용 도커 컴포지트를 다운로드해야 합니다.https://docs.docker.com/compose/install/ #필수 구성 요소

예제 설정은 다음과 같습니다.

은 입니다.base.yml

version: "2"
services:
  webserver:
    image: moodlehq/moodle-php-apache:7.1
    depends_on:
      - db
    volumes:
      - "/var/www/html:/var/www/html"
      - "/home/some_user/web/apache2_faildumps.conf:/etc/apache2/conf-enabled/apache2_faildumps.conf"
    environment:
      MOODLE_DOCKER_DBTYPE: pgsql
      MOODLE_DOCKER_DBNAME: moodle
      MOODLE_DOCKER_DBUSER: moodle
      MOODLE_DOCKER_DBPASS: "m@0dl3ing"
      HTTP_PROXY: "${HTTP_PROXY}"
      HTTPS_PROXY: "${HTTPS_PROXY}"
      NO_PROXY: "${NO_PROXY}"
  db:
    image: postgres:9
    environment:
      POSTGRES_USER: moodle
      POSTGRES_PASSWORD: "m@0dl3ing"
      POSTGRES_DB: moodle
      HTTP_PROXY: "${HTTP_PROXY}"
      HTTPS_PROXY: "${HTTPS_PROXY}"
      NO_PROXY: "${NO_PROXY}"

네트워크 이름을 일반 이름으로 지정합니다. --name 스위치를 사용하지 않는 한 그 이름이 무엇인지 머릿속으로 기억할 수 없습니다.

docker-compose --name setup1 up base.yml

스위치를 호출할 마다 이 를 사용해야 하므로 : --name 를 하는 를 할 마다 해야 를 해야 를 마다 를 할 docker-compose --name setup1 down웹 서버와 db 인스턴스를 둘 이상 가질 수 있으며, 이 경우 도커 구성은 명령어를 실행할 인스턴스를 알고 동시에 둘 이상 실행할 수 있습니다.동일한 서버에서 병렬로 테스트를 실행하는 경우 CI/CD에 적합합니다.

있으므로 Docker composition Docker 를 에 에 를 docker-compose --name setup1 exec webserver do_some_command

가장 좋은 점은 만약 당신이 유닛 테스트를 위해 db's 등을 변경하고 싶다면 up 명령에 .yml 파일을 추가로 포함할 수 있고 비슷한 이름을 가진 모든 항목을 덮어쓸 수 있다는 것입니다. key=>값 교체라고 생각합니다.

예:

db.yml

version: "2"
services:
  webserver:
    environment:
      MOODLE_DOCKER_DBTYPE: oci
      MOODLE_DOCKER_DBNAME: XE
  db:
    image: moodlehq/moodle-db-oracle

ㅇㅇ를 docker-compose --name setup1 up base.yml db.yml

이렇게 하면 다른 설정으로 db.를 덮어씁니다.각 컨테이너에서 이러한 서비스에 연결해야 할 경우 서비스 중에 설정된 이름(이 경우 웹 서버 및 db)을 사용합니다.

당신의 경우에는 이것이 더 유용한 설정이 될 수도 있다고 생각합니다.yml 파일에서 필요한 모든 변수를 설정하고 필요할 때 도커 작성 명령만 실행할 수 있기 때문입니다.그러니 좀 더 시작해보고 설정은 잊어버리세요.

: 하지는 사용하지 .--portcontainer->>container 포트를 가 없으므로.호스트를 컨테이너에 연결하거나 호스트 외부의 애플리케이션에 연결하려는 경우에만 필요합니다.포트를 노출하면 호스트가 허용하는 모든 통신에 포트가 열려 있습니다.따라서 포트 80에서 웹을 노출하는 것은 물리적 호스트에서 웹 서버를 시작하는 것과 같으며 호스트가 허용할 경우 외부 연결을 허용합니다.또한 어떤 이유로 한 번에 두 개 이상의 웹 앱을 실행하고자 하는 경우 포트 80을 노출하면 해당 포트에서도 노출을 시도할 경우 추가 웹 앱을 실행할 수 없습니다.따라서 CI/CD의 경우 포트를 노출하지 않는 것이 가장 좋으며, --name 스위치로 도커 구성을 사용하는 경우 모든 컨테이너가 자체 네트워크에 있으므로 충돌하지 않습니다.그래서 당신은 거의 용기를 가지고 있을 것입니다.

업데이트: 기능을 추가로 사용하고 Jenkins와 같은 CICD 프로그램에 대해 다른 사람들이 어떻게 수행했는지 확인한 후.네트워크 또한 실행 가능한 솔루션입니다.

예:

docker network create test_network

위의 명령어를 사용하면 다른 컨테이너도 첨부할 수 있는 "test_network"가 생성됩니다.그것으로 쉽게 만들어진 것.--network스위치 조작자

예:

docker run \
    --detach \
    --name db1 \
    --network test_network \
    -e MYSQL_ROOT_PASSWORD="${DBPASS}" \
    -e MYSQL_DATABASE="${DBNAME}" \
    -e MYSQL_USER="${DBUSER}" \
    -e MYSQL_PASSWORD="${DBPASS}" \
    --tmpfs /var/lib/mysql:rw \
    mysql:5

물론 프록시 네트워크 설정이 있는 경우에도 "-e" 또는 "--env-file" 스위치 문을 사용하여 해당 설정을 컨테이너에 전달해야 합니다.그래서 컨테이너는 인터넷과 통신할 수 있습니다.도커는 새로운 버전의 도커에서는 프록시 설정이 컨테이너에 흡수되어야 한다고 말하지만, 저는 여전히 그것들을 습관적인 행동으로 전달합니다.이것은 사라져가는 "--link" 스위치를 대체하는 것입니다.작성한 네트워크에 컨테이너가 연결된 후에도 컨테이너의 '이름'을 사용하여 다른 컨테이너의 해당 컨테이너를 참조할 수 있습니다. 그것은에면과다의다er 입니다.db1네트워크에 되어 있는지 모든 컨테이너가 동일한 네트워크에 연결되어 있는지 확인하기만 하면 됩니다.

CICD 파이프라인에서 네트워크를 사용하는 자세한 예는 다음 링크를 참조할 수 있습니다. https://git.in.moodle.com/integration/nightlyscripts/blob/master/runner/master/run.sh

이것은 Jenkins에서 Moodle의 대규모 통합 테스트를 위해 실행되는 스크립트이지만 아이디어/예제는 어디에서나 사용할 수 있습니다.이것이 다른 사람들에게 도움이 되었으면 좋겠습니다.

호스트 머신의 ip를 통해 db에 접속하거나 localhost:1521을 통해 접속하려면 다음과 같이 웹 서버를 실행해야 합니다.

docker run --net=host --name oracle-wls wls-image:latest

여기를 보시오

을 해서.docker-compose, 서비스는 기본적으로 상호간에 노출됩니다.문서.
다음과 같은 별칭을 지정할 수도 있습니다.

version: '2.1'
services:
  mongo:
    image: mongo:3.2.11
  redis:
    image: redis:3.2.10
  api:
    image: some-image
    depends_on:
      - mongo
      - solr
    links:
      - "mongo:mongo.openconceptlab.org"
      - "solr:solr.openconceptlab.org"
      - "some-service:some-alias"

지정된 이름으로 된 을 으로 하여 에 에 하여 으로 :mongo.openconceptlab.org위해서mongo이 경우에는

환경: 윈도우 10, 도커 데스크톱 버전 4.5.1

이름 사용 host.docker.internal컨테이너 내부에서 호스트 시스템에서 실행 중인 서비스에 액세스할 수 있습니다.

참조: https://docs.docker.com/desktop/windows/networking/ #사용 사례 및 해결 방법

나는 포스트그레를 운영합니다.하나의 컨테이너에 SQL이 있고 별도의 컨테이너에 내 앱이 있습니다.는 앱 을 ㅇㅇㅇ을 사용하도록 합니다.host.docker.internal호스트 이름으로 작동합니다.

예제 우리가 여기서 두 개의 컨테이너를 만드는 것을 고려해 보세요 PostgreSQL Server 및 pgadmin(PHPMyAdmin, SQL Studio, Workbench와 같은 서버에 액세스하는 경우).

enter image description here

노출포트

  1. PostgreSql --->5436
  2. Pgadmin --->5050

pgadmin 호스트 이름의 서버를 localhost로 추가한 후.연결 오류가 나타납니다.도커 컨테이너 pgadmin이 localhost를 시스템으로 받기 때문에 Postgre가 필요합니다.문제를 해결하기 위한 SQL IP입니다.

enter image description here

docker network create con
docker network connect con app1
docker network connect con app2

enter image description here

이 명령은 연결된 컨테이너 IP 주소 및 기타 세부 정보를 가져옵니다.

docker network inspect con

enter image description here

이제 네트워크 검사에 표시된 IP 주소를 확인할 수 있습니다.Postgres 컨테이너 IP를 선택합니다.이 IP를 통해 노출된 다른 포트에 액세스할 수 있습니다.여기 포스트그레 5432만 노출되어 있습니다.이제 호스트 이름을 컨테이너 ip로 설정하면 작동합니다.

기본 도커 네트워크를 사용할 수 있습니다.도커 네트워킹을 거치지 않으려면 다음 작업을 수행할 수 있습니다.

리소스의 도커 서브넷에 있는 IP 주소 복사>도커의 네트워크 Mac 환경설정: 도커 환경설정 스크린샷

스크린샷 링크를 보시면 알 수 있듯이 ip 주소는

192.168.65.0

컨테이너 구성 파일의 "localhost"를 "192.168.65.1"(즉, IP 주소 선택 + 1)로 바꾸기만 하면 됩니다.

컨테이너를 시작할 수 있으며 로컬 개발/테스트용으로 설정해야 합니다.

자세한 내용은 제 기사를 보실 수 있습니다: Connect Docker Containers the easy way

저의 경우, 브릿지가 제공하는 IP가 다른 컨테이너의 컨테이너에 대한 애플리케이션의 호스트 연결이 작동하지 않았습니다.

하지만 컨테이너 이름으로 작동합니다(제 스크린샷 참조).

따라서 컨테이너 이름으로 IP를 대체할 수 있습니다.

enter image description here

언급URL : https://stackoverflow.com/questions/42385977/accessing-a-docker-container-from-another-container

반응형