객체 지향 프로그래밍(OOP)과 객체 지향 프로그래밍 설계의 5가지 원칙 SOLID에 대해 알아보자
Docker #1 Docker로 Ubuntu, Apache, Php 환경의 이미지 만들기
2019-08-01
Explanation
오랜만에 포스팅이네요. 요즘 회사 일이 바빠서…(는 핑계)
사실은 약간의 슬럼프??가 오려고 해서 6월, 7월은 일부러 좀 휴식의 시간을 보냈어요. 이제 다시 포스팅도 열심히 하고 소소히 프로젝트도 많이 할 예정이랍니다.
오늘은 Docker로 Ubuntu – Apache – PHP 환경의 이미지를 만들어보는 과정을 정리해 보려고 합니다.
그리고 예정된 다음 글은 Docker로 만든 이미지를 AWS(아마존 웹 서비스)의 ECR에 업로드하고 EC2에서 만든 이미지를 PULL 받아 적용하는? 글을 작성해보려 합니다.
우선 간단하게 Ubuntu v18.04을 OS로 Apache2를 웹서버로 설치하는 Dockerfile 을 만듭니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Dockerfile FROM ubuntu:18.04 MAINTAINER falsy <me@falsy.me> RUN apt install apache2 -y ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_PID_FILE /var/run/apache2/apache2.pid EXPOSE 80 CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] |
간단히 살펴보면,
FROM 은 어떤 이미지를 기반으로 할지,
RUN 은 명령어를 실행하고 여기에서 -y는 apt install 설치 과정에서 yes 입력을 설정해주는 것 입니다.
ENV 는 환경 변수 선언입니다.
이제 도커로 좀전에 만든 Dockerfile의 이미지를 만들건데요.
터미널을 열고 Dockerfile 파일의 디렉토리로 이동한 후 Docker에 로그인 한 후 빌드합니다.
1 2 |
$ docker login $ docker build -t falsy-ubuntu . |
-t 는 tag 의 줄임 옵션이으로 falsy-ubuntu 라는 태그로 이미지를 빌드합니다. 그리고 마지막에 . 은 오타가 아니고 Dockerfile 파일이 있는 디렉토리 경로랍니다.
이제 이미지를 구동? 합니다.
1 |
$ docker run -d -p 80:80 falsy-ubuntu |
-p 는 포트를 나타내고요 앞에 80은 외부에서 접근하는 포트번호 뒤에 80은 내부로 연결하는 포트번호입니다.
Ubuntu 서버가 잘 돌아가고 있는지 확인합니다.
1 |
$ docker container ls |
위 명령어로 돌아가고 있는 컨테이너의 ID 값을 기억합니다. 글에서는 ‘1a2b3c..’ 라고 가정할게요.
그리고 exec 모드로 방금 실행한 ‘1a2b3c’ 컨테이너로 접속합니다.
1 |
$ docker exec -it 1a2b3c /bin/bash |
이제 Docker로 만든 Ubuntu 이미지에 접속해서 필요한 패키지들을 설치해볼게요.
Php를 설치할건데 최신 버전인 7.3 버전을 설치해보려 합니다.
글 작성의 편의를 위해 슈퍼 유저 권한으로 작성할게요.
1 |
$ sudo su |
$ apt install php7.3
이렇게 설치하면 될 거 같지만 어드밴스 패키징 툴(APT)로는 최신의 버전의 PHP를 설치 할 수 없기 떄문에,
PPA(Personal Package Archive)를 통해 설치해줘야 합니다.
1 |
$ add-apt-repository ppa:ondrej/php |
이렇게 하면 된다는데, 안되길래 알아보니
1 |
$ apt install software-properties-common |
‘software-properties-common’ 요놈을 먼저 설치해야 ‘add-apt-repository’ 요놈을 사용할 수 있다고 하네요.
참고. https://askubuntu.com/questions/1120716/how-can-i-see-if-i-have-software-properties-common-installed
여기서 잠시, 예전 글들은 패키지를 설치할때 apt-get 커맨드를 많이 사용하는데요, 요즘 글들을 보면 대부분 apt를 사용하더라고요.
그래서 짧게 알아보니 대충 apt 커맨드는 apt-get과 apt-cache를 함께 쓰기 위한 커맨드라고 하네요.
참고. https://jhhwang4195.tistory.com/69
software-properties-common 를 설치했다면 다시 ppa에 ondrej 저장소의 php를 설치합니다.
1 2 3 |
$ add-apt-repository ppa:ondrej/php $ apt update # 업데이트도 해줌니다. |
이제 필요한 패키지들을 쭉쭉 설치해볼까요
1 2 3 4 5 6 7 8 9 |
#php 7.3 코어 설치 $ apt install php7.3 php7.3-common php7.3-cli # 보편적으로 많이 사용하는 패키지들 설치 $ apt install php7.3-bcmath php7.3-bz2 php7.3-curl php7.3-gd php7.3-intl php7.3-json php7.3-mbstring php7.3-readline php7.3-xml php7.3-zip # 아파치와 연동?? $ apt install libapache2-mod-php7.3 # 편리한 편집을 위해 vim도 설치해 줍니다. $ apt install vim |
이제 설치가 끝났으면 잘 설치가 되었는지 버전을 확인해 봅니다.
1 |
$ php -v |
이제 아파치 서버를 통해서 php 파일을 잘 해석하는지 해볼까요?
1 2 3 4 5 6 |
$ cd /home # home 디렉토리로 이동해서 $ mkdir falsylab # falsylab 이라는 디렉토리를 만들고 $ vi index.php # index.php 라는 파일을 만들어볼게요. |
1 2 |
# index.php <?php echo 'hello world'; ?> |
다음으로 아파치의 가상호스트 설정을 해줍니다.
1 2 |
#falsylab.conf 라는 설정파일 추가해줍니다. $ vi /etc/apache2/sites-available/falsylab.conf |
1 2 3 4 5 6 7 8 9 10 11 |
# falsylab.conf <VirtualHost *:80> ServerName localhost DocumentRoot /home/falsylab <Directory /home/falsylab > Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost> |
간략하게 이야기하면 80번 포트로 들어오는 localhost의 접근을 /home/falsylab 디렉토리로 향하게하고
/home/falsylab 디렉토리의 접근 권한을 열어 준 설정입니다.
다음으로 심볼 링크를 만들어 줍니다
1 |
$ ln -s /etc/apache2/sites-available/falsylab.conf /etc/apache2/sites-enabled/ |
이제 어느 정도 설정이 끝났으니 아파치를 재시작하고 접속해보면 되겠죠?
1 |
$ service apache2 restart |
두둥.. 하지만 이렇게 하면 도커의 컨테이너가 종료됩니다…
하지만 당황하지 않고,
우리는 된다는 믿음으로.
본격적으로 방금 설치하고 설정했던 순서대로 Dockerfile을 수정해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# Dockerfile FROM ubuntu:18.04 MAINTAINER falsy <me@falsy.me> RUN apt update RUN apt install apache2 -y ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_PID_FILE /var/run/apache2/apache2.pid RUN apt install software-properties-common -y RUN add-apt-repository ppa:ondrej/php RUN apt update RUN apt install php7.3 php7.3-common php7.3-cli -y RUN apt install php7.3-bcmath php7.3-bz2 php7.3-curl php7.3-gd php7.3-intl php7.3-json php7.3-mbstring php7.3-readline php7.3-xml php7.3-zip -y RUN apt install libapache2-mod-php7.3 COPY ./test/index.php /home/visual/index.php COPY ./test/visual.conf /etc/apache2/sites-available/visual.conf RUN ln -s /etc/apache2/sites-available/visual.conf /etc/apache2/sites-enabled/ EXPOSE 80 CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] |
아까 우분투에서 입력했던 순서대로 쭈루룩 적은거에요. 약간 추가된 부분은
1 2 3 |
# Dockerfile COPY ./test/index.php /home/visual/index.php COPY ./test/visual.conf /etc/apache2/sites-available/visual.conf |
vim으로 작성했던 부분을 저는 Dockerfile 파일이 있는 디렉토리에 test라는 디렉토리 안에 미리 만들어 놓고 docker로 만들 이미지에 카피하도록 하였습니다.
이제 다시 빌드하고 배포를 하면!
1 |
$ docker build -t falsy-ubuntu . |
끝 일 줄 알았지만, 역시 세상일이 생각처럼 되지 않습니다.
php를 설치하는 과정에서 타임존을 설정해야 하는데 이부분은 -y 같은 옵션으로는 넘길 수 없답니다.
그리고 이러한 당혹스러운 문제는 우리 스텍오버플로 형, 누나들에게 물어보면 됩니다.
참고. https://askubuntu.com/questions/909277/avoiding-user-interaction-with-tzdata-when-installing-certbot-in-a-docker-contai
스택오버플로 형, 누나들은 모르는게 없습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# Dockerfile FROM ubuntu:18.04 MAINTAINER falsy <me@falsy.me> # 업데이트 RUN apt update # 아파치 설치 RUN apt install apache2 -y ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_PID_FILE /var/run/apache2/apache2.pid # 최신 버전의 패키지 설치를 위한 패키지 설치 RUN apt install software-properties-common -y # PPA-php 설치 (php 7.3 버전 사용을 위해) RUN add-apt-repository ppa:ondrej/php # 업데이트 RUN apt update # 아래의 설정으로 타임존 설정을 유예하는 것이기 때문에 차후에 따로 설정을 해주어야 합니다. ENV DEBIAN_FRONTEND=noninteractive # php 코어 설치 RUN apt install php7.3 php7.3-common php7.3-cli -y # php 보편적 모듈 설치 RUN apt install php7.3-bcmath php7.3-bz2 php7.3-curl php7.3-gd php7.3-intl php7.3-json php7.3-mbstring php7.3-readline php7.3-xml php7.3-zip -y # php와 웹 서버(apache2)와 연결 RUN apt install libapache2-mod-php7.3 # 이미지에 소스 코드 카피 COPY ./test/index.php /home/visual/index.php # 가상 호스트 설정 이미지에 카피 COPY ./test/visual.conf /etc/apache2/sites-available/visual.conf # 카피한 가상 호스트 설정 파일 심볼 링크 설정 RUN ln -s /etc/apache2/sites-available/visual.conf /etc/apache2/sites-enabled/ EXPOSE 80 CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] |
이제 다시 이미지를 빌드하고
1 |
$ docker build -t falsy-ubuntu . |
80번 포트로 컨테이너를 만들고
1 |
$ docker run -d -p 80:80 falsy-ubuntu |
웹 브라우저를 열고 localhost 에 접속하면 ‘hello world’가 뜨는 것을 확인할 수 있습니다!