2017-02-22 9 views
2

두 개의 서로 다른 이미지를 기반으로 두 개의 도커 컨테이너를 만들었습니다. 하나는 db이고 다른 하나는 웹 서버입니다. 두 컨테이너 내 맥 OSX에서 실행됩니다.다른 컨테이너에서 도커 컨테이너에 액세스

호스트 컴퓨터에서 db 컨테이너에 액세스 할 수 있으며 호스트 컴퓨터에서 웹 서버에 액세스 할 때와 동일한 방식으로 액세스 할 수 있습니다.

그러나 웹 서버에서 db 연결에 액세스하려면 어떻게해야합니까?

내가 DB 컨테이너 시작 방법입니다

고정 표시기 실행 --name의 오라클 DB -p 1521 : -p 5501 1521 : 5500 오라클/데이터베이스 : 12.1.0.2 - EE 내가 WLS 컨테이너를 시작

7001 WLS-이미지 : : 1521/ORCLCDB

: 최신

내가/welcome1 @ // localhost를 스캇 SQLPLUS에 연결하여 호스트에서 DB에 접근 할 수 고정 표시기로 실행 --name 오라클 - WLS는 7001 -p으로 호스트의 wls에 액세스 할 수 있습니다.http://localhost:7001/console

+0

웹 컨테이너와 db 컨테이너가 모두 호스트 시스템에 있습니까? 그렇다면 사용하는 도커 버전은 무엇입니까? 이전 버전의 docker에는 한 가지 방법이 있었기 때문에 새 버전에는 다른 방식이 있습니다. 도커 작성 기능을 사용할 수 있습니까? 어느 것이 더 쉽게 만들지 만, 사용할 수없는 방법을 사용하여 답을주고 싶지 않습니다. – Caperneoignis

답변

1

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

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

https://deis.com/blog/2016/connecting-docker-containers-1/

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

예 :

당신은 DB 컨테이너 DB1 및 웹 서버 컨테이너 WEB0 이름

. 컨테이너는 모두 브리지 네트워크에 있어야합니다. 즉, 웹 컨테이너가 이름을 참조하여 DB 컨테이너에 연결할 수 있어야합니다.

귀하의 앱에 대한 웹 설정 파일이있는 경우 DB 호스트의 경우 DB1 이름을 사용하게됩니다.

이전 버전의 docker를 사용하는 경우 --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에 연결됩니다. 그러나, 내가 말한대로 - 링크 스위치는 곧 제거 될 것입니다.

대신 도커 작성 기능을 사용하면 네트워크를 구축 할 수 있습니다. 하나; 시스템에 대한 도커 작성을 다운로드해야합니다. https://docs.docker.com/compose/install/#prerequisites

예 설정은 다음과 같이이다 :

파일 이름이 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: "[email protected]" HTTP_PROXY: "${HTTP_PROXY}" HTTPS_PROXY: "${HTTPS_PROXY}" NO_PROXY: "${NO_PROXY}" db: image: postgres:9 environment: POSTGRES_USER: moodle POSTGRES_PASSWORD: "[email protected]" POSTGRES_DB: moodle HTTP_PROXY: "${HTTP_PROXY}" HTTPS_PROXY: "${HTTPS_PROXY}" NO_PROXY: "${NO_PROXY}"

이 네트워크에게 일반적인 이름을 이름을 것, 내가의 상단을 기억할 수없는 내 --name 스위치를 사용하지 않는 한 해당 이름을 사용하십시오.

IE docker-compose --name setup1 up base.yml

참고 : --name 스위치를 사용하는 경우, 당신이 이제까지 고정 표시기의 작성을 호출 할 때 그것을 사용해야합니다, 그래서 docker-compose --name setup1 down이있다 그래서 당신은 웹 서버 및 DB의 두 개 이상의 인스턴스를 가질 수 있습니다, 이 경우 도커 작성은 명령을 실행할 인스턴스를 알고 있습니다. 한 번에 한 번 이상 실행하도록 설정할 수도 있습니다. 동일한 서버에서 동시에 테스트를 실행하는 경우 CI/CD에 적합합니다.

도커는 고정 표시기와 같은 명령이 구성 그래서 docker-compose --name setup1 exec webserver do_some_command

당신이 최대 명령에 추가 .yml 파일을 포함 할 수 단위 테스트에 대한 DB를 나 같은 뭔가를 변경하려는 경우 가장 좋은 부분이고, 비슷한 이름을 가진 항목을 덮어 씁니다. 키 => 값 대체라고 생각합니다.

예 :

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를 덮어 쓰게됩니다 호출합니다. 다른 설정으로. 각 컨테이너에서이 서비스에 연결해야하는 경우 서비스중인 이름 집합 (이 경우 webserver 및 db)을 사용합니다.

저는 이것이 실제로 귀하의 경우보다 유용한 설정이라고 생각합니다. 필요한 모든 변수를 yml 파일에 설정하고 시작할 필요가있을 때 docker 작성 명령을 실행하기 만하면됩니다. 그래서 더 시작하고 설정을 잊어 버려.

참고 : 컨테이너 -> 컨테이너 통신에 포트가 필요하지 않으므로 --port 명령을 사용하지 않았습니다. 호스트가 컨테이너 나 호스트 외부의 응용 프로그램에 연결되기를 원하는 경우에만 필요합니다. 포트를 공개하면 포트는 호스트가 허용하는 모든 통신에 열려 있습니다. 따라서 포트 80에서 웹을 노출하는 것은 실제 호스트에서 웹 서버를 시작하는 것과 동일하며 호스트가 허용하는 경우 외부 연결을 허용합니다. 또한 어떤 이유로 든 한 번에 하나의 웹 응용 프로그램을 실행하려는 경우 포트 80을 노출하면 해당 포트에서도 노출을 시도하면 추가 웹 응용 프로그램을 실행할 수 없습니다. 따라서 CI/CD의 경우 포트를 전혀 노출하지 않는 것이 가장 좋습니다. - 도커를 사용하여 --name 스위치를 사용하면 모든 컨테이너가 자체 네트워크에 있으므로 충돌은 발생하지 않습니다. 따라서 컨테이너의 컨테이너를 꽤 많이 가질 것입니다.

2

당신은 호스트 시스템의 IP를 통해 DB에 접근해야 할 것이다, 또는 당신이 localhost를 통해 액세스하려면 : 1521, 다음과 같은 웹 서버를 실행 -

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

See here

+0

호스트 컴퓨터의 ip가 실행중인 컴퓨터 컨테이너에 따라 변경되므로 실제 작동 방식은 어떻게됩니까? – Vik

+1

기계가 정적 IP 또는 DNS를 사용하는 경우에만 유효합니다. 그렇지 않으면 두 번째 방법을 사용하십시오. – xitter

+0

나는 이것에 문제가있는 것 같다. 내 정확한 실행 명령은 다음과 같습니다. docker run --name ora-tools-wls -it -p 7001 : 7001 orawls http : // localhost : 7001/console 으로이 컨테이너에서 실행중인 서버에 액세스 할 수있게합니다. 그러나 서버에서 db 액세스는 DB를 실행하는 다른 컨테이너에 도달하기 위해 정확한 ip가 필요합니다. 도커 실행 - 이름 ora-tools-wls -it -p 7001 : 7001 --network = "host"orawls 그런 다음 언급 한대로 서버가 로컬 호스트로 db에 액세스 할 수 있지만 액세스 할 수 있습니다 호스트 컴퓨터 브라우저의 서버가 실패합니다. – Vik

관련 문제