Docker

Minki CHO·2023년 2월 2일
0

CodeStates

목록 보기
41/43

컨테이너

일반적 컨테이너
:물자를 싣고 내릴 때 선박에 입항해 있는 시간을 획기적으로 단축시킴
:물자를 싣고 내릴 때 필요한 인력(분류하는 사람, 짐 옮기는 사람, 감독하는 사람)을 대폭 감소시킴
=> 개발자들은 컨테이너 기술을 "소프트웨어 수송, 즉 배포에 사용할 수 없을까?"

"컨테이너 방식으로 애플리케이션을 실행한다"

컨테이너 기술의 장점
:실행 환경에 구애받지 않고 애플리케이션을 실행할 수 있다!
= 애플리케이션 실행은 어떠한 환경에 구애를 받는다

Docker

컨테이너 방식의 장점
:의존성 충돌 문제를 해결해 준다
1. 개발과 배포 환경을 일치시킨다
2. 수평 확장을 쉽게 해준다
3. 각 서버에 새로운 내용을 배포하기 쉽게 만들어준다

애플리케이션 실행하려면 반드시 어떠한 환경이 구축되어야 함
ex. 윈도우용 프로그램 실행하려면 윈도우 운영체제가 필요함

어떤 프로그램A 실행에 다른 프로그램B이 반드시 필요한 경우,
"프로그램A는 프로그램B에 의존 관계를 가지고 있다"

ex.
워드 프로세스 프로그램이 php 프로그램에 대해 의존 관계를 가질 때,
특정 php 버전인 php v7을 요구할 수 있음
그런데 동일 컴퓨터에 php 프로그램을 반드시 필요로 하는 drupal 프로그램을 실행시켜야 할 때,
이 drupal 프로그램이 php v6 버전을 요구한다면?
하나의 컴퓨터에 두 버전의 프로그램이 존재할 수 없으므로
워드 프로세스 프로그램 또는 drupal 프로그램 중 하나만 제대로 실행됨
이러한 상황을 "의존성이 충돌한다"라고 함

컨테이너 기술이 이 문제를 해결할 수 있음
컨테이너 기술은 애플리케이션을 컨테이너 내에 구성함
즉, 컨테이너에서 실행 중인 애플리케이션은 어떻한 의존성도 공유하지 않고, 각자 고유의 의존성을 포함함

:각 컨테이너가 철저하게 실행 환경이 격리되어 있기 때문

컨테이너가 격리하는 것

1 프로세스
:특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스할 수 있음
:컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향을 줄 수 없음

2 네트워크
:기본적으로 컨테이너 하나에 하나의 IP 주소가 할당되어 있음

3 파일 시스템
:컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있어 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있음

? 컨테이너는 가상머신인가?
가상 머신 Virtual Machine, VM
(하나의 호스트(주인) 컴퓨터 위에 여러개의 독립적인 컴퓨터가 작동할 수 있게 하는 기술)
도커를 비롯한 리눅스 컨테이너 기술은 가상머신의 접근 방법과 조금 다르나,
가상 머신과 비슷한 수준의 격리성을 제공함

컨테이너 방식의 장점
:의존성 충돌 문제를 해결해 준다
1. 개발과 배포 환경을 일치시킨다
2. 수평 확장을 쉽게 해준다
3. 각 서버에 새로운 내용을 배포하기 쉽게 만들어준다

ex.
여러 개발자가 하나의 애플리케이션을 만들기 위해서 먼저 비슷한 개발 환경을 구축함
특정 버전 이상의 JDK, 특정 버전의 MySQL 등을 개발자 본인의 운영체제에 설치하고 개발 진행
그런데 이 과정에서 사소한 실수, 사전 설치 항목의 부재 등으로 지연될 가능성이 있음
이때 도커가 이러한 문제를 해결함
도커가 실행 중이라면, 어떤 운영체제든 상관없이 다음 명령어로 즉시 PostgreSQL을 설치/실행함

docker run --name postgres -e POSTGRES_PASSWORD=mysecret -d postgres

도커는 다음 문제를 해결할 수 있음
:OS에 상관없이 즉시 애플리케이션 실행 환경을 만들 수 있음
:개발을 컨테이너 위에서 진행할 경우, 모든 개발팀이 동일한 환경 하에서 개발을 진행할 수 있음

컨테이너 방식의 장점
:의존성 충돌 문제를 해결해 준다
1. 개발과 배포 환경을 일치시킨다
2. 수평 확장을 쉽게 해준다
3. 각 서버에 새로운 내용을 배포하기 쉽게 만들어준다

ex.
글로벌 웹 서비스인 google.com은 전 세계인들이 사용하여 트래픽이 많음
그렇다면 수많은 사람들이 검색 서버란는 단 하나에 접속하나?
그렇지 않음
서비스 제공자들은 이러한 트래픽의 분산을 위해 프록시 서버를 운영
프록시 서버는 여러 대의 동일한 검색 서버 중 한 군데를 이용할 수 있도록 도움
(이러한 서버를 리버스 프록시의 한 종류인 '로드 밸런서'라고 부름)

:리버스 프록시 구조 예시

컨테이너의 가장 큰 장점은 실행 환경의 일치
더 많은 트래픽으로 인한 서버 증설에는 컨테이너 기술이 활발하게 이용됨
동일한 애플리케이션 구성(이미지)을 바탕으로 새로운 서버에 해당 애플리케이션을 컨테이너로 실행하고
로드 밸런서에 이 서버를 추가하면 됨

