docker는 무엇이고 docker-compose는 무엇일까? 라는 고민은 회사에 스택을 직접 적용하면서 그것이 무엇인지에 대해서 공부는 할 수 있었습니다. 신입 시절 개발을 공부할 때, docker를 써서 뭘 했다와 같은 걸 들으면 그냥 필요해서 쓰는거구나 라고 생각했습니다. 시간이 흐르고 처음엔 그런게 있으니 써봐야지라는 것이 이걸 왜 쓸까? 라는 궁금증으로 변하게 되어 게시글을 작성하게 되었습니다.
1. docker
도커에 대해서 검색을 해보면 프로세스를 실행하는데 있어서 필요한 파일/환경만 담은 독립된 객체라고 생각하시면 됩니다. 이것이 이해하기 어럽다면 그냥 또 다른 컴퓨터 같은 느낌으로 생각하시면 될 것 같습니다. 물론 OS 커널이 존재하지 않기 때문에 컴퓨터라고 보기 어려운게 맞습니다만, 어떤 한 프로세스를 위한 독립적인 애 정도로 생각하시면 됩니다.
예를 들어서, 프로젝트를 진행함에 있어서 MySQL을 설치한다고 하면 처음에 대부분 로컬의 환경에 설치하고 이에 맞춰 환경변수를 작성하였을 것입니다. MySQL의 어떤 버전인진 모르지만 본인의 로컬 환경에서는 테스트가 아주 잘 이루어질 수 있겠지만 팀이 존재해 팀원이 이를 보려고 할 때는 또 각자가 다른 로컬의 환경에 이를 설치해서 실행시킬 것이고 버전 등이 다르다면 분명 문제가 있을 것입니다.
물론 결국 로컬의 환경에서 도커를 실행시키는 것 또한 공통되게 사용하지 않았다면 로컬에 설치한 것과 크게 다르지 않게 될 것입니다. 앞으로 작성해나갈 docker-compose, 현재 게시물에서는 다루지 않겠지만 Dockerfile 등을 사용해 같은 코드 저장소(git, ...)에서 사용한다면 그런 불상사는 없어지게 됩니다.
현재 저의 환경은 맥북으로 brew를 사용하고 있습니다. 윈도우 체제의 경우에는 공식 문서의 이미지 파일을 다운로드 받아 처리하는 것이 좋습니다. 과거에는 Window Home 버전일 경우에 설치가 어려웠던 기억이 있지만 이 부분에 대해서는 따로 다루지 않겠습니다.
brew install --cask docker
--cask를 통해 docker와 관련된 모든 파일들을 설치합니다. 이를 통해서 docker desktop 등이 자동으로 설치됩니다.

