코딩무비

3. 컨테이너 애플리케이션 구축

by 코딩무비
반응형

이번에는 애플리케이션을 구축하는 실습을 해보겠습니다.

 

먼저 시작하기에 앞서, 거의 대부분의 서비스들은 단일 프로그램으로 동작하지 않고 여러 컨테이너로 나누고 컨테이너당 애플리케이션 하나만 동작합니다

 

컨테이너당 애플리케이션 하나만 동작

 

 

장점
  • 컨테이너 간의 독립성 보장
  • 애플리케이션의 버전관리, 소스 코드 모듈화 가능
  • 도커의 철학(한 컨테이너에 프로세스 하나만 실행)

 

 

 

컨테이너 구축

데이터베이스 컨테이너
docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
wordpress 컨테이너
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

 

결과 확인

docker ps
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. 호스트와 볼륨 공유

 

db 컨테이너 생성
(호스트 볼륨)
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
워드프레스 글 생성
db 컨테이너 삭제 후 다시 생성
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

블로그의 정보

코딩무비

코딩무비

활동하기