버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.
목차

...

1. Container 란

보통 IT인이 아니라면 ‘컨테이너’ 라는 말에 다음의 그림을 상상하실 겁니다.

...

1.1 Container

사전적 의미로 컨테이너는 어떤 물체를 격리하는 공간을 뜻합니다. 하지만 우리에게 컨테이너는 어떤 의미일까요?

...

  • 컨테이너는 OS의 기능을 활용하여 프로세스를 격리하고, 격리된 프로세스가 CPU, 메모리, 스토리지, 네트워크 리소스를 쉽게 공유할 수 있게 해줍니다.

  • 컨테이너는 격리된 프로세스 형태로 실행되므로 환경에 상관없이 빠르고 안정적이며 일관된 배포를 보장합니다.

1.2 VM

  • VM은 하이퍼바이저라는 가상화 소프트웨어 계층을 사용하여 하드웨어를 가상화하고, 각 VM을 서로 분리하여 상호작용할 수 있는 가상 컴퓨팅 환경을 구축하는 기술입니다.

  • VM에는 애플리케이션, 관련 라이브러리 및 종속 항목과 함께 게스트 OS가 포함됩니다.

1.3 Container와 VM 비교

가상 환경에 익숙하다면 컨테이너를 가상 머신(VM)에 비교하여 생각하면 이해하기 쉽습니다.

...

컨테이너를 사용하면 개발자와 IT 운영팀이 훨씬 작은 단위로 업무를 수행할 수 있으므로 그에 따른 이점도 많습니다.

1.4 컨테이너 살펴보기

...

 

정보
  • Control groups : 리소스 사용량(CPU/Memory/Network/Storage) 결정

  • Namespaces : 자원을 격리(네트워크/프로세스/사용자정보 - 공개 범위를 결정)

  • Union mount file system : 컨테이너 이미지를 효율적으로 관리

1.4.1 컨테이너

  • 컨테이너는 애플리케이션을 실행하는 데 사용될 수 있는 OS 가상화의 한 형태입니다

  • 이를 위해 컨테이너는 리눅스 커널의 몇 가지 새로운 기능으로 제작되었으며, 그 중 두 가지 주요 기능은 "namespace"와 "cgroups"입니다.

1.4.2 리눅스 네임스페이스

  • 네임스페이스는 리눅스 커널의 기능 중 하나이며 리눅스의 컨테이너의 기본적인 측면입니다.반면에 네임스페이스는 격리 계층을 제공합니다.네임스페이스는 한 프로세스 집합은 한 리소스 집합을 보고 다른 프로세스 집합은 다른 리소스 집합을 보도록 커널 리소스를 분할하는 리눅스 커널의 기능입니다.

정보

리눅스에는 다양한 종류의 네임스페이스가 있습니다.리눅스 네임스페이스 종류

  • PID PID 네임스페이스를 통해 별도의 프로세스를 만들 수 있습니다.

  • 네트워크 : 네트워킹 네임스페이스를 사용하면 같은 컴퓨터에서 실행되는 다른 프로세스와 충돌하지 않고 포트에서 프로그램을 실행할 수 있습니다.

  • IPC(Interprocess communication) 네임스페이스에는 자체 IPC 리소스(예: POSIX 메시지 큐)가 있습니다.

  • 마운트 : 마운트 네임스페이스를 사용하면 사용하면 호스트 파일 시스템에 영향을 주지 않고 파일 시스템을 마운트 및 마운트 해제할 수 있습니다.

  • UNIX Time-Sharing (UTS) 네임스페이스를 사용하면 사용하면 단일 시스템이 서로 다른 프로세스의 호스트 및 도메인 이름을 가지는 것처럼 보일 수 있습니다.

  • Linux 네임스페이스를 만드는 것은 매우 간단하며 UTS namespace를 만들어서 확인해보겠습니다.

코드 블럭
root@ubuntu-focal:~# unshare --fork --pid --mount-proc bash
root@ubuntu-focal:~# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.3   8960  3928 pts/4    S    13:00   0:00 bash
root           8  0.0  0.3  10612  3268 pts/4    R+   13:00   0:00 ps aux

...

  • 호스트에서

...

  • 확인

코드 블럭
root@ubuntu-focal:~# ps aux | grep unshare
root        9258  0.0  0.0   7232   520 pts/3    S    13:09   0:00 unshare --fork --pid --mount-proc bash
root        9372  0.0  0.0   8160   720 pts/4    S+   13:09   0:00 grep --color=auto unshare
  • unshare namespace에서 빠져나오기

...

  • 위해 docker와 같이 exit 수행

코드 블럭
root@ubuntu-focal:~# exit
exit
root@ubuntu-focal:~# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.8 102540  8840 ?        Ss   12:04   0:02 /sbin/init
root           2  0.0  0.0      0     0 ?        S    12:04   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   12:04   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   12:04   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   12:04   0:00 [kworker/0:0H-kblockd]

1.4.3 Cgroup

리눅스 네임스페이스로 다른 프로세스와는 별도의 프로세스를 만들 수도 있었습니다.

...

2007년에 몇몇 사람들은 우리만을 위한 cgroup을 개발했습니다.이것은 프로세스의 리소스를 제한할 수 있는 리눅스 기능입니다.Cgroups는 프로세스에서 사용할 수 있는 CPU 및 메모리의 한계를 결정합니다.

