Container Isolation Technology

진성대·2023년 9월 28일
0

Docker

목록 보기
7/12

Process Isolation Technology

  • docker 의 base image

    /dev/sdb1 :: /var/lib/docker

OCI

  • 이미지를 우리가 원하는대로 build 할때 packing하는 기술
[ec2-user@ip-172-31-36-185 save_lab]$ docker run -it --rm --name=mycontainer ubuntu:16.04 bash

# chroot & pivot_root
root@e77d22520d5d:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var


# pivot_root & mount namespace
root@e77d22520d5d:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         8.0G  5.1G  2.9G  65% /
tmpfs            64M     0   64M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/xvda1      8.0G  5.1G  2.9G  65% /etc/hosts
tmpfs           475M     0  475M   0% /proc/acpi
tmpfs           475M     0  475M   0% /proc/scsi
tmpfs           475M     0  475M   0% /sys/firmware

# UTS namespace
root@e77d22520d5d:/# hostname
e77d22520d5d

# PID / IPC namespace
root@e77d22520d5d:/# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 14:24 pts/0    00:00:00 bash
root          14       1  0 14:26 pts/0    00:00:00 ps -ef

# Network namespace
/# ifconfig

컨테이너 격리 기술

기술설명
chroot프로세스의 루트 디렉토리를 변경, 격리하여 가상의 루트 디렉터리를 생성
privot_root루트 파일시스템 자체를 바꿔, 컨테이너가 전용 루트 파일시스템을 가지도록함 (chroot 보완)
Mount namespacenamespace 내에 파일 시스템 트리를 구성
UTS namespace컨테이너에 대한 hostname 격리를 수행하여 고유한 hostname 보유가능
PID namespacePID 와 프로세스를 분리(systemd와 분리)
Network namespace네트워크 리소스(IP, Port, route table, ethernet, ... )
IPC namespace전용의 process table 보유
[ec2-user@ip-172-31-36-185 save_lab]$ lsns
        NS TYPE   NPROCS   PID USER     COMMAND
4026531834 time        3 80302 ec2-user /usr/lib/systemd/systemd --user
4026531835 cgroup      3 80302 ec2-user /usr/lib/systemd/systemd --user
4026531836 pid         3 80302 ec2-user /usr/lib/systemd/systemd --user
4026531837 user        3 80302 ec2-user /usr/lib/systemd/systemd --user
4026531838 uts         3 80302 ec2-user /usr/lib/systemd/systemd --user
4026531839 ipc         3 80302 ec2-user /usr/lib/systemd/systemd --user
4026531840 net         3 80302 ec2-user /usr/lib/systemd/systemd --user
4026531841 mnt         3 80302 ec2-user /usr/lib/systemd/systemd --user

docker 컨테이너 lifecycle

  • docker 컨테이너는 docker create 명령을 통해 image의 snapshot으로 /var/lib/docker 영역에 생성된다.
  • docker start 명령은 읽고 쓰기가 가능한 Process영역 즉, container layer를 생성하여 동적 컨테이너를 구성하게 된다. 또한 docker stop은 생성된 container layer를 삭제한다.
  • docker rm 은 생성된 snapshot을 삭제하는 과정을 통해 docker container lifecycle을 알 수 있다.

docker [container] run [option] docker_image [command]

# 컨테이너 명령 테스트를 위한 이미지를 만들어 보자.

[ec2-user@ip-172-31-36-185 ch05]$ vi Dockerfile
FROM node:20-alpine3.17
RUN apk add --no-cache tini curl
WORKDIR /app
COPY runapp.js .
EXPOSE 6060
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "runapp.js"]

[ec2-user@ip-172-31-36-185 ch05]$ vi runapp.js
const http = require('http');
const server = http.createServer().listen(6060);
server.on('request', (req, res) => {
        console.log('Your request arrived.');
        res.write("HostName: " + process.env.HOSTNAME + "\n");
        res.end();
});
server.on('connection', (socket) => {
        console.log("Your Connected.");
});



ec2-user@ip-172-31-36-185 ch05]$ docker build -t noderun:1.0 .
[+] Building 1.7s (10/10) FINISHED                                                                                                                                                           docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                   0.0s
 => => transferring dockerfile: 255B                                                                                                                                                                   0.0s
 => [internal] load .dockerignore                                                                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                                                                        0.0s
 => [internal] load metadata for docker.io/library/node:20-alpine3.17                                                                                                                                  1.5s
 => [auth] library/node:pull token for registry-1.docker.io                                                                                                                                            0.0s
 => [1/4] FROM docker.io/library/node:20-alpine3.17@sha256:2d808029dd5a1e6a606c06a3c78fbb770f53d2603827e7fcfbc7878848749152                                                                            0.0s
 => [internal] load build context                                                                                                                                                                      0.0s
 => => transferring context: 401B                                                                                                                                                                      0.0s
 => CACHED [2/4] RUN apk add --no-cache tini curl                                                                                                                                                      0.0s
 => CACHED [3/4] WORKDIR /app                                                                                                                                                                          0.0s
 => [4/4] COPY runapp.js .                                                                                                                                                                             0.1s
 => exporting to image                                                                                                                                                                                 0.0s
 => => exporting layers                                                                                                                                                                                0.0s
 => => writing image sha256:495dc5add342e639280b6d397782d978fe972307dc03a32a59ba85ac375bfce1                                                                                                           0.0s
 => => naming to docker.io/library/noderun:1.0                                                                                                                                                         0.0s
