[DE] Docker basic

Doker란?

  • APP 실행환경을 코드로 작성할 수 있고 OS를 격리화하여 관리하는 기술

환경 표준화

  • 엔지니어는 개발하는 APP이 어떤 환경에서 구동될 지 생각한 후 개발해야 한다.

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

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

리소스 격리성

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

  • 이와 같은 요구가 생긴다면 리소스 격리성이 필요하다.
  • 리소스 격리성을 제공하는 기술로 가상머신, Docker 등이 있다.
  • 가상머신 : VB, VM과 같은 가상머신은 개발 혹은 사용하는 환경을 Image로 저장하고 Host OS 위에 게스트 OS를 띄우는 방식

스크린샷 2021-09-30 11 15 12

  • 가상화 방법과 Docker는 격리성을 제공하기 때문에 각 APP 마다 다른 컴퓨터에서 실행되는 것처럼 IP, Port 등을 다르게 설정할 수 있다.
  • Docker는 가상머신만큼 견고한 격리성을 제공하지는 않는다.
  • Docker는 Linux의 Container를 이용한 기술로 OS 위에 다른 OS를 실행하는 것이 아니기 때문에 가상머신보다 좋은 성능을 낼 수 있다.

Linux Container

What is?

  • Linux 기반의 기술 중 하나로 필요한 라이브러리와 APP을 모아 마치 별도의 server처럼 구성한 것
  • Container를 이루는 Network 설정, 환경 변수 등 시스템 자원은 각 Container가 독립적으로 소유
  • Process 구획화
    • 특정 Container에서 작동하는 process는 기본적으로 그 Container 안에서만 Access 할 수 있다.
    • Container 안에서 실행되는 process는 다른 Container의 process에게 영향을 줄 수 없다.
  • Network의 구획화
    • 기본으로 Container 하나에 IP 주소가 할당되어 있다.
  • 파일 시스템의 구획화
    • 해당 Container에서의 명령이나 파일 등의 액세스를 제한할 수 있다.

Docker만의 특징

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

Docker CLI

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

Use to Docker

스크린샷 2021-09-30 11 40 02

docker/whalesay

  • Image가 제공되었을 때 읽는 법
  • Registry 계정, repo 이름, tag 세 가지 정보로 구성

스크린샷 2021-09-30 11 41 16

  • Registry
    • Docker image가 관리되는 공간
    • Docker Hub을 기본 registry로 설정
    • Docker Hub, Private Docker Hub, 회사 내부용 Registry 등으로 나뉨
  • Repository
    • Registry 내 Docker image가 저장되는 공간
    • Image 이름이 사용되기도 한다.
    • Github의 repo와 유사
  • Tag
    • 같은 image라고 할 지라도 version 별로 내용이 조금 다를 수 있다.
    • 해당 image를 설명하는 version 정보를 주로 입력
    • 다른 것을 지정하지 않은다면 latest tag를 붙힌 image를 가져온다.
  • docker/whalesay : Docker Hub라는 registry에서 docker라는 분이 올리신 whalesay image 혹은 repository에서 latest tag를 가진 image

Docker Example 수행하기 : docker/whalesay

1
2
3
$ docker image pull docker/whalesay:latest

$ docker image ls
  • image pull : registry에서 image 혹은 reopsitory를 가져온다.
  • image ls : image list
  • 받아온 image 실행(image -> container)
