Stay hungry, Stay foolish

Docker ????????????? 본문

Docker

Docker ?????????????

Jake2 2022. 4. 23. 19:33

저희 회사 프로젝트는 docker 에 올라가 있지 않았습니다.. 따라서 찾아오는 새로운 개발 팀원이 들어올때마 겪는 환경 셋팅의 고통들...

그러다 사수님께서 docker를 제안해주셨고 본격적으로 이 레거시 같은 rails 환경을 docker에 올려놓고자 공부를 시작해봅니다.

docker란? 그리고 이걸 왜 써야 하는걸까요?

- docker는 애플리케이션을 빠르게 구축, 테스트, 배포 할 수 있는 소프트 웨어 플랫폼 docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징 하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있습니다.

도커를 써야하는 이유를 간단하게 이해하자면 우리의 운영체제 하나에서 여러 어플리케이션을 돌리고자 할때 각 어플리케이션을 위한 서버별로 가상의 OS를 통해 올려야 하는데 docker 컨테이너라는 OS레벨의 가상화 방식으로 가상의 도커엔진이 존재하고 도커엔진 위에 각 프로세스에 필요한 바이너리만 존재합니다. 

그리고 이 컨테이너의 동작은 도커 이미지라는 설정파일을 통해 가능합니다. 

이 이미지는 프로젝트에서 dockerfile을 통해 만들어집니다. (docker doc)

 

웹서버가 동작하는 원리 웹브라우저에서 80번 port 로 들어온 요청이 있으면 webserver가 파일속의 index로 보내 하고 돌려보냄

 
도커를 이용할때는 위와 같이 컨테이너에 우리가 올린 웹서버와 파일이 올라가있다. 웹브라우저에서 요청이 들어오면? Host 측과 docker의 컨테이너 port의 연결이 이어지는 연결고리가 없기 때문에 `$docker run -p 80:80 httpd` 의 커맨드로 이어준다.
이렇게 Host 80port to Docker 80port 로 이어주는것을 port forwarding 이라고 한다.
 
아래처럼 8081:80 으로 설정도 가능하다
 
 
호스트와 컨테이너 파일시스템 연결하기
컨테이너 안에만 파일이 있으면 코드 수정에 대한 어려움과, 언제 삭제될지 모르는 어려움이 있어서 호스트에서 컨테이너와 이어줘야함.
$ docker run -p port:port -v pwd httpd

도커 이미지 만드는 법

도커 허브에서 이미지를 받기만 하지 말고 우리의 이미지를 만들어보자
이미지 파일을 만드는 방법은 두가지 이다.
container -> commit
dockerfile -> build
컨테이너에서 커밋은 내가 현재 도커 환경에서 작업하던 내용의 백업 느낌 이고, 도커파일에서의 빌드는 시간 순서별로 구체적으로 필요한 이미지를 만드는 느낌이다.
 
 
=========================================
Docker를 알기전에 process 를 알아야한다.

process란 뭘까..?

예를 들어 실행파일이 word.exe인 ms-word라는 sw 프로그램이 있다. 이걸 실행시키면 os에 의해 이 프로그램이 돌아가는데 이 돌아가는 인스턴스가 process라고 이해할 수 있다.
program 실행 -> 운영체제가 프로세스화(instance) 하여 실행 이걸 개념적 표현으로 task 라고 함
우리가 서버나 레디스 같은것들을 돌리면 이것들에 부여되어 있는게 PID 즉 process ID이다
이렇게 프로그램을 실행 시키면 각자 고유의 PID를 갖는 프로세스가 실행되고 이를 작동시키기 위해 os에서 특정 cpu 나 RAM 같은 자원을 할당해주는 역할을 한다.
물론 여기서 각 프로세스는 독립된 공간이고 침범받으면 안된다
이 프로세스의 IO 관리 주체인 커널 + 프로세스가 docker container 인거다 하지만 Host 입장에서 보면 이것도 또하나의 process 긴 한데 이 컨테이너는 별개의 컴퓨터인것마냥 다른 process 들에 영향을 받지 않는다.

get start

일단 docker docs의 get start 를 따라서 시작해 보겠습니다.

1. docker desktop 을 받는다

2. 아래의 커맨드를 입력한다.

  • -d - run the container in detached mode (in the background)
  • -p 80:80 - map port 80 of the host to port 80 in the container
  • docker/getting-started - the image to use

상단의 이상한 이름의 프로젝트가 생겼다. 잘되어가고 있는 거다 랜덤으로 이름이 생긴다고 한다.

 

자 그러면 이 컨테이너를 지우고 다시 해보자 지우기 위해 docker ps cmd를 입력해서 id 값을 찾아 준다.

난 이미 지워서 뜨지 않고 있다. 이후 

 docker stop <the-container-id>
 docker rm <the-container-id>

위 커맨드 들을 통해  컨테이너를 지우고 시작하자! 

한큐에 하려면 docker rm -f <the-container-id> 로 지워주자

 

어플리케이션을 도커로 빌드해보자!

빌드 하기 위해서는 dockerfile이 필요합니다. 

 

https://aws.amazon.com/ko/docker/

Comments