2022-03-29 T.I.L 도커

Docker에 대해


도커 = 컨테이너임 . 왜 컨테이너를 쓰는지 생각해봐!

도커의 장점


  1. 의존성 충돌 문제를 해결해 준다.

  2. 개발과 배포 환경을 일치시킨다.

  3. 수평 확장을 쉽게 해준다.

  4. 각 서버에 새로운 내용을 배포하기 쉽게 만들어준다.

    자 그러면 하나씩 살펴보자


1. 의존성 충돌 문제를 해결해 준다.

실행 환경에 구애받지 않고 애플리케이션을 실행할 수 있다!

근데 반대로 말하면 애플리케이션 실행은 어떠한 환경에 구애를 받는다는말 아님? ㅇ

예를 들어 밥을 먹으려면 숟가락이 있어야함. 다시 말해 밥 프로그램은 숟가락 프로그램에 의존한다라고 함.

근데 문제는 A프로그램은 B 프로그램 버전 7에 의존하고 C프로그램은 B 프로그램 버전 6에 의존하면
내 컴퓨터에는 버전 7을 깔아야됨? 버전 6을 깔아야됨?

그래서 A프로그램, C프로그램을 도커(컨테이너)에 가둬서 따로따로 실행하면 됨 ❗




좀더 전문적으로 말하면

프로세스, 네트워크, 파일 시스템을 컨데이너에 격리시킴
프로세스는 컨테이너 안에서만 액세스 가능, 컨테이너 하나에 하나의 IP 주소 할당, 컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있음

컨테이너랑 가상 머신이랑 비슷함(advance)

개발과 배포 환경을 일치시킨다.

이게 무슨 말이냐

맥쓰는 사람이랑 우분투 쓰는 사람이랑 프로그램 설치방법이 다를 수 있음

별거 아닐지 몰라도 프로그램 까는 방법들이 통일되지 않으면 사소한 부분에서 문제가 생기면

진짜 시간낭비..

근데 도커는 명령어가 통일 되어있음. (진짜?)

OS에 상관없이 앱 실행 환경을 만들 수 있는것

근데 그러면 이런 질문이 있지

아니 전에 AWS에서 배포할때 그거 사이트 실행 환경 구성하는것 그것도 맥은 들어가고 우분투는 못들어가나? 같이 들어가잖아. 맞음

그것은 퍼블릭이고 이거는 프라이빗임.

근데 이렇게 생각해보자. 애초에 EC2 자체에 도커를 설치하는거임😳 => 그게 ECS서비스란다.

그래서 이제 "내 컴퓨터에서는 잘 되는데요 님 컴퓨터 문제임. 이 변명이 안통함 ㅋㅋ

3 & 4 수평 확장을 쉽게 해주고 각 서버에 새로운 내용을 배포하기 쉽게 만들어줌.

google 서버는 전 세계에 단 하나만 있지 않을거임.

그리고 서버가 1, 2, 3번 서버가 있다 해도 전부 1로 접속시킨다음 터지면 2로 접속하고 또 터지면 3으로 접속하고 이렇게 하지 않고 트래픽을골고루 분배 할거임 그래서 수평 확장이 쉬움. 그냥 서버 show me the money 쓰면 됨.

이러한 서버를 리버스 프록시의 한 종류인 로드 밸런서라고 부름

컨테이너 기술의 가장 큰 장점은 실행 환경의 일치인데 그냥 로드 밸런서에 서버 계속 추가해주면 됨!

이걸 응용하여 일부 서버에만 업데이트를 하여 테스트 운영 해볼수도 있음!

그게 오케스트레이션 도구인데 그거는 다음에 공부하자..

도커 핵심 키워드

컨테이너

도커라는 기술 위해 실행될 수 있도록 만든 애플리케이션 상자

이미지

실행되는 모든 컨테이너는 이미지로부터 생성됨!
얘는 애플리케이션 및 애플리케이션 구성을 함께 담아놓은 템플릿

이걸 ctrl + c , ctrl + v 하면 수평 확장 가능!

Node.js 웹 앱의 도커라이징 레퍼런스 참고!

레지스트리

이미지는 레지스트리에 저장됨. Docker Hub, Amazon ECR이 있음

도커 CLI 실험


우선 우분투에서는 무조건 앞에 sudo 붙이기!

도커 공식문서

도커 CLI 설명

이미지 구분 해석

파란색: 레지스트리 => 도커 이미지 관리 공간.
내꺼, 회사 것등으로 구분
디폴트는 https://hub.docker.com/

초록색: 레포지토리 => 레지스트리안의 여러 이미지 공간

노란색: 태그 => 같은 이미지지만 버전 별로 내용 구분 가능. 디폴트는 latest

예제

  • docker/whalesay의 최신 이미지를 받아오기
docker/whalesay:latest

