[Docker] Dockerfile을 이용하여 apache, ftp 적용 로컬 환경 만들기

프론트앤드 개발을 하다보면은 현제 작업했던 결과를 로컬에서 구동해서 동료들과 공유를 해야 할때가 있습니다.

동료들과는 내부망이니 바로 구동한 다음 그 아이피를 알려줘서 보여줘도 되겠지만 그렇게 하면 내가 추가로 개발을 하면 내 로컬에 붙어서 확인하는 사람들의 환경이 변경이 되어서 불편함을 경험 했었습니다.

내가 개발하는 환경과 달리 공유용 환경을 만들면 이런 상황을 피할수 있어서 유용하고 실제 서버에 배포하는 환경과 비슷하여 배포문제를 파악할때도 도움이 된적이 있습니다.

이 글에서는 도커로 아파치서버를 구축하고 거기서 ftp서버를 구축하여 동료들도 내가 구축한 환경에 배포를 해서 확인해 볼수 있는 환경을 구성하는 방법을 공유하고자 합니다.

전체구성

전체 구성은 위와 같습니다.htmlfiles: 배포하고자 하는 프론트앤드 소스를 빌드해서 배포하는 곳

sites: 아파치에여러 사이트들을 배포 할수 있는데 그런 사이트의 설정파일 위치이다. 프로젝트별 설정파일이라고 보면된다.

Dockerfile: 도커 이미지를 빌드 하기 위한 파일

httpd.conf: 아파치 설정파일(공유하는 파일 그대로 사용하면 된다)

vsftpd.conf: ftp설정파일docker-run.text: 이미지 빌드 및 인스턴스 생성 코드

 

Dockerfile

먼저 도커 이미지를 만드는 Dockerfile부터 살펴보자

FROM httpd:latest

LABEL author="junseongday@gamil.com"

COPY httpd.conf /usr/local/apache2/conf/httpd.conf

RUN mkdir -p /usr/local/apache2/conf/sites/
RUN apt-get update -y
RUN apt-get install vim -y
RUN apt-get install vsftpd -y
COPY vsftpd.conf /etc/vsftpd.conf
RUN chmod -R 777 htdocs

RUN adduser --disabled-password --gecos "" testuser && echo "testuser:1234" | chpasswd

RUN echo '#!/bin/bash' > /usr/local/bin/start.sh
RUN echo 'service vsftpd start &' >> /usr/local/bin/start.sh
RUN echo 'httpd -D FOREGROUND' >> /usr/local/bin/start.sh
RUN chmod +x /usr/local/bin/start.sh


EXPOSE 80
EXPOSE 21
EXPOSE 30001

CMD ["/usr/local/bin/start.sh"]

 

EXPOSE 80 EXPOSE 21 EXPOSE 30001 CMD [“/usr/local/bin/start.sh”]

위에서 부터 보면 아파치 최신 이미지를 불러와서 author를 표현하였다. 위의 주소는 실제 내 이메일 주소이다.

COPY 명령어로 호스트의 설정파일을 인스턴스 내의

/usr/local/apache2/conf/httpd.conf

위치로 복사한다. 그리고 아래의 명령어처럼 sites폴더를 만들고 vsftpd, vim 설치하고 vsftpd 설정파일을 복사한다. htdocs 위치가 루트 폴더로 설정했는데 다른 사람들도 배포할수 있도록 권한을 준다.

RUN adduser –disabled-password –gecos “” testuser && echo “testuser:1234” | chpasswd

ftp를 사용할 유저의 계정을 만든다. 아이디는 testuser이고 비밀번호는 1234 설정하였다.

RUN echo ‘#!/bin/bash’ > /usr/local/bin/start.sh

RUN echo ‘service vsftpd start &’ >> /usr/local/bin/start.sh

RUN echo ‘httpd -D FOREGROUND’ >> /usr/local/bin/start.sh

RUN chmod +x /usr/local/bin/start.sh

CMD [“/usr/local/bin/start.sh”]

위의 코드는 인스턴스가 멈춘다음에 다시 구동될때 vsftpd, httpd를 다시 시작하도록하는 코드이다. 

