도커는 너무 어려워요
- 우아한테크코스
- 2021. 5. 31. 22:24
도커는 너무 어려워요
우아한테크코스 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
참고
'우아한테크코스' 카테고리의 다른 글
배포를 해보자 AWS, nginx, HTTPS 그리고 Spring #1 (2) | 2021.06.10 |
---|---|
자동차 경주 피드백 (0) | 2021.06.09 |
네트워크는 너무 어려워요 (2) | 2021.05.01 |
[우아한테크코스 3기] 레벨 1이 끝났다. (2) | 2021.04.10 |
SQL 미션은 너무 어려워요 (9) | 2021.03.27 |