티스토리 뷰
앞선 포스팅에서 Docker와 VM 구동 방식의 차이를 알아보았다. 여기서 Docker가 "왜 등장하게 됐는지"에 대한 설명은 마무리하고, "어떻게 사용할 것인가"에 대해 초점을 맞추어 정리해보려고 한다.
우선, Docker 웹 사이트에선 Docker를 아래와 같이 설명했다.
Docker는 애플리케이션을 개발, 배송 및 실행하기 위한 개방형 플랫폼입니다. Docker를 사용하면 애플리케이션을 인프라에서 분리할 수 있으므로 소프트웨어를 빠르게 제공할 수 있습니다. Docker를 사용하면 애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리할 수 있습니다.
코드를 신속하게 배송, 테스트 및 배포하기 위한 Docker 방법론을 활용하면 코드 작성과 프로덕션 환경에서 실행하는 사이의 지연을 크게 줄일 수 있습니다.
Docker의 등장 이후로 더 편한 방식으로 인프라와 어플리케이션을 분리하여 서로 다른 인프라에서도 동일한 방식으로 어플리케이션을 구동할 수 있으며, Docker Registry에서 형상 관리 기능 또한 제공한다.
아래 그림은 Docker 웹사이트에서 제공하는 아키텍처이다.
![](https://blog.kakaocdn.net/dn/bDyfPv/btrXa1uk5vv/p90uvRVsKvayJqTdQMnW8k/img.png)
Client 기준으로 요약하면.
- docker build로 image/container를 생성
- docker push/pull로 registry에 docker를 저장/불러오기
- docker run으로 docker를 실행
이런 구조로 정리할 수 있을 것 같다. 이 순서대로 포스팅을 진행하면 좋을 것 같다. 이미 조금 써보기도해서 아는 부분도 있고, 모르는 부분도 있어서 나름 신경써서 봤던 부분을 첨가해가며 작성해보겠다.
굳이 Docker를 설치하는 법은 이 포스팅에서 정리했었으니 여기서 확인.
1. Docker Image 생성
Docker Container를 생성하기 위해서는 Docker Image부터 생성해야한다. Docker Image는 요약하면 Container를 찍어내는 형판이라고 보면 된다.
![](https://blog.kakaocdn.net/dn/Li5mP/btrW6ppNAqD/wQ98aDQTZzjT7lpLHLUQq0/img.png)
Docker Image는 두 가지 방법으로 생성할 수 있다.
1. Docker Registry에서 가져오기
2. Dockerfile로 local에서 build하기
위 두가지가 있다. 만들어진 것을 가져오냐, 입맛대로 만드냐의 차이이다.
1.1 Docker Registry에서 가져오기
![](https://blog.kakaocdn.net/dn/Nnlon/btrW76jfzXh/YN8CKRtTRtzt2NeGFVIqD1/img.png)
엄밀히 Docker pull을 하는 것은 Docker Image를 생성하는 것은 아니다. Docker Hub과 같은 Docker Registry에서 이미 빌드해놓은 Image를 다운로드 하는 것이다. 생각보다 이 생태계가 굉장히 커서 웬만한 개발 환경들은 찾아보면 다 있다.
예를 들어, 여기에서 tomcat도 Official Image를 제공하고, 아래 명령어로 이미지를 가져올 수 있다.
docker pull tomcat
여기에 태그를 붙여서 특정 버전을 가져올 수도 있다.
1.2 Dockerfile로 build하기
![](https://blog.kakaocdn.net/dn/bHPebl/btrXaBCK4Xo/eo62Snf5aK6NEDxnjkky5k/img.png)
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
'개발 > 인프라' 카테고리의 다른 글
AWS EC2에서 Jenkins 자동배포 구축하기 (1) (1) | 2023.01.26 |
---|---|
웹서버와 WAS의 차이 정리 (1) | 2023.01.26 |
VM(Virtual Machine)과 Docker (1) | 2023.01.26 |
캐시(Cache)와 CDN(Content Delivery Networks) (0) | 2023.01.16 |
Windows 10에서 Jenkins - SVN - GIT 설정 및 연동하기 (0) | 2023.01.04 |
- Total
- Today
- Yesterday
- Kotlin
- CloudFront
- elasticsearch
- GIT
- lambda
- chat GPT
- AWS EC2
- terraform
- Log
- serverless
- openAI API
- OpenAI
- awskrug
- docker
- 코딩테스트
- springboot
- AWS
- cache
- Spring
- 람다
- S3
- java
- jenkins
- ChatGPT
- Elastic cloud
- AOP
- 스프링부트
- JWT
- EKS
- MySQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |