Docker

Dockerfile 작성(Web, FTP, DNS 구축)

Joon0464 2021. 7. 8. 18:47

관련 자료

https://github.com/thdguswns3/Dockerfile

- 직접 작성한 DockerFile 및 설정 압축 파일 -

전 설정

# docker network create --subnet 192.168.0.0/24 --gateway 192.168.0.254	web
  • 사용할 네트워크를 미리 생성해둔다.

1. Web 서버 Dockerfile 작성

# mkdir proweb
# cd proweb
  • Dockerfile 및 관련 설정 파일을 생성할 디렉터리를 생성하고 경로를 이동한다.
# vi Dockerfile

FROM		centos:7

MAINTAINER	shjoon

RUN		yum install -y httpd
RUN		yum install -y net-tools
RUN		systemctl enable httpd

COPY		index.html /var/www/html/

ENTRYPOINT	/usr/sbin/httpd -D FOREGROUND

EXPOSE		80
  • RUN을 사용하여 컨테이너가 생성되고 실행시킬 명령어를 지정할 수 있다. 여기서는 httpd 패키지와 net-tools 설치 및 systemctl 등록 설정
  • COPY 명령어를 사용하여 미리 생성한 index.html 파일을 컨테이너 내부의 /var/www/html 경로로 복사하여 웹을 서비스하도록 설정
  • ENTRYPOINT는 컨테이너가 실행되면서 실행시킬 대몬을 설정한다. 해당 값은 실제 호스트 pc에 httpd 패키지를 설치 후 ps -ef 명령어를 통해 확인할 수 있다.
  • EXPOSE는 포트 내보내기 옵션으로 컨테이너가 서비스할 포트번호를 적어준다. WEB 서버이기 때문에 80번 포트를 열어준다.
# vi index.html

<html>
<body>
<h1>Docker-Build-Web</h1>
<p1> My First Build Docker</p1>
</body>
</html>
  • index.html은 원하는대로 작성한다.
# docker build -t proweb:1.0 .
  • Dockerfile을 빌드하는 명령어이다.
  • proweb:1.0은 Dockerfile 빌드로 생성 될 이름 및 태그를 지정하는 부분이다.
  • 명령어 가장 마지막에 존재하는 . 은 현재 경로의 Dockerfile을 실행하기 위해 반드시 적어야한다.
# docker run -itd --net web --ip 192.168.0.1 -p 80:80 --name w1 proweb:1.0
  • Dockerfile로 생성된 이미지 실행

실행한 이미지가 정상적으로 동작하는 모습
위와 같이 접속되면 정상적으로 테스트 된 것이다.

  • 추가적으로 httpd.conf를 미리 작성하여 COPY를 Dockerfile에 작성하는 방식으로 웹 서버 상세설정도 가능하다.

 

2. FTP 서버 Dockerfile 작성

# mkdir proftp
# cd proftp
  • Dockerfile 및 관련 설정 파일을 생성할 디렉터리를 생성하고 경로를 이동한다.
# vi Dockerfile

FROM	centos:7

MAINTAINER shjoon

RUN	yum -y install vsftpd
RUN	mkdir /test
RUN	sh /test/user.sh

COPY	user.sh /test/user.sh
COPY	ftp.txt /test/ftp.txt
COPY	vsftpd.conf /etc/vsftpd/vsftpd.conf
COPY	chroot_list /etc/vsftpd/chroot_list

EXPOSE	21	50000-50010

CMD	["/usr/sbin/vsftpd","-obackground=NO"]
  • RUN을 사용하여 vsfptd 패키지와 설치 및 설정 파일을 넣어줄 /test 디렉터리를 생성하고 쉘 스크립트 파일이 실행되도록 설정한다.
  • COPY 명령어를 사용하여 미리 설정한 파일 및 실행될 쉘 스크립트 파일을 컨테이너의 각 경로에 복사하도록 설정
  • CMD는 컨테이너가 실행되면서 실행시킬 대몬을 설정하는 값이지만 ENTRYPOINT보다 우선되지는 않는다.
  • 즉 CMD 부분은 ENTRYPOINT로 바꿔주어도 현재 설정에서는 무관하며 위와 같이 vsftpd에 맞는 값을 찾아 넣는다.
  • EXPOSE는 vsftpd가 서비스할 21번 포트를 열어주고 패시브모드로 서비스 할 것이기 때문에 vsftpd.conf에 설정할 패시브 모드 포트도 값을 넣어준다.
# vi user.sh

useradd a
echo 'P@ssw0rd'|passwd --stdin a
useradd b
echo 'P@ssw0rd'|passwd --stdin b
  • 쉘 스크립트를 작성하여 해당 쉘 스크립트 작성시 a,b 사용자가 생성되고 비밀번호를 P@ssw0rd로 설정하도록 작성한다.
