ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 얄코 Docker
    docker 2021. 7. 21. 18:39

     = 실행환경

     

    얄코 :

    https://youtu.be/tPjpcsgxgWc

    https://youtu.be/hWPv9LMlme8

    https://www.yalco.kr/36_docker
    얄코 XML, JSON, YAML : https://finepiz.tistory.com/3

     

    결론적으로 우리가 할 수 있는것 : 깃에서 클론을 받고 그 파일들이 어떤 프로그램을 필요로 할 텐데 그걸 도커로 받아서 바로 배포할 수가 있음

     

    원래 웹어플리케이션을 만들고 테스트를 할 때 클라이언트들이 나와 다른 환경일 수도 있으니 가상컴퓨팅을 이용해서 다른 OS같은 나와 다른 환경에서 테스트를 한 뒤 배포를 했었다. + 서버 컴퓨터에 배포할 때 똑같은 환경을 잡아줘야 하니 힘들었다

     

    그러다 도커가 나왔는데 

    환경을 그대로 잡아 줄 수가 있던 거지 그 이미지란것에

     

    이미지는 도커허브에 가면 공식 이미지를 다 올려놨음 오라클이미지도 있고 node.js같은거 기타 등등

    나는 실습을 해봤는데 DB는 테이블과 기본 자료들까지도 파일에 넣어놓으면 그대로 입력이 돼서 나왔다.

    그런 컨테이너들에 하나씩 백단 / 프론트단 / DB 이렇게 세개를 넣고 나면 얘네끼리 연결이 안된다

     

    이런 컨테이너에 더해서 내가 이미지를 만들 수가 있음.

     

    도커를 깔면 기본으로 깔리는게 있는데 그게 도커 컴포즈 이게 우리가 배우는거

    얘네가 컨테이너끼리 연결을 할 수 있는 설정파일 같은거다 yaml형식으로 돼 있어 

     

     

     

    https://youtu.be/tPjpcsgxgWc

     : 5분 30초

    Docker

    한곳에서 일 한 뒤, 다른데 가서 할 때

    거기가서 복잡한 장비들을 옮겨서 조립하고 설치해야한다

     

    도커가

    내 장비들을 설치된 그 상태로 사본들로 박제함

    하나하나 할 수도 있고, 서로 연결되고 조립된 모습까지 문서를 저장하듯 보관

    도커허브란 곳에 업로드를 하는것. 클라우드를 쓰는것처럼 어디서든

    내려받아서 설치하면 됨.

     

    옮겨간곳에서 다른 작업을 하는 게 있으면

    물건을 두는곳도 겹치고 전선도 꼬이고 하는데?

    ->둘 각자의 분리된 작업공간을 만든다.

    ->컨테이너를 만드는 것임

     

    도커는 항상 장비들을 컨테이너라는 공간에 설치함.

    같은 곳의 다른 비품들과 서로 방해하지 않을 수 있다

    해당 작업만의 업무환경을 만들어낼 수 있다.

     

    한번 저장된 장비들은 얼마든지 새로 불러낼 수 있다.

     

    노트북을 새로사면 이것저것 설치를 해야되잖아

    서버를 돌리기 위한 환경을 구축하는건 훨씬 복잡함

    언어, 웹서버, DB, 자동배포툴 등 버전 신경써서 다운받은 다음

    맞물려 잘 동작할 수 있도록 이것저것 설정해줘야 함

     

    이러다가 더 성능 좋은 서버로 옮겨가거나 서버를 추가해야 할 수도

    그럼 그곳들에도 똑같이 다 설치를 해야함

     

    그걸 했던 개발자가 퇴직하고 없거나 구식이라 매뉴얼도 없으면..

     

    그 와중에 뭐가 잘못돼서 뭘 어떻게 고쳐야할지 아무도 모르면..

     

    같은 서버에 여러서비스를 돌리는 경우, 각각이 다른실행환경에서 동작해야할때

    일이 까다로워질수도

    기존사이트를 자바 7

    새 서비스가 자바 8

    ->이것저것 맞추고 신경써야함.

     

    도커가 이런 문제들을 깔끔하게 해결해줌

     

    각 요소들이 설치된 모습을 이미지란 형태로 박제해서 저장

     

    각 제품마다 공식적으로 제공되는 이미지도 있고

    내가 원하는대로 만들어낼 수도 있다

    Git으로 저장된 내용들이 Github에 올려지는 것처럼

    도커 이미지들은 DockerHub란 곳에 업로드돼서 공유되고

    다운받아질 수 있다.

     

    그리고 이렇게 이미지로 저장된 항목들이 함께 연결돼서 동작하도록 설정된 상태를 명령어 텍스트나, 문서 형태로 저장할 수도 있다.

     

    마치 이것들을 설치하는 과정을 어디서든 컴퓨터가 자동으로 재현할 수 있도록

    녹화해둔다는 느낌.

     

    이 문서만 잘 보관해두면 이 요소들이 언제 어디서든 미리 지정된 서비스에 필요한 설정대로 도커헙으로부터 받아져서 설치될 수 있다.

     

    도커는 이것들을 컴퓨터에 바로 설치하지 않음.

    각각을 컨테이너 라 불리는 독립된 가상 공간을 만들어내서 복원

     

    때문에 아까 말했던 케이스처럼 다른 버전의자바를 돌리는 서비스들도

    각각의 컨테이너 안에서 서로 방해받는 일 없이 돌아갈 수 있다.

     

    버추얼박스같은 가상컴퓨터처럼 들릴 수있는데

    도커는 이거랑은 다른 구조인게

     

    가상 컴퓨팅은 한 물리적 컴퓨터 안에 각각 OS를 가동하는 가상 컴퓨터들이

    물리적 자원을 분할해서 쓰기 때문에 성능에 한계가 생김

    도커는 OS단까지 내려가는게 아니라 실행환경만 독립적으로 돌리는거라서

    컴퓨터에 직접 요소들을 설치한거랑 별 차이 없는 성능을 낼 수 있고

    가상 컴퓨팅보다 훨씬 가볍고 빠르게 각각을 설치하고 실행하고

    커고 끄고 연동하고 할 수가 있다.

     

    그래서 이제는 서버에 뭐가 잘못돼서 고쳐야 하거나 일부를 업그레이드 해야

    하거나 할 때는

    일일이 요소들을 정지하고 지우거나 새로 깔 필요없이

    그냥 이 컨테이너들을 통째로 교체해서 새로 실행해버리면 되는것.

    서버를 관리하고, 서비스들을 배포하는 일이 전과는 비교도 안되게 쉬워진것.

    ->뭔말인지.. 업그레이드 버전을 따로 만들었다가 바꾸기만하란건가

     

    ===

    https://youtu.be/hWPv9LMlme8

    23

    실제 서비스를 만들어볼것.

    방문할때마다 칸에 이름을 적고 엔터를 치면 방문시간과 함께 표에 기록되는 웹페이지

     

    이 서비스는 프론트엔드 + 백엔드 + DB로 구성됨

     

    프론트엔드는 Svelte로 짜서 build한 결과물을 Node.js http-server에 올릴것

    쉽게말하면 html, css, js파일들을 브라우저에서 사이트로 볼 수 있도록 웹 서버를 돌릴 것

     

    백엔드는 Python 언어로 된 Flask 프레임워크를 씀.

    REST API로 데이터를 프론트와 주고받을 것.

     

    이에 사용될 데이터들이 저장되는 db MySQL을 사용

     

    브라우저에서 이 프론트엔드 웹사이트를 열면

    프론트엔드에서 백엔드로 데이터를 요청하고

    백엔드는 데이터베이스로부터 데이터를 받아서 프론트엔드에 보내줘

    그래서 화면이 나타남.

     

    이처럼 세 요소가 함께 동작하는 웹 서비스인거죠. 지금부터 Service A라고 부르겠습니다.

     

    자 그럼 개발작업은 보통 어떻게 이뤄지나?

    개발자의 컴퓨터에서 코딩

     -> 테스트진행, 별 이상 없으면

     -> 그것들을 서버에 올려서 사람들이 사이트를 볼 수 있도록 서버에서 프로그램을 실행,  배포를 함.

     

    그러려면 개발자의 컴퓨터와 서버 모두에 이것들을 돌릴 수 있는 환경들,  Node.js와 파이썬, 그리고 MySQL이 가능한 버전 등이 동일하게 깔려 있어야 할 것.

     

    컴퓨터들을 대저택으로 비유, 여기에 Node.js / 파이썬 / MySQL근무자들이 입주해서 일을 하는거라고 비유

    개발자가 이 서비스 A만 만드는거라면 별 문제가 없음.

     

    그런데 이 집에서 새로 서비스 B도 진행하게 됐는데 Node.js의 신버전을 쓰면?

    서비스 A Node.js의 구버전에서만 정상동작한다면 이 집에는 두 버전의 Node.js가 입주해 있어야 하고 Node.js와보라고 하면 둘이 오다가 부딪히고 하는 등 이로써 일어나는 혼란이나 오류들을 방지하기 위해서는 꽤나 번거로운 설정들이 필요

     

    파이썬이나 DB도 마찬가지.

     

    집에서 여러프로젝트가 진행되면 입주자들이 함께 지내기가 꽤 힘들어짐

     

    가상환경 : VirtualBox, VMWare, 페러릴즈 로 내 OS안에 또 다른 OS들을 설치해서 서비스 A는 여기서, 서비스 B는 여기서 개발하는 것.

     

    이 가상환경을 깐다는건 이 큰 집 안에 또 집을 지어 넣는것과 같다

    환경들을 확실히 분리해주기는 하지만 그다지 효율적인 방법은 아님.

     

    일단 이 저택에 제공되는 전기와 수도를 이 집들이 특정비율로 분할해서 끌어감

    어디에 20%, 어디에 30%를 할당. 그럼 나머지는 50%밖에 활용이 안됨.

    컴퓨터의 성능과 자원이 환경마다 칼같이 제한됨

     

    그리고 큰 집에 부엌이랑 화장실 등이 이미 있는데, 이 집들에도 굳이 그것들이 들어감.

    성능활용이 중요한 서버에서는 더더욱 곤란.

     

    더 효율적으로 환경을 분리하는 방법 : 도커의 컨테이너를 활용

     

    대저택 안에 근무자들이 업무공간으로만 사용하는 컨테이너들이 들어가는 것.(▽방처럼)

    한 컨테이너 안에 여럿이 들어갈 수도 있고.(파이썬, MySQL)

    각각이 들어있는 컨테이너들이(파이썬 컨테이너, MySQL컨테이너) 서로 연결돼서 서비스들을 돌릴 수도 있다

     

    이 컨테이너들은 집에서 딱 필요한 공간만 차지하고 전기와 수도도 함께 공유해서 쓰기 때문에 집에 그냥 입주해서 사는것과 비교할 때 각각의 업무공간이 확실히 분리됨 + 컴퓨터 자원이 낭비되는 부분도 크지 않다. 버전이 다른 근무자들로 인한 혼란도 발생하지 않음.

     

    2.

    기존 입주방식의 또다른 문제는 서버로의 배포

    여러 근무자들이 함께하는 복잡한 서비스일수록 서버환경을 개발환경과 동일하게 맞추는것도 일이거든요

     

    개발 저택에 입주해있는 근무자들이 서버 저택으로 이삿짐 나르고 사무실 똑같이 세팅하고 해야 하는 것. 크고복잡한 서비스일수록 여간 번거롭다. 작은 것 하나만 잘못돼도 서버에서 안도는 수가 있다.

     

    이 문제 또한 도커의 컨테이너로 해결할 수 있음.

     

    개발자는 각 컨테이너들이 어떻게 설계되고 지정한 곳에 어떻게 설치가 되며 어떤 업무를 수행할지 심지어 여러 컨테이너들이 어떻게 연결돼서 함께 서비스를 구성하며 동작을 할지 설계도에 하나하나 명시해놓을 수가 있거든요.

     

    개발저택에서 코드를 작성하고, 그 코드들을 설계도와 함께 서버 저택에 보내면 서버에서는 그 설계대로 컨테이너들을 뚝딱 설치, 근무자들이 동일하게 서비스를 실행할 수 있게 해줌.

     

    3.

    실습

    도커사이트로 가서 도커데스크탑을 설치하기.

    윈도우의 파워쉘, 맥의 터미널에서 도커 버전을 확인

    도커 + IDE(VS Code 등) + Git

    세개 설치

     

    실습 진행 폴더 만들기

    윈도우는 C의 Users(사용자) 폴더 안에 내 사용자명 폴더 안쪽에 만들기

    이 폴더를 VS Code로 열고, (VS Code의)터미널을 연다음

    git clone뒤에  밑의 주소 붙여서 실행

    https://www.yalco.kr/36_docker/

    git clone https://gitlab.com/yalco/practice-docker.git

    얄코가 예제로 만들어둔 프로젝트 폴더가 다운받아짐.

     

    여기서부터 폴더구조와 Node.js웹서버를 실행해서 이 파일들로 웹사이트를 띄울거래

    이미 컴퓨터에 Node.js가 깔려있고, 자바스크립트로 돌아가는 http-server도 글로벌로 설치가 돼 있다면

    터미널에서 cd로 frontend 디렉토리로 들어간다음 따로 명령어를 사용해서 웹서버를 실행할 수 있다.(저영상보세요)

     

    근데 Node.js가 안깔려있다고 가정하면 http-server는 물론이고, 기본적인 자바스크립트 코드도 실행할 수 없다.

    근데 docker run -it node 를 쳐보면

    (어떤 명령어든 permission관련한 오류가 뜨면 앞에 sudo를 붙여주면 됨)

     

    뭔가 다운로드 되는 듯한 내용들이 출력되고

    노드js가 깔려있을 때의 노드를 실행했을 때처럼 입력 콘솔이 나타남.

     

    이처럼 자바스크립트 코드를 실행할 수 있다.

    이 Node.js환경은 어디서 나타난걸까?

    docker hub를 검색해서 사이트에 들어가보면

    여기서는 여러분이 뭔가 개발할 때 필요한 거의 모든 환경들을 '이미지'란 형태로 찾을 수 있다.

     

    node도 이처럼, 공식 이미지가 올라와 있음.

     

    도커의 이미지란것은 리눅스 컴퓨터의 특정 상태를 (리눅스 주택에 Node.js가 입주한 상태)

     

    캡쳐해서 박제해놓은 것을 말함.

    node이미지는 리눅스에 Node.js가 설치된 상태를 그대로 급속냉동해다가 클라우드에 올려놓은것

     

    근데 이게 어떻게 내 컴퓨터에 깔렸냐?

    도커는 일단 내 컴퓨터에서 그 이미지를 찾아본 뒤, 없으면 Docker Hub로부터 해당 이름으로 등록된

    이미지를 다운받게 됨.

    다운만 받는 명령어들도 있음 : https://www.yalco.kr/36_docker/

     

    run명령어는, 이미지가 없으면 그렇게 다운받은 다음, 그 이미지를 내 컴퓨터에서 해동해서 컨테이너로 만들어요

    이미지를 한번 받으면 그걸로 컨테이너를 몇개든 만들어낼 수 있습니다.

    이미지는 컨테이너를 찍어내는 틀 또는 무한생산 가능한 컨테이너 조립키트라고 생각하면됨

     

    run명령어의 옵션으로 사용되는 -it는 이 컨테이너를 연 다음 그 환경 안에서 CLI를 사용한다는것.

     

    컨테이너를 만든 다음, 그 안에 있는 근무자랑 컨테이너에 난 창문으로 대화를 하겠다는것

    그래서 이처럼 자바스크립트 콘솔을 사용할 수 있는것

     

    그리고 이 이미지는 컨테이너가 만들어져 설치되면 바로 node명령어가 실행되도록 설계가 돼 있어요

    때문에 컨테이너가 만들어지자마자 이런 입력창이 뜨는것.

     

    터미널을 하나 더 열고 상태를 살펴볼게요

     

    docker images를 입력합니다. node란 이름의 이미지가 다운받아진걸 볼 수 있죠?

    때문에 run명령어를 다시 실행하면 이미지를 새로받을 필요 없이 바로 콘솔이 실행돼요

     

    이번엔 컨테이너들을 살펴볼까요?

    터미널을 하나 더 연 다음(이전건 자바스크립트 콘솔이 열려있으니까)

    docker ps를 입력해볼게요

     

    그러면 이름이 임의로 지어진 컨테이너 하나를 볼 수 있다.

    컨테이너 고유의 ID와 임의로 주어진 컨테이너명 등의 정보가 보임.

     

    docker exec -it (컨테이너명) bash를 입력하면 이 컨테이너 내에서 bash shell이라는걸 실행한다는것.

    뒷문으로 돌아들어가서 컨테이너 안을 살펴볼 수 있다.

     

    윈도우에서 파워 쉘로 CLI명령어들을 입력할 수 있듯이

    맥이나 리눅스 등 유닉스에는 배쉬 쉘 등이 있다고 보시면 돼요

     

    엔터를 치면 뭔가 색다른 명령어 콘솔이 뜸

    이 컨테이너 내부를 통해 가상의 리눅스 환경으로 들어간것

    ls로 주변을 둘러보면 리눅스 영상에서 보았던 리눅스 환경의 기본 디렉토리들이 보임.

    컨테이너마다 각각 이 파일시스템과 네트워크가 있는것.

    그렇다고 집 전체, 리눅스가 다 들어있는건 아님.

    이 리눅스 환경은 도커 데스크탑 프로그램으로 구현되고 있는것

    여러분이 어떤 OS에서 도커를 돌리든, 도커의 컨테이너들은 리눅스 가상환경의 돌아간다고 기억하시면 돼요

    자 그럼 node 컨테이너의 CLI를 컨트롤+C로 종료

    ->컨테이너 안의 Node.js랑 회의를 끝마친것.

    다시 docker.ps를 입력해보면 컨테이너가 나타나지 않음.

    컨테이너가 철거됐다는의미?ㄴㄴ docker.ps는 현재 작업이 진행중인, 내부의 근무자가 일하고 있는 컨테이너만 표시가 됨

     

    모든 컨테이너를 보여달라는 의미의 -a를 붙여서 실행하면 현재 중지돼있는, 작업중이 아닌 이 컨테이너도 정보와 함께 나타남

     

    이 컨테이너들과 이미지들은 이 폴더(frontend)에 들어있는게 아님

    어느위치에서든 이 명령어들로 확인이 가능. 도커에 의해 다른곳에서 관리되는거라고 알고계시면 됨

    기타 주요 명령어들은 고정댓글 링크

     

    도커의 컨테이너와 이미지들은 각각 이 명령어들로 하나하나 정지시키고 삭제할 수 있는데

     

    번거로우니까 실습에서는 이걸 붙여넣어서 한꺼번에 없앱시다.

    docker stop $(docker ps -aq)

    docker system prune -a

    확인질문에 y

     

    이제 아무것도 없음.

     

    본격적으로 실제사용으로 들어가기

     

    방금처럼 컨테이너를 펼친 다음, 그 안의 근로자에게 창문으로 할 일들을 구두로 알려주는 것만으로는

    서비스를 돌리기 위한 복잡한 작업들을 제대로 시킬 수 없다.

    보다 섬세한 컨테이너 활용을 위해 이 Dockerfile이 사용됩니다.

    git으로 받은 프로젝트 내 폴더들을 살펴보죠.

     

    backend, frontend, database 폴더 전부에 Dockerfile이란 파일이 하나씩 들어있을것임.

     

    Dockerfile은 나만의 이미지를 만들기 위한 설계도다

     

    아니 node이미지를 받았는데 내걸 왜 또 만들어?

    컴퓨터에서 http-server란 프로그램을 돌리려면 Node.js만 설치돼 있어선 안됨.

    npm등으로 http-server가 전역으로 깔려 있어야함.

    node 이미지는 아직 http-server는 없는 상태기 때문에 이를 컨테이너로 실행할 때마다 매번 이걸 받아줘야함

     

    서비스를 돌릴때마다 이런 모듈들을 일일이 다운받아야 하는것

    Node.js에다가 http-server까지 깔린 상태가 이미지로 있으면 컨테이너로 서비스를 실행하기 보다 수월하겠죠

    그럼 이 Dockerfile을 살펴보면

     

    우리가 만들 이미지는 이 버전의 node이미지에 덧붙여서, 공식 이미지를 개조, 튜닝해서 만드는것.

     

    RUN명령어는 이미지를 생성하는 과정에서 실행할 명령어

     

    Node.js가 깔린 node이미지니까 npm명령어가 먹히겠죠.

    이 상태에서 http-server를 설치해줍니다.

    workdir명령어는 이 안에서 명령어를 실행할 위치를 설정해요

    이 커맨드에서 문자열의 배열로 명시한 이 명령어가 이 디렉토리내에서 실행되는것.

    이 RUN 명령어와 CMD 명령어의 차이는

    RUN은 이미지를 생성하는 과정에서 실행되는것. 즉 이미지에서 컨테이너를 실행하는 시점에서는 이미 http-server가 설치돼 있도록 하는거구요

    커맨드 명령어는 이미지로부터 컨테이너가 만들어져 가동될 때

    기본적으로 바로 실행되는 명령어라는거죠.

     

    이 명령어로 서비스를 만들어 돌리려면, 이 폴더 안에 사이트의 html, css, js등의 파일들이 들어있어야 하잖아요?

    그 걱정은 잠시 미뤄두고, 이 파일로 이미지를 만들어볼까요?

    명령어들은 여기 주석들로 다 표기를 해두었습니다.

    CLI에서 이 폴더로 들어온 다음 -t 뒤에 원하는 이미지명을 적은 뒤

    Dockerfile로의 상대 경로를 적어줍니다.

    파일명이 Dockerfile이면 따로 명시할 필요가 없어요

     

    실행을 해주면 이처럼 node 컨테이너를 다운받은 다음 지정한 명령어들을 실행하는 걸 볼 수 있죠.

    이게 docker images로 이미지목록들을 보면 node이미지가 다운받아져 있고 이를 기반으로 해서

    Dockerfile과 build 명령어로 만든 이 이미지가 만들어진걸 확인할 수 있음. 여기에는 http-server가 이미 깔려 있는거에요

    그럼 이 이미지를 컨테이너로 run, 실행을 해 보죠.

    이번 run 명령어는 아까보다 옵션이 많이 들어갑니다.

    먼저 아까는 도커가 임의의 컨테이너명을 지어줬지만 이번에는 생성될 컨테이너의 이름을 지정해주기로 해요.

    여러 컨테이너들이 실행될 시 각각이 구분되는게 좋을테니까요

     

    다음은 -v옵션. volume의 약자

    도커에서 볼륨이란, 컨테이너와 특정 폴더를 공유하는걸 말함.

    코드는 내 컴퓨터에서 짜는거니까 이 컴퓨터, 즉 집에 있겠죠

    여러분이 집에서 코드를 짜서 그 파일을 거실 탁자에 놓으면 그 거실 탁자는 Node.js가 일하는 컨테이너의

    home칸 node책상의 app서랍과 연결돼 있는것.

    그럼 컨테이너가 언제, 몇 개가 만들어지든 각 컨테이너의 app서랍에서는 거실에 둔 파일들로 얼마든지 서비스를 실행할 수 있겠죠

     

    pwd명령어가 현 위치를 출력하는거니까

     이 옵션은 지금 위치한 이 폴더 안의 내용들이 컨테이너의 home/node/app폴더에 들어간다는 의미

    그래서 컨테이너에서 이 명령으로 파일들을 실행할 수 있는거에요

     

    -p옵션은 포트, 웹 개발해보신 분들은 알겠죠. 집에 내선번호를 컨테이너의 것과 연결하는거에요

     

    이미지 단에서 CMD로 미리 설정을 해둔것처럼

    컨테이너는 실행시 이 사이트를 8080번으로 송출할거니까 그게 집에서도 같은 번호로 송출될거면 이처럼 집의 8080번을 컨테이너의 8080번과 연결한다 이렇게 명시하면 되는거에요

    만약 이 컨테이너를 두 개 이상 만든다면 집의 내선번호를 공유할순 없기 때문에 충돌이 나겠죠

     

    그래서 같은 이미지의 다른 컨테이너를 실행할 때는 집의 8081번을 컨테이너의 8080번과 연결한다 이런식으로 변화를 주면 돼요

     

    마지막으로는 컨테이너로 실행할 이미지를 지정해줍니다.

     

    자 그럼 실행 해보면

    8080번으로 서버가 열렸다는 표시가 뜨고 브라우저에서 내 컴퓨터 주소를 뜻하는 localhost뒤에 8080번 포트를 붙여서 접속해보면 이처럼 사이트가 나타나죠

     

    컨+C로 컨테이너를 종료한 뒤, 컨테이너랑 이미지를 다 삭제해 주고 이제 나머지 둘도 도커로 실행을 해볼까요?

     

    database 폴더로 가면 Dockerfile이 들어있다.

    이번에는 mysql 5.7버전을 담은 이미지를 다운받아 개조할거에요

    먼저 env명령어로 생성될 컨테이너 안의 환경변수를 미리 지정합니다. 컨테이너가 안에 있는 칠판에 이런 내용이 적힌채로 만들어지는거에요

     

    MySQL DB에서 어떤 사용자명과 비밀번호, 데이터베이스명 등을 사용할지 미리지정해두는것

     

    실전에서는 보안요소를 이런 곳에 그대로 작성하면 위험해요

    따로 관리되는 파일에 넣거나 하는 식으로 안전하게 관리합니다.

    다음에는 COPY 명령어로, 이 scripts 안에 있는 이 파일들을 이미지 내부의 이 폴더로 복사합니다.

    이 mysql 이미지는 컨테이너로 실행이 될 때 이 폴더 안의 sql 파일들에 적힌 쿼리 명령어들을 실행하도록 설계가 돼 있는거에요

     

    서비스에서 사용할 테이블을 만들어두고 기본적으로 들어갈 데이터들을 넣어주는 쿼리들입니다 ▽오 컨테이너를 만들면 기본으로 세팅되는군

     

    아까의 RUN 과 CMD 명령어처럼 COPY 명령어도 volume 개념과 헷갈리실 수 있는데 COPY는 RUN처럼 이미지를 생성하는 과정에서 미리 해당 이미지 안에 특정 파일을 미리 넣어두는 거고 volume은 CMD처럼, 컨테이너가 생성되어 실행될 때 그 내부의 폴더를 외부의 것과 연결하는 겁니다.

     

    이 script파일들은 컨테이너 초기화 과정에 필요한거니까 COPY로 이미지 안에 미리 넣어두는 것이 맞겠죠(▽초기화는 세팅)

     

    자 그럼 터미널에서 database로 이동한 다음 여기서 아까처럼 이미지부터 만들어볼게요

    mysql을 받아서 그걸로 이 이미지를 만들었고, 이제 run 명령어로 실행을 해 보도록 하죠

    이번 컨테이너는 컨테이너명과 포트만 지정하면 돼요

    실전에서는 데이터를 유지해야 하니까 데이터 폴더를 -v옵션으로 집의 데이터 창고랑 볼륨 공유를 하겠죠.

     

    mysql은 3306포트가 기본이고 집에도 3306으로 연결할게요

    뭔가 막 로그가 뜨고 3306으로 MySQL이 열렸다고 나옴.

     

    근데 이렇게 컨테이너를 실행하면 이 컨테이너가 돌아가는 동안 이 터미널은 못씁니다.

    현재는 내가 보는 앞에서만 컨테이너에서 일을 할 수 있도록 돼 있어요

    이 MySQL 컨테이너는 명령어도 받지 않으니까 터미널을 하나 새로 열어서 컨테이너를 중지, 삭제해주고 

    이번에는 run 명령어에 -d 옵션을 붙여볼게요

     

    daemon의 줄임말인데, 저 뒤에 안 보이는 곳에 가서 알아서 컨테이너 깔고 돌라는 겁니다.

    이렇게 하면 생성된 컨테이너의 ID만 표시되고, 터미널은 그대로 사용 가능해요

    docker.ps로 살펴보면 알아서 잘 돌고 있고 여기서도(sql developer같은건가본데) 정상작동하는게 확인이 되죠.

     

    일 어떻게 하고 있는지 컨테이너의 로그를 살펴보려면 docker logs -f 뒤에 컨테이너 명을 붙여주시면 돼요.

     

    이렇게 실시간으로 로그를 볼 수 있고 컨+C로 빠져나올 수 있습니다.

     

    마지막으로 backend쪽을 살펴볼게요

    백엔드에서는 파이썬의 flask로 api서버를 돌리고요

    이 backend.py파일을 실행해서 서버를 가동합니다.

     

    Dockerfile을 열어보면 파이썬이 깔려 있는 이미지를 가져다가 이 flask관련 라이브러리들이 추가로 깔리도록 개조한 다음 이 폴더에 위치해서 컨테이너 실행시에 이 명령어로 백엔드 서버를 실행하도록 되어있죠

     

    이처럼 우리의 서비스A를 구성하는 세 요소가 각각의 폴더에 Dockerfile이란 미시적 설계도로 도커에서 어떻게 실행될지 설정이 돼있는거에요.

     

    그런데 이렇게 설계된 서비스를 실행할 때 매번 이런식으로 요소들 하나하나 이미지를 다운받고 적절한 명령어로 컨테이너를 실행하는 건 여전히 번거롭죠. 게다가 각각의 네트워크가 분리 되어 있기 때문에 이 백엔드와 데이터베이스는 데이터를 주고받지 못해요

     

    이 요소들을 연결해서 서비스를 간편하게 실행할 수는 없을까요?

     

    이를 위해 거시적 설계도인 docker-compose가 사용됩니다.

     

    Docker Compose

    Compose : 구성하다 작성하다

     

    일단 실습을 위해 모든 컨테이너와 이미지들을 삭제해주시고

    프로젝트 폴더에 docker-compose.yml파일이 있죠.

     

    열여서 살펴보기로 해요

    영상이 만들어진 현재는 최신인 3버전이 권장됩니다.

    이 페이지에서 도커 버전마다 적합한 컴포즈의 버전을 확인할 수 있어요

     

    서비스 A의 세개가 compose에서는 services란 항목의 내부 항목들로 각각 들어가요.

     

    데이터베이스부터 설정을 합시다.

    이 항목명이 각 서비스들이 이름, 그리고 이들간의 네트워크에서 각각의 호스트명이 돼요.

    build는 Dockerfile이 있는 위치입니다.

     

    컴포즈 파일이 있는 폴더로부터는 이렇게 되겠죠

    외부에 개방할 포트도 이렇게 명시할 수 있어요

     

    run명령어를 실행할 때마다 줘야 했던 옵션들을 이렇게 문서에 미리 작성해둘 수 있는거죠

     

    backend 설정도 살펴봅시다

    역시 Dockerfile의 위치와 포트를 지정하고 volume을 사용하기 때문에 이 항목도 작성돼있죠.

     

    환경변수도 컴포즈에서 이렇게 설정해줄 수 있어요

     

    backend.py코드에 해당 환경변수가 들어가죠.

    컴포즈로 구성될 이 컨테이너들간의 네트워크에서 데이터베이스에 접속할 때 이 호스트명을 사용해서 데이터베이스 컨테이너의 MySQL에 접속하는거에요

     

    frontend는 이제 척보면 아시겠죠?

    자 그럼 이 거시적 설계대로 서비스를 실행해 볼까요?

    docker-compose.yml이 있는 위치에서 docker-compose up 을 실행합니다.

    시간을 꽤 소모하면서 각 이미지들이 빌드되고, 컨테이너로 실행되는 모습을 볼 수 있어요.

     

    브라우저에 localhost:8080으로 접속해보면 이 세 모듈이 연동돼서 성공적으로 이런 화면이 보여지는걸 확인할 수 있죠.

     

    도커컴포즈 뒤에도 -d를 붙여서 이미지 생성 후 뒤에서 알아서 일하도록 할 수 있어요

     

    자, 이제 어느 서버에든 도커 환경만 설치돼있으면 git 등으로 이 프로젝트를 다운받고, 도커로 실행해서 이 컴퓨터와 똑같은 환경을 조성하고, 문제 없이 서비스를 돌릴 수 있겠죠.

     

    Node.js, 파이썬, MySQL, 그리고 추가 라이브러리들을 일일이 설치하고 이것저것 설정할 필요가 없어진거에요

     

    여유가 되신다면, 리눅스 환경에 도커를 설치해서 이 프로젝트를 실행해보세요

    AWS등을 이용해서

    리눅스에서는 docker-compose도 따로 설치를 해줘야함

     

    도커와 도커컴포즈를 모두 설치하신 다음, git으로 프로젝트를 clone하고, sudo docker-compose up으로 실행하면 이제 개발한 서비스를 다른 컴퓨터나 서버에서 실행하는 일이 도커로 인해 얼마나 간편해지는지 실감하실 수 있을거에요

     

    이 강의에선 도커의 수많은 명령어와 유용한 기능들 중에 지극히 일부로 예시만 보여드린것.

    이제 도커가 전반적으로 어떻게 돌아가는건지 감을 잡으셨으니, 보다 자세한 도커관련 문서들과 전문적인 강좌들을 한결 수월하게 이해하고 공부해나가실 수 있을거에요

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

Designed by Tistory.