Cgroups(제어 그룹에서 그룹에서 약칭)는 프로세스의 리소스 사용량(CPU, 메모리, 디스크 I/O, 네트워크 등)을 제한, 계정 및 분리하는 리눅스 커널 기능으로, 2008년 1월 출시된 커널 버전 2.6.24에서는 제어 그룹 기능이 리눅스 커널 메인 라인에 병합되었습니다.

정보

cgroups로 제어할 수 있는 일반적인 리소스는 다음과 같습니다.

  • CPU: 프로세스 그룹에서 사용하는 CPU 시간을 제한

  • 메모리: 프로세스 그룹에서 사용하는 메모리 양을 제한합니다제한합니다.

  • I/O: 프로세스 그룹에서 사용하는 Disk I/O 양 제한

  • 네트워크: 프로세스 그룹에서 사용하는 네트워크 대역폭의 양을 제한합니다제한합니다.

1.5 컨테이너의 장점

(1) 가벼움

  • 사용자의 Request Traffic 이 증가함에 따라, 가상머신이나 컨테이너를 추가적으로 배포합니다.

  • 가상머신의 크기는 최소 몇 GB이지만, 컨테이너의 경우 Guest OS가 없기에 MB단위의 크기를 가집니다.

  • 가상머신은 배포하는데 수분에서 수 십분의 시간이 소요되지만, 컨테이너는 배포에 소요되는 몇 초 밖에 걸리지 않습니다.

...

컨테이너는 격리된 환경에서 실행되기 때문에, 한 컨테이너에서 발생한 보안/장애 문제가 다른 컨테이너나 호스트 운영체제에 영향을 미치지 않습니다.

...

2. Docker

개발자와 시스템 관리자가 컨테이너로 애플리케이션을 개발, 배포 및 실행할 수 있는 플랫폼입니다.

...

2.1 도커 주요 컴포넌트

  • docker engine
    여러분 모두가 아는 그 엔진, 이 엔진

  • containerd / dockerd /cri-o
    container 런타임

  • runc
    Open Container Initiative (OCI) 규격에 맞게 컨테이너를 실행하고 생성하는 CLI 도구

...

정보

다음과 같은 기능을 제공합니다.

  • 컨테이너 레지스트리에서 컨테이너 이미지를 다운로드합니다.

  • 컨테이너 이미지를 관리합니다.

  • 컨테이너 이미지에서 컨테이너를 실행합니다.

  • 컨테이너 관리.

2.2 Docker의 등장

사용자가 컨테이너와 더 쉽게 소통할 수 있도록 컨테이너 관리하는 새로운 도구가 탄생했는데, 도커도 그 중 하나입니다.

정보
  • 이미지 빌드(도커 파일/도커 빌드).

  • 컨테이너 이미지(도커 이미지)를 관리합니다.

  • 컨테이너 생성, 삭제 및 관리

  • 컨테이너 이미지 공유

  • CLI를 사용하지 않고 사용자가 조작할 수 있는 UI를 제공합니다.

2.3 OCI (Open Container Initiative)는?

  • 컨테이너 포맷과 런타임에 대한 개방형 업계 표준을 만들기 위한 목적으로 Linux Foundation 의 지원으로 구성된 오픈 거버넌스 조직 (프로젝트)입니다.

  • OCI는 2015년 6월 22일에 Docker 사와  CoreOS 사가 각각 별도로 표준화를 진행하고 있던 컨테이너의 규격을 통일하는 것을 목적으로 Docker, CoreOS 그리고  AWS, Google, Microsoft, IBM 등 주요 플랫폼 벤더가 참여하여 2015 년 6 월에 발족 한 단체입니다.

=> 컨테이너 규격을 통일하는 것을 목적으로 만들어진 조직

2.4 도커를 이용한 앱 개발

...

개발 순서

  1. 코드개발

  2. Dockerfile 생성

  3. Dockerfile Image 생성Image 생성

  4. Container Orchestrator를 통한 배포

  5. Container run

  6. Container image Container image Push

2.5 실습환경 구축 - VM 구성 테스트

정보

이전의 모든 vagrant VM을 지우는 방법

$ vagrant global-status | grep virtualbox | awk '{ print "vagrant destroy -f " $1}' | sh -v

이전의 모든 vagrant box를 지우는 방법

$ vagrant box list | grep virtualbox | awk '{ print "vagrant box remove -f "$1}' | sh -v

...

코드 블럭
$mkdir -p ~/vagrant/ubuntu
$cd ~/vagrant/ubuntu 
$vagrant init sysnet4admin/Ubuntu-k8s
$vagrant up

2.5.1. 기동 된 VM 확인

  1. vagrant 명령어로 확인

    1. $ vagrant box list

      image-20240514-034351.png
    2. 코드 블럭
      $ vagrant ssh default
      Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.19.0-28-generic x86_64)
      
       * Documentation:  https://help.ubuntu.com
       * Management:     https://landscape.canonical.com
       * Support:        https://ubuntu.com/advantage
      
       * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
         just raised the bar for easy, resilient and secure K8s cluster deployment.
      
         https://ubuntu.com/engage/secure-kubernetes-at-the-edge
      
      Last login: Sat Mar 20 18:04:46 2021 from 10.0.2.2
      vagrant@k8s:~$
      Docker 기본 명령어에 대해 알아보는 시간을 가지도록 하겠습니다.

