TIL: Docker | 도커 기초 - 221211

Lumpen·2022년 12월 10일
0

TIL

목록 보기
200/242

도커

경량화 컨테이너 기반의 가상화 플랫폼으로
리눅스 응용 프로그램들을 프로세스 격리 기술을 사용해 실행, 관리한다

컨테이너

컨테이너란 소프트웨어를 실행하는 모든 것(코드, 런타임, 시스템 도구, 라이브러리 등)을
파일 시스템 안에 감싸 어떤 환경에서든 실행할 수 있도록 돕는다

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술로
기존의 가상화 방식인 OS 가상화가 아닌 프로세스를 격리하는 방식으로 동작한다

때문에 속도와 메모리 측면에서 큰 손해 없이 가상화가 가능하여 가볍고 빠르다

docker hub - 컨테이너 버전 관리

이미지

도커로 생성한 가상화 파일 및 설정을 이미지라고 부르고
실행중인 이미지를 컨테이너라고 부른다

클래스와 인스턴스 같은 느낌.. 프로그램과 프로세스 같은 느낌..

이미지는 상태값을 가지지 않고 변하지 않는다
컨테이너는 이미지를 실행한 상태로 추가되거나 변하는 값이 컨테이너에 저장된다

같은 이미지에서 여러개의 컨테이너를 생성할 수 있고,
컨테이너의 상태가 바뀌거나 삭제되어도 이미지는 변하지 않는다

설치

로컬에서 설치

brew install --cask docker

linux

curl -fsSL https://get.docker.com/ | sudo sh

사용

docker app (demon) 을 켜놓아야 사용 가능하다

프로젝트 폴더 최 상단에 Dockerfile 생성 후
파일 내부에 컨테이너를 구성할 환경과 명령어 등의 정보를 작성한다

Dockerfile

FROM node: 16.15.1-alpine AS builder // 경량화 된 node version 설치 빌더로 사용
WROKDIR /app/test/client // 컨테이너 내부 경로 설정
COPY ./package*.json ./ // package.json, package-lock.json 을 가져와서 ./ 경로에 복사
RUN npm ci // 실행할 명령어
COPY ./ ./ // npm ci 로 생성된 것들을 전부 ./ 경로로 복사

CMD ["npm", "run", "start"] // 커멘드 명령어를 큰 따옴표 
// 빌드 코드를 작성한다면 빌드가 실행됨

FROM nginx
WORKDIR [경로]
COPY --from=builder [build 파일 경로] [nginx 경로]

프론트는 도커 컴포즈를 만들어서 실행하는 것이 좋다

도커 컴포즈

여러개의 애플리케이션이 서로 의존성을 가지고 있을 경우
컨테이너 또한 여러개가 필요하다
여러 컨테이너의 실행을 한 곳에서 관리하는 기술이 도커 컴포즈
yaml 포맷으로 작성된다

docker-compose.yml 파일을 작성

docker-compose.yml

version: '3' // 도커 컴포즈 3 버전이 안전하기 때문에 주로 사용한다
services:
	container_name: test_container // 컨테이너 이름 설정
	client:
		platform: linux/amd64 // 실리콘 맥 사용 시 - m1 이기 때문에 설정
		build:
			context: ./ // 어떤 환경에서 실행할 것인지 - ./ 로 전부 포함시킴
			dockerfile: ./Dockerfile
			ports:  // 포트 번호는 여러개 사용 가능
				- "3000: 3000"  // "input: outbound"
			stdin_open: true  // 라우터 작동을 열어둘 것인가에 대한 옵션
			restart: always // 예기치 못한 다운 시 재시작 여부
			volumes: 
				- /app/test/client/node_modules // 이미지 생성 시 제외할 폴더나 파일
				- ./:/app/test/client // local과 docker 이미지 실시간 연동 
															// (핫 리로딩 되지만 업데이트가 느려서 개발용으로 사용하긴 어렵다)
			depends_on: db // 아래의 db에 의존하게 만든다 - db 먼저 생성 후 client 생성
		
	db:  // 만들어져 있는 이미지 사용
			platform: linux/amd64
			container_name: db
			image: mysql:8.0.31
			restart: always
			ports:
				- "3306:3306"

파이썬 처럼 들여쓰기로 코드 블록을 구분하는듯 하다

docker-compose up -d --build // -d detection 모드로 컨테이너를 도커 라이징 - local
	// 공유하려면 docker hub 로 push 해야 함

docker ps // 실행중인 도커 컨테이너 확인 
docker images // 어떤 이미지가 있는지 확인
docker logs [이미지 이름] // 해당 이미지로 컨테이너 실행
docekr exec -it [경로] // 실행중인 컨테이너에 접속

컨테이너 실행 중지 및 삭제

docker-compose up -d --build // -d detection 모드로 컨테이너를 도커 라이징 - local
	// 공유하려면 docker hub 로 push 해야 함

docker ps // 실행중인 도커 컨테이너 확인 
docker images // 어떤 이미지가 있는지 확인

dockerizing on the react - https://velog.io/@songheechoi/Docker-react-nginx-Dockerizing-이용해-리액트-프로젝트-배포시도-1

nginX config 이름과 docker container client 이름이 일치해야 한다

profile
떠돌이 생활을 하는. 실업자는 아니지만, 부랑 생활을 하는

0개의 댓글