데이터베이스를 docker-compose로 구축하기(mysql, mongodb, redis) Setting Up Databases with Docker Compose (MySQL, MongoDB, Redis)
Docker는 인프라적인 요소들을 코드로 세팅 할 수 있는 가장 좋은 도구라고 생각한다. Docker를 사용해서 컴퓨터 내에 설치 하기 귀찮은(?) 데이터베이스들을 세팅 해 보려고 한다. 내 컴퓨터를 뭔가 더럽히고싶지 않은 생각에서 한번에 설치하고 깔끔하게 지울 수 있는 것을 찾다보니까 docker-compose로 설치를 하게 되었는데, 좀 더 많은 기능들이나 옵션들을 코드화 하는것은 사용 해 보면서 배워야겠다. 이 글은 M1 맥북을 사용하기 때문에 Docker에서 사용 하는 이미지의 버전이 조금 다를 수 있는데, 각자 환경에 알맞는 이미지를 사용 하면 될 것 같다.
Mysql
MySQL은 RDB 중 많이 사용하는 데이터베이스 중 하나이다. MySQL 기본설정과 변수들은 .env 파일에서 관리하는 docker-compose 를 작성 해 보았다.
version: "3"
services:
mysql-docker:
image: arm64v8/mariadb
ports:
- "3306:3306"
environment:
TZ: Asia/Seoul
MYSQL_ROOT_PASSWORD: qwerqwer123
MYSQL_DATABASE: paul
MYSQL_USER: paul
MYSQL_PASSWORD: qwerqwer123
container_name: "docker-mysql"
env_file: .mysql_env
volumes:
- /Users/wool/Database-docker/data/mysql:/var/lib/mysql
docker-compose.mysql.yml
- 서비스 이름을
mysql-docker로 지었다 - image는
arm64v8/mariadb를 사용했는데, 코드를 쓴 시점에서 mysql의 m1버전 이미지가 없었던 것으로 기억한다 - ports로 포트를 열어주었다
- environment라는 곳에 데이터베이스에서 인증과 관련 된 환경변수들을 작성했다
- env_file 도 동일하게 environment 안에 있는 내용들을 추가했는데, 둘중 하나만 작성 해 주어도 된다
- volumes을 사용해서 가상화컨테이너 내부와 나의 로컬의 저장소를 연동 해 주었다
- 실행 명령어는
docker-compose -f docker-compose.mysql.yml up -d - env_file 혹은 environment 둘 중 하나만 있어도 된다.
- 아래는 .mysql_env 파일 내애 작성 된 내용이다
# .mysql_env MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_ROOT_PASSWORD=qwerqwer123 MYSQL_DATABASE=paul MYSQL_USER=paul MYSQL_PASSWORD=qwerqwer123
MongoDB
version: "3"
services:
mongo-docker:
image: arm64v8/mongo
ports:
- "${MONGO_PORT}:27017"
volumes:
- /Users/wool/Database-docker/data/mongo:/data/db
container_name: "docker-mongodb"
env_file:
- .mongo_env
docker-compose.mongo.yml
- 마찬가지로, service 이름을
mongo-docker로 지었다 - image는 mongo에서 제공하는 arm64v8버전을 사용했다
- volumes 설정으로 로컬과 데이터를 연동할 수 있게 했다
- 실행 명령어는
docker-compose -f docker-compose.mongo.yml up -d - 여기서는 모든 환경변수를
.mongo_env에서 가져와서 사용하도록 했다MONGO_HOST=localhost MONGO_PORT=27017 MONGO_INITDB_ROOT_USERNAME=root MONGO_INITDB_ROOT_PASSWORD=qwerqwer123 MONGO_INITDB_DATABASE=mongo-test
Redis
version: "3"
services:
redis-docker:
image: redis:latest
command: redis-server --port 6379
container_name: "docker-redis"
labels:
- "name=redis"
- "mode=standalone"
volumes:
- /Users/wool/Database-docker/data/redis:/data
ports:
- 6379:6379
docker-compose.redis.yml
- Redis는 기본적으로 image에서 arm64v8를 지원한다
- command로, redis서버를 시작하게 해주었다. 레디스에 대한 여러가지 실행옵션이 있는데 여기에 적어주면 된다
- 실행 명령어는
docker-compose -f docker-compose.redis.yml up -d
한번에 모두 사용하기
위와같이 하나씩만 올려도 되지만, docker-compose으로 여러가지 컨테이너를 한번에 올릴 수 있기 때문에 같이 모아서 작성 해 보았다
version: "3"
services:
mysql-docker:
image: arm64v8/mariadb
ports:
- "3306:3306"
environment:
TZ: Asia/Seoul
MYSQL_ROOT_PASSWORD: qwerqwer123
MYSQL_DATABASE: paul
MYSQL_USER: paul
MYSQL_PASSWORD: qwerqwer123
container_name: "docker-mysql"
env_file: .mysql_env
volumes:
- /Users/wool/Database-docker/data/mysql:/var/lib/mysql
mongo-docker:
image: arm64v8/mongo
ports:
- "${MONGO_PORT}:27017"
volumes:
- /Users/wool/Database-docker/data/mongo:/data/db
container_name: "docker-mongodb"
env_file:
- .mongo_env
redis-docker:
image: redis:latest
command: redis-server --requirepass qwerqwer123 --port 6379
container_name: "docker-redis"
volumes:
- /Users/wool/Database-docker/data/redis:/data
labels:
- "name=redis"
- "mode=standalone"
ports:
- 6379:6379
- 각각 .env 파일들은 docker-compose와 동일한 위치에 놓고 사용했다
- 실행 명령어는
docker-compose -f docker-compose.yml up -d - 레디스와 몽고디비는 클러스터 구성을 해서 올리기도 하던데 요거는 조금 더 연구 해 봐야곘다
I think Docker is the best tool for setting up infrastructure elements as code. I’m going to use Docker to set up databases that are annoying to install directly on my computer. Looking for something I could install all at once and cleanly remove without wanting to mess up my computer, I ended up installing via docker-compose. I’ll need to learn more about codifying additional features and options as I use it. This post uses an M1 MacBook, so the Docker image versions might be slightly different. Use images appropriate for your environment.
Mysql
MySQL is one of the most widely used relational databases. I wrote a docker-compose that manages MySQL default settings and variables from a .env file.
version: "3"
services:
mysql-docker:
image: arm64v8/mariadb
ports:
- "3306:3306"
environment:
TZ: Asia/Seoul
MYSQL_ROOT_PASSWORD: qwerqwer123
MYSQL_DATABASE: paul
MYSQL_USER: paul
MYSQL_PASSWORD: qwerqwer123
container_name: "docker-mysql"
env_file: .mysql_env
volumes:
- /Users/wool/Database-docker/data/mysql:/var/lib/mysql
docker-compose.mysql.yml
- Named the service
mysql-docker - Used
arm64v8/mariadbfor the image because at the time of writing, there was no M1 version image for mysql - Opened ports with ports
- Wrote authentication-related environment variables for the database in environment
- Also added the same content in env_file as in environment, but you only need one of them
- Used volumes to sync the virtual container’s internal storage with my local storage
- Run command is
docker-compose -f docker-compose.mysql.yml up -d - Either env_file or environment is sufficient.
- Below is the content written in the .mysql_env file
# .mysql_env MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_ROOT_PASSWORD=qwerqwer123 MYSQL_DATABASE=paul MYSQL_USER=paul MYSQL_PASSWORD=qwerqwer123
MongoDB
version: "3"
services:
mongo-docker:
image: arm64v8/mongo
ports:
- "${MONGO_PORT}:27017"
volumes:
- /Users/wool/Database-docker/data/mongo:/data/db
container_name: "docker-mongodb"
env_file:
- .mongo_env
docker-compose.mongo.yml
- Similarly, named the service
mongo-docker - Used the arm64v8 version image provided by mongo
- Enabled data sync with local using volumes configuration
- Run command is
docker-compose -f docker-compose.mongo.yml up -d - Here, all environment variables are fetched from
.mongo_envMONGO_HOST=localhost MONGO_PORT=27017 MONGO_INITDB_ROOT_USERNAME=root MONGO_INITDB_ROOT_PASSWORD=qwerqwer123 MONGO_INITDB_DATABASE=mongo-test
Redis
version: "3"
services:
redis-docker:
image: redis:latest
command: redis-server --port 6379
container_name: "docker-redis"
labels:
- "name=redis"
- "mode=standalone"
volumes:
- /Users/wool/Database-docker/data/redis:/data
ports:
- 6379:6379
docker-compose.redis.yml
- Redis basically supports arm64v8 in its image
- Used command to start the redis server. There are various execution options for Redis that can be written here
- Run command is
docker-compose -f docker-compose.redis.yml up -d
Using All at Once
You can bring up each one individually as shown above, but since docker-compose allows bringing up multiple containers at once, I wrote them all together
version: "3"
services:
mysql-docker:
image: arm64v8/mariadb
ports:
- "3306:3306"
environment:
TZ: Asia/Seoul
MYSQL_ROOT_PASSWORD: qwerqwer123
MYSQL_DATABASE: paul
MYSQL_USER: paul
MYSQL_PASSWORD: qwerqwer123
container_name: "docker-mysql"
env_file: .mysql_env
volumes:
- /Users/wool/Database-docker/data/mysql:/var/lib/mysql
mongo-docker:
image: arm64v8/mongo
ports:
- "${MONGO_PORT}:27017"
volumes:
- /Users/wool/Database-docker/data/mongo:/data/db
container_name: "docker-mongodb"
env_file:
- .mongo_env
redis-docker:
image: redis:latest
command: redis-server --requirepass qwerqwer123 --port 6379
container_name: "docker-redis"
volumes:
- /Users/wool/Database-docker/data/redis:/data
labels:
- "name=redis"
- "mode=standalone"
ports:
- 6379:6379
- Each .env file is placed in the same location as docker-compose
- Run command is
docker-compose -f docker-compose.yml up -d - I’ve heard Redis and MongoDB can also be set up as clusters, which I need to research more
댓글남기기