docker image ls 로 하면 더 많은 정보 탐색 가능



  • 받아온 이미지 실행 (이미지 => 컨테이너)
docker container run --name 컨테이너_이름 docker/whalesay:latest cowsay boo


  • run : 컨테이너 실행.

  • --name : 컨테이너 이름 할당

  • command : 실행 시 수행되는 명령어

  • cowsay : 실행시 cowsay 명령어 호출


boo : cowsay에 넘겨질 파라미터.

  • 컨테이너 리스트 출력
docker container ps -a

  • 컨테이너 삭제
docker container rm 컨테이너_이름

  • 이미지 삭제
docker image rm docker/whalesay

  • docker image의 용량 확인
docker image ls

이까지 하면 하나의 이미지를 받아와 컨테이너로 실행하고, 컨테이너와 관련된 리소스를 삭제한거임.

여기까지 했을때 문제해결한 것.

sudo docker image rm docker/whalesay

해서 이미지 지우려고 하니 문제가 있음.

뭐라 뭐라 뜨는데 내가 지울 이미지를 이미 어떤 컨테이너가 참조하고 있다는 거임

그래서 컨테이너 먼저 지워줘야됨!

docker/whalesay로 안 지워져서 컨테이너 번호로 지움

그리고 다시 이미지 지움

여튼

그러면 이 세가지작업을 동시에 하면?

docker container run --name 컨테이너_이름 --rm docker/whalesay cowsay boo

만약에 이미지가 없다면 이미지를 받아온 뒤 실행함.

  • -rm : 컨테이너를 일회성으로 실행!

다시 이미지 지움!

도커 CLI 예제 실습!

❓danielkraic라는 사람이 올린 이미지 asciiquarium 를 실행합니다.

docker container run -it --rm danielkraic/asciiquarium:latest
  • -it 는 -i 과 -t 의 조합인것 같음.

하면 물고기 움직임 ㅋㅋㅋ

도커의 응용


타인의 도커 이미지를 사용할 때 내가 뭔가 파일을 추가하고 싶거나 도커 이미지를 만들어 보자!

도커 컨테이너에 파일 복사

앞에서는 사용할 모든 파일이 하나의 이미지에 구성되어 있고, 그 이미지를 사용했는데

게임서버, 웹 서버와 같이 내가 사용할 도구가 도커 이미지에 모두 구성되어 있지 않은 경우가 있음.

예를들어 웹 서버는 도커 컨테이너로 실행하나 그 안을 구성하는 파일은 직접 만들거나 가져온 파일로 구성할때

=> 서버에 문제와 호스트의 문제를 분리해야 파악 가능, 문제가 생긴 서버만 크고 공장 초기화로 빨리 복구 가능!

그래서 로컬 ------------------------- 도커 이미지 연결 방법은

  • CP : 호스트와 컨테이너 사이에 파일을 복사

  • Volume: 호스트와 컨테이너 사이에 공간을 마운트해서 얻음.

마운트는 저장 공간을 다른 장치에서 접근할 수 있도록 경로를 허용하는것.

게임 서버 파일은 codestates/pacman-canvas 저장소에서 확인할 수 있음.



httpd 웹 서버

우리는 도커 이미지 httpd (http daemon)을 사용해보자.

httpd는 아파치 HTTP Server를 실행할 수 있는 오픈소스 웹서버 스프트웨어임.

  • httpd는 /usr/local/apache2/htdocs/경로에 웹 서버와 관련된 파일들이 저장되어 있다면, 해당 파일을 기반으로 웹 서버가 실행되도록 하는 것.
  1. 레포 클론.
git clone https://github.com/codestates/pacman-canvas
  1. docker container run명령어로 httpd 실행
docker container run --name 컨테이너_이름 -p 818:80 httpd

나는 여기서 whalesay로 했는데 httpdserver 이렇게 컨테이너 이름 짓는게 나을듯

  • -p 옵션은 로컬호스트의 포트와 컨테이너의 포트를 연결 내것:818 컨테이너것:80

  • httpd는 일정 시간 입력이 없으면 서버 가동 중단.

  • -d 는 컨테이너를 백그라운드에서 실행하게 해줌.


3. 자 그러면 여기서 localhost:818 나 127.0.0.1:818 (내꺼) 로 접속하면?

굳!

  1. 새로운 터미널을 열어 docker container cp명령어를 입력해 로컬호스트에 있는 파일을 컨테이너에 전달하자!
  • 경로를 입력할 때, 상대 경로와 절대 경로를 주의해서 작업!!!

문서

이 작업은 앞 경로의 파일을 뒤 경로에 복사하는거임.

docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/
컨테이너 이름 => usr~~~ 로 복사!

이거 할때 pacman-canvas 폴더에서 해야함!

  1. 다시 localhost:818에 들어가면??

팩맨게임 쌉가능!

문제가 있다면?

