runc는 컨테이너를 실제로 실행하는 **표준 가전(Low-level Container Runtime)**입니다.

  • 역할: Docker나 Kubernetes가 "컨테이너 하나 띄워줘!"라고 요청하면, 리눅스 커널의 기능을 사용하여 프로세스를 격리하고 컨테이너를 실제로 만드는 '실행 부대' 역할을 합니다.
  • 왜 NVIDIA와 대조되나요? * 기본 runc는 CPU와 일반 메모리만 다룰 줄 압니다.
    • GPU를 쓰려면 GPU 드라이버를 컨테이너 안으로 연결해줄 수 있는 nvidia-container-runtime이 필요한데, 이 런타임은 내부적으로 runc를 수정하여 GPU 인식 기능을 추가한 것입니다.
    • 따라서 설정에서 handler: nvidia를 지정하지 않고 기본 runc를 쓰면, 컨테이너는 GPU가 내부에 있는지 전혀 모르게 됩니다.

# 필수는 아니나 Dockerfile 를 제작할 때에는 디렉토리 생성 후 해당 디렉토리에 접근해 사용할 것을 권장 

 

1. HTTP 서비스 구축 

 1.1. 디렉토리 만들기 : mkdir /http

 1.2. 디렉토리 들어가기 : cd /http

 1.3. Dockerfile 만들기 : vi Dockerfile

# step1 : base image
FROM    rockylinux:9

# step2 : httpd install

RUN    dnf install -y httpd
RUN    dnf install -y net-tools
RUN    sed -i 's/Listen 80/Listen 8080/' /etc/http/conf/httpd.conf
RUN    systemctl enable httpd

# step3 : index.html file copy

COPY    index.html /var/www/html/

# step4 : web execute

CMD     /usr/sbin/httpd -D FOREGROUND

# step5 : port

EXPOSE  8080

 

 1.4. index.html 만들기 : vi index.html

<html>
<body>
<h1>DOCKERFILE-TEST</h1>
</body>
</html>

 

 1.5. 빌드 : docker bulid -t httpd:behwang .

 1.6. 컨테이너 실행 : docker run -itd -p 60080:80 --name h1 httpd:behwang

 

2. FTP 서비스 구축 

 2.1. 디렉토리 만들기 : mkdir /ftp

 2.2. 디렉토리 들어가기 : cd /ftp

 2.3. Dockerfile 만들기 : vi Dockerfile

#Dockerfile
FROM    rockylinux:9

RUN     dnf install -y vsftpd

RUN     setenforce 0

COPY    user.sh /ftp/user.sh

COPY    ftp.txt /ftp/ftp.txt
COPY    vsftpd.conf /etc/vsftpd/vsftpd.conf
COPY    chroot_list /etc/vsftpd/chroot_list

RUN     sh /ftp/user.sh


EXPOSE  21      50000-50010


CMD     ["/usr/sbin/vsftpd","-obackground=NO"]

 

 2.4. user.sh 만들기 : vi user.sh

useradd a
echo 'It1' | passwd --stdin a
useradd b
echo 'It1' | passwd --stdin b

 

 2.5. ftp.txt 만들기 : vi ftp.txt

+++++++++++++++++++++
Docker!
Vsftpd!
+++++++++++++++++++++

 

 2.6. vsftpd.conf 만들기 : vi vsftpd.conf

#vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
banner_file=/test/ftp.txt
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50010
allow_writeable_chroot=YES

 

 2.7. chroot_list 만들기 : vi chroot_list

a

 

 2.8. 빌드 : vi Dockerfile

 2.9. 컨테이너 실행 : docker run -d -p 21:21 -p 50000-50010:50000-50010 --name f1 vsftpd:behwang

 2.10. 방화벽 설정

  step1) firewall-cmd --permanent --add-port=21/tcp
  step2) firewall-cmd --permanent --add-port=50000-50010/tcp
  step3) 저장 : firewall-cmd --reload


 

3. DNS 구축 

 3.1. 디렉토리 만들기 : mkdir /bind

 3.2. 디렉토리 들어가기 : cd /bind

 3.3. Dockerfile 만들기 : vi Dockerfile

# DNS Build
# Step 1 : Base Image Install
FROM    rockylinux:9

