여러가지/Docker & AWS

[정리] Docker 전체 개념

15June 2024. 5. 30. 17:01

● 개념 

 

- 이미지 : 컨테이너 실행하기 위한 모든 파일 및 설정을 포함하는 템플릿

- 컨테이너 : 이미지를 실행한 상태로, 애플리케이션 및 해당 환경을 포함한 가상화된 독립 실행 환경

- 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 - 이미지

https://hub.docker.com/

 

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 서버