관련 자료
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 조회 테스트를 진행한다.
'Docker' 카테고리의 다른 글
Docker 컨테이너에 자원 할당 및 관리 (0) | 2021.07.08 |
---|---|
Docker 네트워크 설정 및 link 기능 (1) | 2021.07.08 |
Docker 이미지 생성 및 Save&Load 와 Export&Import (0) | 2021.07.07 |
Docker Volume 공유 사용하기 (0) | 2021.07.07 |
Docker 명령어 실습 (3) (0) | 2021.07.07 |