일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Class
- Operator
- descriptive statistics
- selenium
- 리눅스 기초
- BFS
- External Scheme
- preprocessing
- 리눅스 마스터 1급
- Mac
- Physical Scheme
- Entity
- Entity Set
- python
- 자바
- dbms
- 셀레니움
- Java
- Binary Search
- X.org
- systemd
- Reference Type
- Polymolphism
- 리눅스
- literal
- OOP
- Inheritance
- X윈도우
- Unity
- 백준
- Today
- Total
Byeol Lo
Docker - Container 본문
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 |
---|