기록
[MSA] 2. Docker Image, Container 본문

엔코아 플레이데이터(Encore Playdata) Backend 2기 백엔드 개발 부트캠프 (playdata.io)
백엔드 개발 부트캠프
백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.
playdata.io
1. Docker Image
도커 엔진에서 사용하는 기본 단위는 이미지와 컨테이너이며, 이 두가지가 도커 엔진의 핵심이라 볼 수 있다.
어플리케이션을 포장 및 전송하기 위해서 도커는 도커 이미지를 사용한다.
도커 이미지는 파일로 어플리케이션 실행에 필요한 환경을 포함하고, 컨테이너를 생성할 때 필요한 요소이다.
즉, 소스 코드, 라이브러리 등 응용 프로그램을 실행하는데 필요한 기타 파일을 포함하는 불변 파일이다.
때문에 도커 이미지는 읽기 전용이므로 스냅샷이라고도 하고, 특정 시점의 어플리케이션과 가상 환경을 나타낸다.
이렇게 일관성을 가지고 있기 때문에 개발자가 안정적이고 동일한 조건에서 어플리케이션을 테스트 할 수 있게 된다.
이미지는 템플릿일 뿐이므로 직접 시작하거나 실행할 수 없다.
컨테이너를 생성하면 쓰기 가능한 레이어가 immutable image(불변 이미지) 위에 추가된다.
즉, 이미지는 수정할 수 없지만 컨테이너는 수정이 가능하다.
때문에 컨테이너 환경을 실행할 때는 기본적으로 컨테이너 내부에 해당 파일 시스템(도커 이미지)의
읽기-쓰기 복사본을 만든다.
이렇게 하면 이미지 전체 복사본을 수정할 수 있는 컨테이너 레이어가 추가된다.

하나의 베이스 이미지에서 도커 이미지를 무제한으로 생성할 수 있다.
하지만 베이스 이미지는 수정이 불가능하기 때문에, 이미지의 초기 상태를 변경하고 기존 상태를 저장할 때마다 추가 레이어가 있는 새 템플릿을 만든다.
때문에 도커 이미지는 여러 개의 레이어로 구성될 수 있으며, 각각은 다르지만 이전 레이어에서 비롯된다.
이미지 계층은 컨테이너 계층을 사용하여, 가상 환경을 시작할 때, 추가된 읽기 전용 파일을 나타낸다.
* 이미지 다운로드 받기
1. docker pull nginx
2. docker pull nginx:stable
* 다운받은 이미지 확인
3. docker history nginx:stable
* 도커 이미지 생성
docker build -t=이미지이름 .
2. Docker Container
도커 컨테이너는 가상화 된 실행 환경으로, 컨테이너 내부에서 실행되는 환경을 표준화하여 응용 프로그램들이 동일한 환경에서 동작하게 하고, 다른사람들과의 공유도 단순화 해준다.
위에서 생성한 이미지로 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어있는 파일 시스템 및 격리 된 자원, 네트워크를 사용할 수 있는 독립적인 공간이 생성된다.
즉, 각각의 컨테이너 내에 이미지를 실행하기 위한 파일들이 격리되어 있어 컨테이너 끼리 서로 방해하지 않고, 독립적이다.