EXPOSE 80

EXPOSE 21

EXPOSE 30001

일종의 주석 같은 기능이다 실제 기능은 하지 않으나 위의 포트를 사용하겠다고 다른 개발자 혹은 나에게 명시하는 기능이다. 실제 이러한 포트들은 *.conf 파일들을 보면 설정해 놓은것을 알수 있다.

이제 이 도커 파일로 이미지를 만들고 컨테이너를 만들면 끝이다. 하지만 설정파일들중에서 사용자별 설정이 달라지는 부분이 몇 있어 그부분을 설명하겠다.

vsftpd.conf

vsftpd.conf의 맨 아래를 보면

#패시브모드로 연결될 ip(포트제외 서버ip만 적어주세요)

pasv_address=[yourip]

 이부분에 호스트의 ip를 적어주어야 한다. 

터미널에서 현제 폴더가 위치한 곳으로 이동한후 docker build -t apache-ftp . 이 명령어로 이미지를 만든다. 현제 폴더의 위치한 파일을 apache-ftp라는 이미지로 만들겠다는 의미이다.

그런다음 그 이미지로 인스턴를 만들면 된다. 사용자는 90 포트로 웹서버를 접근하며 5001으로 ftp를 접근할수 있다. 3001은 ftp의 데이터 전송 포트이다. 그리고 아래의 볼륨은 호스트의 파일을 인스턴스의 파일과 연결시켜 운영의 편리함을 주려고 사용하였다.

.conf

마지막으로 devopsjunction.conf에서 프록시 서버 설정할수 있습니다. 

<Location "/sample">
    ProxyPass "https://jsonplaceholder.typicode.com"
    ProxyPassReverse "https://jsonplaceholder.typicode.com"
</Location>

위와 같이 특정 경로를 적고 뒤에 연결되는 백앤드 서버를 적어주면 된다. 그리고 이러한 설정을 하면 아파치를 다시 시작해 줘야 한다.

그러기 위해서는 도커 인스턴스에 들어가서 아파치를 재시작 해주는 방법을 알아야한다.

docker exec -it apache bash

위의 명령어로 인서턴스에 접속하고

bin/apachectl restart

위의 명령어로 아파치를 재시작하면 적용된것을 알수 있다. 

docker-run.text

이제 실제로 도커이미지를 빌드하고 컨테이너를 뛰우는 방법을 살펴보겠습니다.

터미널에서 현제 프로젝트가 있는 위치로 이동합니다.

ls 혹은 dir을 했을때 해당 파일들이 보이는 위치로 이동했다면 공유해드린 텍스트에서 

docker build -t apache-ftp .


docker run -p 90:80 -p 50001:21 -p 30001:30001 -d --name apache \
-v /Users/apache/httpd.conf:/usr/local/apache2/conf/httpd.conf \
-v /Users/apache/htmlfiles:/usr/local/apache2/htdocs \ 
-v /Users/apache/sites:/usr/local/apache2/conf/sites apache-ftp

Users/apache 이부분을 현제 소스가 위치한 경로로 리플레이스하고 실행시키면 컨테이너가 구동됩니다.

결과

위에서 -v속성으로 htmlfiles폴더를 컨테이너 내부에 htdocs에 연결해 두었습니다

그래서 해당 폴더에 빌드된 소스를 올려 놓으면 배포가 됩니다.

 

이런식으로 빌드된 프론트앤드 소스들을 이곳에 복사 붙여넣기를 하여서 로컬에서 올려놓고 확인이 가능합니다.

마지막으로 ftp로 컨테이너에 붙은 화면을 확인해보겠습니다.

컨테이너 내부에서 /usr/local/apache2 폴더 아래가 우리가 보아야 할 폴더들이 위치해 있습니다. 볼륨으로 연결해 놓았던

httpd.conf,  htdocs, sites 폴더들이 보이고 있습니다. 

위의 소스는 https://github.com/junseongday/Docker-Httpd-Vsftpd 여기에 올려 놓았습니다.


참고 자료

https://www.middlewareinventory.com/blog/docker-reverse-proxy-example/

Leave A Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다