Explanation
오랜만에 포스팅이네요. 요즘 회사 일이 바빠서...(는 핑계)
사실은 약간의 슬럼프??가 오려고 해서 6월, 7월은 일부러 좀 휴식의 시간을 보냈어요. 이제 다시 포스팅도 열심히 하고 소소히 프로젝트도 많이 할 예정이랍니다.
오늘은 Docker로 Ubuntu - Apache - PHP 환경의 이미지를 만들어보는 과정을 정리해 보려고 합니다.
그리고 예정된 다음 글은 Docker로 만든 이미지를 AWS(아마존 웹 서비스)의 ECR에 업로드하고 EC2에서 만든 이미지를 PULL 받아 적용하는? 글을 작성해보려 합니다.
1. Dockerfile 만들기
우선 간단하게 Ubuntu v18.04을 OS로 Apache2를 웹서버로 설치하는 Dockerfile 을 만듭니다.
# 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 는 환경 변수 선언입니다.
2. Docker 이미지 만들고 실행하기
이제 도커로 좀전에 만든 Dockerfile의 이미지를 만들건데요.
터미널을 열고 Dockerfile 파일의 디렉토리로 이동한 후 Docker에 로그인 한 후 빌드합니다.
$ docker login
$ docker build -t falsy-ubuntu .
-t 는 tag 의 줄임 옵션이으로 falsy-ubuntu 라는 태그로 이미지를 빌드합니다. 그리고 마지막에 . 은 오타가 아니고 Dockerfile 파일이 있는 디렉토리 경로랍니다.
이제 이미지를 구동? 합니다.
$ docker run -d -p 80:80 falsy-ubuntu
-p 는 포트를 나타내고요 앞에 80은 외부에서 접근하는 포트번호 뒤에 80은 내부로 연결하는 포트번호입니다.
Ubuntu 서버가 잘 돌아가고 있는지 확인합니다.
$ docker container ls
위 명령어로 돌아가고 있는 컨테이너의 ID 값을 기억합니다. 글에서는 '1a2b3c..' 라고 가정할게요.
그리고 exec 모드로 방금 실행한 '1a2b3c' 컨테이너로 접속합니다.
$ docker exec -it 1a2b3c /bin/bash
3. 패키지 설치해보기
이제 Docker로 만든 Ubuntu 이미지에 접속해서 필요한 패키지들을 설치해볼게요.
Php를 설치할건데 최신 버전인 7.3 버전을 설치해보려 합니다.
글 작성의 편의를 위해 슈퍼 유저 권한으로 작성할게요.
$ sudo su
$ apt install php7.3
이렇게 설치하면 될 거 같지만 어드밴스 패키징 툴(APT)로는 최신의 버전의 PHP를 설치 할 수 없기 떄문에,
PPA(Personal Package Archive)를 통해 설치해줘야 합니다.
$ add-apt-repository ppa:ondrej/php
이렇게 하면 된다는데, 안되길래 알아보니
$ 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를 설치합니다.
$ add-apt-repository ppa:ondrej/php
$ apt update
# 업데이트도 해줌니다.
이제 필요한 패키지들을 쭉쭉 설치해볼까요
#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
이제 설치가 끝났으면 잘 설치가 되었는지 버전을 확인해 봅니다.
$ php -v
이제 아파치 서버를 통해서 php 파일을 잘 해석하는지 해볼까요?
$ cd /home
# home 디렉토리로 이동해서
$ mkdir falsylab
# falsylab 이라는 디렉토리를 만들고
$ vi index.php
# index.php 라는 파일을 만들어볼게요.
# index.php
<?php echo 'hello world'; ?>
다음으로 아파치의 가상호스트 설정을 해줍니다.
#falsylab.conf 라는 설정파일 추가해줍니다.
$ vi /etc/apache2/sites-available/falsylab.conf
# 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 디렉토리의 접근 권한을 열어 준 설정입니다.
다음으로 심볼 링크를 만들어 줍니다
$ ln -s /etc/apache2/sites-available/falsylab.conf /etc/apache2/sites-enabled/
이제 어느 정도 설정이 끝났으니 아파치를 재시작하고 접속해보면 되겠죠?
$ service apache2 restart
두둥.. 하지만 이렇게 하면 도커의 컨테이너가 종료됩니다...
하지만 당황하지 않고,
우리는 된다는 믿음으로.
본격적으로 방금 설치하고 설정했던 순서대로 Dockerfile을 수정해줍니다.
4. Dockerfile 수정하기
# 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"]
아까 우분투에서 입력했던 순서대로 쭈루룩 적은거에요. 약간 추가된 부분은
# Dockerfile
COPY ./test/index.php /home/visual/index.php
COPY ./test/visual.conf /etc/apache2/sites-available/visual.conf
vim으로 작성했던 부분을 저는 Dockerfile 파일이 있는 디렉토리에 test라는 디렉토리 안에 미리 만들어 놓고 docker로 만들 이미지에 카피하도록 하였습니다.
이제 다시 빌드하고 배포를 하면!
$ docker build -t falsy-ubuntu .
끝 일 줄 알았지만, 역시 세상일이 생각처럼 되지 않습니다.
php를 설치하는 과정에서 타임존을 설정해야 하는데 이부분은 -y 같은 옵션으로는 넘길 수 없답니다.
그리고 이러한 당혹스러운 문제는 우리 스텍오버플로 형, 누나들에게 물어보면 됩니다.
참고. https://askubuntu.com/questions/909277/avoiding-user-interaction-with-tzdata-when-installing-certbot-in-a-docker-contai
스택오버플로 형, 누나들은 모르는게 없습니다.
# 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"]
이제 다시 이미지를 빌드하고
$ docker build -t falsy-ubuntu .
80번 포트로 컨테이너를 만들고
$ docker run -d -p 80:80 falsy-ubuntu
웹 브라우저를 열고 localhost 에 접속하면 'hello world'가 뜨는 것을 확인할 수 있습니다!