* 도커로 컨테이너 생성 예시
docker run -it (inter active) ubuntu:14.04
it 키워드를 쓰면, 생성과 동시에 컨테이너 내부로 들어가게 된다.
하지만 도커를 백그라운드에서 돌리는 케이스가 많기 때문에 해당 키워드를 안쓰는 경우도 많다.
또한, 일반적으로 컨테이너 내부는 root 권한을 준다.
왜냐하면 모종의 이유로 컨테이너가 망가져도 해당 컨테이너를 내렸다 올리면 정상화되기 때문이다.
* 도커를 종료하지 않고 컨테이너 빠져나오기
ctrl + p + q
* centos:7 로 컨테이너 생성, 이름지정
docker run -it --name mycentos centos:7
이렇게 이름을 주면, docker stop 같은 명령어를 name을 통해 사용가능하다.
이름을 직접 주지 않으면 도커가 임의로 이름을 생성해 사용하게 된다.
3. 도커를 통한 웹 서버 실행
* 웹 서버(HTTP) 실행 예시
docker run -it --name mywebserver -p 80:80 ubuntu:14.04
* 컨테이너 실행
docker start [도커이름 or 컨테이너ID]
* 생성되어 있는 컨테이너에 접근
docker exec -it [도커이름 or 컨테이너ID] /bin/bash
* 컨테이너 내부에서 서비스 실행
1. apt-get update
2. apt-get install apache2 -y (데몬 등록)
3. service apache2 start
이렇게 도커를 통해 포트를 연결하고, 컨테이너 내부에서 서비스를 실행하면 127.0.0.1 로 접속이 가능하다.

4. 도커를 통해 ssh 서버 생성
* ssh 서버 생성
docker run -it --name myserver -p 10000:22 ubuntu:14.04
-p 옵션을 통해 ssh의 기본포트인 22를 컨테이너 내에서 10000번 포트와 매칭시킨다.
즉, 밖에서 접속시에는 10000으로 접속한다면, 도커가 22번 포트와 연결해준다.
* 컨테이너 내부에서 서비스 실행
1. apt-get install openssh-server
2. service ssh start (데몬 등록)
3. adduser encore
위의 명령어를 실행 후 다른 wsl2 나 ubuntu를 키고 ssh encore@127.0.0.1 -p 10000을 통해
외부에서 접속이 가능하다.
이렇게 ssh 서버를 생성 후, 다른 ubuntu를 통해 외부에서 접속할 수 있다.
ssh [사용자계정]@127.0.0.1 -p 10000

5. 도커 명령어
| 명령어 | 실행 내용 |
| sudo docker ps | 실행중인 컨테이너 정보 보기 |
| sudo docker ps -a | 실행중인 컨테이너 + 종료한 컨테이너 정보 보기 |
| docker ps -a -q | 삭제한 도커 보기 |
| docker rm $(docker ps -a -q) | 컨테이너 id 값들을 환경변수에 담아 삭제요청 -> 일괄삭제 |
| docker start [도커이름 or 컨테이너ID] | 도커 실행 |
| docker stop [도커이름 or 컨테이너ID] | 실행중인 도커 종료 |
| ctrl + p + q | 도커를 종료하지 않고 컨테이너 빠져나오기 |
| cat /etc/issue | OS 버전 확인 |
6. 49일차 후기
도커를 구성하는 핵심인 이미지와 컨테이너는 도커에 의해 정의된 시스템의 일부로, 컨테이너가 존재하려면 이미지를 실행해야하는 반면, 이미지는 컨테이너 없이 존재할 수 없다.
따라서 컨테이너는 이미지에 종속되어 런타임 환경을 구성하고, 어플리케이션을 실행한다.
도커 이미지는 도커 컨테이너에서 코드를 실행하고, 이미지는 불변이기 때문에 실행 중인 컨테이너를 만들기 위해 도커 이미지에 쓰기 가능 계층을 추가한다.
때문에 동일한 도커 이미지를 활용해, 여러 컨테이너를 만들 수 있고 이를 이용해 개발, 운영 및 테스트 단순화를 할 수 있기 때문에 반드시 알아야하는 개념이라 생각한다.
'Bootcamp > MSA' 카테고리의 다른 글
| [MSA] 6. Docker 활용, SQL 예제 (0) | 2023.10.12 |
|---|---|
| [MSA] 5. Docker 활용, Compose (0) | 2023.10.11 |
| [MSA] 4. Docker 활용, Image Build (0) | 2023.10.10 |
| [MSA] 3. Network (1) | 2023.10.05 |
| [MSA] 1. Ubuntu, Docker (1) | 2023.09.26 |