해당 글은 Inflearn(인프런) ‘비전공자도 이해할 수 있는 Docker 입문/실전' 강의를 토대로 작성되었습니다.
1. Docker Volume(도커 볼륨)
✅ 컨테이너가 가진 문제점
Docker를 활용하면 특정 프로그램을 컨테이너로 띄울 수 있다. 이 프로그램에 기능이 추가되면 새로운 이미지를 만들어서 컨테이너를 실행시켜야 한다. 이 때, Docker는 기존 컨테이너에서 변경된 부분을 수정하지 않고, 새로운 컨테이너를 만들어서 통째로 갈아끼우는 방식으로 교체를 한다.
이런 특징 때문에 기존 컨테이너를 새로운 컨테이너로 교체하면, 기존 컨테이너 내부에 있던 데이터도 같이 삭제된다. 만약 이 컨테이너가 MySQL을 실행시키는 컨테이너였다면 MySQL에 저장된 데이터도 같이 삭제 돼버린다.
따라서 컨테이너 내부에 저장된 데이터가 삭제되면 안 되는 경우에는 **볼륨(Volume)**이라는 개념을 활용해야 한다.
✅ Docker Volume(도커 볼륨)이란?
도커의 볼륨(Volume)이란 도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법이다. 볼륨(Volume)은 컨테이너 자체의 저장 공간을 사용하지 않고, 호스트 자체의 저장 공간을 공유해서 사용하는 형태이다.
해당 개념을 배우면서 궁금한 점이 있었다. 그럼 호스트 시스템에 따로 저장공간을 두면, 협업시 DB 데이터는 어떻게 공유할까?
1. 개발용 더미 데이터:
SQL 스크립트를 프로젝트에 포함
컨테이너 첫 실행 시 자동으로 더미 데이터 투입
2. 개발용 DB 덤프 파일 공유:
주기적으로 개발 DB 덤프를 만들어 공유
팀원들이 필요할 때 덤프 파일로 데이터 복원
3. 개발용 공용 DB 서버:
팀이 공유하는 개발용 DB 서버를 별도로 운영
로컬 개발 시 이 서버를 바라보도록 설정
위와 같은 방법으로 협업시 DB 데이터를 활용 및 공유한다.
✅ 볼륨(Volume)을 사용하는 명령어
docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]
- [호스트의 디렉토리 절대 경로]에 디렉토리가 이미 존재할 경우, 호스트의 디렉터리가 컨테이너의 디렉터리를 덮어씌운다.
- [호스트의 디렉토리 절대 경로]에 디렉토리가 존재하지 않을 경우, 호스트의 디렉터리 절대 경로에 디렉터리를 새로 만들고 컨테이너의 디렉터리에 있는 파일들을 호스트의 디렉터리로 복사해온다.
2. [실습] Docker로 MySQL 실행시켜보기
✅ Docker로 MySQL 실행시켜보기
1. MySQL 이미지를 바탕으로 컨테이너 실행시키기
mysql - Official Image | Docker Hub
Quick reference Supported tags and respective Dockerfile links 9.1.0, 9.1, 9, innovation, latest, 9.1.0-oraclelinux9, 9.1-oraclelinux9, 9-oraclelinux9, innovation-oraclelinux9, oraclelinux9, 9.1.0-oracle, 9.1-oracle, 9-oracle, innovation-oracle, oracle8
hub.docker.com
docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -d mysql
- 참고) docker pull 과정은 생략해도 상관없다. 왜냐하면 docker run mysql로 실행시켰을 때, 로컬에 이미지가 없으면 Dockerhub으로부터 MySQL 이미지를 알아서 다운받아서 실행시키기 때문이다.
- -e MYSQL_ROOT_PASSWORD=password123 : -e 옵션은 컨테이너의 환경 변수를 설정하는 옵션이다.
- Dockerhub의 MySQL 공식 문서를 보면 환경 변수로 MYSQL_ROOT_PASSWORD를 정해주어야만 정상적으로 컨테이너가 실행된다고 적혀져있다.
- 아래의 명령어로 컨테이너로 들어가서 환경 변수를 직접 눈으로 확인해보자.
docker exec -it [MySQL 컨테이너 ID] bash
echo $MYSQL_ROOT_PASSWORD # MYSQL_ROOT_PASSWORD라는 환경변수 값 출력
export # 설정되어 있는 모든 환경변수 출력
2. 컨테이너가 잘 실행되고 있는 지 체크
docker ps
3. 컨테이너 실행시킬 때 에러 없이 잘 실행됐는 지 로그 체크
docker logs [컨테이너 ID 또는 컨테이너명]
4. DBeaver에도 연결시켜보기
✅ MySQL 컨테이너에 직접 접속해보기
1. MySQL 컨테이너에 접속
docker exec -it [MySQL 컨테이너 ID] bash
2. 컨테이너에서 MySQL에 접근하기
mysql -u root -p
3. MySQL 접근에 성공했다면 데이터베이스 조회해보기
4. 데이터베이스 만들기
mysql> create database mydb;
mysql> show databases;
5. 컨테이너 종료 후 다시 생성해보기
# 컨테이너 종료
docker stop [MySQL 컨테이너 ID]
docker rm [MySQL 컨테이너 ID]
# 컨테이너 생성
docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -d mysql
docker exec -it [MySQL 컨테이너 ID] bash
mysql -u root -p
mysql> show databases; # 아까 생성한 데이터베이스가 없어진 걸 확인할 수 있다.
위 방식은 볼륨(Volume)을 활용하지 않고 MySQL 컨테이너를 띄웠다. 그래서 MySQL 컨테이너를 삭제함과 동시에 MySQL 내부에 저장되어 있던 데이터도 함께 삭제되어 없어졌다. 이를 방지하기 위해 볼륨(Volume)을 활용해 MySQL 컨테이너를 띄우는 방식에 대해 알아볼 것이다.
✅ 볼륨(Volume)을 활용해 MySQL 컨테이너 띄우기
1. MySQL 컨테이너 띄우기
cd /Users/jaeseong/Documents/Develop
mkdir docker-mysql # MySQL 데이터를 저장하고 싶은 폴더 만들기
# docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v {호스트의 절대경로}/mysql_data:/var/lib/mysql -d mysql
docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v /Users/jaeseong/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql -d mysql
pwd 명령어로 볼륨으로 사용하고자 하는 경로를 확인한 뒤 입력해주자.
- 윈도우의 경우 아래와 같이 경로가 작성될 수 있다.
# 예시
docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v C:/Users/jaeseong/js-mysql:/var/lib/mysql -d mysql
- 주의) mysql_data 디렉토리를 미리 만들어 놓으면 안 된다. 그래야 처음 이미지를 실행시킬 때 mysql 내부에 있는 /var/lib/mysql 파일들을 호스트 컴퓨터로 공유받을 수 있다. mysql_data 디렉토리를 미리 만들어놓을 경우, 기존 컨테이너의 /var/lib/mysql 파일들을 전부 삭제한 뒤에 mysql_data로 덮어씌워 버린다.
2. MySQL 컨테이너에 접속해서 데이터베이스 만들기
docker exec -it [MySQL 컨테이너 ID] bash
mysql -u root -p
mysql> show databases;
mysql> create database mydb;
mysql> show databases;
3. 컨테이너 종료 후 다시 생성해보기
# 컨테이너 종료
docker stop [MySQL 컨테이너 ID]
docker rm [MySQL 컨테이너 ID]
# 컨테이너 생성
docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -v /Users/jaeseong/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql -d mysql
docker exec -it [MySQL 컨테이너 ID] bash
mysql -u root -p
mysql> show databases; # 아까 생성한 데이터베이스가 그대로 존재하는 걸 확인할 수 있다.
✅ MySQL 컨테이너 삭제하고 다시 띄워보기
# 컨테이너 종료
docker stop [MySQL 컨테이너 ID]
docker rm [MySQL 컨테이너 ID]
# 비밀번호 바꿔서 컨테이너 생성
docker run -e MYSQL_ROOT_PASSWORD=pwd1234 -p 3306:3306 -v /Users/jaeseong/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql -d mysql
docker exec -it [MySQL 컨테이너 ID] bash
mysql -u root -p # 접속이 안 됨...
분명 MYSQL_ROOT_PASSWORD 값을 바꿔서 새로 컨테이너를 띄웠는데 비밀번호는 바뀌지 않은걸까? 이 부분 때문에 많은 분들이 헤맨다.
그 이유는 Volume으로 설정해둔 폴더에 이미 비밀번호 정보가 저장되버렸기 때문이다.
'Docker' 카테고리의 다른 글
Docker : Docker Compose를 활용해 컨테이너 관리하기 (0) | 2024.12.02 |
---|---|
Docker : Dockerfile 활용해 이미지 직접 만들기 (1) | 2024.12.02 |
Docker : [실습] Docker(Nginx 설치 및 실행) (0) | 2024.12.02 |
Docker : Docker CLI 익히기 (1) | 2024.12.02 |
Docker : Docker란? (0) | 2024.12.02 |