Docker 개념과 실습

Docker 기초

Docker에 대한 기본 설명과 Mac에서 실습을 진행하기 위한 글이다.
마지막에 nginx.conf 설명이 있는 이유는, 프론트 소스를 빌드 결과를 nginx에 index.html 디렉토리 하위
에 복사 후 nginx 도커 이미지 기반으로 app이 동작하는 것을 확인하는 것을 실습의 목표로 한다.

VM vs Container

  • vm은 OS가 동작하는데 필요한 기능들을 guest OS로 들고 있어야 한다. 용량이 크다.
  • vm은 io가 발생하는 경로가 container보다 많다.
  • vm이 처리한 io를 결국 host os의 커널이 받아 자신의 드라이버에 맞게 처리 필요하다. (병목 발생)
  • container는 host의 os를 공유한다.
    # VM 와 Container
    # VM vs Container 성능 비교

Linux kernel features

namespaces

  • mnt (파일시스템 마운트) : 호스트 파일 시스템에 구애받지 않고 독립적으로 파일 시스템을 마운트하거나 언마운트 가능
  • pid
  • net : namespace간 네트워크 충돌 방지 (ex. 중복포트 바인딩)
  • ipc : 프로세스간 독립적인 통신통로 할당
  • uts (hostname)
  • user (UID)

cgroup (Control groups)

자원에 대한 제어를 가능하게 해준다.

  • 메모리, CPU, I/O, 네트워크, device 노드(/dev)

장점

  • 운영환경과 동일한 환경으로 개발환경 구성이 가능하다.
  • Orchestration => scale out
  • MSA에 적합

Mac 환경설정

  • docker desktop app 설치 및 구동확인 (맥에서 가상화환경을 사용하기 위해 도커 엔진 설치)
    1
    2
    3
    4
    $ docker version

    # -i: tty 모드, -t: 대화형 세션, -h: host명
    $ docker exec -it redis bash

Dockerfile

  • 도커 이미지를 생성하기 위한 절차를 담고 있는 텍스트 파일
  • 교육 중 진행한 sample 프로젝트를 docker 컨테이너로 실행해보자.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #Dockerfile: sample project
    FROM nginx:alpine

    COPY nginx.conf /etc/nginx/conf.d/default.conf

    COPY ./dist/ /usr/share/nginx/html

    #로컬에 image file 생성 [name]:[tag]
    $docker build -t sample .

Docker image

  • 여러 계층으로 구성되어 있다.
  • 각 계층은 읽기 전용 파일 시스템에 있다.
  • 계층은 도커파일에 있는 명령마다 생성되며, 이전 계층 위에 위치하게 된다.
    1
    2
    3
    4
    5
    6
    $docker images

    $docker rmi [이미지명]

    ## UFS (유니온 파일 시스템, 유니온 마운트), 여러 개의 파일 시스템을 겹칠 수 있도록 해준다.
    $docker info | grep "Storage Driver"

Docker Registry

이미지를 운영하고 배포하는 역할을 담당하는 서비스, 기본 레지스트리 도커 허브

  • docker hub
  • private registry

Container

1
2
3
4
5
6
7
8
9
10
11
12
## 많이 사용하는 command 기준으로 설명
$docker run -h sample-web -p 9080:80 -d sample

$docker ps

$docker stop [컨테이너명 | 컨테이너 ID]

$docker ps -a

$docker start [컨테이너명 | 컨테이너 ID]

$docker rm [컨테이너명 | 컨테이너 ID]

참조

설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#nginx.conf
server {
listen 80;
server_name localhost;

#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;

location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.html break;
}
root /usr/share/nginx/html;
index index.html index.htm;
gzip_static on;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
location /api/v1 {
proxy_pass http://127.0.0.1:8088;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

Share