멀티 프로젝트에서 라라독(Laradock) 사용

이 문서의 목적은 Laradock 을 설치한 로컬 도커환경에서, 복수의 라라벨 프로젝트간에 Guzzle/Curl 사용을 할 수 있도록 설정하는 것입니다. 사용자 환경은 Docker for Mac 18.03 이후 버전을 사용한다고 가정합니다. Laradock 의 기본적인 멀티 프로젝트 설정에 관련된 내용은 Laradock 공식문서의 Setup for Multiple Projects 편을 참고하여, 아래 폴더 구조로 멀티 프로젝트들을 구성합니다. Laradock 공식문서의 설명대로 설치한 경우, 각각의 서비스를 독립적으로 동작시키는 것에는 문제가 없으나, 복수의 라라벨 프로젝트 간에 서로 Guzzle/Curl 통신을 할 수가 없어서, 마이크로 서비스 구조로 만들어진 멀티 프로젝트간의 상호 API 호출은 불가능 합니다. 일단, 사용하려는 라라독 폴더 구조가 아래와 같다면,
+ laradock
+ project-1
+ project-2
맥의 /etc/hosts 파일 하단에, 필요한 도메인들의 주소를 localhost IP 주소로 추가합니다.
127.0.0.1  project-1.test
127.0.0.1  project-2.test
그런다음, 아래와 같이 두 서비스에서 필요한 모든 도커 컨테이너들을 실행합니다. (실제로는 이처럼 자주 사용하면서 복잡한 명령어의 경우 alias 로 설정해두면 좋겠죠.)
docker-compose up -d nginx php-fpm php-worker workspace mysql mongo redis beanstalkd beanstalkd-console elasticsearch kibana
정상적으로 설치가 되었다면, 프로젝트 1 (http://project-1.test) 및 프로젝트 2 (http://project-2.test) 에 모두 접속이 잘될 것입니다. 하지만, 아래의 명령을 이용해서 workspace 컨테이너에 들어간 다음,
docker-compose exec workspace bash
커맨드 라인에서 curl project-1.test 라고 입력하면, 안타깝게도 [curl] 7: Failed to connect to project-1.test port 80: Connection refused 라는 오류 메시지가 나고, 접속에 실패하는 걸 볼 수 있습니다. Docker for Mac 의 공식 문서를 보면, 18.03 이후 버전부터는 network access 가 가능한 컨테이너의 경우 host.docker.internal 라는 이름의 특별 DNS 레코드가 존재하는 걸 알 수 있는데, 이 레코드가 가리키는 IP 주소가 바로 그 컨테이너에서, 호스트 상의 다른 서비스로의 연결을 원할 때 사용해야하는 IP 주소입니다. 실제로 dig 명령을 사용해보면 192.168.65.2 처럼 Docker subnet 범위 안에 존재하는 하나의 IP 주소가 설정되어 있는 걸 알 수 있습니다. 이 주소는 고정 IP 주소가 아니라, 변동될 수 있는 IP 주소라고 합니다만, 한번 자동으로 설정된 이후, 매번 유동적으로 변동하는 것 같지는 않습니다. 위에서 언급했듯, workspace 컨테이너에 들어가서, 다음과 같이 설정된 IP 주소를 확인해 봅니다.
dig host.docker.internal
주) dig 명령은 기본 라라독의 workspace 컨테이너에 존재하지 않는 명령입니다. 따라서, workspace 의 Dockerfile 파일을 열고 적당한 곳에 아래와 같은 라인을 추가한 다음, workspace 컨테이너를 다시 리빌드하면 사용할 수 있습니다.
USER root
RUN apt-get -y install dnsutils
workspace 컨테이너 리빌드는 다음 명령을 사용합니다. (완전히 이미지 다운로드부터 시작하려면 –no-cache 옵션을 추가합니다.)
docker-compose build workspace
이런식으로 자신의 도커 환경에 설정된, 호스트 IP 주소를 확인했다면, 다음과 같이 docker-compose.yml 파일의 마지막 위치에 아래의 라인을 추가합니다.
HOST_IP_ADDRESS=192.168.65.2
(위의 192.168.65.2 라는 IP주소 값은 각자의 환경마다 다를 수 있습니다.) 이제 남은 작업은, 호스트 상의 다른 서비스로의 접근이 필요한 컨테이너들의 /etc/hosts 파일에 바로 이전에 HOST_IP_ADDRESS 로 지정한 주소를 추가하는 일입니다. docker-compose.yml 안에 각각의 컨테이너 정의 부분이 있는데, 필요한 컨테이너 정의 부분에 extra_hosts 옵션값을 추가하면 됩니다. 예를 들어, PHP Worker 정의 부분은 기본적으로 아래와 같지만
### PHP Worker ############################################
    php-worker:
      build:
        context: ./php-worker
        args:
          - PHP_VERSION=${PHP_VERSION}
          - INSTALL_PGSQL=${PHP_WORKER_INSTALL_PGSQL}
      volumes:
        - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}
        - ./php-worker/supervisord.d:/etc/supervisord.d
      depends_on:
        - workspace
      extra_hosts:
        - "dockerhost:${DOCKER_HOST_IP}"
      networks:
        - backend
위의 내용을 아래와 같이 수정합니다.
### PHP Worker ############################################
    php-worker:
      build:
        context: ./php-worker
        args:
          - PHP_VERSION=${PHP_VERSION}
          - INSTALL_PGSQL=${PHP_WORKER_INSTALL_PGSQL}
      volumes:
        - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}
        - ./php-worker/supervisord.d:/etc/supervisord.d
      depends_on:
        - workspace
      extra_hosts:
        - "dockerhost:${DOCKER_HOST_IP}"
        - "project-1.test:${HOST_IP_ADDRESS}"
        - "project-2.test:${HOST_IP_ADDRESS}"
      networks:
        - backend
저같은 경우에는, workspace, php-fpm, php-worker 이렇게 3개 컨테이너의 extra_hosts 옵션을 동일하게 변경하였는데, 각자 사용환경 조건에 따라 적당히 변경하면 되겠죠. 라라독의 기본 네트웍 드라이버 설정은 bridge 네트웍 드라이버를 사용하고 frontendbackend 라고 명명되어 있습니다. 컨테이너 안에서 /sbin/ip route 명령을 쳐보면, 아래의 내용처럼 172.24.x.x172.25.x.x 대역 범위을 사용하며 172.24.0.1172.25.0.1 을 게이트웨이로 사용하여, 모든 아웃바운드 트래픽을 포워딩하는 걸 알 수 있습니다.
default via 172.25.0.1 dev eth0
172.24.0.0/16 dev eth1  proto kernel  scope link  src 172.24.0.2
172.25.0.0/16 dev eth0  proto kernel  scope link  src 172.25.0.2
하지만, HOST_IP_ADDRESS 에서 사용하는 192.168.x.x IP 주소와 다른 네트웍에 속해 있기 때문에, 호스트 상의 다른 서비스를 연결하기 위해서는 위와 같은 설정이 필요합니다.

Leave a Reply