1
$ docker container run --name myName docker/whalesay:latest cowsay boo
  • container run : container를 실행
  • OPTION
    • --name : container의 이름을 할당
  • COMMAND
    • cowsay : container에서 cowsay를 호출(python을 호출하듯 이용하는 것)
  • ARG
    • boo : COMMAND 인 cowsay 에 넘겨질 파라미터
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 _____ 
< boo >
 ----- 
    \
     \
      \     
                    ##        .            
              ## ## ##       ==            
           ## ## ## ##      ===            
       /""""""""""""""""___/ ===        
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
       \______ o          __/            
        \    \        __/             
          \____\______/   

1
2
3
$ docker container ps -a

$ docker container rm myName
  • container ps : container list
    • -a : Default로는 실행되는 container지만 종료 된 container를 포함하여 모든 container를 출력
  • container rm : container를 지칭해서 삭제. container를 명시할 때는 ps 명령을 통해 확인할 수 있는 NAMES 혹은 CONTAINER ID 를 사용
1
2
3
4
5
# docker image 용량 확인
$ docker image ls

# docker/whalesay image 지우기
$ docker image rm docker/whalesay
  • image를 받아오고, container로 실행하고, container와 관련된 리소스를 지우는 작업을 한번에 실행
1
$ docker container run --name my_name --rm docker/whalesay cowsay boo
  • container run : container 실행. image가 없다면 image를 받아온 뒤(pull) 실행
  • --rm : container를 일회성으로 실행. container가 종료될 때 container와 관련된 리소스를 모두 제거
1
$ docker image rm docker/whalesay
  • image rm : 지정된 docker image 삭제

Docker Example 수행하기 : danielkraic/asciiquarium

1
$ docker container run -it --rm danielkraic/asciiquarium:latest
  • -it : -i, -t 를 통시에 사용한 것으로 터미널 입력을 위한 옵션. 사용자와 container 간에 interaction이 필요하다면 해당 옵션을 사용. 본 예제에서는 지속적으로 출력되는 화면을 사용자가 보기 위해서 사용. 예를들어 Python 명령이 필요하거나, 추가적으로 다른 입력을 받는다면 해당 옵션을 지정한 뒤 사용.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

~~~~~~~~~~~~~~~~~~~~~~~_~~~~~~~~~~_~~~~~~~~~~_  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
^^^^ ^^^  ^^^   ^,____(')<^ ,____(')= ^,____(')= ^^^    ^^^^      ^^^^ ^^^
^^^^      ^^^^    \~~= ') ^^ \~~= ')^   \~~= ')     ^^^    ^^     ^^^^
^^      ^^^^      ^^^    ^^^^^^  ^^      ^^^^      ^^^    ^^^^^^  ^^      ^^


                                                          \
                                               __        / \
                                             ><_'>     >=_('>
                                                '        \_/~~   
                                                          /|     
        .:/                                               /^\
     ,,///;,   ,;/                                       /   \
   o:::::::;;///                             _   _   _  /     \  _   _   _
  >::::::::;;\\                            [ ]_[ ]_[ ]/ _   _ \[ ]_[ ]_[ ]
    ''\''\''\''\                           [ ]_[ ]_[ ]/ _   _ \[ ]_[ ]_[ ]

Docker CP & DockerFIle

Docker container에 파일 복사

  • 게임 server, Web server와 같이 사용할 도구가 docker image에 모두 구성되어 있지 않은 경우도 있다.
  1. Web server는 docker container로 실행
  2. Web server를 구성하는 파일은 만들거나 가져온 구성
  • 장점
    • Server에 문제가 생기는 것을 Host와 별개로 파악
    • 문제가 생긴 server를 끄고, 마치 공장초기화를 하듯 docker image로 server를 재구동하기 용의함
  • Local에 있는 파일과 docker image를 연결하는 방법은 CP와 Docker Volume 기능을 이용하는 방법으로 나뉜다.
    • CP : 호스트와 container 사이의 파일을 복사
    • Volume : 호스트와 container 사이의 공간을 마운트

httpd Web server

1
2
3
$ git clone https://github.com/codestates/pacman-canvas

$ docker container run --name my_web --rm -p 818:80 httpd
  • -p : Local(호스트)의 포트와 container의 포트와 연결
  • 127.0.0.1:818 혹은 localhost:818을 통해 Web server가 작동하고 있는지 확인

스크린샷 2021-09-30 12 13 19

1
$ docker container cp ./ my_web:/usr/local/apache2/htdocs/
  • cp : 앞에 인수의 경로를 뒤에 인수의 경로에 복사
    • 경로는 반드시 복사할 곳으로 이동할 것

스크린샷 2021-09-30 12 14 46

Make Doker Image

  • Image로 만들어 놓으면 이전에 작업했던 내용을 다시 한번 수행하지 않아도 된다는 점과 배포 및 관리가 유용하다.

1. 구동한 Docker container를 image로

1
2
3
$ docker container commit my_web my_pacman:1.0

$ docker run --name my_web2 -p 900:80 my_pacman:1.0
  • 생성된 image를 이용해서 900 포트에 웹server 구동
  • 127.0.0.1:900 혹은 localhost:900 을 통해 Web server가 작동하고 있는지 확인

2. 빌드를 위한 파일인 Dockerfile로

1
2
3
4
5
6
7
8
9
10
11
# 베이스 image를 httpd:2.4로 사용
FROM httpd:2.4 
# 호스트의 현재경로에 있는 파일을 생성할 image /usr/local/apache2/htdocs/ 에 복사
COPY ./ /usr/local/apache2/htdocs/ 

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

# 생성된 image를 이용해 901 포트에 웹server 구동
$ docker run --name my_web3 -p 901:80 my_pacman:2.0

Reference

0%