3. 컨테이너 애플리케이션 구축
by 코딩무비이번에는 애플리케이션을 구축하는 실습을 해보겠습니다.
먼저 시작하기에 앞서, 거의 대부분의 서비스들은 단일 프로그램으로 동작하지 않고 여러 컨테이너로 나누고 컨테이너당 애플리케이션 하나만 동작합니다
컨테이너당 애플리케이션 하나만 동작
- 컨테이너 간의 독립성 보장
- 애플리케이션의 버전관리, 소스 코드 모듈화 가능
- 도커의 철학(한 컨테이너에 프로세스 하나만 실행)
컨테이너 구축
docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80 \
wordpress
결과 확인
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee21612b6921 wordpress "docker-entrypoint.s…" 8 seconds ago Up 6 seconds 0.0.0.0:49157->80/tcp, :::49157->80/tcp wordpress
c3b69f803c98 mysql:5.7 "docker-entrypoint.s…" 13 seconds ago Up 12 seconds 3306/tcp, 33060/tcp wordpressdb
-p 옵션으로 80을 입력 결과 호스트의 포트 중 하나(49157)와 컨테이너의 80번 포트가 연결된 것을 확인
문제 발생 !
- 서버의 IP와 포트로 접속 시 무한 로딩 되는 현상 발생!
원인
- aws 서버에서 해당 포트에 대하여 인바운드 규칙에 추가하지 않아 접속이 불가능
해결
- aws의 보안그룹에 해당 포트를 추가
- 성공
자, 이 애플리케이션의 문제점은 무엇일까요???
정답은 현재 애플리케이션에서 데이터는 mysql 컨테이너 안에 저장되고 있습니다. 그런데 만약 mysql 컨테이너가 삭제될 시 그 안의 데이터베이스 정보 또한 삭제됩니다! 이를 방지하기 위하여 데이터를 영속적(Persistent) 데이터로 활용해봅시다
그중 대표적인 방법은 볼륨을 활용하는 겁니다
1. 호스트와 볼륨 공유
2. 볼륨 컨테이너 활용
3. 도커가 관리하는 볼륨 생성
1. 호스트와 볼륨 공유
(호스트 볼륨)
docker run -d \
--name wordpressdb_hostvolume \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7
-v을 이용하여 호스트의 /home/wordpress_db와 컨테이너의 /var/lib/mysql(mysql db 저장 디렉터리) 공유
docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress_hostvolume \
--link wordpressdb:mysql \
-p 80 \
wordpress
docker stop wordpressdb_hostvolume
docker rm wordpressdb_hostvolume
docker run -d \
--name wordpressdb_hostvolume \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7
- 성공 !!
db컨테이너를 삭제하고 다시 실행시켜도 db의 데이터가 남아있는 것을 확인할 수 있다. (호스트 볼륨을 통해 데이터를 영속적으로 보관하기 때문)
2. 볼륨 컨테이너
docker run -it --name volumes_from_container --volumes-from wordpressdb_hostvolume
앞서 생성한 wordrpessdb_hostvolume 컨테이너에서 볼륨을 공유 받음
root@ae433253f211:/# ls var/lib/
apt dpkg misc mysql pam systemd
mysql db가 저장되어있는 /var/lib 디렉터리에 mysql이 존재하는 것을 확인할 수 있습니다!
--volumes-from <컨테이너 이름> 옵션을 사용함으로써 볼륨을 공유해 사용할 수 있음
3. 도커 볼륨
docker volume create --name myvolume
myvolume
도커 볼륨 적용
docker run -it --name my_volume_1 \
-v myvolume:/root \
ubuntu:18.04
도커 볼륨 형식 - [볼륨의 이름] : [컨테이너의 공유 디렉터리]
이후 테스트하기 위한 파일 저장
echo hello, volume! >> /root/volume
도커 볼륨 적용후 확인
docker run -it --name my_volume_2 \
-v myvolume:/root \
ubuntu:18.04
테스트 파일 확인
root@cf5732c7cc0c:/# cat /root/volume
hello, volume!
도커 볼륨을 적용하여 디렉터리가 공유되고 있다는 것을 확인 가능
볼륨 리스트 확인
docker volume ls
도커 볼륨은 어디에 저장되어 있을까?
컨테이너와 공유하므로 호스트 어딘가에 저장되어 있는데 저장된 위치는 다음의 명령어로 확인할 수 있습니다.
docker inspect --type volume myvolume
결과
[
{
"CreatedAt": "2022-03-22T02:44:55Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
"Name": "myvolume",
"Options": {},
"Scope": "local"
}
]
/var/lib/docker/volumes/myvolume/_data/volume에 저장되어 있는 것을 확인할 수 있습니다.
cat /var/lib/docker/volumes/myvolume/_data/volume
결과
hello, volume!
사용되지 않는 도커 볼륨 삭제
docker volume prune
마무리
(statelss)
- 컨테이너가 아닌 외부에 데이터 저장
- 컨테이너는 그 데이터로 동작하도록 설계
- 컨테이너 자체는 상태가 없음
- 도커를 사용할 때 바람직한 설계(컨테이너가 삭제돼도 데이터는 보존되므로)
(stateful)
- 컨테이너가 데이터를 저장하는 설계
- 컨테이너 자체에서 데이터를 보관하므로 삭제 시 데이터도 같이 삭제
- 도커를 사용할 때 지양하는 방식
출처
시작하세요! 도커/쿠버네티스
'도커' 카테고리의 다른 글
aws cloudwatch (5) | 2022.04.14 |
---|---|
컨테이너 로깅 (6) | 2022.03.30 |
[Docker] 4. 도커 네트워크 (8) | 2022.03.24 |
2. 이미지, 컨테이너 (4) | 2022.03.21 |
[Docker] 1. 도커란? (1) | 2022.03.17 |
블로그의 정보
코딩무비
코딩무비