Docker

개발 공부 기록·2021년 8월 14일
0

Network

목록 보기
8/9
post-thumbnail

Docker

도커(Docker)는 리눅스 컨테이너(Linux Container) 기술을 기반으로 하는 오픈 소스 서비스

도커를 통해 애플리케이션 실행 환경을 코드로 작성할 수 있으며, OS를 격리화하여 관리

Linux Container

Linux Container는 Linux 기반의 기술 중 하나로, 필요한 라이브러리와 애플리케이션을 모아서 마치 별도의 서버처럼 구성한 것

컨테이너를 이루는 네트워크 설정, 환경 변수 등의 시스템 자원은 각 컨테이너가 독립적으로 소유

1. 프로세스의 구획화

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

2. 네트워크의 구획화

  • 기본으로 컨테이너 하나에 IP 주소가 할당되어 있음

3. 파일 시스템의 구획화

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

Docker로 해결할 수 있는 문제

1. 환경 표준화

대표적인 운영 체제(OS)는 Linux, Windows, MacOS로 구분

엔지니어는 자신이 개발하는 애플리케이션이 어떤 환경에서 구동될지 생각하고 개발해야함

개발하려고 하는 여러 애플리케이션을 구동하는 운영체제가 서로 다르다면 환경에 따라 조금씩 변경할 부분이 발생함

같은 LinuxUbuntu, CentOS, Debian 은 서로 다른 환경이므로 여러 버전이 존재

환경이 다르다면 개발자들이 조정할 문제가 수도 없이 생기며, 수작업으로 환경을 맞추는 일은 쉬운 일이 아님
=> 많은 환경에서 애플리케이션이 돌아가도록 빌드하고 테스트를 수행해야 함

2. 수작업으로 일치시키는 환경 구성

모든 개발자와 사용자가 동일한 OS 환경을 유지하는 경우, 어느 정도는 빨라질 수 있지만 '내 컴퓨터' 혹은 '내 사용 목적'에만 맞는 설정이 따로 필요할 수도 있기 때문에 환경 변수처럼, 같은 OS라도 사용자에 따라 달라지는 구성이 있다.

애플리케이션을 설치할 때, 컴퓨터의 환경에 맞게 변경해야 하는 부분이 있다. (방화벽 설정, 사용자 권한 설정, Port 설정 등)

컴퓨터에 다양한 설정 작업을 수작업으로 하게 된다면, 많은 시간이 걸릴 뿐만 아니라 설정 간에 간섭이 일어나 프로그램이 멈출 수도 있다.

개발과 실행에 대한 환경 설정이 코드로 정해져 있다면 해결 가능

3. 리소스 격리성

리소스 격리성을 제공하는 기술로는 가상 머신(Virtual Machine), 도커

VirtualBox, VMware 와 같은 가상 머신은 개발 환경이나 사용 환경을 이미지로 저장하고, Host OS 위에 게스트 OS를 올리는 방식

가상 머신과 도커는 격리성을 제공하기 때문에, 각 애플리케이션마다 다른 컴퓨터에서 실행되는 것처럼 IP나 Port 등을 다르게 설정 가능

도커가 가상 머신과 다른점

  • 도커는 가상 머신만큼 견고한 격리성을 제공하지 않음
  • 도커는 리눅스의 컨테이너(Linux Container)를 이용한 기술로, OS 위에 다른 OS를 실행하는 것이 아니므로 가상 머신보다 좋은 성능을 낼 수 있음
  • 애플리케이션에 대한 환경 격리성을 중심으로 한 VM과는 달리, 도커는 Container의 관점에서 개발자와 사용자 커뮤니티를 중심으로 혜택을 제공하는 데 있음

Docker Container Lifecycle

도커 컨테이너의 독립적인 특징을 기반으로 한 Lifecycle

Docker CLI

Docker Image 및 Container를 다루기 위한 Docker Command Line 명령어

  • 사용법 : Docker CLI, Docker-Compose CLI, API Reference
  • 환경 및 빌드 파일 구성 : DockerFile, Docker-Compose File

Docker Image 구성

레지스트리 계정, 레포지토리 이름, 태그 세 가지 정보로 구성

1. 레지스트리(Registry)

  • 도커 이미지를 관리하는 공간
  • 특별히 다른 것을 지정하지 않는다면, 도커 허브(Docker Hub)를 기본 레지스트리로 설정
  • 레지스트리는 Docker Hub, Private Docker Hub, 회사 내부용 레지스트리 등으로 나눔

2. 레포지토리(Repository)

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

3. 태그(Tag)

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

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

Docker Hub는 Docker Image를 찾거나, Docker Image의 사용방법을 확인할 때 사용

  • sudo docker image pull docker/whalesay:latest
    docker/whalesay의 최신 이미지를 받아옴
  • sudo docker image ls
    이미지 리스트를 출력
  • sudo docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • sudo docker container run --name 컨테이너_이름 docker/whalesay:latest cowsay boo
    컨테이너_이름을 이름으로 갖는 컨테이너를 실행
  • [OPTIONS]
    --name : 컨테이너의 이름을 할당
  • [COMMAND]
    command는 초기 컨테이너 실행 시 수행되는 명령어
    cowsay : 컨테이너 실행 시 cowsay 명령어를 호출 (node를 호출하듯 이용)
  • [ARG..]
    boo : COMMAND인 cowsay에 넘겨질 파라미터
  • sudo docker container ps -a
    모든 컨테이너의 리스트를 출력
  • {container} ps : 컨테이너의 리스트를 출력
  • -a : Default 로는 실행되는 컨테이너지만 종료된 컨테이너를 포함하여 모든 컨테이너를 출력
  • sudo docker container rm 컨테이너_이름
    컨테이너_이름이라는 이름을 가진 컨테이너를 삭제

