티스토리 뷰
리눅스 컨테이너
리눅스 커널을 공유하면서 프로세스를 격리된 환경에서 실행하는 기술이다.
이는 리눅스 네임 스페이스, 컨트롤 그룹, 루트 디렉토리 격리 등의 커널 기능을 활용하여 격리되어 실행되기 때문에 호스트 머신에서는 프로세스로 인식하지만 컨테이너 관점에서는 마치 독립적인 환경인것처럼 보인다.
하드웨어를 가상화하는 가상 머신과 달리 하이퍼바이저를 이용하여 여러개의 운영체제를 하나의 호스트에서 생성해서 사용하고 커널을 공유하는 방식이기 때문에 실행 속도가 빠르고, 성능상의 손실이 거의 없다.
리눅스 컨테이너의 종류
- 시스템 컨테이너 : 일반적으로 리눅스 init 프로세스 등을 사용해서 다수의 프로세스가 같은 환경을 공유하는 것을 목표로 한다. 대표적인 런타임으로는 LXC, LCD가 있다.
- 애플리케이션 컨테이너 : 단 하나의 프로세스만 실행한가는 점에서 확장이 쉽고 관리 요소가 거의 없다. 대표적인 런타임으로는 도커가 있다.
도커란?
컨테이너를 관리할 수 있게 해주는 컨테이너 런타임으로 오픈소스 프로젝트이다.
일반적으로 컨테이너를 생성하고 관리하는 주체인 도커 엔진 혹은 도커에 관련된 모든 프로젝트를 말한다.
도커 이미지와 컨테이너
도커 이미지는 컨테이너를 생성할 때 필요한 요소이며, 여러 계층으로 된 바이너리 파일로 존재한다.
도커 이미지 : 도커 컨테이너 = 1:N 관계이다.
"build" : Dockerfile → Docker Image
"run" : Docker Image → Docker Container
도커에서 사용하는 이미지의 이름은 기본적으로 아래의 형태로 구성된다.
저장소 이름/[이미지 이름]:[태그]
- 저장소 이름 : 이미지가 저장된 장소
- 이미지 이름 : 해당 이미지가 어떤 역할을 하는지 나타내며 필수로 설정해야 한다.
- 태그 : 이미지의 버전을 나타낸다.
도커 구성요소
- Docker Client : 도커를 설치하면 그것이 Client이며, build, pull, run 등의 도커 명령어를 수행한다.
- Docker Host : 도커가 띄워져있는 서버이며, 컨테이너와 이미지를 관리하게 된다.
- Docker daemon : 도커 엔진
- Registry : 외부 이미지 저장소
컨테이너는 왜 사용해야 할까?
운영하면서 눈송이 서버(서버들에 존재하는 상황이 달라지는 경우, 눈송이 결정체가 모두 다른 상황에 비유한 단어)가 만들어지게 된다.
이러한 서버의 상황을 일치시키기 위해서는 서버 운영을 기록해야한다.
도커 파일 == 서버 운영 기록 코드화
도커 이미지 == 도커파일+실행시점
도커 컨테이너 == 도커 이미지 + 환경변수
도커 이미지 빌드
Dockerfile
cat > Dockerfile <<EOF
# Use an official Node runtime as the parent image
FROM node:lts
# Set the working directory in the container to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Make the container's port 80 available to the outside world
EXPOSE 80
# Run app.js using node when the container launches
CMD ["node", "app.js"]
EOF
Dockerfile Build
Dockerfile로 Image를 생성하는 명령어 Dockerfile이 있는 디렉토리에서 실행해야 한다.
docker build -t [이미지 이름:tag] .
도커 컨테이너 실행
Docker Run
Image로 Container를 실행하는 명령어
docker run -p 4000:80 --name my-app -d node-app:0.1
기타 도커 명령어
//실행중인 컨테이너 확인
docker ps
[-a] : 실행하여 모든 컨테이너를 포함하여 모든 컨테이너 출력
//컨테이너 중지
$ docker stop [컨테이너 pid]
//컨테이너 삭제
$ docker rm [컨테이너 pid]
//컨테이너 로그 확인
$ docker logs [container id]
[-f] : 컨테이너가 실행 중일때 로그 출력을 확인하기 위해서 사용한다.
//컨테이너 상호작용
$ docker exec -it [container_id] bash
-it : psudo-tty를 할당하고 stdin을 열린 상태로 유지하여 컨테이너와 상호작용할 수 있도록 한다.
//컨테이너 메타 데이터 검토
docker inspect [container_id]
'ETC' 카테고리의 다른 글
Event Driven Architecture란? (0) | 2023.05.10 |
---|---|
MSA란? (0) | 2023.05.10 |
- Total
- Today
- Yesterday
- java
- JPA
- Hibernate
- CI와 CD의 차이
- network
- Route53
- 정렬
- aws
- DevOps
- 지연 대기열
- 트랜잭션
- EC2
- 영속성 컨텍스트
- 자바
- githubactions
- fetchcount()
- acm
- IAM
- CodeDeploy
- 프로그래머스
- persistencecontext
- 영속 상태
- appliationeventlistener
- springboot
- Spring
- Spring Boot
- LeetCode
- entitylisteners
- 네트워크
- CI/CD
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |