
06F. Docker ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์์ฑํ๊ธฐ
06F. Docker ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์์ฑํ๊ธฐ ๊ด๋ จ

๋ณดํต Dockerfile๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๋ Docker Hub์์ ์ ๊ณตํ๋ ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค. ์ด๋ฒ์๋ ๋๋ง์ ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ฐ๋ถํฌ ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์์ฑํ๊ธฐ
์ฐ๋ถํฌ ๋ฆฌ๋ ์ค ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ถํฌ ๋ฆฌ๋ ์ค์ฉ ๋ถํธ์คํธ๋ฉ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ฐ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ถํฌ ๋ฆฌ๋ ์ค๊ฐ ์ค์น๋ ํธ์คํธ์์ ์งํํฉ๋๋ค.
๋จผ์  ๋ถํธ์คํธ๋ฉ ๋๊ตฌ์ธ debootstrap์ ์ค์นํฉ๋๋ค.
sudo apt install debootstrap
debootstrap์ผ๋ก ์ฐ๋ถํฌ jammy(22.04) ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ฐ์ต๋๋ค. jammy๋ ์ฐ๋ถํฌ ๋ฆฌ๋
์ค์ ์ฝ๋๋ค์์
๋๋ค.
sudo debootstrap jammy jammy
deboostrap <์ฝ๋๋ค์> <๋๋ ํฐ๋ฆฌ> ํ์์
๋๋ค.
์ฐ๋ถํฌ ๋ฆฌ๋ ์ค ์ฝ๋๋ค์
์ฐ๋ถํฌ ๋ฆฌ๋ ์ค์ ๋ฒ์ ๋ณ ์ฝ๋๋ค์ ๋ชฉ๋ก์ ๋ค์ URL์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ค ๋ฐ์์ผ๋ฉด docker import ๋ช
๋ น์ผ๋ก ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
sudo tar -C jammy -c . | sudo docker import - jammy
tar -C jammy -c .๋ jammy ๋๋ ํฐ๋ฆฌ์ ๋ด์ฉ์ ํ์ผ ํ๋๋ก ํฉ์ณ์ stdout์ผ๋ก ์ถ๋ ฅํ๋ ๋ช
๋ น์
๋๋ค. ์ด ์ถ๋ ฅ ๋ด์ฉ์ | (ํ์ดํ)๋ฅผ ํตํด docker import ๋ช
๋ น์ ์ ๋ฌํฉ๋๋ค.
docker import <URL ๋๋ -> <์ด๋ฏธ์ง ์ด๋ฆ>:<ํ๊ทธ> ํ์์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์ธํฐ๋ท์ ์๋ ํ์ผ๋ ์ฌ์ฉํ  ์ ์์ต๋๋ค. |๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ๋ฐ๋๋ค๋ฉด -๋ฅผ ์ง์ ํฉ๋๋ค.
sudo docker import http://example.com/jammy.tgz focal
์ด๋ฏธ์ง ๋ชฉ๋ก์ ์ถ๋ ฅํฉ๋๋ค.
sudo docker images
# 
# REPOSITORY                TAG       IMAGE ID       CREATED         SIZE
# jammy                     latest    190b8535965c   6 seconds ago   374MB
jammy ์ด๋ฏธ์ง๊ฐ ์์ฑ๋์์ต๋๋ค. ์ด์  jammy ์ด๋ฏธ์ง๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑํฉ๋๋ค. ์ปจํ
์ด๋์ Bash ์
ธ์ด ์คํ๋๋ฉด /etc/lsb-release ํ์ผ์ ๋ด์ฉ์ ํ์ธํด๋ด
๋๋ค.
sudo docker run -i -t --name hello jammy /bin/bash
cat /etc/lsb-release
# 
# DISTRIB_ID=Ubuntu
# DISTRIB_RELEASE=22.04
# DISTRIB_CODENAME=jammy
# DISTRIB_DESCRIPTION="Ubuntu 22.04 LTS"
์ฝ๋๋ค์์ jammy, ๋ฆด๋ฆฌ์ค ๋ฒ์ ์ 22.04 ๋ก ํ์๋ฉ๋๋ค.
CentOS ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์์ฑํ๊ธฐ
์ด๋ฒ์๋ CentOS ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค. CentOS์ฉ ๋ถํธ์คํธ๋ฉ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ฐ์์์ผ ํ๊ธฐ ๋๋ฌธ์ CentOS Stream 9๊ฐ ์ค์น๋ ํธ์คํธ์์ ์งํํฉ๋๋ค.
๋จผ์  ๋ถํธ์คํธ๋ฉ ๋๊ตฌ์ธ supermin์ ์ค์นํฉ๋๋ค.
sudo yum install supermin
supermin์ผ๋ก ๋ถํธ์คํธ๋ฉ์ ์ค๋นํฉ๋๋ค.
supermin --prepare yum -o supermin.d
supermin --build --format chroot supermin.d -o appliance.d
mkdir -p appliance.d/etc/yum/vars
echo 9 > appliance.d/etc/yum/vars/releasever
๋ถํธ์คํธ๋ฉ์ ๋ค ์ค๋นํ๋ค๋ฉด docker import ๋ช
๋ น์ผ๋ก ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
sudo tar -C appliance.d -c . | sudo docker import - centos
sudo tar -C appliance.d -c .๋ appliance.d ๋๋ ํฐ๋ฆฌ์ ๋ด์ฉ์ ํ์ผ ํ๋๋ก ํฉ์ณ์ stdout์ผ๋ก ์ถ๋ ฅํ๋ ๋ช
๋ น์
๋๋ค. ์ด ์ถ๋ ฅ ๋ด์ฉ์ | (ํ์ดํ)๋ฅผ ํตํด docker import ๋ช
๋ น์ ์ ๋ฌํฉ๋๋ค.
docker import <tar ํ์ผ URL ๋๋ -> <์ด๋ฏธ์ง ์ด๋ฆ>:<ํ๊ทธ> ํ์์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์ธํฐ๋ท์ ์๋ ํ์ผ์ ์ฌ์ฉํ  ์๋ ์์ต๋๋ค. |(ํ์ดํ)๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ๋ฐ๋๋ค๋ฉด -๋ฅผ ์ง์ ํฉ๋๋ค.
sudo docker import http://example.com/centos.tgz centos
์ด๋ฏธ์ง ๋ชฉ๋ก์ ์ถ๋ ฅํฉ๋๋ค.
sudo docker images
# 
# REPOSITORY                   TAG       IMAGE ID       CREATED              SIZE
# centos                       latest    6f4877487603   About a minute ago   187MB
centos ์ด๋ฏธ์ง๊ฐ ์์ฑ๋์์ต๋๋ค. centos ์ด๋ฏธ์ง๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑํฉ๋๋ค. ์ปจํ
์ด๋์ Bash ์
ธ์ด ์คํ๋๋ฉด /etc/centos-release ํ์ผ์ ๋ด์ฉ์ ํ์ธํด๋ด
๋๋ค.
sudo docker run -i -t --name hello centos /bin/bash
cat /etc/centos-release
# 
# CentOS Stream release 9
๋ฐฐํฌํ ๋ฒ์ ์ด CentOS Stream release 9๋ก ํ์๋ฉ๋๋ค.
๋น ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์์ฑํ๊ธฐ
์๋ฌด๊ฒ๋ ๋ค์ด์์ง ์์ ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์
๋๋ค. Docker์์๋ ๋น ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ scratch ์ด๋ฏธ์ง๋ผ๊ณ  ๋ถ๋ฆ
๋๋ค.
/dev/null ์ฅ์น๋ฅผ ์ด์ฉํ์ฌ ๋น tar ํ์ผ์ ๋ง๋ค์ด์ docker import ๋ช
๋ น์ ์ ๋ฌํฉ๋๋ค.
tar cv --files-from /dev/null | sudo docker import - scratch
scratch ์ด๋ฏธ์ง๋ ์์ ์๋ฌด๊ฒ๋ ์๊ธฐ ๋๋ฌธ์ ์ปจํ
์ด๋๋ก ์์ฑ์ด ๋์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ Dockerfile์ ์์ฑํ์ฌ ์ฌ๋ฌ๋ถ์ด ๋ง๋  ์คํ ํ์ผ์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.
๊ฐ๋จํ๊ฒ C ์ธ์ด๋ก ๋ง๋  ํ๋ก๊ทธ๋จ์ scratch ์ด๋ฏธ์ง์ ๋ฃ์ด๋ณด๊ฒ ์ต๋๋ค. ๋จผ์  hello ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ ๋ค hello ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํฉ๋๋ค.
mkdir hello
cd hello
๋ค์ ๋ด์ฉ์ hello.c๋ก ์ ์ฅํฉ๋๋ค.
hello.c
#include <stdio.h>
int main() {
    printf("Hello Docker\n");
    return 0;
}
.hello.c ํ์ผ์ ์ปดํ์ผํ์ฌ ์คํ ํ์ผ๋ก ๋ง๋ญ๋๋ค. scratch ์ด๋ฏธ์ง์๋ ์๋ฌด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ผ๋ฏ๋ก ๋ฐ๋์ ์ ์ (static) ๋ฐ์ด๋๋ฆฌ๋ก ์ปดํ์ผํด์ผ ํฉ๋๋ค.
gcc hello.c -static -o hello
์ปดํ์ผ
sudo apt install gcc
sudo yum config-manager --set-enabled crb
sudo yum install gcc
sudo yum install glibc-static
๋ค์ ๋ด์ฉ์ Dockerfile๋ก ์ ์ฅํฉ๋๋ค.
DockerfileFROM scratch
ADD ./hello /hello
CMD ["/hello"]
scratch ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
FROM: ์ด๋ค ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ง ์ค์ ํฉ๋๋ค. Docker ์ด๋ฏธ์ง๋ ๊ธฐ์กด์ ๋ง๋ค์ด์ง ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค.<์ด๋ฏธ์ง ์ด๋ฆ>:<ํ๊ทธ>ํ์์ ๋๋ค. ์ฌ๊ธฐ์๋ ์์์ ๋ง๋scratch์ด๋ฏธ์ง๋ฅผ ์ค์ ํฉ๋๋ค.ADD: ์ด๋ฏธ์ง์ ํฌํจํ ํ์ผ์ ์ค์ ํฉ๋๋ค.<๋ก์ปฌ ๊ฒฝ๋ก> <์ด๋ฏธ์ง ๊ฒฝ๋ก>ํ์์ ๋๋ค. ์์์hello.cํ์ผ์ ์ปดํ์ผํ์ฌ ์์ฑํhelloํ์ผ์ ์ค์ ํฉ๋๋ค.CMD: ์ปจํ ์ด๋๊ฐ ์์๋์์ ๋ ์คํํ ์คํ ํ์ผ ๋๋ ์คํฌ๋ฆฝํธ์ ๋๋ค.helloํ์ผ์ด ์คํ๋๋๋ก ์ค์ ํฉ๋๋ค.
docker build ๋ช
๋ น์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
sudo docker build --tag hello:0.1 .
์ด์  scratch ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด์ ๋ง๋  hello:0.1 ์ด๋ฏธ์ง๋ฅผ ์ปจํ
์ด๋๋ก ์์ฑํฉ๋๋ค.
sudo docker run --rm hello:0.1
# 
# Hello Docker
Hello Docker๊ฐ ์ถ๋ ฅ๋๋ฉด ์คํ ํ์ผ์ด ์ ์์ ์ผ๋ก ์คํ๋ ๊ฒ์ ๋๋ค.