{container} rm : 컨테이너를 지칭해서 삭제
컨테이너를 명시할 때는 ps 명령을 통해 확인할 수 있는 NAMES 혹은 CONTAINER ID 를 사용

  • sudo docker image ls
    docker image 의 용량 확인
  • sudo docker image rm docker/whalesay
    docker/whalesay 이미지 지우기
  • sudo docker container run --name 컨테이너_이름 --rm docker/whalesay cowsay boo
  • {container} run : 컨테이너를 실행합니다. 이미지가 없다면 이미지를 받아온 뒤(pull) 실행
  • -rm : 컨테이너를 일회성으로 실행 / 컨테이너가 중지되거나 종료될 때, 컨테이너와 관련된 리소스를 모두 제거

Docker Example 수행하기 : danielkraic/asciiquarium

sudo docker container run -it --rm danielkraic/asciiquarium:latest
danielkraic라는 사람이 올린 이미지 asciiquarium 를 실행

  • -it : -i, -t 를 동시에 사용한 옵션
    사용자와 컨테이너 간에 인터렉션(interaction)이 필요하다면 이 옵션을 사용
  • container는 ctrl + c 로 종료

Copy, Dockerfile

Docker 컨테이너에 파일을 복사하기

사용할 도구가 도커 이미지에 모두 구성되어 있지 않은 경우

  1. 웹 서버는 도커 컨테이너로 실행
  2. 웹 서버를 구성하는 파일은 직접 만들거나 가져온 파일 구성

장점

  • 서버에 문제가 생기는 것을 호스트와 별개로 파악할 수 있음
  • 문제가 생긴 서버를 끄고, 마치 공장 초기화를 하듯 도커 이미지로 서버를 재구동할 수 있음

도커 이미지를 연결하는 방법은 크게 CP(Copy) 를 이용하는 방법과 Docker Volume 기능을 이용하는 방법으로 나뉜다.

  • CP(Copy) : 호스트와 컨테이너 사이에 파일을 복사(Copy)
  • Volume : 호스트와 컨테이너 사이에 공간을 마운트(Mount)

마운트는 저장 공간을 다른 장치에서 접근할 수 있도록 경로를 허용해서, 마치 하나의 저장 공간을 이용하는 것처럼 보이게 하는 작업

httpd 웹 서버

httpd(http daemon)은 Apache HTTP Server를 실행할 수 있는 오픈소스 웹 서버 소프트웨어

  • sudo docker container run --name 컨테이너_이름 -p 로컬호스트 포트:컨테이너 포트 httpd
    httpd 를 실행하는 명령어

httpd 는 일정 시간 연결 기록이 없으면, 서버 가동이 중지됨

컨테이너를 백그라운드에서 실행하게 해주는 -d 옵션

  • docker container cp 명령은 앞 경로의 파일을 뒤 경로에 복사
  • docker exec -it 컨테이너_이름 bash 명령어를 통해 컨테이너 내부 터미널로 접속 가능

Docker 이미지 만들기

장점

  • 이전에 작업했던 내용을 다시 한 번 수행하지 않아도 됨
  • 배포 및 관리가 유용

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

sudo docker container commit 명령을 이용

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

Dockerfile 은 이미지 파일의 설명서

  • sudo docker build 명령은, Dockerfile로 도커 이미지 파일을 생성
  • sudo docker build --tag my_pacman:2.0 .
  • --tag 는 name:tag 형식으로 이미지를 생성 가능
  • 지정한 경로에 있는 Dockerfile을 찾아서 빌드
  • "."을 명령어에 꼭 포함해야 한다!

docker-compose CLI

  • docker-compose.yaml에 정의된 이미지를 컨테이너로 실행
  • sudo docker-compose up
    -d 옵션을 함께 사용하면, 컨테이너를 백그라운드로 실행할 수 있다.
  • sudo docker-compose down
    docker-compose.yaml에 정의된 이미지를 이용해 실행된 컨테이너를 종료
  • docker-compose up {특정 이미지}
    특정 이미지만 컨테이너로 실행
  • 하나의 docker-compose에서 관리되는 컨테이너끼리는 동일한 docker network에서 구동됨
  • docker run 명령과 다르게 docker-compose 파일 안에서 기본 network가 사용됨

개념 정리

  • Docker: 컨테이너 기술을 사용하는 플랫폼
    Container: 앱 각각 격리할 수 있게 만드는 기술
    격리: 응용 프로그램 + 실행 환경을 각각 분리하는 것
  • Docker container: 리소스는 공유하되 앱의 독립성을 보장
  • Docker image: AMI와 유사 => 토대로 컨테이너 생성
    AMI(Amazon Machine Image): 운영체제 + 어플리케이션을 담은 템플릿
    => 토대로 EC2 인스턴스 생성

Docker: 앱 단위 가상화
가상머신: OS 단위 가상화

  • e.g. httpd => 웹서버 생성
    client => node.js + 애플리케이션
    server => 웹 서버 + 정적 파일

응용 프로그램과 실행 환경을 조합해서 이미지 빌드
=> 응용 프로그램이 실행되고 있는 격리 환경: 컨테이너

두 개 이상의 컨테이너(클라, 서버)가 서로 통신하면서 동시에 클라 + 서버 애플리케이션을 배포 가능
=> docker-compose up -d

  • 클라이언트
    운영체제
    정적 파일을 호스팅할 웹서버(nginx)
    빌드할 정적 파일
  • 서버
    운영체제
    node.js
  • DB
    운영체제
    mysql
profile
둔필승총(鈍筆勝聰) - 기억보다는 기록을

0개의 댓글