0. 개요
이 글은 아래 글과 이어집니다.
https://ksb-dev.tistory.com/379
지금까지 학습한 내용을 총 망라해서 도커 없이 컨테이너를 만들어보겠습니다.
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;
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
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
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 |