2.5.2. Image 가져오기

(1) docker image 저장소

...

    ...

    • 기본 개념에서와 같이 도커는 저장소(registry)에서 이미지를 가져와 사용을 합니다.

    코드 블럭
    vagrant@ubuntu-focal:~$ sudo apt update 
    vagrant@ubuntu-focal:~$ docker images
    vagrant@ubuntu-focal:~$ sudo -i
    root@ubuntu-focal:~# apt install docker.io

    (2) docker hub 확인

    https://hub.docker.com/

    정보(3) docker 이미지 이름 구성

    코드 블럭
    저장소 이름 (Repository Name) : default == docker hub

    ...

     
    이미지 이름 (Image Name) : nginx

    ...

    
    이미지 태그 (Image Tag) : lastest (default)

    (4) 이미지 가지고 오기

    코드 블럭
    $ docker pull nginx:latest
    $ docker images
    코드 블럭
    # dockertag를 images지정해주지 명령어를않으면 통해default로 현재latest 가지고버전을 있는가져옵니다.
    이미지# 확인
    root@ubuntu-focal:~# docker images
    REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

    이미지를 가져와 봅시다.

    root@ubuntu-focal:~# docker images

    코드 블럭
    # tag를 지정해주지 않으면 default로 latest 버전을 가져옵니다.
    # tag를 지정할 경우 
    # docker pull nginx:latest 
    # 위의 명령어 대로 pull 가능
    root@ubuntu-focal:~# docker pull nginx:latest
    latesttag를 지정할 경우 
    # docker pull nginx:latest 
    # 위의 명령어 대로 pull 가능
    root@ubuntu-focal:~# docker pull nginx:latest
    latest: Pulling from library/nginx
    52d2b7f179e3: Pull complete
    fd9f026c6310: Pull complete
    055fa98b4363: Pull complete
    96576293dd29: Pull complete
    a7c4092be904: Pull complete
    e3b6889c8954: Pull complete
    da761d9a302b: Pull complete
    Digest: sha256:104c7c5c54f2685f0f46f3be607ce60da7085da3eaa5ad22d3d9f01594295e9c
    Status: Downloaded newer image for nginx:latest
    docker.io/library/nginx:latest
    # 이미지 확인
    root@ubuntu-focal:~# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    nginx        latest    eea7b3dcba7e   2 weeks ago   187MB
    

    이미지를 가져왔으니 이제 실행시켜봐야죠!

     

    ...

     

    2.5.3.

    ...

    컨테이너 기동

    (1) 현재 실행 중인 컨테이너 확인

    코드 블럭
    # docker ps 라는 명령어로 현재 실행중인 컨테이너를 확인합니다.
    # docker ps -a -> 중지된 컨테이너까지 모두 출력
    root@ubuntu-focal:~# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

    실행중인 컨테이너가 없네요(2) 컨테이너 기동

    코드 블럭
    root@ubuntu-focal:~# docker run -it -d -p 80:80 --name=nginx nginx:latest
    
    #기동중인 컨테이너 확인
    root@ubuntu-focal:~# docker ps
    
    #호출 테스트
    root@ubuntu-focal:~# curl http://localhost:80

    ...

    코드 블럭
    # docker run 이라는 명령어로 컨테이너를 실행시켜줍니다.
    # docker run <옵션> <이미지 이름> <실행할 파일>
    root@ubuntu-focal:~# docker run -it -d -p 80:80 --name=nginx nginx:latest
    1303feec17205609e6303e72831084babeaebdfaec3bf9bf0f6f4e4b39082dd1
    # 옵션 -i(interactive), -t(Pseudo-tty) -> Bash Shell에 입력 및 출력을 할 수 있습니다.
    # 옵션 --name -> 컨테이너의 이름을 지정해 줍니다.
    # 옵션 -d -> daemonized
    # 옵션 -p -> 포트포워딩
      ex) 80:80 = [호스트의 포트] : [컨테이너의 포트]
    root@ubuntu-focal:~# docker ps
    CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                   NAMES
    1303feec1720   nginx:latest   "/docker-entrypoint.…"   14 seconds ago   Up 14 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   nginx
    root@ubuntu-focal:~# curl http://localhost:80
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    
    정보

    Docker docker create : 도커 이미지에서 새로운 컨테이너를 생성합니다. 그러나 즉시 실행되지는 않습니다

    Docker docker start : 중지된 컨테이너를 시작합니다. docker create 명령을 사용하여 컨테이너를 만든 경우 이 명령으로 시작할 수 있습니다.

    Docker docker run : create와 start의 조합으로 새 컨테이너를 생성하고 시작합니다. docker run 명령은 로컬 시스템에서 이미지를 찾지 못하는 경우 Docker Hub에서 이미지를 가져와서 컨테이너를 생성하고 실행합니다.

    ...

    2.

    ...

    컨테이너를 실행했으니 내부로 들어가 봅시다.

    5.4. Container

    ...

    $ docker exec

    내부 탐험

    (1) exec 명령어를 이용한 컨테이너 접속

    코드 블럭
    root@ubuntu-focal:~# docker exec -it nginx /bin/bash

    ...

     

    
    root@1303feec1720:/#

    ...

     hostname
    root@1303feec1720:/# cat /etc/issue

    ...

    
    root@1303feec1720:/#

    ...

    root@ubuntu-focal:~# docker run -it -p 8090:80 --name=nginx80999 nginx:latest bash

    코드 블럭
    # 내부장벽진입
    root@ubuntu-focal:~# docker exec -it nginx /bin/bash
    root@1303feec1720:/#
    # 진입완료
    # 컨테이너의 hostname을 알아봅시다 
    root@1303feec1720:/# hostname
    1303feec1720
    root@1303feec1720:/# cat /etc/issue
    Debian GNU/Linux 12 \n \l
    root@57c8f50ce8c5:/# 
    # Shell을 빠져나오려면 Ctrl + D 혹은 exit를 입력합니다.
    # 혹시docker를 daemon으로 설치하지  exit
    
    # 혹시docker를 daemon으로 설치하지 않고, 아래와같이 bash로 들어갔다면 
    root@ubuntu-focal:~# docker run -it  -p
    8090:80 --name=nginx80999 nginx:latest bash
    # exit로 나왔을 경우 container 도 쉘 종료메세지(exit 0)을 받고 자연스럽게 종료 되기때문에 docker start [컨테이더 ID ] 명령어로 재시작 혹은 ctrl+ pq 로 실행을 유지한 채 터미널로 빠져 나올 수 있습니다.

    ...

    
    # docker run -it  -p 8090:80 --name=nginx80999 nginx:latest bash

    ...

    2.5.5. Image 삭제

    ...

    • 보통은 이미지를 삭제하기 전 컨테이너를 먼저 삭제한 후 진행됩니다.

    코드 블럭
    # docker rm 명령어를 통해 삭제합니다
    # 컨테이너 삭제 
    root@ubuntu-focal:~# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    nginx        latest    eea7b3dcba7e   2 weeks ago   187MB
    root@ubuntu-focal:~# docker ps
    CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS                                   NAMES
    9eb7bfa20030   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8090->80/tcp, :::8090->80/tcp   nginx80999
    1303feec1720   nginx:latest   "/docker-entrypoint.…"   42 minutes ago       Up 42 minutes       0.0.0.0:8080->80/tcp, :::8080->80/tcp   nginx
    root@ubuntu-focal:~# docker rm nginx
    Error response from daemon: You cannot remove a running container 1303feec17205609e6303e72831084babeaebdfaec3bf9bf0f6f4e4b39082dd1. Stop the container before attempting removal or force remove
    root@ubuntu-focal:~# docker rm nginx80999
    Error response from daemon: You cannot remove a running container 9eb7bfa20030ad9c3e28b56ea437075b617b5b062894b409843177c764a2cbf0. Stop the container before attempting removal or force remove
    # 어라? 삭제가 안되네요
    # 먼저 중지를 해줍니다.
    root@ubuntu-focal:~# docker kill nginx
    nginx
    # 다시삭제를 해봅니다.
    root@ubuntu-focal:~# docker rm nginx
    nginx
    root@ubuntu-focal:~# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    # 잘 삭제가 되네요
    

    ...

    # 잘 삭제가 되네요
    
    • 컨테이너 이미지 삭제

      • 컨테이너를 삭제하기 전 이미지를 삭제할 경우 -f 옵션으로 컨테이너&이미지 동시 삭제

        • docker rmi -f [이미지 ID]

    코드 블럭
    # docker rmi 명령어를 통해 이미지를 삭제해줍니다.
    root@ubuntu-focal:~# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    nginx        latest    eea7b3dcba7e   2 weeks ago   187MB
    # $ docker rmi nginx:latest 혹은 $ docker rmi [ 이미지 ID ]  
    root@ubuntu-focal:~# docker rmi nginx 
    Untagged: nginx:latest
    Untagged: nginx@sha256:104c7c5c54f2685f0f46f3be607ce60da7085da3eaa5ad22d3d9f01594295e9c
    Deleted: sha256:eea7b3dcba7ee47c0d16a60cc85d2b977d166be3960541991f3e6294d795ed24
    root@ubuntu-focal:~# docker images
    REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

    컨테이너를 삭제하기 전 이미지를 삭제할 경우 -f옵션으로 한꺼번에 삭제할 수 있습니다.

    ...

    > 컨테이너도 강제삭제

     

    • docker hub 로그인 방법

    코드 블럭
    root@ubuntu-focal:~# docker login
    Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
    Username: dncs0725
    Password:
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    Login Succeeded
    

     

    6. Dockerfile 만들기

    도커를 설치하고 컨테이너를 실행해봤으니 이제는 도커 이미지를 만들고 서버에 배포해볼 차례!

    도커 개념에서도 다뤄봤듯이, 도커는 도커 파일을 가지고 도커 이미지를 만들게 되는데요,

    다시 한번 말씀드리자면, Docker File이란 Docker Image를 만들기 위한 여러가지 명령어의 집합입니다.

    예를 들어, 일반 서버로 웹서버를 구축시 아래와 같은 작업이 필요합니다.

    1. ubuntu 설치

    2. 패키지 업데이트

    3. nginx 설치

    4. 경로설정 (필요한 경우)

     

     

    2.5.6. Linux 서버에 웹서버 구축

    (1) ubuntu 설치 & 패키지 업데이트

    코드 블럭
    ## 1. ubuntu 설치 & 2. 패키지 업데이트
    # 테스트 ubuntu 서버를 사용하였기 때문에
    패키지 업데이트를 먼저 합니다.
    root@ubuntu-focal:~# apt-update
    ## 3. nginx 설치
    

    (2) nginx 설치

    코드 블럭
    root@ubuntu-focal:~# apt install nginx
    #4.
    설치#설치 확인
    root@ubuntu-focal:~# nginx -v
    nginx version: nginx/1.18.0 (Ubuntu)
    #5. 설치파일 경로
    root@ubuntu-focal:~# cd 
    정보

    socket() [::]:80 failed 에러가 나면, /etc/nginx

    root@ubuntu-focal:/etc/nginx# pwd /etc/nginx

    여기서 잠깐

    ...

    /sites-enabled/default 에서

    listen [::]:80 default_server; 삭제

    (3) Nginx 확인

    • nginx를 패키지를 통하여 설치 하였기에 Default directory가 /etc/nginx 아래에 위치하게 됩니다.

    • 직접 compile한 경우에 경로는 /usr/local/nginx/conf 혹은 /use/local/etc/nginx 에 위치하고 있습니다.그래도 경로가 없다 한다면 다음의 명령어를 통해 찾을 수 있습니다.위치합니다.

    코드 블럭
    root@ubuntu-focal:~# cd /etc/nginx
    root@ubuntu-focal:/etc/nginx# pwd
    /etc/nginx

    • 기본 경로 찾기

    코드 블럭
    root@ubuntu-focal:~# sudo find / -name nginx.conf
    /etc/nginx/nginx.conf
    

    • 경로설정 (필요한 경우)

      • 기본적인 환경 설정 파일 : sites-available/default

    코드 블럭
    root@ubuntu-focal:/etc/nginx# ls
    conf.d          koi-utf     modules-available  proxy_params     sites-enabled  win-utf
    fastcgi.conf    koi-win     modules-enabled    scgi_params      snippets
    fastcgi_params  mime.types  nginx.conf         sites-available  uwsgi_params
    # 기본적인 환경 설정 파일 정보는 sites-available/default 이곳에 있습니다.
    # 따라서 웹서버의 루트 디렉토리 변경 등의 작업이 필요하다면 이곳에 들어가 작업하시면 됩니다.
    root@ubuntu-focal:/etc/nginx# vim sites-available/default
    

     

    ...

     

    • 기본페이지 작성

    코드 블럭
    # index.html 를 만든 후 찍어 봅니다.
    root@ubuntu-focal:/etc/nginx# cat index.html
    Hello~~ docker
    root@ubuntu-focal:/etc/nginx# cp index.html /var/www/html/
    root@ubuntu-focal:/etc/nginx# service nginx restart
    root@ubuntu-focal:/etc/nginx# curl localhost
    Hello~~ docker

    이제는 이런 한땀한땀 구축한 명령어를 토대로 docker file을 만들어 보겠습니다.

    ...

    ubuntu 설치

    ...

    패키지 업데이트 apt update

    ...

    nginx 설치 apt install nginx

    ...

     docker

    2.5.7. Dockerfile을 통한 도커 이미지 생성

    • Docker File이란 Docker Image를 만들기 위한 여러가지 명령어의 집합

    (1) Dockerfile 생성

    코드 블럭
    cd /home/vagrant

    ...

    
    vi Dockerfile

    3/Dockerfile

    코드 블럭
    FROM ubuntu:20.04
    MAINTAINER Hojin kim "khoj@osci.kr" 
    RUN apt update
    RUN apt install -y nginx
    WORKDIR /etc/nginx 
    CMD ["nginx", "-g", "daemon off;"]
    EXPOSE 80 
    

    ...

     

    docker file이 거의 흡사하게 작성된 것을 보실 수 있습니다. 아마 도커파일에 있는 내용들이 생소하실 여러분(저를 포함)을 위해 하나하나 뜯어 보도록 할까요?

    ...

    (2) Dockerfile 설명

    코드 블럭
    FROM ubuntu:20.04

    ...

    
    -> 기반으로  이미지를 가져옵니다. 여기에서는 ubuntu 20.04버전의 이미지를 가져오겠습니다.

    ...

    
    MAINTAINER Hojin kim "khoj@osci.kr"

    ...

     
    -> 작성자의 정보를 기입해줍니다.

    ...

    
    RUN apt update

    ...

    
    -> RUN이라는 명령어를 통하여  스크립트를 실행하여 줍니다.

    ...

    
    RUN apt install -y nginx

    ...

    
    -> 도커 빌드 중에는 키보드를 입력할  없기에 [-y]

    ...

     옵션을 넣어줍니다.

    ...

    
    WORKDIR /etc/nginx

    ...

     
    -> 이후 CMD 명령어가 실행  경로로 먼저 이동을  줍니다.

    ...

    
    CMD ["nginx", "-g", "daemon off;"]

    ...

    
    -> nginx를 백그라운드로 실행합니다

    ...

    
    EXPOSE 80

    ...

    
    -> 80번 포트를 오픈하여 웹서버에 정상적으로 접근할  있게 합니다.


    아직까지 Dockerfile 명령어들이 익숙치 않으시죠? 아니라고 해도 명령어들은 좀더 나눠서 알아보겠습니다.(2) Dockerfile 명령어 상세설명

    명렁어

    내용

    예시

     

    FROM

    베이스 이미지를 지정해줍니다.

    FROM <image>:<tag>

    FROM ubuntu:20.04

    ...

    • 베이스 이미지는 반드시

    ...

    • 지정해야하며,

    ...

    • 버전 정보는 latest보다는 구체적인 버전을

    ...

    • 지정하는 것이 좋습니다.

    RUN

    직접적으로 쉘 스크립트 내에서 실행 될 명령어 앞에 적어줍니다.

    RUN <command>

    RUN apt update

    ...

    • 명령 수행을 위해 많이 쓰이는

    ...

    • 명령어입니다.

    CMD

    도커가 실행될 때 실행할 명령어를 정의해줍니다.

    CMD [“executable”, “param”, “param”]

    CMD ["nginx", "-g", "daemon off;"]

    ...

    • 도커 빌드시에는 실행되지 않으며, 여러개의 CMD 명령어가 존재할 경우 가장 마지막 명령어만 실행 됩니다. CMD nginx 라고 입력하면 nginx 서버를 구동시키게 됩니다.

    WORKDIR

    이후 명령어가 작업할 디렉토리로 이동합니다

    WORKDIR /path

    WORKDIR /etc/nginx

    ...

    • 명령어(RUN, CMD ) 등이 실행될 디렉토리를 설정합니다. 각 명령어는 줄마다 초기화가 되기 때문에 ‘RUN cd /path’ 로 경로를 잡아줘도 다음줄에선 다시 위치가 초기화가 됩니다. 같은 디렉토리에서 계속 작업하기 위하여 WORKDIR을 사용해줍니다.

    COPY

    파일이나 디렉토리를 이미지로 복사합니다

    COPY <src> <dst>

    COPY . /usr/src/app

    ...

    • 일반적으로 소스를 복사하는데 사용합니다

    ADD

    COPY와 비슷하게 복사를 위해 사용합니다

    ADD <src> <dst>

    ADD . /usr/src/app

    ...

    • COPY명령어와 비슷하게 소스를 복사하는데 사용하지만 차이점은

    ...

    • ADD 같은경우 압축파일이 있을 경우 자동으로 압축을 해제하면서 복사됩니다.

    EXPOSE

    – 공개 하고자 하는 포트를 지정해줍니다

    EXPOSE <port>

    EXPOSE 80

    ...

    • 호스트와 연결해줄 포트를 지정해주며, 여러개의 포트를 지정할 수 있습니다.

    이 밖에 사용되는 ENV VOLUME 같은 명령어는 공식문서 를 참고 바랍니다

    ...

    2.5.8.

    ...

    이미지 Build

    (1) 작성한 Dockerfile을 빌드합니다.

    코드 블럭
    docker build --force-rm --tag mynginx:0.1 .
    
    • –force-rm : 기존에 존재하는 image를 삭제합니다.

    • –tag : 태그를 설정해줍니다.

    코드 블럭
    root@ubuntu-focal:~# docker build --tag mynginx:0.1 .
    DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
                Install the buildx component to build images with BuildKit:
                https://docs.docker.com/go/buildx/
    Sending build context to Docker daemon  17.41kB
    Step 1/7 : FROM ubuntu:20.04
    20.04: Pulling from library/ubuntu
    edaedc954fb5: Pull complete
    Digest: sha256:33a5cc25d22c45900796a1aca487ad7a7cb09f09ea00b779e3b2026b4fc2faba
    Status: Downloaded newer image for ubuntu:20.04
     ---> 6df894023726
    Step 2/7 : MAINTAINER Hojin kim "khoj@osci.kr"
     ---> Running in b568cf60d414
    Removing intermediate container b568cf60d414
     ---> 7f72532b3e72
    Step 3/7 : RUN apt update
     ---> Running in 44b39e24a339
    WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
    Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
    Fetched 28.2 MB in 7s (3951 kB/s)
    Reading package lists...
    Building dependency tree...
    Reading state information...
    All packages are up to date.
    Removing intermediate container 44b39e24a339
     ---> b00de74eef37
    Step 4/7 : RUN apt install -y nginx
     ---> Running in 1b206d0758d4
    Processing triggers for libc-bin (2.31-0ubuntu9.9) ...
    Removing intermediate container 1b206d0758d4
     ---> 6cd8450ed504
    Step 5/7 : WORKDIR /etc/nginx
     ---> Running in 7b4c7f8dc6b1
    Removing intermediate container 7b4c7f8dc6b1
     ---> 3d5f4b3e96f6
    Step 6/7 : CMD ["nginx", "-g", "daemon off;"]
     ---> Running in 5c78083ddaed
    Removing intermediate container 5c78083ddaed
     ---> 80a706657ecf
    Step 7/7 : EXPOSE 80
     ---> Running in 829ebedc357a
    Removing intermediate container 829ebedc357a
     ---> 03de8991a4f8
    Successfully built 03de8991a4f8
    Successfully tagged mynginx:0.1

    ...

    (2) 빌드된 이미지를 확인합니다.

    코드 블럭
    root@ubuntu-focal:~# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
    mynginx      0.1       03de8991a4f8   About a minute ago   178MB
    ubuntu       20.04     6df894023726   5 weeks ago          72.8MB
    

     

    빌드가 완료되어 Docker Image가 만들어진 것을 확인할 수 있는데요 이 빌드가 되는 과정들도 또 하나하나 살펴보도록 하겠습니다.

    ...

        72.8MB

    (3) 빌드과정을 살펴봅니다.

    코드 블럭
    Sending build context to Docker daemon  17.41kB               <---   [1]
    Step 1/7 : FROM ubuntu:20.04                                  <---   [2]            
    20.04: Pulling from library/ubuntu                            <---   [3]
     ---> 6df894023726                                            <---   [4]
    Step 2/7 : MAINTAINER Hojin kim "khoj@osci.kr""               <---   [5]
     ---> Running in b568cf60d414                                 <---   [6]
    Removing intermediate container b568cf60d414                  <---   [7]
     ---> 7f72532b3e72                                            <---   [8]
    Step 3/7 : RUN apt update                                     <---   [9]
     ---> Running in 1e6d817f7aa0
    ...
    successfully built 03de8991a4f8                               <---   [10]
    

    ...

    [10] successfully built 03de8991a4f8
    최종적으로 만들어진 이미지ID를 멋지게 출력해줍니다.좀 전에 빌드했던 도커파일을 다시 빌드하게 되면

    • 같은 Dockerfile을 재빌드하면 처음 빌드했을 때 보다

    ...

    • 빠르게 수행합니다.

      명령어를 실행할 때 이미지 위에 레이어를 추가하는 형태로

    ...

    • 저장하고, 기존에 저장된 이미지를 그대로 캐시처럼 사용하여

    ...

    • 빌드합니다.

    코드 블럭
    # 재빌드
    root@ubuntu-focal:~# docker build --tag mynginx:0.1 .
    Sending build context to Docker daemon  17.41kB
    Step 1/7 : FROM ubuntu:20.04
     ---> 6df894023726
    Step 2/7 : MAINTAINER Hojin kim "khoj@osci.kr"
     ---> Using cache
     ---> 7f72532b3e72
    Step 3/7 : RUN apt update
     ---> Using cache
     ---> b00de74eef37
    Step 4/7 : RUN apt install -y nginx
     ---> Using cache
     ---> 6cd8450ed504
    Step 5/7 : WORKDIR /etc/nginx
     ---> Using cache
     ---> 3d5f4b3e96f6
    Step 6/7 : CMD ["nginx", "-g", "daemon off;"]
     ---> Using cache
     ---> 80a706657ecf
    Step 7/7 : EXPOSE 80
     ---> Using cache
     ---> 03de8991a4f8
    Successfully built 03de8991a4f8
    Successfully tagged mynginx:0.1
    

    • 이러한 도커빌드 원리를 이해하고 있으면 도커파일을 만들 때 효과적으로

    ...

    • 만들 수 있으며, history 확인이 가능합니다.

    코드 블럭
    root@ubuntu-focal:~# docker history mynginx:0.1
    IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
    03de8991a4f8   9 minutes ago    /bin/sh -c #(nop)  EXPOSE 80                    0B
    80a706657ecf   9 minutes ago    /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B
    3d5f4b3e96f6   9 minutes ago    /bin/sh -c #(nop) WORKDIR /etc/nginx            0B
    6cd8450ed504   9 minutes ago    /bin/sh -c apt install -y nginx                 59.3MB
    b00de74eef37   10 minutes ago   /bin/sh -c apt update                           45.7MB
    7f72532b3e72   10 minutes ago   /bin/sh -c #(nop)  MAINTAINER Hojin kim "kho…   0B
    6df894023726   5 weeks ago      /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
    <missing>      5 weeks ago      /bin/sh -c #(nop) ADD file:233702cd816c07bc9…   72.8MB
    <missing>      5 weeks ago      /bin/sh -c #(nop)  LABEL org.opencontainers.…   0B
    <missing>      5 weeks ago      /bin/sh -c #(nop)  LABEL org.opencontainers.…   0B
    <missing>      5 weeks ago      /bin/sh -c #(nop)  ARG LAUNCHPAD_BUILD_ARCH     0B
    <missing>      5 weeks ago      /bin/sh -c #(nop)  ARG RELEASE                  0B

    참고로 명렁어를 주르륵 나열하기보단 최대한 간결하고 ‘&&’ 명령어를 이용해 줄여서 적어주는것이 좋습니다! (스토리지 엔진에 따라 이미지 개수가 제한되는 경우도 있기때문)

    ###빌드한 이미지는 각 서버에 어떻게 배포할까요?

    도커는 이미지를 각각의 서버에 복사하는 방법 대신 저장소(Registry)를 이용합니다.

    여기서 이미지를 저장소에 업로드할때 ‘push’ 명령어를 사용하고, 각 서버에서 저장소에 올려져있는 이미지를 가져올때 ‘pull’이라는 명령어를 사용합니다.
    저번시간에 tag에 대하여 스르륵 지나갔었는데 이미지 이야기를 하는김에 같이 다뤄보도록 하겠습니다.

    8. 이미지 태그에 관하여

    ...

    (스토리지 엔진에 따라 이미지 개수가 제한되는 경우도 있기때문)

    2.5.9. 이미지 태그

    (1) 이미지 이름 구조

    • 저장소 주소는 기본적으로 Docker hub를 바라보고 있고, 사용자 ID를 지정해주지 않으면 기본으로 library를 사용합니다.

    ...

    • docker pull 명령어 시, 모두 같은 동작을 의미합니다.

      • <저장소 주소, 사용자명>/<이미지이름>:

    ...

    ...

      • library/nginx

    ...

    이미지 이름 변경

    ...

      • nginx

    (2) 이미지 이름 변경

    • 실제로는 이미지 이름 변경이 아닌 새로운 이름을 추가, 복제하는 방식입니다.

      • docker tag <reponame>:<old_name> <new_reponame>:<new_name>

    ...

    코드 블럭
    root@ubuntu-focal:~# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    mynginx      0.1       03de8991a4f8   11 minutes ago   178MB
    ubuntu       20.04     6df894023726   5 weeks ago      72.8MB
    root@ubuntu-focal:~# docker tag mynginx:0.1 mynginx:0.2
    root@ubuntu-focal:~# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    mynginx      0.1       03de8991a4f8   12 minutes ago   178MB
    mynginx      0.2       03de8991a4f8   12 minutes ago   178MB
    ubuntu       20.04     6df894023726   5 weeks ago      72.8MB
    root@ubuntu-focal:~#

    ...

     

    성능이슈가 발생할수 있으므로, vagrant를 halt 시켜놓는다.

    코드 블럭
    root@k8s:/home/vagrant# exit
    logout
    vagrant@k8s:~$ exit
    logout
    
    $ vagrant halt -f default
    ==> default: Forcing shutdown of VM...

    ...

    3. 컨테이너 Orchestration

    Container Orchestration은 애플리케이션을 구성하고 있는 수십 또는 수백 개의 컨테이너와 호스트들을 배포하고 관리하기 위한 도구입니다.

    컨테이너 Orchestration은 어떤 환경에서든 사용할 수 있으며, 재설계할 필요 없이 각기 다른 환경 전반에 동일한 애플리케이션을 배포하는데 도움이 됩니다.

    3.1 컨테이너 Orchestration 종류

    Kubernetes

    Docker Swarm

    Apache Mesos

    • 구글에 의해 개발된 오픈 소스 프로젝트로 가장 널리 사용되고 있는 오케스트레이션 툴

    • Docker가 공식적으로 만든 오케스트레이션 툴

    • Apache 재단에서 발표된 오픈 소스 프로젝트

    • 컨테이너의 롤링 업그레이드 지원

    • 여러 Host를 묶어 클러스터 구성 및 배포, 자동 복구 지원

    • 컨테이너 추가, 복제, 업데이트, 롤백 지원

    • 베어메탈, VM환경, 퍼블릭 클라우드 등의 다양한 환경에서 작동

    • 호스트 OS에 Agent만 설치하면 간단하게 작동하고 설정이 쉬움

    • Docker 명령어와 Compose를 그대로 사용 가능

    • 수만 대의 물리적 시스템으로 확장할 수 있도록 설계됐으며, 대형 스케일 클러스터에 적합한 도구

    • 하둡, MPI, Hypertable, Spark 같은 응용프로그램을 동적 클러스터 환경에서 리소스 공유와 분리를 통해 최적화 가능

    • Docker 컨테이너를 적극적으로 지원

    3.2 컨테이너 Orchestration의 활용

    • 컨테이너 프로비저닝 및 배포

    • 컨테이너 구성 및 스케쥴링 조정

    • 컨테이너 상태 모니터링 및 장애 복구

    • 컨테이너 추가 또는 제거로 확장 및 축소

    • 실행될 컨테이너를 기반으로 애플리케이션 설정

    • 컨테이너 간 상호 작용의 보안 유지

    ...

    4. 쿠버네티스

    쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 오케스트레이션 도구입니다.

    4.1 쿠버네티스를 구성하는 3가지 방법

    (1) 관리형 쿠버네티스

    ...

    퍼블릭 클라우드 업체에서 제공하는 관리형 쿠버네티스

    • 구성이 이미 갖춰져 있고 마스터 노드는 클라우드 업체에서 관리합니다.

    • 사용자는 필요한 부분들을 애플리케이션에 올려놓고 애플리케이션을 배포하여 사용하는 형태형태입니다.

    • 예시: EKS(Amazon Elastic Kubernetes Service), AKS(Azure Kubernetes Service), GKE(Google Kubernetes Service)

    ...

    사용하는 시스템에 쿠버네티스 클러스터를 자동으로 구성해주는 구성형 쿠버네티스 구성하는 방법입니다.

    • 관리형/설치형 쿠버네티스 보다 자유롭게 구성 가능합니다.

    • 예시: kubeadm, kops(Kubernetes operations), KRIB(Kubernetes Rebar Integrated Bootstrap), Kuberspray

    4.2 쿠버네티스에서 제공하는 기능

    (1)서비스 디스커버리와 로드밸런싱

    • 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있습니다.

    • 트래픽이 많아지면, 자동으로 네트워크 트래픽을 로드밸런싱하여 배포가 안정적으로 이루어질 수 있도록 합니다.

    ...