Docker 정리

CHLEE·2023년 4월 13일
0

DevOps

목록 보기
11/24

컨테이너 방식의 장점

  1. 의존성 충돌 문제를 해결해 준다.
  • 프로세스, 네트워크, 파일시스템을 각각 독립적으로 소유하고 관리.
  1. 개발과 배포 환경을 일치시킨다.
  • OS에 상관없이 즉시 애플리케이션 실행 환경을 만들 수 있다.
  • 개발을 컨테이너 위에서 진행할 경우, 모든 개발팀이 동일한 환경 하에 개발을 진행할 수 있다. → 배포 또한 실질적으로 동일한 방식이므로 서버에 컨테이너에 담긴 애플리케이션을 실행하는 방식으로 서비스를 제공
  1. 수평 확장을 쉽게 하고, 각 서버에 새로운 내용을 배포하기 쉽게 만들어 준다.

    실행 환경의 일치

Docker 핵심 키워드

컨테이너는 애플리케이션이 의존성, 네트워크 환경, 파일 시스템에 구애받지 않고, 도커라는 기술 위에 실행될 수 있도록 만든 애플리케이션 상자이다.

이미지는 애플리케이션 및 애플리케이션 구성을 함께 담아놓은 템플릿으로, 이를 이용해 즉시 컨테이너를 만들 수 있다. 이미지를 이용해 여러 개의 컨테이너를 생성할 수 있어 애플리케이션의 수평 확장이 가능하다. 이미지는 기본 이미지(base image)로부터 (마치 git을 사용하는 것처럼) 변경 사항을 추가/커밋해서 또 다른 이미지를 만들 수도 있다.

레지스트리는 이미지가 저장되는 곳이다. 대표적인 이미지 레지스트리로는 Docker Hub, Amazon ECR이 있다. 도커 CLI에서 이미지를 이용해 컨테이너를 생성할 때, 호스트 컴퓨터에 이미지가 존재하지 않는다면, 기본 레지스트리로부터 다운로드 받게 된다.(Pull)

컨테이너와 VM 비교

Docker CLI

Docker docs : https://docs.docker.com/engine/reference/commandline/container_run/

  • 사용법 : Docker CLI, Docker-Compose CLI, API Reference
  • 환경 및 빌드 파일 구성 : DockerFile, Docker-Compose File
  • Registry_Acount/Repository_Name:Tag
    • 레지스트리 : 도커이미지를 관리하는 공간
    • 레포지토리 : 레지스트리 내에 도커 이미지가 저장되는 공간
    • 태그 : 해당 이미지를 설명하는 버전 정보를 주로 입력(없으면 latest 태그를 붙인 이미지를 가져옴)
docker image pull docker/whalesay:latest
# 레지스트리에서 이미지 혹은 레포지토리를 가져옴(pull)
docker container run --name 컨테이너_이름 [IMAGE] [COMMAND] [ARG...]
# 컨테이너_이름을 이름으로 갖는 컨테이너를 실행
# 이미지 -> 컨테이너
# -it : -i, -t를 동시에 사용한 옵션. 사용자와 컨테이너 간에 인터렉션이 필요할 때 사용.
docker container ps -a
# 모든 컨테이너의 리스트를 출력
docker container rm 컨테이너_이름
# 컨테이너_이름이라는 컨테이너 삭제
docker image ls
# 이미지 리스트를 출력, 용량 확인
docker image rm 이미지_이름
# 이미지_이름이라는 이미지 삭제 (docker rmi도 같은 기능 수행)

로컬에 있는 파일과 도커 이미지를 연결하는 방법

  • CP(copy) : 호스트와 컨테이너 사이에 파일을 복사(Copy)
  • Volume : 호스트와 컨테이너 사이에 공간을 마운트(Mount)
docker container run --name 컨테이너_이름 -p 818:80 httpd
# httpd를 실행
# httpd(http daemon)은 Apache HTTP Server를 실행할 수 있는 오픈소스 웹 서버 소프트웨어
# -p : 로컬호스트의 포트와 컨테이너의 포트연결. 818포트가 로컬호스트의 포트이고, 80번은 컨테이너의 포트
# -d : 컨테이너를 백그라운드에서 실행.
docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/
# 로컬호스트에 있는 파일을 컨테이너에 복사하여 전달.
# httpd 는 /usr/local/apache2/htdocs/ 경로에 웹 서버와 관련된 파일들이 저장되어 있다면, 해당 파일을 기반으로 웹 서버가 실행됨.
docker exec -it 컨테이너_이름 bash
# 컨테이너 내부 터미널로 접속.

컨테이너를 이미지 파일로 변환

  • 이전에 작업했던 내용을 다시 한 번 수행하지 않아도 됨
  • 배포 및 관리에 유용
  1. 구동한 Docker Container를 이미지로 만드는 방법
# docker container commit 명령어 이용
docker container commit 컨테이너_이름 이미지_이름
# docker images로 확인 가능
  1. Docker Image 빌드를 위한 파일인 Dockerfile로 만드는 방법
FROM httpd:2.4 
# 베이스 이미지를 httpd:2.4 로 사용.
COPY ./ /usr/local/apache2/htdocs/ 
# 호스트의 현재 경로에 있는 파일을 생성할 이미지 /usr/local/apache2/htdocs/ 에 복사.
# --tag 는 name:tag 형식으로 이미지를 생성할 수 있다.
# 지정한 경로에 있는 Dockerfile을 찾아서 빌드.
docker build --tag 이미지_이름 . 
# "."을 명령어에 꼭 포함해야 됨!

docker-compose CLI

https://docs.docker.com/compose/reference/ - 두 개 이상의 Docker Image를 다루는 방법

docker-compose up
# docker-compose.yaml에 정의된 이미지를 컨테이너로 실행. -d 붙이면 컨테이너 백그라운드 실행.
docker-compose down
# docker-compose.yaml에 정의된 이미지를 이용해 실행된 컨테이너를 종료.
docker-compose up {특정 이미지}
# 특정 이미지만 컨테이너 실행

# 뭔가 바꾼 것을 적용하고 싶을 때
# docker compose build 후 docker compose up 을 실행

docker-compose.yaml

  • yaml, yml은 같은 확장자.
  • 하나의 docker-compose에서 관리되는 컨테이너끼리는 동일한 docker network에서 구동.
    • docker run 명령과 다르게 docker-compose 파일 안에서 기본 network가 사용.

Node.js 웹 앱의 컨테이너화 - node.js 앱을 컨테이너화(도커라이징)하는 방법

profile
🤗

0개의 댓글