Cloud/Docker

[따배도] 3. 도커 컨테이너 살펴보기 ,4.도커 컨테이너 만들어보기

Tony Lim 2021. 12. 22. 15:43

컨테이너는 하나의 Application 프로세스

모든것이 독립적으로 동작한다

 

docker deamon 이 동작하고 리눅스 커널이 있는 서버를 docker host라고 부른다

OS 입장에서는 docker host는 하나의 process일 뿐이다.

 

 

Container Image

여러개의 layer로 구성이되어 하나의 Application이 잘 실행되수 있도록 일종의 snapshot 이다 readonly라 볼수 있다.

 

Container는 실제 Docker Daemon위에서 돌아가는 Container image를 의미한다. 이제는 실제 HW resource들을 가지고실행이 되니 write도 가능해지게 된다.

 

 

컨테이너 동작방식

도커 public hub에서 container image를 가지고와서 docker daemon에서 실행시킨다.

docker host = linux kernel

 

 

실습

docker nginx container image의 layer가 총 5개로 이루어진 것을 확인할 수 있다.

아직 컨테이너화 되서 실행이 된 것이 아님

 

docker run --name web -d -p 80:80 nginx 명령어로 컨테이너화 해서 실행 시킬 수 있다.

docker ps 를 통해 확인할 수 있다.

 

curl localhost:80 명렁어로 접속가능하다

 

docker stop web 으로 멈춘후 docker rm web을 하면 현재 컨테이너화 되어서 돌고 있는 컨테이너를 제거하는것이고

pull 한 container image까지 지울려면 docker rmi nginx 으로 깔끔하게 지울 수 있다.

 

 

 

이러한 앱 컨테이너들을 어디에 사용하는가?

서로 독립되어 있으므로 어떤 언어를 사용하든 상관이 없다.

이런 환경을 MSA 환경의 polyglot 앱운영이라 한다

각각의 Application Service에 맞춰서 Container를 만들어내는 것이다.

 

컨테이너는 어떻게 만드는가?

Dokcerfile을 이용해 컨테이너를 빌드한다.

저 3개의 명령어말고도 무수히 많다

from = dockerfile에서 가장 먼저 나와야한다. top down 방식이기 때문에 , 컨테이너의 베이스 이미지 (운영환경)

copy = host에 있는 soruce 코드를 복사한다

add = copy에 추가로 tar, 를 풀어서 복사하거나 url에 있는 resource를 다운받아서 복사한다

maintainer = 이미지를 생성한 사람의 이름 및 정보

label = 컨테이너이미지에 컨테이너의 정보를 저장 , 빌드된 날짜 ,팀이름 , description

workdir = 현재 작업디렉터리를 정의할 때 사용

env = 환경변수 지정

user = 첨엔 루트권한으로 컨테이너가 만들어진다. user들을 넣어놓으면 user switch할 수 있다. 보안과 중요하다

volume = 컨테이너가 동작될 때 저장되는 데이터들을 host에도 다운로드 한다. vice versa 도 가능 

이 경우에는 컨테이너의 /var/lib/mysql/data 와 host 의 /home/mount/data가 동기화 되었다고 보면 될 것이다.

expose = 컨테이너 동작시 외부에서 사용할 포트 지정 , 컨테이너가 포트 포워딩을 통해서 서비스를 연결 시켜 준다

cmd 에는 보통 argument나 option  entrypoint에서는 명령어를 주로 쓴다. 컨테이너 동작시 저절로 실행되는 것이다.

 

 

만들어진 컨테이너를 어떻게 배포할까?

docker build하고 만들어진 컨테이너를 저장할 cloud에 로그인 하고 push 로 저장을 한다

 

 

실습

8080포트에 서블릿을 만들어주었다.

dockerfile 로 baseimage + source code + command가 준비가 되었다

총 3가지 step으로 실행이되었다. base image인 node를 다운받고 

소스코드를 복사하고 , 커맨드를 실행하였다

 

만들어진 container image는 docker images 명령어를 통해 확인이 가능하다

 

이번에는 webserver를 띄워보자 apache

앞에 것은 application container , 이번에는 webserver역할을 하는 webserver container

build 명령어를 통해 잘 만들어진 것을 확인할 수 있다

docker run 으로 잘 실행된것을 확인할 수 있다. 80 포트로 들어갔을때 index.html 에 Test Web도 dockerfile에서 설정한 것 처럼 잘 작성이 되었다

앞에서 만든 hello.js 도 잘 실행이 된것을 확인 할 수 있다.

이제 잘 동작하는 이미지들을 docker hub에 올려보자 로그인을 하고 tag를 통해 이름을 바꿔줘야한다.

똑같은 Image ID를 가지고 다른이름을 가지는 파일이 생성되었다

잘 올라온것을 확인할 수 있다