컨테이너의 Stateless
- 컨테이너는 상태 없음(Stateless) 이다. 컨테이너가 실행 된 후 발생하는 모든 변경 사항은 컨테이너 레이어에만 있으며 컨테이너가 종료되면 변경 사항이 모두 사라진다.
- 컨테이너는 Stateless하기 때문에 쉽게 개수를 증가시킬 수 있으며 다른 환경에서도 빠르게 배포할 수 있다.
- 소프트웨어의 버전 등 컨테이너의 상태 변경이 필요한 경우 새로운 버전의 이미지를 만들어서 배포한다
- 컨테이너는 상태가 없기 때문에 여러 대의 컨테이너를 여러 곳에 빠르개 배포할 수 있다.
- 클라우드 네이티브 환경에서는 MSA 아키텍처에 따라 서버의 개수가 매우 많아진다.
모던 애플리케이션의 요구사항을 충족시키기 위해 서버 관리 방법론이 변화했다.
- 전통적인 서버 방법론은 서버 한대를 중요하게 생각하는 Pet 방식이며 서버 한 대를 소중하게 케어합니다.
- 컨테이너를 활용한 서버 방법론은 Cattle 방식이며 서버를 빠르게 교체할 수 있으며 서버의 상태를 최대한 제거한다.
컨테이너의 특징
컨테이너의 이미지는 한번 지정된 후 변경되지 않는다. (불변성,Immutability)
새로운 설정이나 패치가 필요할 경우 새로운 이미지를 만들어야 한다.
컨테이너는 언제든지 새로운 컨테이너로 대체할 수 있다.
컨테이너는 어떤 호스트에서든 컨테이너를 실행할 수 있다.
컨테이너는 동일한 컨테이너를 여러개 쉽게 생성해서 트래픽에 대응할 수 있다.
장애가 발생한 경우 새로운 컨테이너를 빠르게 시작할 수 있다.
데이터를 영구적으로 저장하기 위해서는 데이터베이스 서버 사용이 필수이다.
상태가 없기 때문에 저장 및 공유가 필요한 데이터는 무조건 외부에 저장해야 한다.
사용자 세션 정보나 캐시 같은 정보를 캐시 서버나 쿠키를 통해 관리한다. (파일이나 메모리에 저장 X)
동일한 요청은 항상 동일한 결과를 제공해야 한다.
환경 변수나 구성 파일을 통해 설정을 외부에서 주입할 수 있어야 한다.
다양한 환경에서 컨테이너 이미지를 활용할 수 있다.
Docker Volume
컨테이너는 상태가 없기 때문에 재생성되면 데이터가 모두 삭제되고 그래서 영속성이 필요한 데이터를 저장할 공간이 필요하다.
그래서 도커는 이렇게 영속성이 필요한 데이터를 위해서 도커 Volume이라는 기능을 제공한다.
도커의 Volume 기능을 사용하면 컨테이너가 데이터를 외부에 저장하고 다른 컨테이너들과 공유할 수 있다.
여기서 컨테이너의 폴더를 Volume에 마운트 한다고 표현을 한다.
마운트는 컴퓨터의 특정 디렉토리를 외부 저장소와 연결한다는 것을 의미한다.
즉, 마운트는 특정 디렉토리를 외부 저장소로 대체 하는것을 의미한다.
컨테이너를 실행할 때 도커 볼륨을 마운트 하는 방법
1. 도커Volumes
위와 같이 하나의 컨테이너에 여러개의 볼륨을 마운트할 수도 있다.
실제로는 volumes라는 경로는 도커가 경로를 자동으로 관리하고 도커가 실행되는 가상 머신 안에서 저장되기 때문에 이 볼륨이 저장하는 경로에 사용자가 직접 접근하기는 어렵습니다.
2. 바인드 마운트
Bind Mount 기능을 사용하면 HostOS의 경로를 직접 지정할 수 있다.
실습 1 PostgresSQL
1. 볼륨 생성
docker volume create mydata
2. 볼륨 리스트 조회 및 상세 정보 조회
docker volume ls
docker volume inspect mydata
3. Postgres 컨테이너 생성 및 볼륨 연결, 컨테이너 상세 정보 조회
docker run -d --name my-postgres -e POSTGRES_PASSWORD=password -v mydata:/var/lib/postgresql/data postgres:13 docker container inspect my-postgres
4. 컨테이너에 DB 생성(mydb) 명령어 실행
docker exec -it my-postgres psql -U postgres -c "CREATE DATABASE mydb;"
5. 기존 컨테이너 제거 및 볼륨 상태 확인
docker rm -f my-postgres
docker volume ls
6. 새로운 Postgres 컨테이너 생성 및 기존 mydata 볼륨 연결
docker run -d --name my-postgres-2 -v mydata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=password postgres:13
7. mydb가 그대로 유지되어있는지 확인
docker exec -it my-postgres-2 psql -U postgres -c "\list"
8. 생성한 컨테이너 및 볼륨 삭제(사용중인 볼륨은 삭제 불가)
docker rm -f my-postgres-2
docker volume rm mydata
실습 2 Nginx
1. 폴더 생성 및 Nginx 컨테이너 생성 및 볼륨 연결
mkdir index && cd index
docker run -d -p 8000:80 --name my-nginx-a -v /Users/hyeonwoo/easydocker/index:/usr/share/nginx/html nginx docker run -d -p 8001:80 --name my-nginx-b -v /Users/hyeonwoo/easydocker/index:/usr/share/nginx/html nginx
2. 볼륨 리스트 조회 (조회되지 않아야 정상)
docker volume ls
3. localhost:8000, localhost:8001 접속 시도(에러)
4. 생성한 index 경로에 Hello Volume! 내용의 index.html 파일 생성
5. localhost:8000, localhost:8001 접속 하여 내용 확인
6. index.html 파일의 내용을 Bye Volume! 으로 수정
7. 생성한 컨테이너 삭제
docker rm -f my-nginx-a my-nginx-b
'SOPT 34기 서버파트 > Docker 스터디' 카테고리의 다른 글
도커 컴포즈(Docker Compose) (0) | 2024.06.25 |
---|---|
[Docker] 도커 실무에 적용하기 (0) | 2024.05.08 |
[Docker] 가상 네트워크 (0) | 2024.05.07 |
[Docker] 컨테이너 애플리케이션 구성 (0) | 2024.05.04 |
[Docker] 이미지 빌드와 Dockerfile (1) | 2024.04.28 |