시작하세요! 도커/쿠버네티스의 내용을 공부하여 정리한 포스트입니다! 🌈
MySQL과 Wordpress, 그리고 도커 볼륨을 이용하여 데이터베이스와 웹 서버가 분리된 애플리케이션 컨테이너를 만드는 예제입니다.
MySQL 컨테이너 생성하기
docker run -d \ # 백그라운드로 도커 컨테이너 실행 (터미널에 띄우지 않음)
--name wordpressdb \ # 컨테이너 이름은 wordpressdb
-e MYSQL_ROOT_PASSWORD=password \ # 컨테이너에서 사용될 환경변수를 설정
-e MYSQL_DATABASE=wordpress \ # MYSQL_ROOT_PASSWORD와 MYSQL_DATABASE라는 환경변수가 컨테이너 내에 설정됨
mysql:5.7 # mysql 5.7 이미지로 컨테이너를 생성
Wordpress 컨테이너 생성하기
docker run -d \ # 백그라운드로 도커 컨테이너 실행
-e WORDPRESS_DB_HOST=mysql \ # 컨테이너에서 사용될 환경변수 설정
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \ # 컨테이너 이름은 wordpress
--link wordpressdb:mysql \ 이 컨테이너에서 wordpressdb라는 컨테이너에 접근할 때 mysql이라는 호스트 이름으로 참조할 수 있게 link
-p 80 \ # 호스트의 임의의 빈 포트를 컨테이너의 80번 포트와 bind
wordpress # wordpress 이미지로 컨테이너를 생성
위의 --link
옵션에 의해, 웹 서버 컨테이너(wordpress)에서 데이터베이스 컨테이너(wordpressdb)에 접근할 때, 데이터베이스 컨테이너의 IP를 모르더라도 mysql이라는 이름으로 참조할 수 있습니다.
단, --link로 연결한 컨테이너끼리는 의존성이 생기기 때문에 --link로 연결하려고 하는 컨테이너가 실행 중이 아니라면 이 컨테이너도 실행할 수 없습니다. 따라서 위와 같은 경우에는 데이터베이스 컨테이너인 wordpressdb가 먼저 실행 중이어야 웹 서버 컨테이너인 wordpress를 실행할 수 있는 것이죠!
그런데 --link 옵션은 현재 deprecated이므로, 대신 도커 브리지(bridge)를 사용하는 것을 권장합니다.
Output
도커 이미지는 read-only이고, 이미지를 이용해 생성한 컨테이너는 변경 사항만 별도로 저장하여 각 컨테이너의 정보를 보존합니다. 따라서 컨테이너를 삭제하면 컨테이너 계층에 저장되어 있던 데이터가 모두 사라져 복구할 수 없게 됩니다. 이를 방지하여 컨테이너의 데이터를 영속적(persistent) 데이터로 활용할 수 있는 방법은 다음과 같습니다.
도커 공식 홈페이지에서는 volume을 이용할 것을 적극 권장하고 있습니다. Volume의 장점은 다음과 같습니다!
도커 볼륨을 사용하는 방법은 다음과 같습니다.
docker run
시 -v
(--volume
) 옵션으로 호스트 볼륨을 컨테이너와 공유docker run
시 --volumes-from
옵션으로 볼륨을 사용하는 다른 컨테이너와 볼륨을 공유docker volume
명령어 활용다음 볼륨 예제를 통해 컨테이너 삭제 이후에도 데이터를 보존하는 방법을 알아봅시다.
MySQL 데이터베이스 컨테이너 생성하기
docker run -d \ # 컨테이너를 백그라운드에서 실행
--name wordpressdb_hostvolume \ # 컨테이너 이름은 wordpressdb_hostvolume
-e MYSQL_ROOT_PASSWORD=password \ # 컨테이너에서 사용할 환경변수 설정
-e MYSQL_DATABASE=wordpress \
-v ~/wordpress_db:/var/lib/mysql \ # 호스트의 ~/wordpress_db 디렉토리와 컨테이너의 /var/lib/mysql 디렉토리를 공유!
mysql:5.7
Wordpress 컨테이너 생성하기
docker run -d \ # 컨테이너를 백그라운드에서 실행
--name wordpress_hostvolume \ # 컨테이너 이름은 wordpress_hostvolume
-e WORDPRESS_DB_PASSWORD=password \ # 컨테이너에서 사용할 환경변수 설정
--link wordpressdb_hostvolume:mysql \ # 이 컨테이너에서 wordpressdb_hostvolume 컨테이너를 접근할 때 mysql이라는 호스트 이름으로 참조할 수 있습니다!
-p 80 \ # 호스트의 사용 가능한 임의의 포트와 컨테이너의 80번 포트를 bind
wordpress
볼륨 공유를 지정한 호스트 디렉토리를 살펴보면 MySQL 관련 파일이 설치되어 있는 것을 확인할 수 있습니다.
컨테이너를 모두 삭제한 후에도 호스트 볼륨에는 파일이 그대로 남아있습니다!
도커 이미지에 따라 컨테이너 내의 특정 경로에 파일이 이미 존재할 수 있습니다. 이때, 파일이 들어있는 컨테이너 내 경로와 호스트의 볼륨을 공유하는 경우, 컨테이너 내 해당 경로는 호스트 볼륨에 덮어 씌워집니다!
볼륨을 사용하는 두 번째 방법은 --volumes-from
옵션을 통해 이미 볼륨을 사용하는 컨테이너로부터 볼륨을 공유받는 것입니다.
동일한 컨테이너에 여러 컨테이너가 --volumes-from
옵션을 사용하여 공유할 수 있습니다. 이를 활용하여 호스트 볼륨을 공유하는 역할만을 담당하는 '볼륨 컨테이너'를 만들 수도 있습니다!
docker volume
명령어 활용# docker volume create --name <새로운 볼륨 이름>
docker volume create --name volume-test
컨테이너에서 이 볼륨을 활용할 때는 다음과 같이 명령어를 입력하면 됩니다.
docker run -it --name volume-container1 \ # 컨테이너 이름은 volume-container1
-v volume-test:/root \ # 도커 볼륨 volume-test를 컨테이너의 /root에 공유
ubuntu:14.04 # 사용할 도커 이미지는 ubuntu
volume-container1 생성 결과
이제 다른 컨테이너를 만들어 위에서 만든 볼륨을 공유해볼까요?
docker run -it --name volume-container2 \ # 컨테이너 이름은 volume-container2
-v volume-test:/root \ # 도커 볼륨 volume-test를 컨테이너의 /root에 공유
ubuntu:14.04 # 사용할 도커 이미지는 ubuntu
volume-container2 생성 결과
docker volume
으로 생성한 볼륨은 하나의 디렉토리에 상응하는 단위로, 도커 엔진에서 관리합니다. 도커 볼륨도 호스트 볼륨 공유와 마찬가지로 호스트에 데이터를 보존하는데, 파일이 실제로 어디에 저장되는지 사용자가 알 필요가 없으므로 더 간편합니다!
docker inspect
명령어로 볼륨 정보 보기
docker volume create
명령을 입력하지 않아도 -v
옵션으로 도커 볼륨을 생성할 수 있습니다.
docker run -it --name volume-auto \ # 생성할 컨테이너의 이름은 volume-auto
-v /root \ # 컨테이너의 /root 경로에 대한 볼륨을 자동으로 생성!
ubuntu:14.04
volume-auto 컨테이너 생성 전 volume list
volume-auto 컨테이너 생성 후 volume list
이름이 6861b4d98... 인 볼륨이 생성된 것을 확인할 수 있습니다.
docker container inspect volume-auto
로 컨테이너 정보 확인하기
Mounts > Source에서 6861b4d98...인 볼륨을 사용하고 있음을 확인할 수 있습니다.
docker volume prune
으로 사용하지 않는 볼륨 정리하기
데이터가 컨테이너 외부에 저장되고 컨테이너는 이 데이터로 동작하도록 설계하는 것을 stateless라고 하고, 반대로 컨테이너가 자체적으로 데이터를 가지고 있어서 상태가 있는 경우를 stateful이라고 합니다. Stateless 컨테이너가 삭제되어도 데이터가 보존되지만, statefule 컨테이너가 삭제되면 데이터를 잃으므로 stateless 컨테이너로 설계하는 것이 바람직합니다. 🌼