본문 바로가기

삽질

도커 없이 컨테이너 만들기 - 9

0. 개요

이 글은 아래 글과 이어집니다.

https://ksb-dev.tistory.com/379

 

도커 없이 컨테이너 만들기 - 8

0. 개요이 글은 아래 글과 이어집니다.https://ksb-dev.tistory.com/378 도커 없이 컨테이너 만들기 - 70. 개요이 글은 아래 글과 이어집니다.https://ksb-dev.tistory.com/377 도커 없이 컨테이너 만들기 - 60. 개요

ksb-dev.tistory.com

 

 

지금까지 학습한 내용을 총 망라해서 도커 없이 컨테이너를 만들어보겠습니다.

 

1. 이미지 준비

기존에 tools에 ping, stress, hostname, umount를 추가하겠습니다.

ubuntu1804를 쓰시는 분은 아래를 통해 tools를 다운받으시면 됩니다.

https://raw.githubusercontent.com/sam0kim/container-internal/main/scripts/copy_tools.sh
bash copy_tools.sh

 

하지만 저의 경우 ubuntu2004를 쓰기 때문에 copy_tools.sh 파일을 아래와 같이 수정했습니다.

#!/bin/bash

mkdir -p /tmp/tools/{bin,lib64,lib/x86_64-linux-gnu,usr/lib/x86_64-linux-gnu,usr/bin};

# copy ping
ldd /bin/ping;
cp /bin/ping /tmp/tools/bin/;
cp /lib/x86_64-linux-gnu/{libcap.so.2,libgcrypt.so.20,libresolv.so.2,libc.so.6,libgpg-error.so.0} /tmp/tools/lib/x86_64-linux-gnu/;
cp /lib64/ld-linux-x86-64.so.2 /tmp/tools/lib64/;

# copy stress
ldd /usr/bin/stress;
cp /usr/bin/stress /tmp/tools/usr/bin/;
cp /lib/x86_64-linux-gnu/{libm.so.6,libc.so.6} /tmp/tools/lib/x86_64-linux-gnu/;
cp /lib64/ld-linux-x86-64.so.2 /tmp/tools/lib64/;

# copy hostname
ldd /bin/hostname;
cp /bin/hostname /tmp/tools/bin/;
cp /lib/x86_64-linux-gnu/libc.so.6 /tmp/tools/lib/x86_64-linux-gnu/;
cp /lib64/ld-linux-x86-64.so.2 /tmp/tools/lib64;

# copy umount
ldd /bin/umount;
cp /bin/umount /tmp/tools/bin/;
cp /lib/x86_64-linux-gnu/{libmount.so.1,libc.so.6,libblkid.so.1,libselinux.so.1,librt.so.1,libuuid.so.1,libpcre2-8.so.0,libdl.so.2,libpthread.so.0} /tmp/tools/lib/x86_64-linux-gnu/;
cp /lib64/ld-linux-x86-64.so.2 /tmp/tools/lib64/;

 

쉘파일 실행은 똑같이 bash로 하시면 됩니다.

 

2. Network Namespace 생성

RED, BLUE network namespace를 생성하고 ip를 부여하겠습니다.

ip netns add RED;
ip netns add BLUE;
ip link add veth0 netns RED type veth peer name veth1 netns BLUE
ip netns exec RED ip addr add dev veth0 11.11.11.2/24;
ip netns exec RED ip link set veth0 up;
ip netns exec BLUE ip addr add dev veth1 11.11.11.3/24;
ip netns exec BLUE ip link set veth1 up;
출처 : https://speakerdeck.com/kakao/ige-dwaeyo-dokeo-eobsi-keonteineo-mandeulgi?slide=213

 

3. RED 컨테이너 생성

RED 컨테이너의 cgroup을 생성합니다.

mkdir /sys/fs/cgroup/cpu/red;
mkdir /sys/fs/cgroup/memory/red;

 

CPU 사용율 40%, RAM 200MB로 제한하겠습니다.

또한, swap off를 하여 가상 메모리를 사용하지 않게하겠습니다.

echo 40000 > /sys/fs/cgroup/cpu/red/cpu.cfs_quota_us;
echo 209715200 > /sys/fs/cgroup/memory/red/memory.limit_in_bytes;
echo 0 > /sys/fs/cgroup/memory/red/memory.swappiness;

 