이러한 기술을 응용하여 새로운 버전의 애플리케이션을 여러 서버 중 몇대에만 운영하고 테스트하는 방법도 가능함
이를 통해 새 버전의 애플리케이션에서 발생할 수 있는 문제를 미리 확인하고
이 문제가 사용자 전체에게 영향을 끼치지 않게 만들 수 있음


:오케스트레이터를 활용한 테스트의 예시
쿠버네티스와 같이 오케스트레이션 도구라고 부르는 것들이 이러한 일을 해줌
이는 컨테이너 기술 덕분에 가능한 것

Docker 핵심 키워드

컨테이너
:애플리케이션이 의존성, 네트워크 환경, 파일 시스템에 구애받지 않고, 도커라는 기술 위에 실행될 수 있도록 만든 애플리케이션 상자

이미지
:실행되는 모든 컨테이너는 이미지로부터 생성됨
:애플리케이션 및 애플리케이션 구성을 함께 담아놓은 템플릿으로, 이를 이용해 즉시 컨테이너를 만들 수 있음
:이미지를 이용해 여러개의 컨테이너를 생성할 수 있음, 이를 이용해 앞서 설명한 애플리케이션의 수평 확장이 가능함
(이미지:컨테이너 = 1: N 관계)
:이미지는 기본 이미지base image로부터 변경사항을 추가/커밋해서 또 다른 이미지를 만들 수 있음
ex. 스프링부트 기반의 애플리케이션을 이미지로 만들고 싶은 경우, 스프링부트 초기 세팅 이미지를 기본 이미지로 삼고 만들고 싶은 애플리케이션을 추가해 넣고, 이미지화할 수 있음

레지스트리
:이미지는 레지스트리에 저장됨
:대표적 이미지 레지스트리로 Docker Hub, Amazon ECR 있음
:도커 CLI에서 이미지를 이용해 컨테이너를 생성할 때, 호스트 컴퓨터에 이미지가 존재하지 않는다면, 기본 레지스트리로부터 다운로드 받게 됨
(Docker CLI : Command Line Interface)

Docker CLI

Docker CLI(Command Line Interface)
:Docker Image 및 Container를 다루는 명령어 작성 가능

Docker docs : https://docs.docker.com/engine/reference/commandline/container_run/

도커 이용하기

:도커 이미지 실행 시 도커 컨테이너가 됨


:이미지 구분

1 레지스트리 Registry
:Docker Hub : https://hub.docker.com/
:도커 이미지를 관리하는 공간
:특별히 다른 것을 지정하지 않으면, 도커 허브(Docker Hub)를 기본 레지스트리로 설정
:레지스트리는 Docker Hub, Private Docker Hub, 회사 내부용 레지스트리 등으로 나눌 수 있음

2 레포지토리 Repository
:레지스트리 내에 도커 이미지가 저장되는 공간
:이미지 이름이 사용되기도 함
:Github의 레포지토리와 유사함

3 태그 Tag
:같은 이미지라고 할지라도 버전 별로 안의 내용이 조금 다를 수 있음
:해당 이미지를 설명하는 버전 정보를 주로 입력함
:특별히 다른 것을 지정하지 않으면, latest 태그를 붙인 이미지를 가져옴

docker/whalesay:latest
:Docker Hub 레지스트리에서
:docker라는 유저가 등록한 whalesay 이미지 혹은 레포지토리에서
:latest 태그를 가진 이미지

명령어

docker image pull docker/whalesay:latest

:docker/whalesay의 최신 이미지를 받아옴 pull함

docker image ls

:이미지 리스트 출력

받아온pull 이미지를 실행(이미지-> 컨테이너)

:명령어 docker container run 사용법
{container} run: 컨테이너를 실행
[OPTIONS]: -name : 컨테이너의 이름을 할당
[COMMAND]: 초기 컨테이너 수행시 수행되는 명령
: cowsay : 컨테이너 실행 시 cowsay 명령어를 호출, node 호출하듯 이용
[ARG...] : boo : COMMAND인 cowsay에 넘겨질 파라미터

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

:'컨테이너_이름'을 이름으로 갖는 컨테이너를 실행


:docker container run --name whalesay docker/whalesay:latest cowsay boo 정상적으로 실행되었을 때 터미널에 출력되는 화면

docker container ps -a

:모든 컨테이너의 리스트 출력
:{container} ps : 컨테이너 리스트 출력
:-a : Default로는 실행되는 컨테이너지만, 종료된 컨테이너를 포함하여 모든 컨테이너를 출력함<노이해중>

docker container rm 컨테이너_이름

:'컨테이너_이름'을 이름으로 갖는 컨테이너를 삭제
:{container} rm :컨테이너 지칭해서 삭제

# docker image 의 용량 확인
docker image ls

# docker/whalesay 이미지 지우기
docker image rm docker/whalesay

:docker image의 용량 확인, docker/whalesay 이미지 삭제

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

:이미지를 받아와, 컨테이너 실행, 컨테이너와 관련된 리소스를 삭제하는 작업 수행
:{container} run: 컨테이너 실행, 이미지 없으면 이미지 받아온 뒤(pull) 수행
:-rm : 컨테이너를 일회성으로 실행, 컨테이너가 중지되거나 종료될 때 컨테이너와 관련된 리소스를 모두 제거

docker image rm docker/whalesay

:지정된 도커 이미지를 삭제

docker container run -it --rm danielkraic/asciiquarium:latest

:danielkraic/asciiquarium 이미지를 실행
:-it :-i, -t 동시에 사용한 옵션, 사용자와 컨테이너 간에 인터렉션interaction 필요하다면 이 옵션 사용
:위에서는 출력되는 화면을 지속적으로 보기 위해 사용함

ctrl+c :컨테이너 종료

profile
Developer

0개의 댓글