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
root@e77d22520d5d:/
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@e77d22520d5d:/
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
root@e77d22520d5d:/
e77d22520d5d
root@e77d22520d5d:/
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
/
컨테이너 격리 기술
기술 | 설명 |
---|
chroot | 프로세스의 루트 디렉토리를 변경, 격리하여 가상의 루트 디렉터리를 생성 |
privot_root | 루트 파일시스템 자체를 바꿔, 컨테이너가 전용 루트 파일시스템을 가지도록함 (chroot 보완) |
Mount namespace | namespace 내에 파일 시스템 트리를 구성 |
UTS namespace | 컨테이너에 대한 hostname 격리를 수행하여 고유한 hostname 보유가능 |
PID namespace | PID 와 프로세스를 분리(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 .
<missing> 6 minutes ago WORKDIR /app 0B buildkit.dockerfile.v0
<missing> 6 minutes ago RUN /bin/sh -c apk add --no-cache tini curl … 2.36MB buildkit.dockerfile.v0
<missing> 9 days ago /bin/sh -c
<missing> 9 days ago /bin/sh -c
<missing> 9 days ago /bin/sh -c
<missing> 9 days ago /bin/sh -c apk add --no-cache --virtual .bui… 7.76MB
<missing> 9 days ago /bin/sh -c
<missing> 9 days ago /bin/sh -c addgroup -g 1000 node && addu… 167MB
<missing> 9 days ago /bin/sh -c
<missing> 7 weeks ago /bin/sh -c
<missing> 7 weeks ago /bin/sh -c
[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 | 대화식 모드 열기 |
-t | TTY(단말 디바이스) 할당 |
-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
[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
[ec2-user@ip-172-31-36-185 ch05]$ docker port node-run
6060/tcp -> 0.0.0.0:6060
6060/tcp -> [::]:6060
[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