다음과 같이 로드되었다면 성공한 것입니다.
도커에 대해 리서치하며 알아가다보니 재밌는 부분이 많았습니다. 단순히 MySQL와 같은 프로세스들만 독립적으로 사용하는 거겠지라는 과거 제 생각이 틀렸음을 알게 되었습니다.
도커를 통해 서비스를 직접 띄울 수도 있고, nginx와 같은 인프라 시스템에서도 공통된 서버 환경을 조성할 수 있는 등등... 많은 부분에서 애용되고 있음을 확인하였습니다. 저의 경우에는 서버 한 대를 기용하여 사용하다보니 nginx 설정을 해당 우분투 서버 내에서만 처리해도 무방했었지만 규모가 큰 회사나 여러 클라우드 서버를 기용하는 곳은 인프라 설정에 대해서도 모두가 다른 것이 아닌 공통된 환경에 사용될 수 있게 필요하다는 것을 알 수 있었습니다.
2. docker-compose
docker에 짧게 알아볼 수 있었고 docker-compose에 대해 정리합니다. docker-compose는 여러 컨테이너로 이루어진 애플리케이션을 하나의 yml 파일로 정리하고, 명령어 하나로 실행 / 중지 / 관리를 할 수 있게 도와주는 도구입니다.
docker는 프로세스를 독립시킨 하나의 단일 객체라고 설명하였습니다. 만약 내가 MySQL을 도커로 띄우고 redis, mongoDB, ... 등등을 하나의 애플리케이션에 동작하고 이에 대한 각각의 프로세스를 실행시키려고 하면 일일이 하나하나 docker run 시켜야 할 것입니다. 하지만 이것은 가변적이기에 매 번 직접 실행시켜주는 건 도커의 장점을 무색화시키는 것이라 생각합니다.
docker-compose를 통해 하나의 yml 파일에서 각각의 프로세스를 정리하여 관리할 수 있게 됩니다. 현재는 redis와 MySQL 두 프로세스에 대해 compose yml 파일을 작성하고 이에 대해 직접 실행시켜보는 것까지 작성해보겠습니다.
docker-compose의 작성에 대해서는 정말 많은 방법이 있습니다. 하나의 yml 파일에 프로세스 별로 적어서 관리, Dockerfile로 관리, ... 많은 방법들이 있지만 제가 선택할 방법은 하나의 공통된 yml 파일을 두고 개발과 운영을 병합해서 사용하는 방식으로 진행하겠습니다.
services:
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: 1234
volumes:
- mysql_data:/var/lib/mysql
redis:
container_name: shop_redis
image: redis:7
volumes:
- redis_data:/data
volumes:
mysql_data:
redis_data:
기본적인 docker-compose.yml을 다음과 같이 작성하였습니다. redis는 개발 / 운영을 모두 공통된 것을 사용하고 mysql은 개발과 운영을 나누어서 사용할 예정입니다.
services:
mysql:
container_name: mysql_dev
environment:
MYSQL_USER: admin
MYSQL_PASSWORD: 12345678
MYSQL_DATABASE: shop_dev
restart: always
ports:
- '10216:3306'
docker-compose.dev.yml 파일입니다. 원래는 비밀번호 등도 환경변수 파일에 따로 관리하는 것이 맞으나 단순 연습이기에 따로 작성하지는 않은 점에 대해 양해를 부탁드립니다. 컨테이너는 3306번 포트로 동일시하고 외부의 10216번 포트와 포트포워딩을 할 수 있도록 조정하였습니다.
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
다음과 같이 명령어를 실행합니다. 의미는 docker-compose.yml 파일과 docker-compose.dev.yml 파일을 병합하여 실행하는데 이는 백그라운드라는 의미입니다.

저는 테스트 단계에 있어서 이미 실행을 한 번 시켜 이미지가 생성되어있었기에 결과물이 다르게 보일 수도 있습니다만, 이미지 생성 과정의 로딩 과정이 보여질 것이니 신경쓰지 않아도 될 것 같습니다. 여기서 redis가 포트포워딩이 안된 것을 확인해 수정하려고 한다면 다음과 같이 진행하면 됩니다.
services:
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: 1234
volumes:
- mysql_data:/var/lib/mysql
redis:
container_name: shop_redis
image: redis:7
volumes:
- redis_data:/data
ports: // 여기
- '6379:6379'
volumes:
mysql_data:
redis_data:
먼저 redis 프로세스 부분에 ports를 추가하여 다음과 같이 작성합니다.

그리고 다시 실행시켜보면 포트 부분이 변한 것을 확인할 수 있습니다.

그렇다고 이미지가 추가되거나 하지는 않았습니다.
이렇게 docker-compose를 통해서 여러 컨테이너를 하나의 파일로 관리할 수 있게되어 동일한 환경에서의 개발을 가능해질 수 있습니다.
현재 사이드 프로젝트에 필요한 것만 추가해둔 상태인데 이후에는 nginx, mongoDB, 노드서버 등도 추가하여 관리하는 법을 기록할 예정입니다.
혹시나 잘 설치되었는지의 검증이 필요하면 docker logs나 직접 bash로 접근해 오류 잘되고 있는지 확인 또는 외부 프로그램(MySQL Workbench나 DBeaver) 등을 사용하여 확인해보는 것도 좋습니다.
'dev-ops > docker' 카테고리의 다른 글
| docker compose (0) | 2025.04.21 |
|---|---|
| docker desktop for Window (0) | 2025.04.21 |