# Step 2 : Bind Package Install
RUN     dnf install -y bind bind-utils bind-libs
RUN     dnf install -y net-tools
RUN     sed -i 's/127.0.0.1/any/g' /etc/named.conf
RUN     sed -i 's/localhost/any/g' /etc/named.conf
RUN     systemctl enable named

# Step 3 : Configuration File Settiong

COPY    named.rfc1912.zones /etc/named.rfc1912.zones
COPY    behwang.com /var/named/
COPY    resolv.conf /etc/resolv.conf
RUN     chmod 755 /var/named/behwang.com

# Step 4 : named execute
CMD     ["/usr/sbin/named", "-c", "/etc/named.conf", "-g", "-u", "named"]

# Step 5 : Port
EXPOSE  53/udp
EXPOSE  53/tcp

 

3.4. named.rfc1912.zones 만들기 : vi named.rfc1912.zones

zone "localhost.localdomain" IN {
        type master; 
        file "named.localhost";
        allow-update { none; };
};

zone "localhost" IN {
        type master; 
        file "named.localhost";
        allow-update { none; };
};

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master; 
        file "named.loopback";
        allow-update { none; };
};

zone "1.0.0.127.in-addr.arpa" IN {
        type master; 
        file "named.loopback";
        allow-update { none; };
};

zone "0.in-addr.arpa" IN {
        type master; 
        file "named.empty";
        allow-update { none; };
};

zone "behwang.com" IN {
        type master; 
        file "behwang.com";
        allow-update { none; };
};

 

 3.5. behwang.com 만들기 : vi behwang.com

$TTL 1D
@       IN SOA  ns1.behwang.com. root. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns1.behwang.com.
        MX 10   mail.behwang.com.

             A       192.168.0.1
www     A       192.168.0.1
ftp         A       192.168.0.2
mail      A       192.168.0.4
ns1       A       192.168.0.3

 

 3.6. resolv.conf 만들기 : vi resolv.conf

nameserver 192.168.0.3
nameserver 8.8.8.8

 

 3.7. 빌드 : docker build -t dns1.0 .

 3.8. 컨테이너 구동 : docker run -itd --name d1 dns1.0

 3.9. 확인

 

 

 

1. MYSQL 서비스 구축 : PC1

 1.1. 설치 : dnf install -y mysql

 1.2. docker mysql 이미지 가져오기 : docker pull mysql  

 1.3. docker mysql 볼륨 만들기 : docker volume create mysql

 1.4. mysql 컨테이너 실행 : docker run [run 옵션] -v [볼륨 명]:[마운트하고자 하는 컨테이너 디렉토리] -e [mysql 비밀번호 환경 변수]  --name [컨테이너 명] mysql:5.7

  ex) docker run -itd -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=It12345! --name m1 mysql:5.7

 1.5. mysql 데이터베이스 만들기

   step1) 접속 : mysql -uroot -p[root 비밀번호] -h [mysql 서버 ip 주소]

    ex) mysql -uroot -pIt12345! -h 172.17.0.2

   step2) 데이터베이스 만들기 : create database word;

   step3) 나가기 : exit

 1.6. 방화벽 설정 :  firewall-cmd --add-port=3306/tcp

 

2. WORDPRESS 서비스 구축 : PC2

 2.1. wordpress 이미지 가져오기 : docker pull wordpress

 2.2. wordpress 컨테이너 실행 : docker run [run 옵션] -e WORDPRESS_DB_HOST=[mysql 서버 ip 주소] -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=[mysql root 계정 비밀번호] -e WORDPRESS_DB_NAME=[mysql 데이터베이스 명] --net host --name [컨테이너 명] wordpress:5.8

  ex) docker run -itd -e WORDPRESS_DB_HOST=172.16.0.22 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=It12345! -e WORDPRESS_DB_NAME=word --net host --name w1 wordpress:5.8

 2.3. 방화벽 설정 : firewall-cmd --add-port=80/tcp

 

3. 연동 확인 : PC2 IP 주소 URL 입력 

1. HTTPD 웹 서비스 구축 : PC1

  1.1. HTTPD 이미지 가져오기 : docker pull httpd

  1.2. HTTPD 컨테이너 실행 : docker run [실행 옵션] --name [컨테이너 명] -p [호스트 포트 번호:컨테이너 포트 번호]/tcp httpd

   ex) docker run -itd --name h1 -p 60001:80/tcp httpd

  1.3. HTML 파일 만들기

   step1) 열기 : vi index.html 

   step2) 코드 예시 

