정적 파일 몇 개만 내보내면 되는 용도 — 헬스체크 대상, 설치 파일 배포, 네트워크 시험용 엔드포인트 — 에는 nginx 나 httpd 가 과하다. BusyBox 에 들어 있는 httpd 를 쓰면 이미지가 수 메가바이트에 그친다. 도커 이미지 빌드와 레지스트리 푸시를 익히는 예제로도 적당하다.
mkdir busybox-web && cd busybox-web
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>BusyBox Web Server</title>
</head>
<body>
<h1>BusyBox httpd</h1>
<p>정상 동작 중입니다.</p>
</body>
</html>
FROM busybox:1.37
LABEL maintainer="ops@example.com"
WORKDIR /www
COPY index.html /www/index.html
EXPOSE 8080
CMD ["httpd", "-f", "-v", "-p", "8080", "-h", "/www"]
| 인자 | 뜻 |
|---|---|
-f |
포그라운드로 실행. 컨테이너에서는 필수다 |
-v |
접근 로그를 표준 출력으로 |
-p 8080 |
대기 포트 |
-h /www |
문서 루트 |
-f 를 빼면 httpd 가 백그라운드로 내려가면서 주 프로세스가 곧바로 끝나고 컨테이너가 종료된다. 컨테이너 안의 서비스는 반드시 포그라운드로 돌려야 한다.
태그를 latest 로 고정하지 않는다. 언제 빌드했느냐에 따라 다른 이미지가 되므로 재현이 되지 않는다.
docker build -t busybox-web:1.0 .
docker images | grep busybox-web
docker run -d --name web -p 8080:8080 busybox-web:1.0
curl -i http://localhost:8080
docker logs web
정리한다.
docker stop web
docker rm web
이미지 이름 앞에 레지스트리 주소가 붙어야 그쪽으로 간다. 이미 빌드한 이미지에는 태그를 새로 단다.
docker login harbor.example.com
docker tag busybox-web:1.0 harbor.example.com/library/busybox-web:1.0
docker push harbor.example.com/library/busybox-web:1.0
Docker Hub 라면 계정 이름이 그 자리에 온다.
docker tag busybox-web:1.0 myaccount/busybox-web:1.0
docker push myaccount/busybox-web:1.0
BusyBox httpd 는 CGI 와 기본 인증 정도만 지원한다. TLS, 리버스 프록시, 가상 호스트, 대량 동시 접속은 다루지 못한다. 앞에 nginx 나 Ingress 를 두거나, 그 기능이 필요하면 처음부터 다른 이미지를 쓴다.
BusyBox 이미지에는 셸이 있지만 curl, openssl, ps 의 완전판 같은 도구가 없다. 컨테이너 안에서 진단이 어려우므로 로그를 밖으로 내보내는 설정(-v)이 중요하다.
디렉터리 목록을 보여 주려면 문서 루트에 index.html 이 없어야 하는데, BusyBox httpd 의 자동 목록 기능은 제한적이다. 파일 목록이 필요하면 Apache 로 파일 서버 만들기 를 쓴다.
접근 제어는 -c 로 지정하는 설정 파일에서 한다.
# httpd.conf
A:192.168.0.0/24
D:*
COPY httpd.conf /etc/httpd.conf
CMD ["httpd", "-f", "-v", "-p", "8080", "-h", "/www", "-c", "/etc/httpd.conf"]