[정리] Docker 전체 개념
● 개념
- 이미지 : 컨테이너 실행하기 위한 모든 파일 및 설정을 포함하는 템플릿
- 컨테이너 : 이미지를 실행한 상태로, 애플리케이션 및 해당 환경을 포함한 가상화된 독립 실행 환경
- Dockerfile : 이미지 생성 스크립트 파일
- 네트워크
- 볼륨 : 데이터 저장
- 로그
- Docker Compose : 여러 컨테이너 정의 및 관리 (docker-compose.yml)
(ㄱ) 이미지
※ 컨테이너 실행 시 이미지 별도로 불러오지 않아도 된다.
1) 불러오기
# docker pull <-이미지->
ex) # docker pull nginx:latest
2) 빌드
# docker build .
# docker build -t <-이미지명->:[1/latest] .
-t : 이름:태그 지정
3) 전체 이미지 확인
# docker images
4) 구성 확인
# docker image inspect <-이미지ID->
5) 삭제
(a) 특정 이미지 삭제
# docker rmi <-이미지명/ID->
(b) 사용되지 않는 모든 이미지 삭제
# docker image prune
(+) 태그
[참고] Docker Hub - 이미지
Docker Hub Container Image Library | App Containerization
Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.
hub.docker.com
(ㄴ) 컨테이너
- Attached Mode 컨테이너
- Detached Mode 컨테이너
1) 실행
(a) 새로운 컨테이너 실행
# docker run -d <-이미지ID->
# docker run --name <-컨테이너명-> -d -p 3306:3308 <-이미지ID->
※ run으로 실행 시, 컨테이너는 기본으로 Attached Mode로 실행된다.
--name : 컨테이너 이름 지정
-d: 백그라운드 실행 (Detached Mode)
-p : 포트 매핑, 호스트 시스템 포트 번호:Docker 컨테이너 내부 포트 번호
-v : 볼륨, 호스트의 디렉토리를 컨테이너의 디렉토리로 마운트
--network : 네트워크 지정
--rm : 컨테이너 종료 시 자동 삭제
-e : 환경변수 설정 실행
-it : 터미널 모드 실행
--restart : 컨테이너 재시작 정책 설정
--cpus : CPU 개수 제한
--memory : 메모리 제한
--link : 다른 컨테이너와 연결
--hostname : 호트스 네임 설정
(b) 기존 컨테이너 재실행
# docker start <-컨테이너 이름/ID->...
2) 접속
(a) /bin/bash 접속
# docker exec -it <-컨테이너 이름/ID-> /bin/bash
(b) 특정 명령어 수행
# docker exec <-컨테이너 이름/ID-> <-명령어-> <-파일 및 디렉토리->
ex)
# docker exec hardcore_zhukovsky cat /test/test
# docker exec hardcore_zhukovsky ls /test
(c) 환경변수 출력
# docker exec <-컨테이너 이름/ID-> printenv
ex) docker exec hardcore_zhukovsky printenv
3) Detached Mode > Attached Mode 전환
※ 단, 주 프로세스에 연결되므로 사용 주의
# docker attach <-컨테이너 이름/ID->
※ start으로 실행 시, 컨테이너는 기본으로 Detached Mode로 실행된다.
-a : 포어그라운드 실행(Attached Mode)
4) 컨테이너 확인
# docker ps
# docker ps -a
-a : 전체 컨테이너 확인
5) 특정 컨테이너 삭제
# docker rm <-컨테이너명/ID->
6) 모든 컨테이너 삭제
# docker rm -f $(docker ps -aq)
● RUN vs CMD vs ENTRYPOINT
ㄱ. RUN
(실행 시점) 이미지 빌드
※ 이미지 빌드 과정에서 필요한 명령문을 수행, 주로 이미지 안에 특정 소프트웨어를 설치할 경우 사용한다.
ㄴ. ENTRYPOINT
(실행 시점) 컨테이너 실행
※ 컨테이너를 띄울 때 최초 실행 되어야하는 명령문일 경우 사용한다.
ㄷ. CMD
(실행 시점) 컨테이너 실행
※ 컨테이너를 띄울 때 변경할 수도 있는 명령문일 경우 사용한다.
단, 하나의 Dockerfile에 하나의 CMD 명령어 사용 가능
● 환경변수
※ Docker 파일에서 설정합니다.
[참고] https://uyijune15.tistory.com/213
[정리] 환경 변수 및 환경 변수 파일
(파일) Dockerfile-----------------------------------------------------------------------------------------------------------------------------------------------------------------FROM node:latestWORKDIR /appCOPY package.json /appRUN npm installCOPY . /app
uyijune15.tistory.com
● 빌드 인수
※ Docker 파일에서 설정합니다.
[참고] https://uyijune15.tistory.com/214
[정리] 빌드 인수
빌드 인수를 사용하면 하나의 Dockerfile을 사용하여 다양한 값을 주입하여 이미지를 생성할 수 있다. Step1. Dockerfile 생성(파일) Dockerfile------------------------------------------------------------------------------
uyijune15.tistory.com
(ㄷ) Dockerfile
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
FROM <-이미지->:<-태그-> # 베이스 이미지
WORKDIR <-경로-> # 작업 디렉토리
COPY <-로컬 시스템 경로-> <-컨테이너 내부 경로->
# Dockerfile이 위치한 로컬 시스템 > 컨테이너 내부 파일 및 디렉토리 복사
RUN <-명령어-> # 명령어 실행
ENV # 환경변수
EXPOSE <-포트-> # 컨테이너 외부 노출 포트
즉, 로컬 시스템과 소통하는 포트
※ server.js의 포트와 동일해야한다.
CMD ["<-명령어->", " <-명령어-> "] # 컨테이너 시작 시 실행 명령어
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
(ㄹ) 네트워크
1) 생성
# docker network create <-네트워크명->
2) 확인
# docker network ls
3) 삭제
# docker network rm <-네트워크명/ID->
(ㅁ) 볼륨
a) 종류
ㄱ. Anonymous Volume: 컨테이너가 존재하는 동안에만 존재
ㄴ. Named Volumes: 컨테이너가 삭제한 이후에도 존재
※ 컨테이너를 종료시킨 이후, 새로운 컨테이너를 생성 시 기존 데이터 유지 위해 사용한다.
※ 하나의 컨테이너에 종속되지 않는다.
즉, 여러 컨테이너에 연결할 수 있으므로, 컨테이너 간에 데이터를 공유하는 것이 가능하도록 한다.
1) 명명된 볼륨 생성
# docker volume create <-볼륨명->
# docker run -d -v <-볼륨명->:<-컨테이너 내부 경로-> <-이미지ID->
2) 확인
# docker volume ls
3) 구성 확인
# docker volume inspect <-볼륨명->
4) 삭제
(a) 특정 볼륨 삭제
# docker volume rm <-볼륨명->
(b) 사용되지 않는 모든 볼륨 삭제
# docker volume prune
b) 바인드 마운트
: 컨테이너와 로컬 시스템 간에 파일이나 디렉토리를 공유하는 방법
# docker run -d -v -v <-로컬 시스템 경로->:<-컨테이너 내부 경로-> <-이미지ID->
<-로컬 시스템 경로-> : $(pwd)
c) nodemon
: 파일 시스템을 감시하여 파일이 변경될 때마다 노드 서버를 다시 시작하는 패키지
※ 바인드 마운트와 함께 사용한다.
[참고] https://uyijune15.tistory.com/205
[정리] nodemon
Step 1. 파일 생성(파일) Dockerfile-------------------------------------------------------------------------------------FROM node:latestRUN npm install -g nodemon # nodemon 패키지 설치 WORKDIR /appCOPY package.json /appRUN npm installCOP
uyijune15.tistory.com
d. 읽기 전용
# docker run -v <-로컬 시스템 경로->:<-컨테이너 내부 경로->:ro <-이미지ID->
※ 바인드 마운트를 읽기 전용 볼륨으로 사용한다.
● .dockerignore
: COPY 명령으로 복사해서는 안되는 폴더와 파일 지정
-----------------------------------------
node_modules
Dockerfile
.git
-----------------------------------------
(ㅂ) 로그
# docker logs <-컨테이너명/ID->
# docker logs -f <-컨테이너명/ID->
-f : 포어그라운드
(ㅅ) Docker-Compose
: 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구
※ 컨테이너간의 볼륨, 네트워크 설정 가능하다.
----------------------------------------------------------------------------------
version: '3.8' # Compose 파일 버전
# 애플리케이션 서비스 정의
services:
service_name: # 서비스명
image: some_image # Docker 이미지
build: # Dockerfile 통해 이미지 빌드
context: ./path/to/context
ports:
- "3000:3000" # 로컬 시스템<-> 컨테이너 포트 매핑
environment: # 환경 변수
- NODE_ENV=development
volumes: # 로컬 시스템 <-> 컨테이너 볼륨 마운트
- ./host_path:/container_path
networks:
- network_name # 네트워크
# 사용자 정의 네트워크 설정
networks:
network_name:
driver: bridge
# 사용자 정의 볼륨 설정
volumes:
volume_name:
----------------------------------------------------------------------------------
(+) 삭제 방법
(+) 컨테이너 IP 부여 및 네트워크, 통신 등등
(+) 기존 컨테이너 사용하여 새로운 컨테이너 생성
(+)
ELK 구축
galeradb 구축
vpn 설정 실습
Prometheus & Grafana 실습
포트포워딩??
ssh 서버