Notice
Recent Posts
Recent Comments
07-01 02:16
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

Byeol Lo

Docker - Container 본문

CICD/Docker

Docker - Container

알 수 없는 사용자 2024. 6. 9. 15:06

 Container는 특정된 논리적 영역을 말하는데, 어플리케이션이 동작하는데 필요한 resource를 끌어서 별도의 서버 처럼 동작하게 만드는 것이다. 필요한 요소로만 구성되어서 오버헤드가 적으며, docker 자체에서 container를 관리하기 때문에 편리하게 사용할 수 있다.

 

 여기서 이렇게 따로따로 container안에 application을 넣어서 동작시키도록 하면 각각이 독립된 환경, 격리된 환경으로 구성되어서 서로 영향을 끼치지 않고 동작하게 할 수 있는 것이다. 이때 Docker는 밑의 OS를 기반으로 하여 kernel을 일부 가져다 이용하여 OS 처럼 보여지게 끔 만든 애다. 그렇다면 여기에서는 Linux의 운영체제를 가져다가 다른 운영체제 처럼 쓸 수 있도록 만들 수 있다.

 

Docker Container

 Docker Container는 Container Layer와 Image Layer로 구성되어 있고, Image는 여러가지 형태로 레포지토리처럼 다른데서 가져올 수 있다. Image Layer에는 Read Only의 권한만 있고 이 Image가 Container로 올라갈 때, 최상단 레이어인 Container Layer가 추가되며 여기서 Read Write 전부가 가능한 계층에서 작업을 계속 할 수 있게 된다. 그래서 Image는 R/O이므로 수정이 안되기 때문에 Container 레벨에서 수정을 하고, 다른 동일한 환경의 container를 Image를 통해 다시 만들어서 간편하게 사용하자는 것이다. 여기서 Image 레이어는 다른 컨테이너와 공유를 하는 것이라고 볼 수도 있다(하지만 컨테이너 끼리는 공유 안됨).

 이렇게 container로 실행하게 한다면 장점으로는 동일한 Image Layer를 사용하여 container를 사용하기 때문에 여러 컨테이너를 띄워도 용량이 그만큼 차지하지 않으며, 자원을 적절히 할당하고, 조절할 수 있기 때문에 동일한 성능을 낼 수 있다.

 그래서 도커는 독립된 환경이기 때문에 컨테이너 밖에서는 접근이 불가하다. 그것을 감안하여 포트를 열어서 그 포트로 들어가게끔 만들 수 있다. 통신을 하기 위해서 -p $(host_port):$(container_port) 로 사용해서 쓸 수 있다. 이를 사용할 때 열은 포트가 중복되서 열리지 않도록 주의하자(같은 포트를 쓰는 다른 서비스가 없는지 보라는 것).

 

Docker Instructions

  • docker image: 다운받은 image 목록을 볼 수 있음
  • docker stop: container 정지
  • docker start: container 를 새로 시작
  • docker run: docker image를 내려받은 뒤에 컨테이너를 생성 및 실행
  • docker rm: container 삭제
  • docker ls: container 목록 출력
  • docker ps: 실행되고 있는 container의 목록을 볼 수 있음
  • docker cp: 컨테이너와 호스트 간의 파일 복사를 할 수 있음
  • docker commit: 컨테이너를 이미지로 변환
  • docker exec: 실행되고 있는 container의 process로 접속할 수 있음
  • docker restart: 꺼져 있는 container에 대해 재시작을 할 수 있음
  • docker import: 압축되어 있는 container를 import 하여 사용할 수 있음
  • docker export: 실행되고 있는 container를 압축시켜서 다른 곳에 올릴 수 있음
  • ...

정도만 알아도 잘 사용 가능하다

주요 옵션
--name: container 이름 지정
-p: port number
-v: volume size
-e: environmental variable
-d: background 실행 여부
-i: connects with container

 

Docker Image Instructions

  • docker image pull: Image 를 내려 받는다
  • docker image rm: Image를 삭제한다
  • docker image ls: 가지고 있는 image 목록을 출력한다.
  • docker image build: 이미지를 생성한다.

 

Docker Container 실습

내부 컴퓨터에서 ubuntu image를 받은 뒤 임의의 포트 번호로 열고, 내 컴퓨터에서 해당 포트 번호로 접속을 해보자. 필자는 /ROOT/back이라는 곳에 django project 파일을 올릴 것이다.

# /ROOT/back/Dockerfile

FROM python:3.12-slim

WORKDIR /back

COPY . ./

RUN pip install --no-cache-dir -r /back/requirements.txt
RUN python3 manage.py makemigrations
RUN python3 manage.py migrate

EXPOSE 8000

CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]

 Docker에서 기본으로 제공해주는 python:3.12-slim 을 사용하였고, 여기서 작업 디렉토리를 /back으로 설정해주었다. 그런 뒤 COPY를 통해 내 Dockerfile에 위치해 있는 모든 파일들을 image에서의 back 폴더에 저장을 한 뒤에 명시된 모듈들을 다 다운로드 받아준다. 그런 후에 docker한테 8000포트를 제공을 해준다는 의미로 EXPOSE 8000 을 해준다. 다 끝났으면 마지막으로 django 의 runserver 명령을 실행시킨다.

 그런 후에 docker image list를 치면 우리가 빌드한 image를 볼 수 있다.

docker image list

이제 올린 이미지를 container로 올리자.

docker run syd-back:0.1

그런 후에 docker ps를 치면 실행되고 있는 컨테이너가 보이며, 설정된 포트로 들어가기 위해 브라우저에서 0.0.0.0:8000으로 들어가면 접속이 된다.

docker ps

(여기서 name은 도커에서 알아서 지정해주는 랜덤 이름이다.)

루트 view function을 설정 안했기 때문에 당연히 안뜨는게 정상이다...

'CICD > Docker' 카테고리의 다른 글

Docker - Dockerfile  (0) 2024.06.15
Comments