[Docker] Container and deployment

adam adam·2022년 10월 17일
0

Docker Desktop for Windows10

Container와 Container Image 기본 개념 그리고 Docker Desktop 설치법에 따라서 우선 설치까지 완료

  • Dockerfile is code file of Docker Container Image which will be builded
  • Docker Container Image(이하 container image)는 Container의 설계도
  • Docker Container(이하 container)는 설계도에 따라 구현된 결과물
  • Docker Desktop은 Powershell을 중심으로 Windows 10에서 Docker를 효과적으로 다루기 위한 도구

Docker Desktop

DockerLabs Tutorial

docker run -d -p 80:80 docker/getting-started

를 Windows 10의 powershell에서 container를 실행하면, container image가 없을 시 자동으로 container image를 다운로드해주고, container로 구현하여 실행까지 해준다.

-p 80:80 옵션에 따라서

내 노트북이 자기 자신을 지칭할 때 쓰는 ip인 127.0.0.1의 80번 포트와

Container가 자기 자신을 지칭할 때 쓰는 ip의 127.0.0.1의 80번 포트를 포트포워딩 시켜준다.

127.0.0.1은 사람들끼리 대화할 때 사용하는 '나 , 너' 중 나에 대응하는 개념으로 생각 중. 그러니까 노트북 입장에서의 스스로를 '나'라고 지칭할 수 있고, 컨테이너 입장에서도 스스로를 '나' 라고 지칭가능

이러한 포트포워딩에 따라, 내 노트북에서 127.0.0.1:80로 들어가면 DockerLabs의 Tutorial이 뜬다.

위와 같이 직접 배포한 컨테이너에 기본 탑재된 튜토리얼 내용은 공식 사이트에서도 제공한다

Dockerfile

pre-result

신기하게도 blabla.dockerfile 이나 blabla.Dockerfile 이 아니었다.

확장자가 없다.

progress

Getting our App 에서 javascript 기반 앱 프로젝트의 소스코드를 제공

프로젝트 구조는

app
-spec
-src
-package.json
-yarn.lock

Building the App's Container Image 에서 앞선 프로젝트 폴더 내부에 Dockerfile 생성

app
-spec
-src
-package.json
-yarn.lock
-Dockerfile

Dockerfile은

FROM node:12-alpine
# Adding build tools to make yarn install work on Apple silicon / arm64 machines
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]

Starting an App Container에서

docker build -t todolist-container-image01 .
명령어로 빌드

그러면 container image 가 생성, 참고로 build는 알파벳으로 적힌 소스코드를 01010..기계로 변환하는 명령어로 이해중

그리고 이걸 최초 tutorial container를 실행켰던 것과같이

docker run -d -p 3000:3000 todolist-container-image01

자바 프로젝트를 container image로 만드는 과정도 이와 같을 것으로 예상

Push Container for Sharing

github와 같은 dockerhub을 통해 내가 만든 container를 공유할 수 있다.

다만, github는 프로젝트 소스코드 레벨에서 공유한다면, dockerhub은 이러한 프로젝트를 빌드해서 바로 배포할 수 있는 container 레벨로 공유

virtualbox 보다 공유에 있어 효과적인 부분.

dockerhub 전송 준비

dockerhub으로 전송하기 위해선 docker tag라는 명령어로 dockerhub의 설정에 맞게 이미지명

앞에
[목표로 하는 dockerhub 계정명]/[]
를 붙여야 한다.

github에서 repository에 push 할때는 다른 추가적인 설정이다.

docker tag [내가 dockerhub으로 보내고 싶은 이미지의 로컬 repository명]:latest [내 dockerhub 계정명]/[우선은 앞에꺼 반복]:latest

docker tag todolist-container-image01:latest devsacti/todolist-container-image01:lastest

그러면 github 격인 dockerhub에 해당 레포지토리가 바로 생기고

그 안에 container가 쌓인다.

Docker and AWS

Pull Container

위에서 push 한 컨테이너를 aws ec2에서 pull 하여 바로 배포해보겠다.

ec2 and docker

ssh로 ec2 접속하는 법 참고하여 ssh 접속

당연히 docker 명령어가 존재하지않는다.

이에 따라서 Windows 10에서와 같이 aws linux ec2에 docker 환경을 설치할 수 있다. 그러면 windows 10에서 powershell로 docker 명령어를 수행했던 것처럼 가능

내가 접속한 서버에 docker image가 없었지만

docker pull을 통해서 dockerhub에서 다운로드 받은 다음.

docker images 가 성공적으로 다운로드된걸 조회하고

동일하게 3000으로 run

그러면 이에 따라 ps가 잡히고, 우측 크롬을 통해서 해당 앱이 배포된걸 확인

* 참고로 13.209.40.100 는 원래 노출되면 안되나, ec2를 껐다키면 새로 할당되는 것을 알고, 보안그룹을 재설정할것이이게 노출

보안그룹의 경우 별도로 다뤄야하는데, 얼추 port 열고닫고 명령어를 보다 손쉽게 제어하게 해주는 개념으로 일단 마무리

한편, dockerhub에 대응하여

aws에는 Amazon Elastic Container Registry 가 있어보임.

.

Docker Tutorial
+
+
을 보고 정리한 내용

virtualbox와 같은 Virtualization Software

다만, 다루는 단위가 VM이 아닌, Container

우선 inch와 cm같은 느낌을 이해 중

추가

VM and Container

VM는 용량을 축소했을뿐 컴퓨터 구성과 완전히 똑같은 것으로 우선 이해

VM of VirtualBox
= HW + OS + Libraries + Dependencies
; 내 노트북 + CentOS7 + jdk + tomcat
= Web Application Server

* 참고로 jdk가 library에 속하는지, tomcat이 Dependencies인지 모름, 왜냐하면 참고한 자료에서 구체화한걸 아직보지 못해서, 일단 구색은 맞춰봄

다만, 컨테이너는 완전히 다른 목표를 가지고 새로운 단위로 느껴짐

inch 와 cm의 관계로 우선 이해, 서로 물리적으로 공통점을 찾을라면 찾겠지만, 전환하려고하면 아주 긴 소수점만 나오는 관계, 그러니까 있는그대로 수용

Container of Docker Desktop
= HW + OS kernel + Libraries + Dependency
; 내 노트북 + linux + jdk + tomcat
= web application Container

OS와 OS Kernel의 차이

https://5equal0.tistory.com/m/entry/Linux-Kernel-%EC%BB%A4%EB%84%90%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%BB%A4%EB%84%90%EC%9D%98-%EA%B5%AC%EC%A1%B0

CentOS, Ubuntu와 같은 사례를 포괄하는 집합으로서의 Linux는 OS

그러나

kernel로서의 Linux는 OS kernel

근데, 이렇게 명목적으로 구분해도 코드 까서 몇행부터 몇행까지 OS이고 OS kernel인지 구분하려고하면 안될거같음. 느낌상 그러니까 패스

0개의 댓글