우아한테크코스에서 웹과 db를 연동해야 하는 웹 체스 미션이 주어져서 도커를 사용하게 되었다.
도커(docker)는 애플리케이션을 편리하게 구축하고 배포할 수 있도록 기술들을 컨테이너로 관리하는 오픈 소스 플랫폼이다.
도커를 이용하면 사용자들의 로컬에 mysql이 깔려있지 않더라도 도커의 mysql을 이용하여 애플리케이션을 실행시킬 수 있으므로 환경에 구애받지 않고 편리하게 작동할 수 있게 해준다.
미션을 진행하면서 알게 된 도커 사용법을 간단하게 기록하려 한다.
docker desktop을 설치하자
아래 홈페이지에서 도커를 설치하자.
https://www.docker.com/get-started/
나는 맥북 m1을 이용중이었기 때문에 빨간 박스로 칠한 부분을 클릭해주었다.
docker 환경설정
프로젝트 폴더 내에 docker 폴더를 만들어주도록 하자.
cd docker
터미널에서 위 명령어를 입력해주어 docker 폴더로 들어가주도록 하자.
docker 폴더 내부에 docker-compose.yml을 만들어주고, mysql 연동을 위해 아래와 같이 입력해주자.
version: "3.9"
services:
db:
image: mysql:8.0.28
platform: linux/x86_64
restart: always
ports:
- "3306:3306" // mysql 기본 port
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: chess // database 이름
MYSQL_USER: user
MYSQL_PASSWORD: password
TZ: Asia/Seoul
volumes:
- ./db/mysql/data:/var/lib/mysql
- ./db/mysql/config:/etc/mysql/conf.d
- ./db/mysql/init:/docker-entrypoint-initdb.d
나는 chess 웹 미션을 진행중이었기 때문에 MYSQL_DATABASE 이름은 chess로 설정해주었다.
그리고 mysql을 연동해줄 예정이었기 때문에 mysql 기본 포트인 3306으로 설정해주었다.
만약 3306 포트를 이미 사용중이라면 13306:3306, 23306:3306과 같이 변경해주면 된다.
버전은 8.0.28 버전을 이용하였다.
docker 컨테이너에 서비스를 등록시키자.
도커를 실행하여 배포하기 전에, 먼저 mysql 폴더의 init 폴더를 생성해준 후, init.sql을 만들어주어 미리 테이블을 생성시켜주자.
도커 내 mysql의 테이블을 만들어주는 것이다.
참고로 config 폴더와 data 폴더는 무시하면 된다. 나중에 도커 컨테이너로 생성 및 실행하면 자동으로 생성되는 폴더들이다.
init.sql을 만들어주었다면, 이제 테이블들을 생성하고 애플리케이션을 실행시키기 위해 도커 컨테이너로 등록시켜주자.
// 도커에 서비스를 컨테이너로 생성 및 실행시켜주자
docker-compose -p {서비스명} up -d
// 도커 컨테이너 목록 확인 명령어
docker ps
// 이전에 도커에 등록됐었던 서비스를 컨테이너에서 삭제해주고 싶을 경우
docker-compose -p {서비스명} down
도커 컨테이너로 서비스를 등록시키기 위해선 up 명령어를 입력해주어야 한다.
docker 폴더로 이동 후, docker-compose -p {서비스명} up -d 명령어를 입력해주어 도커 컨테이너로 등록시켜주자.
등록시켜주면 도커가 알아서 서비스를 실행시켜준다.
등록 후에 docker ps 명령어로 서비스가 잘 등록됐는지 확인해주자.
등록해주었다면 mysql 폴더 밑에 config, data 폴더들이 자동으로 생성됐을 것이다.
data 폴더 아래에 굉장히 많은 파일들이 생성됐을 것이다. (1~2분 정도 소요)
만약, 위처럼 많은 파일들이 생성되지 않았다면 아직 준비중이라는 것과 같으므로 천천히 기다려보도록 하자.
+) data 폴더가 아무리 기다려도 정상적으로 생기지 않을 경우는 아래 그림처럼 docker-compose -p {서비스명} down 명령어로 삭제시킨 후 재등록해주자. (그 외에 mysql error 들이 발생할 경우에도 아래 절차를 진행!)
down할 때, mysql 내에 있는 data 폴더도 반드시 삭제해주도록 하자.
그래야 새로 컨테이너에 등록할 때 올바른 데이터 파일들이 제대로 생길 수 있다.
삭제한 이후에 다시 up 명령어를 위 내용을 참고해서 실행시켜 컨테이너에 등록시킨 후, data 폴더 파일들이 생성될 때까지 기다려주자.
등록한 컨테이너를 실행해주자
docker exec -it {서비스명의 name} bash
위 명령어를 입력해주어 컨테이너를 실행시켜주도록 하자.
exec은 execute의 줄임말이고, bash는 실행하라는 명령어이다.
주의할 점은, docker ps 명령어로 확인된 빨간 박스 안의 NAMES의 이름을 bash해주어야 한다는 점이다!
또 주의할 점은, docker 폴더 내부에서 위 명령어를 입력해주어야 한다는 점이다.
입력해준 후, 위 그림처럼 뜨면 성공이다.
mysql -u {mysql id} -p{mysql password}
// 또는 아래와 같이 입력
mysql -u {mysql id} -p
이제 mysql 을 실행시켜주면 제대로 작동될 것이다~
+) 아래와 같은 에러들이 발생할 수 있다.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
둘 다 data 폴더 내 파일들이 제대로 생성되지 않은 경우이다.
차분히 기다려보고 다시 mysql -u root -p 명령어를 입력해주면 제대로 실행될 것이다.
정말 오래 기다려도 실행되지 않는다면 위 내용을 참고해서 down 명령어로 컨테이너에서 삭제시켜주고 재등록해주자.
간단 요약
- docker-compose.yml, init.sql 생성!
- docker-compose -p {서비스명} up -d
- docker exec -it {서비스명의 name} bash
- mysql -u root -proot
로컬에 mysql 을 설치할 필요 없이, 도커로 행복코딩을 할 수 있다는 점이 만족스러웠다.
다만, 도커에 익숙하지 않았기 때문에 여러 에러들을 많이 겪었는데 (특히 1045...) down, up 명령어를 많이 입력한 덕분에 지금은 아예 외워버렸다.
나같은 사람이 또 생기질 않길 바라는 마음으로 환경세팅 포스팅을 올려본다~
'Infra > Docker' 카테고리의 다른 글
[Docker Hub] toomanyrequests: You have reached your pull rate limit 에러 해결 (0) | 2023.09.22 |
---|---|
[ERROR] Communications link failure (Docker + MySQL + Spring JdbcTemplate 연동 실패) 에러 해결 (0) | 2022.04.24 |