가장 쉬운 방법은 --link를 사용하는 것이지만 최신 버전의 docker는 그로부터 멀어지고 있으며 실제로 스위치가 곧 제거 될 것입니다.
아래 링크는 두 개의 컨테이너를 연결하는 방법을 제공합니다. 이미지에 항목을 추가하는 데 유용한 방법이므로 첨부 부분을 건너 뛸 수 있습니다.
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에 연결됩니다. 그러나 내가 말했듯이 --link 스위치는 곧 제거됩니다.
대신 docker compose를 사용하여 네트워크를 구축합니다. 하나; 시스템 용 docker compose를 다운로드해야합니다. 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: "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 스위치를 사용하지 않는 한 그 이름이 무엇인지 기억할 수 없습니다.
IE docker-compose --name setup1 up base.yml
참고 : --name 스위치를 사용하는 경우 docker compose를 호출 할 때이 스위치를 사용해야합니다. docker-compose --name setup1 down
하나 이상의 웹 서버 및 db 인스턴스를 가질 수 있으며이 경우 docker compose가 어떤 인스턴스를 알고 있는지 확인합니다. 명령을 실행하려고합니다. 또한 한 번에 여러 개를 실행할 수 있습니다. 동일한 서버에서 병렬로 테스트를 실행하는 경우 CI / CD에 적합합니다.
Docker compose에는 docker와 동일한 명령이 있으므로 docker-compose --name setup1 exec webserver do_some_command
가장 중요한 부분은 단위 테스트를 위해 db 또는 이와 유사한 것을 변경하려는 경우 up 명령에 추가 .yml 파일을 포함 할 수 있으며 유사한 이름을 가진 항목을 덮어 쓸 수 있다는 것입니다. .
예:
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를 덮어 씁니다. 다른 설정으로. 각 컨테이너에서 이러한 서비스에 연결해야하는 경우 service 아래에 설정된 이름 (이 경우 webserver 및 db)을 사용합니다.
나는 이것이 실제로 귀하의 경우에 더 유용한 설정이라고 생각합니다. yml 파일에서 필요한 모든 변수를 설정할 수 있으므로 필요할 때 docker compose 명령을 실행하면됩니다. 그래서 더 시작하고 설정을 잊어 버리십시오.
참고 : 나는 --port
컨테이너-> 컨테이너 통신을 위해 포트를 노출 할 필요가 없기 때문입니다. 호스트가 컨테이너 또는 호스트 외부에서 애플리케이션에 연결하도록하려는 경우에만 필요합니다. 포트를 노출하면 호스트가 허용하는 모든 통신에 포트가 열려 있습니다. 따라서 포트 80에서 웹을 노출하는 것은 물리적 호스트에서 웹 서버를 시작하는 것과 동일하며 호스트가 허용하는 경우 외부 연결을 허용합니다. 또한 어떤 이유로 든 한 번에 하나 이상의 웹앱을 실행하려는 경우 포트 80을 노출하면 해당 포트에서도 노출을 시도 할 경우 추가 웹앱을 실행할 수 없습니다. 따라서 CI / CD의 경우 포트를 전혀 노출하지 않는 것이 가장 좋으며 docker compose를 --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"스위치 문을 사용하여 해당 설정을 컨테이너에 전달해야합니다. 따라서 컨테이너는 인터넷과 통신 할 수 있습니다. Docker는 프록시 설정이 최신 버전의 docker에서 컨테이너에 흡수되어야한다고 말합니다. 그러나 나는 여전히 그것들을 습관으로 전달합니다. 이것은 사라질 "--link"스위치를 대체합니다. 컨테이너가 생성 한 네트워크에 연결되면 컨테이너의 '이름'을 사용하여 다른 컨테이너에서 해당 컨테이너를 계속 참조 할 수 있습니다. 위의 예에 따라 db1
. 모든 컨테이너가 동일한 네트워크에 연결되어 있는지 확인하기 만하면됩니다.
cicd 파이프 라인에서 네트워크를 사용하는 자세한 예는 다음 링크를 참조하십시오.
https://git.in.moodle.com/integration/nightlyscripts/blob/master/runner/master/run.sh
Moodle에 대한 대규모 통합 테스트를 위해 Jenkins에서 실행되는 스크립트이지만 아이디어 / 예제는 어디에서나 사용할 수 있습니다. 이것이 다른 사람들에게 도움이되기를 바랍니다.