<html>
<body>
<h1>DOCKER-WEB-HTTPD</h1>
</body>
</html>       

 

   step3) 저장   

  1.4. HTML 파일 로컬에서 컨테이너로 보내기 : docker cp index.html [컨테이너명]:[컨테이너 html 디렉토리]

   ex) docker cp index.html h1:/usr/local/apache2/htdocs/

 

2. NGINX 웹 서비스 구축 : PC2

  2.1. NGINX 이미지 가져오기 : docker pull nginx

  2.2. NGINX 컨테이너 실행 : docker run [실행 옵션] --name [컨테이너 명] -p [호스트 포트 번호:컨테이너 포트 번호]/tcp nginx

   ex) docker run -itd --name n1 -p 60001:80/tcp nginx

  2.3. HTML 파일 만들기

   step1) 열기 : vi index.html 

   step2) 코드 예시 

<html>
<body>
<h1>DOCKER-WEB-NGINX</h1>
</body>
</html>       

 

   step3) 저장   

  2.4. HTML 파일 로컬에서 컨테이너로 보내기 : docker cp index.html [컨테이너명]:[컨테이너 html 디렉토리]

   ex) docker cp index.html n1:/usr/share/nginx/html/

 

3. HAPROXY 로드밸런서 구축 : PC3

  3.1. HAPROXY 설치 : dnf install -y haproxy

  3.2. HAPROXY 설정 

   step1) 열기 : vi /etc/haproxy/haproxy.cfg 

   step2) 웹 서버 IP주소, 포트 번호 입력 

 

   step3) 저장 

 

  3.3. HAPROXY 구동 (부팅시에도) : systemctl enable --now haproxy

  3.4. 방화벽 설정 : firewall-cmd --add-port=80/tcp

 

 

 

 

 

1. docker 설치 

 1.1. docker 엔진 설치 

  step1) dnf 플러그인 설치 : dnf -y install dnf-plugins-core

  step2) 레포지토리 추가 : dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  step3) docker 엔진 설치 : dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 1.2. docker 서비스 구동 (부팅시에도) : systemctl enable --now docker

 1.3. 로그인 : docker login -u [아이디]

 

2. docker 활용 

 2.1. 이미지 다운로드 : docker pull [이미지 명(레포지토리)]

 2.2. 다운받은 이미지 확인 : docker images

 2.3. 이미지 실행 : docker run -itd -p [포트번호] --name [컨테이너 명] [이미지 명(레포지토리)]

    * ex) docker run -itd -p 65080:80 --name h1 httpd

    * 이름을 정해주지 않으면 자동으로 생성되기 때문에 정해주는 것이 좋음

 2.4. 컨테이너 실행 상태 확인 : docker ps 
 2.5. 로컬 파일을 컨테이너로 복사 : docker cp [로컬 파일] [컨테이너 명:컨테이너 디렉토리]
    * ex) docker cp index.html h1:/usr/local/apache2/htdocs
 2.6. 컨테이너 상태를 이미지로 저장 : docker commit [컨테이너 명] [저장할 이미지 명]

    * ex) docker commit h1 httpd:1.0
 2.7. 이미지 ID로 이미지 삭제 :  docker rmi [이미지 ID]

    * ex) docker rmi 2582cc6739c6

 2.8. 이미지 파일들 하나의 아카이브 파일로 저장 : docker save -o [아카이브 파일명.tar] [이미지 파일명] [이미지 파일명] ...

    * ex) docker save -o test.tar httpd:1.0 alpine:latest
 2.9. 컨테이너를 아카이브 파일로 저장 : docker export -o [아카이브 파일명.tar] [컨테이너 명]

    * ex) docker export -o test1.tar a1

    * export는 환경 변수가 초기화 되므로, 컨테이너를 이미지 파일로 저장하고 save 해서 파일 이동하는 것을 권장 

 2.10. 아카이브 파일을 이미지 파일로 저장 : docker import [아카이브 파일명] [저장하고자 하는 이미지 명]
    * ex) docker import test1.tar alpine:1.0
 

+ Recent posts