본문 바로가기
Dev-ops/docker

Docker 간단 정리

by livemehere 2023. 2. 3.

Docker를 쓰는 진짜 이유

도커는 어떤 프로그램을 설치하고, 실행하는 것을 간편하게 하기 위해서 사용합니다.

가지고 있는 서버, 패키지버전, 운영체제 등 에 따라서 프로그램을 설치하는 과정중에 많은 차이와 에러가 발생합니다.

뿐만 아니라 설치과정도 복잡합니다.

도커는 이런 프로그램들을 이미지화 해서 간단히 설치하고, 여러 환경을 구성하기 편하게 도와줍니다.

Docker

컨테이너를 사용하여 응용프로그램을 더 쉽게 만들고 배포하고 실행할 수 있도록 설계된 도구이다.

컨테이너 기반의 오픈소스 가상화 플랫폼이며 생태계이다.

Container

컨테이너는 코드와 모든 종속성을 패키지화 하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어의 표준이다.

 Image

프로그램을 실행하는데 필요한 설정과 종속성을 모두 가지고 있다.

Flow 정리

1.docker run [이미지] : 컨테이너를 생성 + 실행

2.위 명령어는 도커 서버로 전송

3.토커 서버에 이미지가 캐시되어있는지 확인하고, 없으면 Docker Hub에서 다운받는다.

4.이미지는 파일이 스냅샷 되어있는 것을 컨테이너 하드 디스크에 올린다.

5.시작 커맨드를 실행하여 어플리케이션을 실행한다.

명령어 정리

docker ps # 활성 컨테이너
docker ps -a # 모든 컨테이너
docker ps -q # 모든 컨테이너 ID 출력
docker images # 저장된 이미지 목록
docker rmi 이미지 # 이미지 제거
docker system prune # 모든 사용중이지 않은 컨테이너, 캐시, 네트워크 삭제

docker exec [컨테이너id] [명령어] # 실행중인 컨테이너에서 명령어 전달
docker exec -it [컨테이너id] [명령어] # cli keep alive

docker volum rm `docker volume ls -q` # 모든 볼륨 삭제

  컨테이너의 생명주기 명령어

docker create # 이미지로 컨테이너 생성

docker start # 컨태이너 실행
docker start -a # attach 모드
docker start -d # dittach 모드
docker run # create + start -a

docker stop # Gracefully 하게 중지 (하던 작업 마무리하고)
docker kill # 즉시 중지
docker rm # 삭제 (실행중이 아닌 컨테이너만)

명령어 응용 명령어

전체 컨테이너 아이디를 가져와 일괄 실행 

docker start `docker ps -a -q`
docker stop `docker ps -a -q`
docker kill `docker ps -a -q`
docker rm `docker ps -a -q`

컨테이너 쉘에들어가는 보편적인 방법

docker exec -it [컨테이너id] sh # bash, zsh ..

Ctrl + D 빠져나오기

Dockerfile

도커 이미지를 만들기위한 설정 파일이며, 컨테이너가 해야할 일을 정의한 파일이다.

1.베이스 이미지 (OS) (파일 스냅샷)

2.명령어 (파일 스냅샷)

3.컨테이너 시작시 명령어

 

docker build . -t [태그명]

 

태그명 네이밍 컨벤션

-t [나의 도커아이디]/[원하는태그]:[버전]

Dockerfile node app 정석

프로그래밍에 정석, 정답같은게 어디있겠냐만은.. nodejs 공식 홈페이지의 권장사항이기도하고, 도커의 캐싱을 활용한 것입니다.

node 패키지의 종속성과 소스코드의 레이어를 분리함으로써 오래걸리는 빌드시간을 단축하는 방법입니다.

FROM node

WORKDIR ./app

COPY package*.json ./

RUN npm install

COPY . .

CMD ["npm","start"]

COPY 와 Volume 의 관계이해

COPY의 경우 호스트의 리소스를 컨테이너에 주입하기 위함이고

Volume은 컨테이너가 호스트의 리소스를 참조하기 위함입니다.

 

COPY를 통해서 소스코드를 함께 이미지화 한다면, 코드가 변경됬을 때 반영하기 위해서는 다시 이미지를 빌드해야 합니다.

하지만 자주 변할 것 같은 코드를 호스트에 두고, 컨테이너를 생성할 때 볼륨으로 연결해 준다면 호스트의 소스코드를 참조하기 때문에 수정된 코드를 반영하기 위해서 이미지를 다시 빌드하는 것이 아니라, 컨테이너를 재 실행해주면 됩니다.

 

예시)

docker run -p 8080:8080 -v /app/node_modules -v $(pwd):/app node-app-last

-v [컨테이너 내부 경로] : 볼륨 마운트에서 제외

-v [호스트경로]:[컨테이너 내부 경로] : 두가지 경로를 마운트

 

* 이렇게 소스코드만 볼륨을 연결하면, 재배포시 컨테이너를 다시 실행하기만 하면 된다.

Docker-compose

다중 컨테이너를 정의하고 실행하는 도구

 

* 아래 예시는 다중 컨테이너를 하나의 네트워크로 연결하여 서로의 이름을 호스트로 사용할 수 있도록 한 설정 입니다.( networks 는 생략해도 서로간 host 이름이로 접근할 수 있다. docker-compose 는 자동으로 하나의 네트워크를 생성한다)

* volume 을 생성하여, 컨테이너의 라이프사이클에 상관없이 호스트의 저장소에 데이터를 유지시킵니다.

version: "3"
services:
  redis-server:
    image: redis
    networks:
      - ll
    volumes:
      - redis_vol:/data

  node-app:
    build: .
    ports:
      - "8080:8080"
    networks:
      - ll

networks:
  ll:

volumes:
  redis_vol:

 

중요 키워드

image : docker-hub 상에 존재하는 이미지를 가져와 컨테이너를 만든다.

build : Dockerfile 로 빌드 후 컨테이너를 만든다.

명령어

docker-compose up -d # 이미지가 없을 경우만 빌드 후 실행
docker-compose up --build # 무조건 이미지 다시 빌드 후 실행

docker-compose down # 컨테이너 rm
반응형

'Dev-ops > docker' 카테고리의 다른 글

Docker-compose 로 Node App + DB 구축  (0) 2023.01.02