[ec2-user@ip-172-31-36-185 ch05]$ docker images | grep noderun
noderun                  1.0          495dc5add342   6 seconds ago   184MB
[ec2-user@ip-172-31-36-185 ch05]$ docker image history noderun:1.0
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
495dc5add342   13 seconds ago   CMD ["node" "runapp.js"]                        0B        buildkit.dockerfile.v0
<missing>      13 seconds ago   ENTRYPOINT ["/sbin/tini" "--"]                  0B        buildkit.dockerfile.v0
<missing>      13 seconds ago   EXPOSE map[6060/tcp:{}]                         0B        buildkit.dockerfile.v0
<missing>      13 seconds ago   COPY runapp.js . # buildkit                     304B      buildkit.dockerfile.v0
<missing>      6 minutes ago    WORKDIR /app                                    0B        buildkit.dockerfile.v0
<missing>      6 minutes ago    RUN /bin/sh -c apk add --no-cache tini curl2.36MB    buildkit.dockerfile.v0
<missing>      9 days ago       /bin/sh -c #(nop)  CMD ["node"]                 0B
<missing>      9 days ago       /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
<missing>      9 days ago       /bin/sh -c #(nop) COPY file:4d192565a7220e13…   388B
<missing>      9 days ago       /bin/sh -c apk add --no-cache --virtual .bui…   7.76MB
<missing>      9 days ago       /bin/sh -c #(nop)  ENV YARN_VERSION=1.22.19     0B
<missing>      9 days ago       /bin/sh -c addgroup -g 1000 node     && addu…   167MB
<missing>      9 days ago       /bin/sh -c #(nop)  ENV NODE_VERSION=20.7.0      0B
<missing>      7 weeks ago      /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>      7 weeks ago      /bin/sh -c #(nop) ADD file:6dd87346b8be240b2…   7.06MB
[ec2-user@ip-172-31-36-185 ch05]$ docker run -itd -p 6060:6060 --name=node-run -h node-run noderun:1.0
5b6d5e11ec5859ff90f75d0507a1d7bd428aa7bc8a2328801240d61d43b32de5
[ec2-user@ip-172-31-36-185 ch05]$ docker ps | grep node
5b6d5e11ec58   noderun:1.0              "/sbin/tini -- node …"   5 seconds ago   Up 4 seconds   0.0.0.0:6060->6060/tcp, :::6060->6060/tcp                       node-run
[ec2-user@ip-172-31-36-185 ch05]$ curl localhost:6060
HostName: node-run



CLI

옵션설명
-i, --interactive대화식 모드 열기
-tTTY(단말 디바이스) 할당
-d, --detach=true백그라운드에서 컨테이너 실행하고 컨테이너 ID등록
--name실행되는 컨테이너에 이름 부여 (미 지정 시 자동으로 부여됨: 딕셔너리 워드 랜덤 선택)
--rm컨테이너 종료 시 자동으로 컨테이너 제거
--restart컨테이너 종료 시 적용할 재시작 정책 지정.([no, on-failure, on-failure:횟수n, always])
--env컨테이너의 환경변수 지정(--env-file은 여러 환경 변수를 파일로 생성하여 지정하는 방법)
-v, --volume=호스트 경로:컨테이너 경로호스트 경로와 컨테이너 경로의 공유 볼륨 설정.(Bind mount 라고 함)
-h컨테이너의 호스트명 지정 (미 지정 시 컨테이너 ID가 호스트명으로 등록)
-p[Host 포트]:[Container 포트], --publish호스트 포트와 컨테이너 포트 연결
-P, --publish-all=[true,flase]컨테이너 내부의 노출된(expose)포트를 호스트 임의의 포트에 게시
--workdir, -w컨테이너 내부의 작업 경로(디렉터리)

docker top | port | stat

# docker top, 컨테이너에서 실행 중인 프로세스 조회
[ec2-user@ip-172-31-36-185 ch05]$ docker top node-run
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                130294              130271              0                   12:31               pts/0               00:00:00            /sbin/tini -- node runapp.js
root                130316              130294              0                   12:31               pts/0               00:00:00            node runapp.js
#
# docker port, 컨테이너에 매핑된 포트 조회
[ec2-user@ip-172-31-36-185 ch05]$ docker port node-run
6060/tcp -> 0.0.0.0:6060
6060/tcp -> [::]:6060

#컨테이너 리소스사용 통계에 대한 실시간 스트림 출력 (스트림 통계 비활성화, --no-stream)
[ec2-user@ip-172-31-36-185 ch05]$ docker stats node-run
CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O         BLOCK I/O     PIDS
5b6d5e11ec58   node-run   0.00%     14.02MiB / 949.4MiB   1.48%     1.53kB / 475B   16.8MB / 0B   11
CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O         BLOCK I/O     PIDS
5b6d5e11ec58   node-run   0.00%     14.02MiB / 949.4MiB   1.48%     1.53kB / 475B   16.8MB / 0B   11
CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O         BLOCK I/O     PIDS
5b6d5e11ec58   node-run   0.00%     14.02MiB / 949.4MiB   1.48%     1.53kB / 475B   16.8MB / 0B   11
CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O         BLOCK I/O     PIDS
profile
신입 개발자

0개의 댓글