1. Docker compose란?
Docker Compose는
Docker 컨테이너 애플리케이션을 정의, 실행 및 관리하기 위한 도구
입니다. Compose는 YAML 파일을 사용하여 여러 개의 도커 컨테이너를 정의하고 구성할 수 있으며, 이를 통해 멀티 컨테이너 애플리케이션의 배포와 관리를 단순화할 수 있습니다.Docker Compose를 사용하면 애플리케이션의 구성 요소(서비스)를 정의하고 이들 사이의 관계를 설정할 수 있습니다. 각 서비스는 독립적인 컨테이너로 실행되며, Compose는 이러한 컨테이너들 간의 네트워크 연결, 볼륨 마운트, 환경 변수 등을 관리합니다.
조금 어려운 말로 설명하는 정의는 이렇지만 간단히 말하면 다수의 컨테이너를 하나의 지시서에 설정하고, 관리할 수 있는 도구라고 할 수 있습니다. docker-compose.yml파일에 해당 컨테이너들에서 초기에 동작할 설정을 정리(빌드, 마운트 볼륨, 포트포워딩) 하고 실행시키면 컨테이너 네트워크 환경을 구축할 수 있습니다.
Docker compose 실행 시 컨테이너 동작 과정
2. APM 이란?
APM은
Apache, PHP, Mysql로 이루어진 환경
으로 처음 웹사이트 개발을 한다면 가장 많이 개발되었던 조합입니다. 각각의 역할은 다음과 같습니다.Apache2
- 웹 서버 소프트웨어로서, 클라이언트의 HTTP 요청을 처리하고 정적인 웹 페이지를 제공합니다.
- Apache2는 클라이언트에서 받은 요청을 PHP나 다른 서버 측 스크립트로 전달하여 동적인 컨텐츠를 생성합니다.
PHP
- 서버 측 스크립트 언어로, 웹 서버에서 실행되어 동적인 웹 페이지를 생성합니다.
- 데이터베이스와 상호 작용하고, 사용자 입력을 처리하며, 동적인 컨텐츠를 생성하여 클라이언트에게 제공합니다.
- Apache2와 함께 사용될 때, Apache2는 PHP 스크립트를 실행하고 그 결과를 클라이언트에게 반환합니다.
MySQL
- MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)입니다.
- MySQL은 데이터를 저장, 관리, 검색하기 위한 기능을 제공합니다.
- PHP와 함께 사용될 때, PHP는 MySQL 데이터베이스에 접속하여 데이터를 쿼리하고 조작할 수 있습니다.
3. Docker-compose.yml
Docker-compose는
docker-compose.yml
이라는 정의된 파일에 의하여 실행됩니다. 서비스, 볼륨, 네트워크 등등을 명시하고 해당 파일이 존재하는 디렉터리에서 docker-compose up
명령어를 사용하면 됩니다.예시로 APM 환경을 구축하는 Docker-compose.yml 파일을 준비하였습니다.
- 저는 추가적으로 phpmyadmin을 구성했습니다,
- 필요 없으신 분들은 phpmyadmin 부분을 지워주시면 됩니다.
+ Dockerfile
추가적으로 설정을 바꾸실 분들은 아래 설명을 보고 바꾸시면 됩니다.
Docker-compose.yml 작성 시 문법
구문 | 설명 |
version | Compose 파일 형식의 버전을 지정합니다. |
services | 응용 프로그램에서 실행할 서비스를 지정합니다. |
build | 서비스에 대한 빌드 구성을 지정합니다. |
image | 서비스에 사용할 이미지를 지정합니다. |
ports | 서비스가 노출할 포트를 지정합니다. |
volumes | 서비스에 마운트할 볼륨을 지정합니다. |
environment | 서비스에 대한 환경 변수를 지정합니다. |
command | 서비스에 대해 실행할 명령을 지정합니다. |
depends_on | 서비스에 대한 종속성을 지정합니다. |
networks | 서비스에 사용할 네트워크를 지정합니다. |
restart | 서비스에 대한 다시 시작 정책을 지정합니다. |
기본적으로 해당 명령어들을 알고 있다면 Docker-compose.yml을 작성할 수 있습니다.
그럼 컨테이너는 서로 어떻게 통신하나요?
Docker Compose에서 기본적으로 생성되는 bridge 네트워크로 통신합니다. 컨테이너는 각각의 IP 주소를 가지고 있지만 Compose는 기본적으로 컨테이너 이름으로 DNS(Domain Name System)를 구성하므로, 서비스 이름으로 컨테이너 간 통신을 할 수 있습니다. (
위에 있는 db, web등
) 이를 통해 하나의 컨테이너에서 다른 컨테이너로 요청을 보낼 때, 서비스 이름을 사용하여 요청할 수 있습니다.
하지만 사용자 정의 네트워크를 생성하여 각 서비스에 할당하는 것이 좋습니다. 이렇게 하면 컨테이너 간 통신이 더욱 안전하고 유연해지며, 서비스를 더욱 구조화하여 관리할 수 있습니다. 사용자 정의 네트워크를 생성하려면, Compose 파일에서 networks 항목을 추가하고 각 서비스에서 이 네트워크를 사용하도록 설정합니다.
♣ 사용자 정의 네트워크를 사용해서 네트워크를 구성한 모습
+) 팁
추가적으로 각각 컨테이너 별로 빌드를 수행하고 compose 할 수 있습니다.
- context는 경로를 의미합니다. dockerfile이 한 디렉터리에 두개 이상 있다면 dockerfile 이름을 명시해주어야 합니다.
주의사항
- yml파일 작성 시 문법이 조금만 틀려도 문제가 발생합니다.
- docker 포멧을 지원하는 에디터를 사용해서 스트레스를 줄이는걸 추천드립니다.