본문 바로가기
데이터 엔지니어링(DE)/환경과 DB

Docker

by kiimy 2021. 7. 14.
728x90
728x90
  • CLI 가 무엇인지 말할 수 있다
  • Docker Hub에서 Docker Image 를 검색한 뒤 사용할 수 있다.
  • 한 개의 Docker Image를 이용해서 Container 를 구축할 수 있다.
  • 두 개 이상의 Docker Container를 이용해서 Container 를 구축할 수 있다.
  • Docker LifeCycle 을 통해 오늘 배우지 않은 부분이 무엇인지를 알 수 있다.

Docker

다른 장치에서 동작하는 게임을 PC 에서 동작시킨다는 것

==> 프로그램 실행을 위해 Linux 환경을 쉽게 구성하기 위한 도구 == docker

#어플리케이션 실행 환경을 코드로 작성할 수 있고 OS를 격리화하여 관리하는 기술#

image = container 실행에 필요한 파일과 설정값들을 포함 ( 변하지않는 파일 Immutable )

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

image = program / container = process

Linux Container란

* 필요한 라이브러리와 어플리케이션을 모아서 마치 별도의 서버처럼 구성한 것

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

 

*프로세스의 구획화

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

 

* 네트워크의 구획화

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

 

* 파일시스템의 구획화

  • 컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있습니다. 그렇기 때문에 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있습니다.

==> virtual machine과 비슷하지만 비슷할 뿐 다른 기술(?) 

Docker

어플리케이션에 대한 환경을 Docker는 격리성을 중심으로 한 VM의 관점으로 보다는 Container의 관점에서 빠르고, 개발자와 사용자 커뮤니티를 중심으로 혜택을 제공

Problem( 해결하는 방법 = 리눅스 컨테이너(Linux Container) )

1. 환경 표준화 - 환경이 일정하지 않아서 생기는 문제

- 대표적인 운영체제는 Linux, Windows, MacOS로 나뉘고, 엔지니어들은 자신이 개발하는

  어플리케이션이 어떤 환경에서 구동될지 생각한 후 개발

 

* 환경이 다르다면 개발자들이 조정할 문제가 생기며, 수작업으로 환경을 맞추는 일은 그리 쉬운 일이 아니다

 

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

  • $ echo $HOME == 홈 디렉토리 확인 
  • ==> 어플리케이션을 설치할 때 컴퓨터에 맞게 변경해줘야함. ex) 방화벽 설정, 사용자 권한 설정, Port 설정

* 컴퓨터에 다양한 설정 작업을 수작업으로 하게된다면 많은 시간이 걸릴뿐만 아니라 설정들이 뒤엉킬 수 있음

3. 리소스 격리성(= 하나의 컴퓨터에서 여러개의 컴퓨터를 이용하는 것처럼 하는 것)

가상화 방법과 도커는 격리성을 제공하기 때문에 각 어플리케이션 마다

다른 컴퓨터에서 실행되는 것처럼 IP, Port 등을 다르게 설정할 수 있다. Virtual Machine , docker

  • 웹서버 1 은 IP 는 A 로 하고 포트 번호는 A-1 로 하고, 방화벽 규칙은 a의 규칙을 이용하세요
  • 웹서버 2 은 IP 는 B 로 하고 포트 번호는 B-1 로 하고, 방화벽 규칙은 b의 규칙을 이용하세요

* IP주소는 인터넷상에 있는 컴퓨터의 고유한 주소로 이것를 바탕으로 인터넷상의

  한 컴퓨터에서 다른 컴퓨터로 데이터를 주고 받을 수 있다.

 

* ex 우리가 물건을 어떤 사람의 방까지 전달

IP address 는 단지 집주소 까지 알고있고 Port Number 는 방주소까지

인터넷 프로토콜에서 포트(port)는 운영 체제 통신의 종단점이다.

포트 번호로 프로세스(프로그램의 실행)를 식별

  • 도커는 Virtual Machine 만큼 견고한 격리성을 제공하지는 않습니다.
  • 도커는 리눅스의 컨테이너를 이용한 기술로 OS 위에 다른 OS를 실행하는 것이 아니기 때문에 Virtual Marchine 보다 좋은 성능을 낼 수 있습니다.
  • virtual machine은 초기세팅이 필요한대 일정한 양을 할당을 해줘야함(= 아직은 이해 못함) 독립적으로 운영

Docker CLI

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

 

  • 레포지토리(Repository)
    • 레지스트리 내에 도커 이미지가 저장되는 공간입니다.
    • 이미지 이름이 사용되기도 합니다.
    • GitHub의 레포지토리와 유사하게 생각하시면 됩니다.

 

  • 태그(Tag)
    • 같은 이미지라고 할지라도 버전 별로 안의 내용이 조금은 다를 수 있습니다.
    • 해당 이미지를 설명하는 버전 정보를 주로 입력합니다.
    • 특별히 다른 것을 지정하지 않는다면 latest 태그를 붙힌 이미지를 가져옵니다.
docker/whalesay 이미지 해석

docker Hub라는 레지스트리에서 docker라는 분이 올리신 whalesay 이미지
혹은 레포지토리에서 latest 태그를 가진 이미지(Tag가 없으면 default 최신 이미지)

$ docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]

  • {container} run
    • 컨테이너를 실행합니다.

 

  • OPTION
    • --name : 컨테이너의 이름을 할당합니다.

 

  • COMMAND
    • cowsay : 컨테이너에서 cowsay를 호출합니다. (저희가 python을 호출하듯 이용하는 것입니다.)

 

  • ARG..
    • boo : COMMAND 인 cowsay 에 넘겨질 파라미터입니다.

 

$ docker container run --name my_web --rm -p 818:80 httpd

  • -p 는 로컬(호스트)의 포트와 컨테이너의 포트와 연결
  • --rm Automatically remove the container when it exits / 중지될때 리소스도 중지
  • cf. httpd 는 일정시간 연결 기록이 없으면 서버 가동이 중지 됩니다

docker container cp명령을 통해서 로컬(호스트)에 있는 파일을 컨테이너에 전달

- 앞에 인수의 경로를 뒤에 인수의 경로에 복사

 

$ docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

$ docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

ex ) docker container cp ./ my_web:/usr/local/apache2/htdocs/

웹서버 구축후

 

해당 컨테이너에 진입

exec my_web pwd ( 현재 해당 폴더 ) 확인

exec my_web ls -al ( 모든 폴더 ) 확인

Docker 이미지 만들기

* docker container commit 명령을 이용

$ docker container commit my_web my_pacman:1.0

 

docker container commit

docker container commit: Create a new image from a container's changes

docs.docker.com

* 생성된 이미지를 이용해서 900 포트에 웹서버 구동

$ docker run --name my_web2 -p 900:80 my_pacman:1.0

 

* docker build 명령은, Dockerfile 을 바탕으로한 도커 이미지 파일을 생성

# --tag 는 name:tag 형식으로 이미지를 생성할 수 있습니다.
# 지정한 경로에 있는 Dockerfile 을 찾아서 빌드합니다.
$ docker build --tag my_pacman:2.0 .

# 해당포트로 구동 확인 901
$ docker run --name my_web3 -p 901:80 my_pacman:2.0

 

728x90

'데이터 엔지니어링(DE) > 환경과 DB' 카테고리의 다른 글

SQL과 NoSQL 차이점  (0) 2021.07.14
SQLite3 / DBeaver / ElephantSQL / NoSQL  (0) 2021.07.14
git , 가상환경  (0) 2021.07.14

댓글