도커는 너무 어려워요

 

도커는 너무 어려워요

우아한테크코스 Level2에서 배포하기라는 큰 산을 만났다. 가이드 대로 따라하면 동작하기는 했지만 명령어가 무슨 의미인지 모르고 진행하니 답답했다. 이번 포스팅에서는 도커에 대한 간단한 설명과 배포하기를 하면서 만난 도커 명령어의 의미를 정리해 볼 것이다.

 

도커를 왜 사용 할까?

snowflak server 이슈

  • 스노우 플레이크 서버
    • 한번 설치한 서버에 계속해서 설정을 변경하고 패치를 적용하는 등의 업데이트를 지속적으로 적용하여 운영하는 서버
  • 스노우 플레이크 서버는 다시 똑같이 설정하기가 매우 어렵다.
    • 장비를 업그레이드 하거나 OS를 새로 인스톨해서 같은 환경을 꾸미고자 할 때 예전 환경과 동일한 환경을 구성하기가 어렵다.

이미지와 컨테이너

  • 도커를 사용하면 개발 환경을 이미지화 시키고 해당 이미지를 통해 개발 및 배포 환경을 쉽게 컨테이너화 시켜 구축 할 수 있다.

 

도커란?

  • 컨테이너 기반의 오픈소스 가상화 플랫폼

 

컨테이너란?

  • 격리된 공간에서 프로세스가 동작하는 기술
  • 이미지를 실행한 상태

 

이미지란?

  • 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것
  • 상태값을 가지지 않고, 변하지 않는다.

 

이미지는 클래스, 컨테이너는 인스턴스로 생각 할 수 있다.

 

Dockerfile 작성 부터 실행

  • docker 이미지를 작성할 수 있는 기능
  • Dockerfile 문법으로 이미지 생성을 위한 스크립트를 작성할 수 있고 이를 기반으로 이미지 생성
명령 설명
FROM 베이스 이미지 지정 명령
LABEL 버전 정보, 작성자와 같은 이미지 설명을 작성하기 위한 명령
CMD docker 컨테이너가 시작할 때, 실행하는 쉘 명령을 지정하는 명령
RUN 쉘 명령을 실행하는 명령
ENTRYPOINT docker 컨테이너가 시작 할 때, 실행하는 쉘 명령을 지정하는 명령
EXPOSE docker 컨테이너 외부에 포른할 포트 설정
ENV docker 컨테이너 내부에서 사용할 환경 변수 지정
WORKDIR docker 컨테이너에서의 작업 디렉토리 설정
COPY 파일 또는 디렉토리를 docker 컨테이너에 복사

 

Dockerfile작성

FROM nginx

COPY nginx.conf /etc/nginx/nginx.conf  
  • FROM nginx
    • docker hub의 nginx를 base 이미지로 사용한다.
    • https://hub.docker.com/_/nginx?tab=description&page=1&ordering=last_updated
  • COPY nginx.conf /etc/nginx/nginx.conf  
    • nginx.conf를 컨테이너에 /etc/nginx/nginx.conf에 복사한다.

 

build

$ docker build -t nextstep/reverse-proxy:0.0.1 .
  • 명령어 마지막의 "."은 뭘까
    • "."은 현재 폴더를 나타내는 것이다. 현재 폴더에 만들어놓은 Dockerfile이 있다면 이것을 참조하여 build가 된다.
    • 따로 Dockerfile를 지정하고 싶다면 아래 설명한 -f 옵션을 이용한다.

 

옵션 설명
-t or -tag 이미지의 이름 설정. 이름은 저장소/이미지이름:태그 와 같이 작성할 수 있다.
-f 디폴트 Dockerfile 외의 파일명으로 이미지를 빌드할 경우 해당 옵션을 사용해서 파일명을 지정할 수 있음
--pull FROM으로 지정된 이미지는 한번 다운로드 받으면 이미지 생성시 마다, 새로 다운로드 받지 않고, 다운로드 받은 이미지를 사용함 해당 옵션은 이미지 생성시마다 새로 다운로드를 받으라는 옵션임. --pull=true와 같이 작성하여, 사용함. Dockerhub에 베이스 이미지를 수시로 업데이트하고, 이를 기반으로 새로운 이미지 생서시 자주 사용할 수 있는 옵션

 

 

이미지 실행

$ docker run -d -p 80:80 --name proxy nextstep/reverse-proxy:0.0.1
  • -d 옵션
    • 도커 컨테이너를 백그라운드로 동작시킨다.
  • -p 옵션
    • 호스트 PC의 80포트에 접속을 하면 도커 컨테이너의 80포트에 연결해 주겠다. (호스트 PC 포트번호 : 도커 포트 번호)

 

도커 볼륨

  • 컨테이너가 아닌 외부에 데이터를 저장하고 컨테이너는 그 데이터로 동작하고록 설계 하여야 한다.
  • 컨테이너 자체는 상태가 없고, 상태를 결정하는 데이터는 외부로부터 제공받도록 구성한다.

 

$ docker run -d -p 80:80 -v /var/log/nginx:/var/log/nginx nextstep/reverse-proxy
  • -v 옵션
    • 호스트와 컨테이너 디렉토리를 연결하는 옵션
  • docker는 이미지를 기반으로 컨테이너를 만들기 때문에, 컨테이너 상의 파일은 컨테이너가 삭제되면 없어진다.
  • 이를 보완하기 위해 특정 폴더를 -v 옵션을 통해 호스트와 바인딩 하면 해당 폴더는 호스트 PC에 있기 때문에 컨테이너가 삭제 되더라도 파일을 유지 할 수 있다.

 

Docker Compose

  • 여러 개의 docker를 정의하고 실행하는 툴
  • docker-compose.yml 파일을 작성하여 실행할 수 있다.
version: '3'
services:
  local-db:
    image: library/mysql:5.7
    container_name: local-db
    restart: always #컨테이너가 다운되었을 경우, 항상 재시작하라는 설정
    ports: #docker run의 -p 옵션과 동일한 역할
      - 13306:3306
    environment: #Dockfile의 ENV옵션과 동일한 역할
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Seoul
    volumes:
      - ./db/mysql/data:/var/lib/mysql
      - ./db/mysql/init:/docker-entrypoint-initdb.d

 

Docker compose 포맷

 

다음과 같은 4가지의 큰 카테고리로 작성한다.

 

  •  version
    • Docker Compose 파일 포맷 버전 지정
    • 기본적으로는 버전 3으로 사용하는 것이 일반적
  • service
    • 컨테이너 설정
  • volumes
    • 컨테이너에서 사용하는 volume 설정으로 대체 가능
  • networks
    • 컨테이너간 네트워크 분리를 위한 추가 설정 부분

Dokcer Compose 명령

  • 실행
    • -d는 백그라운드 실행을 의미한다.
docker-compose up -d

 

  • 정지
docker stop $(docker container ls -q)

or

docker-compose stop

 

  • 삭제
docker-compose rm -v -f
sudo rm -rf db

or

docker-compose down

 

참고

 

초보를 위한 도커 안내서 - 도커란 무엇인가?

도커를 처음 접하는 시스템 관리자나 서버 개발자를 대상으로 도커 전반에 대해 얕고 넓은 지식을 담고 있습니다. 도커가 등장한 배경과 도커의 역사, 그리고 도커의 핵심 개념인 컨테이너와 이

subicura.com

 

 

 

댓글



Designed by JB FACTORY