도커(Docker)
도커에 대한 설명을 도커 페이지에서 찾아보면 지루한 환경 구성이나 관리 없이 개발자가 어디서나 애플리케이션을 구축, 공유, 실행 및 검증할 수 있도록 지원하는 프로그램이라고 설명한다.
도커에서 핵심이 되는 내용은 바로 프로그램을 격리시켜 컨테이너로 실행 및 관리하는 프로그램이라고 생각한다.
그렇다면 도커를 사용하는 이유와 컨테이너라는 것이 뭔지를 살펴보자.
하나의 컴퓨터를 가지고 프로젝트를 개발하게 되면 여러 작업과 역할이 구분되지 못하고 서로 의존하게 되므로 효율적인 시스템을 만들지 못하게 되고 유지보수가 힘들어질 수 있다.
이러한 문제점을 해결하기 위해 Virtual Machine이라는 가상의 컴퓨터를 하나 더 생성하면 각 프로그램마다 역할을 구분하고 격리시키므로 기존의 방식보다 더 효율적인 시스템을 구성할 수 있게 된다.
하지만 이러한 가상 머신을 사용하는 방법에도 단점이 존재하는데 바로 운영체제가 필수적이라는 것이다.
가상 머신은 곧 하나의 가상 컴퓨터를 의미하는데 컴퓨터에서 어떤 프로그램이 돌아가려면 운영체제라는 것이 필수적으로 있어야 한다. 하지만 운영체제는 많은 용량을 차지하게 되고 그만큼 많은 자원을 필요로 하기 때문에 프로그램 자체가 무거워질 수밖에 없다.
또 다른 단점으로는 귀찮음이다.
예를 들어 새로운 가상 머신을 하나 만들고 MySQL을 설치한다고 했을때 여러 과정을 거쳐야 한다.
아이피 설정을 해주고, MySQL을 설치하고, MySQL 초기 세팅을 해줘야 한다.
MySQL
MySQL MySQL은 관계형 데이터베이스에서 가장 많이 사용되는 무료 DBMS이다. MySQL에는 대표적으로 두 가지 버전이 있는데 하나는 8.x 버전과 또 다른 하나로 5.x가 있다. MySQL :: What’s New in MySQL 8.0? (Gene
hotechstory.tistory.com
이전에 MySQL을 공부하면서 설치했던 과정들을 정리한 글이다. 매번 이러한 설정들을 계속해야 된다면 너무 귀찮은 일이 될 것이다.
앞서 언급했던 문제점들을 해결하기 위해 이미지와 컨테이너라는 개념이 생겼다. 귀찮은 설정들을 매번 하지 않고 하나의 이미지라는 것으로 만든 후 프로그램을 실행할 때는 운영체제가 아닌 컨테이너 위에서 실행되게 함으로 앞서 언급한 단점들을 해결할 수 있었다.
도커는 이 컨테이너를 만들어주는 프로그램으로 쉽게 생각하면 운영체제 없이 프로그램이 돌아갈 수 있는 하나의 가상 머신을 만들어주는 프로그램이라고 생각하자.
이렇게 보면 도커라는 것이 개발자의 귀찮음을 줄여주고, 시스템의 효율을 높일 수 있을 것 같지만 이러한 도커에도 단점이 존재한다.
도커는 리눅스 운영체제를 사용하는 기술이기 때문에 리눅스 환경에서 돌아가는 프로그램만 지원한다.
도커를 가지고 개발을 하다 보면 docker desktop 프로그램을 설치하게 되는데 해당 프로그램이 윈도우에 깔려 있다고 윈도우 운영체제로 프로그램이 실행된다고 생각하면 안 된다. 도커가 내부적으로 리눅스 가상 머신을 가지고 있어 해당 리눅스를 통해서 실행되기 때문이다.
도커에서 어떤 프로그램을 실행시키기 위해서는 3가지 과정을 기억하면 된다.
1. 도커 파일을 만든다.
2. 도커 파일을 가지고 이미지를 만든다.
3. 이미지를 컨테이너 통해서 실행시킨다.
이번에 진행했던 미니 프로젝트에서 사용했던 nginx를 가지고 실습을 진행해봤다. 하나씩 살펴보면서 정리해보자.
도커 파일
도커에서 이미지를 만들기 위해서는 도커 파일이 필요하다.
도커 파일은 도커 이미지를 어떻게 만들 것인지 설정 내용이 들어있는 파일로 그 외에 다른 역할은 하지 않는다.
도커 파일에서는 인스트럭션을 통해서 어떻게 이미지를 만들 것인지 정하는데 해당 인스트럭션에는 여러 가지 종류가 있다.
인스트럭션 | 내용 |
FROM | 토대가 되는 이미지를 지정 |
ADD | 이미지에 파일이나 폴더를 추가 |
COPY | 이미지에 파일이나 폴더를 추가 |
RUN | 이미지를 빌드할 때 실행할 명령어를 지정 |
CMD | 컨테이너를 실행할 때 실행할 명령어를 지정 |
ENTRYPOINT | 컨테이너를 실행할 때 실행할 명령어를 강제 지정 |
ONBUILD | 이 이미지를 기반으로 다른 이미지를 빌드할 때 실행할 명령어를 지정 |
EXPOSE | 이미지가 통신에 사용할 포트를 명시적으로 지정 |
VOLUME | 퍼시스턴시 데이터를 저장할 경로를 명시적으로 지정 |
ENV | 환경변수를 정의 |
WORKDIR | RUN, CMD, ENTRYPOINT, ADD, COPY에 정의된 명령어를 실행하는 작업 디렉터리를 지정 |
SHELL | 빌드 시 사용할 셸을 변경 |
LABEL | 이름이나 버전, 저작자 정보를 설정 |
USER | RUN, CMD, ENTRYPOINT에 정의된 명령어를 실행하는 사용자 또는 그룹을 지정 |
ARG | docker build 커맨드를 사용할 때 입력받을 수 있는 인자를 선언 |
STOPSIGNAL | docker stop 커맨드를 사용할 때 컨테이너 안에서 실행 중인 프로그램에 전달되는 시그널을 변경 |
HEALTHCHECK | 컨테이너 헬스체크 방법을 커스터마이징 |
최근에 개발했던 프론트 프로젝트를 이미지로 만들어 보는 실습을 진행했었다.
이미지를 만들기 위해 생성한 도커 파일의 내용을 보고 하나씩 살펴보자.
FROM nginx:latest
ADD ./dist/index.html /usr/share/nginx/html/index.html
ADD ./dist/css /usr/share/nginx/html/css
ADD ./dist/js /usr/share/nginx/html/js
ADD ./dist/img /usr/share/nginx/html/img
ADD ./dist/image /usr/share/nginx/html/image
ADD ./dist/icon /usr/share/nginx/html/icon
ADD ./nginx/default.conf /etc/nginx/conf.d/
RUN rm -rf /usr/share/nginx/html/index.html
RUN rm -rf /etc/nginx/conf.d/default.conf
CMD ["nginx", "-g", "daemon off;"]
먼저 FROM을 통해서 어떤 이미지를 토대로 새로운 이미지를 만들 것인지 정해주었는데 프론트 프로젝트를 웹 서버에 실행시킬 목적이므로 nginx 이미지를 지정해 줬다.
그다음은 nginx가 기본 루트에 있는 index.html 파일을 클라이언트에게 전달하기 때문에 내가 개발한 프론트 프로젝트의 index.html 파일을 기본 루트 경로로 ADD 시켜준다.
다른 폴더들도 마찬가지로 루트 경로로 ADD를 시켜준다.
default.conf 파일은 nginx 서버의 설정 파일로 프록시 설정을 해줘야 하기 때문에 따로 생성하여 ADD 시켰다.
ADD가 끝난 뒤에는 RUN을 통해서 이미지를 빌드할 때 필요한 명령어를 설정했는데, rm -rf 를 통해서 기존의 nginx가 가지고 있는 index.html 파일과 default.conf 파일을 삭제한다.
마지막으로 해당 이미지를 컨테이너로 실행시키기 위한 명령어들을 CMD에 지정한다.
docker build --tag [이미지_이름] .
도커 파일 작성이 완료되면 docker build를 통해서 새로운 이미지를 생성하게 된다.
도커 이미지
이전에 만들었던 도커 파일로 이미지를 만들게 되면 docker desktop 프로그램을 통해서 확인할 수 있다.
docker desktop 프로그램이 아니더라도 cmd 창을 하나 켜서 docker images 명령어를 실행하면 현재 이미지 목록을 확인할 수 있다.
도커 이미지는 불변이라는 특성을 가지기 때문에 한 번 만들어진 이미지는 변경 및 수정할 수 없다. 수정이 필요하거나 변경이 필요하다면 새로운 이미지를 만드는 방법밖에 없다.
이 이미지를 가지고 컨테이너를 실행할 수도 있고, 도커 허브라는 곳에서 다른 사람들과 공유도 할 수 있다.
도커 컨테이너
도커 이미지가 완성되면 RUN 버튼을 클릭하여 새로운 컨테이너를 생성할 수 있다.
컨테이너를 생성하기에 앞서 몇 가지 설정이 필요한데 아래의 사진과 같이 설정을 해줘야 한다.
설정에는 새롭게 생성할 컨테이너의 이름과 포트 포워딩을 진행할 포트 번호, 볼륨 및 환경변수를 설정하고 Run 버튼을 누르면 새로운 컨테이너가 생성된다.
컨테이너를 실행할 때 주의할 점이 있는데 그것은 바로 휘발성이다.
컨테이너는 기본적으로 휘발성이 강하다. 따라서 볼륨 설정을 통해서 해결할 수 있다.
도커 컴포즈
도커 컨테이너를 만들 때 여러 가지 설정을 하게 되는데 매번 컨테이너를 생성할 때마다 설정을 해주는 것은 매우 귀찮은 작업이다. 이러한 여러가지 설정들을 하나의 설정 파일로 관리하게 된다면 매번 귀찮은 작업들을 상당 부분 줄일 수 있게 되는데 그러한 기술이 바로 도커 컴포즈이다.
version: '3'
services:
[컨테이너_이름]:
ports:
- [지정할_포트번호]
image: [이미지_이름]
environment:
[환경변수_이름]:[환경변수_내용]
depends_on:
- [의존할_컨테이너?]
volumes:
- [볼륨_이름]:[볼륨_경로]
volumes:
[볼륨_이름]:
driver: [경로?]
위의 내용은 docker-compose.yml 파일의 내용으로 컨테이너를 생성할 때 볼 수 있었던 설정들을 직접 파일로 설정할 수 있다.
해당 파일을 실행하면 새로운 컨테이너를 생성해 준다.