
docker compose를 사용하기 전에 도커라는 컨테이너의 개념부터 이해하고 오는 것이 좋다. 간단히 도커에 대해서 이야기하자면 도커는 독립된 공간에서 시행되는 작은 컴퓨터라고 생각하면 좋다.
도커를 통해서 우리는 우분투를 설치할 수도 있고 MySQL, MongoDB, Redis, ... 다양한 애플리케이션을 설치하고 활용할 수 있다. 도커의 장점은 독립적으로 시행하기에 어느 환경에서도 사용할 수 있다. 이를테면, 백엔드 개발자 A와 B가 있다. A는 MySQL 서버를 자신의 로컬에 설치하여 사용하고 B는 RDS를 사용하여 개발을 진행하고 있다. 이 경우에, 코드는 깃허브로 공용으로 사용한다고 쳐도 결국 데이터베이스 마이그레이션이 필요해지고 서로가 개발한 것이 제대로 동작하지 않을 수 있게 되어버린다.
모두가 동일한 환경에서 테스트할 수 있도록 지원해주는 것이 도커라고 생각하면 편하다. 그러면 docker compose는 무엇일까? 위에서 도커에 대한 개념을 잠깐 설명해서 알 수 있겠지만 도커는 독립적이라고 했다. 그런데 데브옵스에서 이것저것 애플리케이션을 도커를 통해 추가하면 어떻게 될까? 정말 하나하나 일일이 찾아 수정해주고 하는 작업이 생길 수밖에 없다.
물론 이제 여기서는 설명하지 않았지만 Dockerfile이라고 하는 것도 있다. 하지만 Dockerfile도 결국 하나의 대상에서만 작용하기 때문에 여러 개의 도커를 한 번에 관리하기 위해서는 docker compose를 많이 사용한다.
docker compose 작성에 대해서는 구글링을 통해 yml 파일을 보고 따라하면서 그 감을 익히는 것이 좋다. 하지만 그 전에 도커를 통해 직접 이미지를 다운받고 우분투, MySQL, MongoDB, redis, ...등을 설치해본다음 이 스텝을 밟는 것을 추천하겠다.
윈도우에 Docker Desktop을 설치하고 docker compose를 통해 간단히 MySQL을 컨테이너로 독립적인 시행을 통해 사용하려고 하는 도중에 너무나도 많은 삽질을 했다. 같은 실수를 반복하지 않기 위해서 메모를 남겨두겠다.
# 1. 이미 쓰고 있는 포트를 썼다.
services:
database:
image: mysql:8.0
container_name: mysql-rdb
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: minishop
MYSQL_USER: admin
MYSQL_PASSWORD: 1234
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
겉보기에는 문제가 없다. 정확히는 3306번 포트를 사용하고 있지 않는 깨끗한 로컬이었다면 문제가 되지 않았을 것이다. 하지만 나는 이전에 3306번 포트로 MySQL을 설치해서 간단한 간이 프로젝트를 진행하려고 했던 적이 있다.
이로 인해서 내 로컬은 이미 3306번 포트를 사용하고 있던 중이었는데 내가 이 3306번 포트를 도커 내 컨테이너의 3306번 포트와 포트포워딩을 해버린 것이다. 그렇기 때문에 지속해서 내 로컬에 있는 minishop이라는 데이터베이스를 찾으려고 했고 이를 찾지 못해 에러가 발생했던 것이다.
포트 포워딩을 3306번이 아닌 다른 포트를 사용해서 도커의 3306번 포트와 다시 포워딩을 진행해 오류에서 탈출할 수 있었다.
# 2. 볼륨을 삭제하지 않았다.
위에서 보면 내 로컬 내에 볼륨을 지정해둔 상태이다. 나는 볼륨을 생각하지 않고 컨테이너를 중지 및 삭제하고 다시 재실행했는데 바뀐 것대로 적용되지 않았다.
다시 확인해보니 볼륨으로 인해서 내가 상태를 변경했지만 그것이 적용되지 않았던 것이다.
docker compose down -v
docker compose up -d
down -v를 통해서 볼륨을 초기화하고 다시 백그라운드 재실행을 통해서 해결할 수 있었다.
# 3. Public Key Retrieval is not allowed
MySQL 서버에 접속할 때 있어서 caching_sha2_password 또는 sha256_password와 같은 플러그인을 사용하는 계정이 public key를 제대로 가져오지 못해서 발생했다.
alter user 'admin'@'%' identified with mysql_native_password by '1234';
현재는 간단한 테스트이기 때문에 mysql_native_password 라는 구식 방식을 사용해서 해결했다. 원래대로라면 JDBC를 사용했을 때, allowPublicKeyRetrieval=true 값을 추가해서 해결했을 것이다.
'dev-ops > docker' 카테고리의 다른 글
| # docker & docker-compose (0) | 2025.11.23 |
|---|---|
| docker desktop for Window (0) | 2025.04.21 |