Docker를 이용해 컨테이너로 특정 프로그램을 띄워 사용중이라고 하자.
그런데 만약 이 프로그램에 기능이 추가가되었고, 새로운 이미지를 이 컨테이너에서 실행해야하는데
Docker는 기존 컨테이너에서 수정하는 것이 아니라 새로운 컨테이너를 만들어서 통째로 갈아끼우는 방식이 효율적이라고 생각한다.
docker run -v [호스트의 디렉토리 절대경로]:[컨테이너의 디렉토리 절대경로] [이미지명]:[태그명]
컨테이너를 수정하지 않고 새로 만든다. Why?!
Docker의 철학과 설계 방식에 의해...
이렇기 때문에 컨테이너를 수정하기보다 새로 만들 수 있도록 데이터를 컨테이너 외부(볼륨)에서 관리하는 것이 중요하다.
docker run -e MYSQL_ROOT_PASSWORD=password123 -d -p 3306:3306 mysql
-d MYSQL_ROOT_PASSWORD
요녀석은 뭐지?
docker hub에 mysql을 검색해보면 설명이 나와있다.
대충 해석하면 "이걸 사용하려면 비밀번호를 환경변수로 설정해라" 라는 의미이다.
docker exec -it ~ bash
환경변수로 설정한 비밀번호를 확인하려면
$MYSQL_ROOT_PASSWORD
$ <- 요녀석은 리눅스에서 환경변수를 호출할 때 사용된다.
컨테이너에 접속하고
docker exec -it ~ bash
mysql을 실행
mysql -u root -p
하면 비밀번호를 입력하라고 하는데 설정해둔 비밀번호를 입력하면 mysql에 접속해 명령어 사용이 가능하다.
여기에 mydb라는 새로운 db를 만들고
db가 생성되어있는 컨테이너를 삭제해보자
docker rm -f ~
그 다음은 위의 작업과 동일하게 새로운 컨테이너를 만들고 db를 확인해보면
아까 만들었던 db는 컨테이너 삭제와 함께 같이 삭제된 것을 확인할 수 있다.
-> 이것을 방지하기 위해 볼륨을 사용한다!
자신이 호스트의 저장하고자 하는 경로로 들어간다.
mkdir docker-mysql
: docker-mysql 이라는 이름의 폴더를 생성
docker run -e MYSQL_ROOT_PASSWORD=password123 -d -p 3306:3306 -v /Users/sangwoo/Documents/Develop/docker-mysql/mysql_data:/var/lib/mysql -d mysql
여기서 /Users/sangwoo/Documents/Develop/docker-mysql/mysql_data
이 부분은 호스트의 디렉토리 절대경로(파일 이름은 mysql_data),
/var/lib/mysql
이 부분은 컨테이너의 드렉토리 절대경로를 의미한다.
mysql_data 라는 폴더를 자동으로 생성하므로 터미널 명령어를 입력하고있는 경로의 위치는 /Users/sangwoo/Documents/Develop/docker-mysql
이어야 한다.
컨테이너의 디렉토리 절대경로는 어떻게 아느냐?!
이것 또한 docker hub에서 알려주고있다.
아래로 쭉 내리다보면
사진 맨 아래에 예시로 경로가 적혀있다.
전에 해봤던대로 컨테이너에 접속해
docker exec -it ~ bash
MySQL로 db를 생성해보자
mysql -u root -p
mydb라는 이름의 DB를 생성하고
mysql과 컨테이너에서 호스트로 나온 뒤 이 컨테이너를 날려보자
docker rm -f ~
이제 예상대로라면 다시 컨테이너를 만들었을 때 DB안에 mydb라는 이름의 데이터베이스가 존재해야한다.
위 과정을 동일하게 진행하여 컨테이너를 다시 생성해준 뒤 mysql에서 db를 확인해보면
오우 mydb를 새로 만들어주지 않았는데 살아있다.
주의! : Volume을 생성할 때 설정했던 password123 이라는 비밀번호는 Volume에 저장되는 것이므로 새로운 컨테이너를 다른 비밀번호로 설정하면 연동되지 않는다.
비밀번호를 변경하고싶다면 Volume이 저장되어있는 경로에 들어가 수정하거나 데이터를 지우면된다.