unshare를 격리해보겠습니다.

unshare -m -u -i -fp nsenter --net=/var/run/netns/RED /bin/sh;

 

격리된 컨테이너에 cgroup을 지정하겠습니다.

echo "1" > /sys/fs/cgroup/cpu/red/cgroup.procs;
echo "1" > /sys/fs/cgroup/memory/red/cgroup.procs;

 

컨테이너 안에 오버레이 마운트를 위한 폴더를 생성합니다.

mkdir /redfs;
mkdir /redfs/container;
mkdir /redfs/work;
mkdir /redfs/merge;

 

오버레이를 합니다.

mount -t overlay overlay -o lowerdir=tools:myroot,upperdir=/redfs/container,workdir=/redfs/work /redfs/merge

 

merge가 마운트 포인트 및 컨테이너의 루트 파일시스템이 되기 때문에 pivot_root를 위한 put_old 파일은 merge 밑에 만들어야 합니다.

mkdir -p /redfs/merge/put_old # host와 마운트 될 put_old를 생성합니다.
cd /redfs/merge; # pivot_root를 위해서는 루트 파일시스템이 될 곳으로 이동해야합니다.
pivot_root . put_old;
cd /

 

put_old는 host의 루트 파일시스템과 연결되어 있습니다.

이 상태로 두면 보안상 위협이 되기 때문에, 꼭 삭제해야합니다.

삭제를 위해서는 put_old를 umount해야 하는데, 이를 위해 proc를 mount한 뒤에 해야 합니다.

mount -t proc proc /proc;
umount -l put_old;

 

이제 put_old를 삭제하시면 됩니다.

rm -rf put_old;

 

hostname을 RED로 변경하겠습니다.

hostname
hostname RED
hostname
출처 : https://speakerdeck.com/kakao/ige-dwaeyo-dokeo-eobsi-keonteineo-mandeulgi?slide=228

 

4. Blue 컨테이너 생성

RED 컨테이너 생성과 동일합니다.

다른 터미널로 진행해주세요.

 

host실행 명령어 모음

mkdir /sys/fs/cgroup/cpu/blue;
mkdir /sys/fs/cgroup/memory/blue;
echo 40000 > /sys/fs/cgroup/cpu/blue/cpu.cfs_quota_us;
echo 209715200 > /sys/fs/cgroup/memory/blue/memory.limit_in_bytes;
echo 0 > /sys/fs/cgroup/memory/blue/memory.swappiness;
unshare -m -u -i -fp nsenter --net=/var/run/netns/BLUE /bin/sh;

 

shell실행 명령어 모음

echo "1" > /sys/fs/cgroup/cpu/blue/cgroup.procs;
echo "1" > /sys/fs/cgroup/memory/blue/cgroup.procs;
mkdir /bluefs;
mkdir /bluefs/container;
mkdir /bluefs/work;
mkdir /bluefs/merge;
mount -t overlay overlay -o lowerdir=tools:myroot,upperdir=/bluefs/container,workdir=/bluefs/work /bluefs/merge;
mkdir -p /bluefs/merge/put_old;
cd /bluefs/merge;
pivot_root . put_old;
cd /
mount -t proc proc /proc;
umount -l put_old;
rm -rf put_old;
hostname
hostname BLUE
hostname
출처 : https://speakerdeck.com/kakao/ige-dwaeyo-dokeo-eobsi-keonteineo-mandeulgi?slide=241

 

5. RED와 BLUE 컨테이너 확인

서로 ping을 하면 정상적으로 통신이 되는 것을 알 수 있습니다.

# RED 컨테이너
ping 11.11.11.3

# BLUE 컨테이너
ping 11.11.11.2



'삽질' 카테고리의 다른 글

Service Mesh  (0) 2024.09.15
도커 없이 컨테이너 만들기 - 8  (0) 2024.08.23
도커 없이 컨테이너 만들기 - 7  (0) 2024.08.23
도커 없이 컨테이너 만들기 - 6  (0) 2024.08.23
도커 없이 컨테이너 만들기 - 5  (0) 2024.08.23