컨테이너를 다룰 때 이상하다면 docker exec -it 컨테이너_이름 bash 치면

컨테이너 내부 터미널 로 접속 됨!

거기서 우리 터미널처럼 마음대로 헤집기 가능!

Docker 이미지 만들기

이제 앞에서 만든 Docker Container를 이미지 파일로 변환하자! 반대임!

이렇게 하면 배포 및 관리가 유용해짐!

방법은 두가지 인데

1. 구동한 Docker Container를 이미지로 만드는 방법

docker container commit 명령을 이용

docker container commit 컨테이너_이름 my_pacman:1.0

  1. my pacman 1.0 확인

  1. 생성된 이미지를 900 포트에서 웹 서버로 구동 docker run
docker run --name my_web2 -p 900:80 my_pacman:1.0

900포트로 노출시킬거니까 로컬호스트 900으로 ㄱㄱㄱ

  1. 가보면 팩맨 실행됨!



2. Docker Image 빌드를 위한 파일인 Dockerfile 로 만드는 방법

Dockerfile 공식 문서

도커파일을 만들고, 그대로 이미지를 build하는 방법 => 새로 모든걸!

Dockerfile almost equal to 이미지 파일의 설명서

레포에 포함된 dockerfile 텍스트를 보면

FROM httpd:2.4  # 베이스 이미지를 httpd:2.4로 사용
WORKDIR /usr/local/apache2 
COPY ./ /usr/local/apache2/htdocs/ # 호스트의 현재 경로에 있는 파일을 생성할 이미지 여기졍로에 복사하자.
# 배포시 사용하는 conf 파일
# COPY ./httpd.conf /usr/local/apache2/conf/

그러면 이제

docker build명령으로 도커 이미지 파일 생성!

여기서 중요한건 dockerfile을 찾는데 마지막에 경로를 넣어야 하는데 현재 폴더에 있으면 .찍기!

 # --tag 는 name:tag 형식으로 이미지를 생성할 수 있습니다.
 # 지정한 경로에 있는 Dockerfile을 찾아서 빌드합니다.
 docker build --tag my_pacman:2.0 . # "."을 명령어에 꼭 포함해야 합니다! 

다시

docker run --name my_web3 -p 901:80 my_pacman:2.0

이미지 구동!



도커 스프린트!


Part1. 한 개의 Docker 이미지를 다루는 방식 연습

Quiz 1: 브라우저 속 게임 화면의 특정 단어를 확인하세요.

이미지는 sebcontents/part1을 이용해야 합니다. 태그는 latest 입니다.

sebcontents/part1은 아파치 웹 서버 이미지(httpd)를 기반으로 commit된 새로운 이미지 입니다.

Docker Hub에 저장되어 있는 이미지를 사용하는 경우, repository에 작성된 안내 사항을 확인하는 습관을 들이는 것이 중요합니다.

sebcontents/part1 이미지의 repository로 이동하여 안내 사항을 참고하고, 컨테이너를 생성합니다.

컨테이너를 통해 space 게임을 실행해보세요. 소스 코드는 https://github.com/codestates/SpaceInvaders에 있습니다.

게임 실행 후 다음 그림의 빨간 박스에 들어갈 단어가 무엇인지 확인하세요. Quiz 1의 정답입니다.



  1. 여튼 git 레포 clone 하면 게임이 있음

  2. 우선 docker run --name 컨테이너_이름 -d -p 3000:80 sebcontents/part1로 컨테이너 생성.

  3. 그러면 레포 폴더에서 docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/ 복사 ㄱㄱ

  4. localhost:3000 번 실행! 끝



Quiz 2: 컨테이너 속 txt 파일 안에 있는 단어를 확인하세요.
docker exec 명령어를 이용해 실습을 진행합니다.
컨테이너_이름 부분에는 quiz1 실습 과정에서 사용한 컨테이너의 이름을 입력하면 됩니다.

docker exec -it 컨테이너_이름 bash 로 컨테이너 내부 터미널 ㄱㄱ

Part 2 - 두 개의 Docker 이미지를 다루는 방식 연습

Getting Started
이번 실습에는 두 개의 이미지를 사용합니다.

nginx 이미지를 기반으로 한 sebcontents/client 이미지를 이용하여 client 컨테이너를 생성합니다.
node 이미지를 기반으로 한 sebcontents/server 이미지를 이용하여 server 컨테이너를 생성합니다.

이번 실습에서는 localhost 의 8080 번 포트로 접속하면, sebcontents/client 이미지를 이용해 배포한 client 컨테이너의 80 번 포트로 연결됩니다.
위 그림은 매우 간략하게 표현되어 있습니다. 도커 네트워크에 대해서 좀 더 궁금하시다면 docker network, docker bridge 를 검색해 더 많은 정보를 찾을 수 있습니다.

docker-compose CLI

공식문서

좋은 웹페이지 즐겨찾기