티스토리 뷰

개발/인프라

Docker 정리

애쿠 2023. 1. 26. 01:55

앞선 포스팅에서 Docker와 VM 구동 방식의 차이를 알아보았다. 여기서 Docker가 "왜 등장하게 됐는지"에 대한 설명은 마무리하고, "어떻게 사용할 것인가"에 대해 초점을 맞추어 정리해보려고 한다.

 

우선, Docker 웹 사이트에선 Docker를 아래와 같이 설명했다.

Docker는 애플리케이션을 개발, 배송 및 실행하기 위한 개방형 플랫폼입니다. Docker를 사용하면 애플리케이션을 인프라에서 분리할 수 있으므로 소프트웨어를 빠르게 제공할 수 있습니다. Docker를 사용하면 애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리할 수 있습니다.
코드를 신속하게 배송, 테스트 및 배포하기 위한 Docker 방법론을 활용하면 코드 작성과 프로덕션 환경에서 실행하는 사이의 지연을 크게 줄일 수 있습니다.

 

Docker의 등장 이후로 더 편한 방식으로 인프라와 어플리케이션을 분리하여 서로 다른 인프라에서도 동일한 방식으로 어플리케이션을 구동할 수 있으며, Docker Registry에서 형상 관리 기능 또한 제공한다.

 

아래 그림은 Docker 웹사이트에서 제공하는 아키텍처이다.

 

Client 기준으로 요약하면.

 

  1. docker build로 image/container를 생성
  2. docker push/pull로 registry에 docker를 저장/불러오기
  3. docker run으로 docker를 실행

이런 구조로 정리할 수 있을 것 같다. 이 순서대로 포스팅을 진행하면 좋을 것 같다. 이미 조금 써보기도해서 아는 부분도 있고, 모르는 부분도 있어서 나름 신경써서 봤던 부분을 첨가해가며 작성해보겠다.

 

굳이 Docker를 설치하는 법은 이 포스팅에서 정리했었으니 여기서 확인.

 

1. Docker Image 생성

Docker Container를 생성하기 위해서는 Docker Image부터 생성해야한다. Docker Image는 요약하면 Container를 찍어내는 형판이라고 보면 된다.

Docker Image는 두 가지 방법으로 생성할 수 있다.


1. Docker Registry에서 가져오기
2. Dockerfile로 local에서 build하기

위 두가지가 있다. 만들어진 것을 가져오냐, 입맛대로 만드냐의 차이이다.

 

1.1 Docker Registry에서 가져오기

 

 


엄밀히 Docker pull을 하는 것은 Docker Image를 생성하는 것은 아니다. Docker Hub과 같은 Docker Registry에서 이미 빌드해놓은 Image를 다운로드 하는 것이다. 생각보다 이 생태계가 굉장히 커서 웬만한 개발 환경들은 찾아보면 다 있다.

 

 

예를 들어, 여기에서 tomcat도 Official Image를 제공하고, 아래 명령어로 이미지를 가져올 수 있다.

docker pull tomcat

여기에 태그를 붙여서 특정 버전을 가져올 수도 있다.

 

1.2 Dockerfile로 build하기

Docker Registry에서 받아오는 방식은 이미 구축된 Docker Image를 그대로 가져다 쓰기 때문에, 입맛대로 수정할 수 없다.

 

그래서 아래와 같이 Dockerfile을 생성한다. Dockerfile은 별도의 확장자 없는 텍스트 파일이고, 아래와 같이 작성한다.

FROM tomcat:8.5-jdk11-openjdk
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install git -y
~~~~
RUN ./gradlew clean build

tomcat:8.5-jdk11-openjdk 이미지를 가져와 apt-get update 후 git을 설치하고 gradle build까지 수행하는 간단한 Dockerfile이다. FROM, RUN과 같은 Dokcerfile에서만 사용하는 별도의 명령어가 있다.

FROM : Docker Base Image (기반이 되는 이미지, <이미지 이름>:<태그> 형식으로 설정)
MAINTAINER : 메인테이너 정보 (작성자 정보)
RUN : Shell Script 또는 명령을 실행
CMD : 컨테이너가 실행되었을 때 명령이 실행
LABEL : 라벨 작성 (docker inspect 명령으로 label 확인할 수 있습니다.)
EXPOSE : 호스트와 연결할 포트 번호를 설정한다.
ENV : 환경변수 설정
ADD : 파일 / 디렉터리 추가
COPY : 파일 복사
ENTRYPOINT : 컨테이너가 시작되었을 때 스크립트 실행
VOLUME : 볼륨 마운트
USER : 명령 실행할 사용자 권한 지정
WORKDIR : "RUN", "CMD", "ENTRYPOINT" 명령이 실행될 작업 디렉터리
ARG : Dockerfile 내부 변수
ONBUILD : 다른 이미지의 Base Image로 쓰이는 경우 실행될 명령 수행
SHELL : Default Shell 지정

 

더 다양한 명령어들은 여기서 확인 가능하다.

 

작성된 Dockerfile은 docker build 명령어로 실행한다.

docker build -t vieux/apache:2.0 .

docker 공식 웹사이트에서 따온 명령어인데, 명령어의 옵션으로 -t(tag)를 가장 보편적으로 사용한다. 나도 tag말고는 사용해본적이 거의 없는 것 같다. 더 많은 docker build 옵션은 여기로...

 

이렇게 생성한 docker image들은 docker images 명령어로 확인할 수 있다.

 

2. Docker Container 생성

1 단계에서 Docker Build 과정을 통해서 Docker Image를 생성했다. 이렇게 생성된 Docker Image의 Container를 생성하는 방법은 간단하다.

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

 

여기서도 docker build 명령어와 같이 엄청나게 많은 옵션이 존재한다. 대표적인 것 몇 가지만 소개하고, 역시 홈페이지에 잘 나와 있으니 여기서 확인하자.

 

-d : 컨테이너의 백그라운드 실행
-p : 호스트와 컨테이너 간의 포트(port) 배포(publish)/바인드(bind)를 위해서 사용
-name : 컨테이너에 이름 부여
-it : 컨테이너를 종료하지 않은체로, 터미널의 입력 유지

이렇게 생성한 docker container들은 docker ps 명령어로 확인할 수 있다.

3. Docker Registry로 push 하기

앞서 docker pull만 설명했지만, local에 생성한 이미지를 Docker Registry에 push할 수도 있다.

docker push [OPTIONS] NAME[:TAG]

작업 중인 Container를 새로 push할 수도 있는데, 이때는 commit 단계를 거친다.

docker container commit c16378f943fe rhel-httpd:latest

4. 마치며

각 단계별로 옵션과 명령어들이 너무너무너무너무너무너무 많아서 어떤 것을 넣고 빼야할지 몰라서 내가 써본 것 위주로 추릴 수 밖 에 없었다.

 

CI/CD와 MSA까지 공부하기 위해서 언젠가는 꼭 짚고 넘어가야할 부분이라 생각했고, VM을 거쳐 Docker를 보니 꽤나 공부가 됐다. 미처 못 짚고 넘어갔던 옵션들이나, 명령어들을 한번 더 정리해보고 Docker 관련 포스팅은 마무리할 것 같다.


참고 사이트

https://blog.d0ngd0nge.xyz/docker-dockerfile-write/
https://www.daleseo.com/docker-run/
https://code-masterjung.tistory.com/133

 
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함