# vi 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
banner_file=/test/ftp.txt
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50010
  • anonymous_enable=NO: 익명 사용자 허용하지 않음
  • local_enable=YES: 로컬 계정 접속 허용
  • write_enable=YES: 쓰기 작업 허용
  • local_umask=022: 로컬 계정이 쓰기 잡업할 때 UMASK값
  • dirmessage_enable=YES: 사용자가 경로를 변경할 때 개별 디렉토리의 메시지를 보여주도록 설정
  • xferlog_enable=YES: 로그 기록 허용
  • xferlog_file=/var/log/xferlog: 로그 파일 위치 지정
  • xferlog_std_format=YES: 로그 파일을 스탠다드 포멧으로 사용
  • banner_file=/test/ftp.txt: ftp.txt 파일에 적힌 내용을 배너로 사용
  • chroot_list_enable=YES: chroot를 사용하여 사용자가 사용자 홈 디렉터리를 못 벗어나게 설정
  • chroot_list_file=/etc/vsftpd/chroot_list: chroot를 적용할 사용자 계정이 적힌 파일 경로 설정
  • allow_writeable_chroot=YES: chroot를 적용하기 위해 반드시 필요한 설정
  • listen=YES: standalone으로 vsftpd 데몬을 실행하기 위해 yes로 설정 
  • pam_service_name=vsftpd: vsftpd에서 PAM설정파일명으로 사용할 파일명을 지정
  • userlist_enable=YES: 명시된 사용자만 로그인을 허용하도록 설정
  • tcp_wrappers=YES: /etc/hosts.allow와 /etc/hosts.deny를 사용하도록 설정
  • pasv_enable=YES: 패시브 모드로 사용하도록 설정
  • pasv_min_port=50000: 패시브 모드 포트 최소값 설정
  • pasv_max_port=50010: 패시브 모드 포트 최대값 설정
# vi ftp.txt

++++++++++++++++++++++
       WARNING
VSFTPD WITH DOCKERFILE
++++++++++++++++++++++
  • 배너는 원하는 대로 작성한다.
# vi chroot_list

a
  • chroot를 적용할 사용자를 적는다.
# docker build -t proftp:1.0 .
# docker run -itd --net web --ip 192.168.0.2 -p 21:21 --name f1 proftp:1.0
  • DockerFile 빌드 및 컨테이너 실행

실행한 이미지가 정상적으로 동작하는 모습

  • 파일질라를 사용하여 FTP 접속 테스트

  • 접속 오류 발생

  • 설정을 최초에 Active 모드로 접속을 시도하고 나면 그 이후에 Passive 모드로 접속이 가능해진다.

패시브모드로 접속된 모습

  • a 계정으로 접속 테스트 결과 chroot가 적용까지 된 것이 확인된다.

 

3. DNS 서버 Dockerfile 작성

# mkdir prodns
# cd prodns
  • Dockerfile 및 관련 설정 파일을 생성할 디렉터리를 생성하고 경로를 이동한다.
# vi Dockerfile

FROM	centos:7

RUN	yum -y install bind bind-utils bind-libs net-tools
RUN	sed -i 's/127.0.0.1/any/' /etc/named.conf
RUN	sed -i 's/localhost/any/' /etc/named.conf
RUN	systemctl enable named

COPY	named.rfc1912.zones /etc/
COPY	shjoon.com.zone	/var/named/
COPY	shjoon.com.rev	/var/named/

RUN	chown .named /var/named/shjoon.com.zone
RUN	chown .named /var/named/shjoon.com.rev

CMD	["/usr/sbin/named", "-c", "/etc/named.conf", "-g", "-u", "named"]

EXPOSE	53/udp
EXPOSE	53/tcp
  • RUN을 사용하여 패키지 설치, 설정파일 수정, 데몬 자동 실행 등록, 권한 그룹 소유자 변경을 작성한다.
  • shjoon.com.zone과 shjoon.com.rev와 같은 레코드 영역 파일은 반드시 named 그룹이 권한을 소유하고 있어야한다.
  • COPY를 이용하여 설정 파일 및 레코드 파일을 복사하도록 설정한다.
  • CMD와 EXPOSE를 DNS 서버 bind 패키지에 맞게 작성한다.
# 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 "shjoon.com" IN {
	type master;
	file "shjoon.com.zone";
	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 "0.0.10.in-addr.arpa" IN {
	type master;
	file "shjoon.com.rev";
	allow-update { none; };
};
  • shjoon.com.zone과 shjoon.com.rev 레코드 영역 파일을 참조하여 DNS를 서비스하도록 설정한다.
# vi shjoon.com.zone

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

# vi shjoon.com.rev

$TTL 3H
@	IN SOA	ns1.shjoon.com. root. (
					0	; serial
					1D	; refresh
					1H	; retry
					1W	; expire
					3H )	; minimum
	NS	ns1.shjoon.com.
11	IN PTR	ns1.shjoon.com.
  • 레코드 영역 파일을 자신의 서비스에 맞게 설정하고 저장한다.
# chmod 644 shjoon.com.zone shjoon.com.rev named.rfc1912.zones
# docker build -t prodns:1.0 .
# docker run -itd --name d1 -p 53:53/tcp -p 53:53/udp --net web --ip 192.168.0.3  prodns:1.0
  • others에 읽기 권한이 있어야 Dockerfile build할 때 파일 복사가 가능하기 때문에 권한을 644를 부여한다.
  • 이전과 똑같이 Dockerfile을 build하고 해당 이미지로 컨테이너를 실행하여 DNS 서비스를 시작한다..

  • 윈도우에서 DNS 주소를 10.0.0.11로 변경하고 nslookup 조회 테스트를 진행한다.