이제 우리가 해야 할 일은 지금까지 Bash에 입력했던 명령들을 Dockerfile 지시어와 함께 보기 좋게 정리해 주는 일이다. Dockerfile 지시어들은 Shell Script 언어와 조합하여 사용할 수 있다. 프로젝트의 요구 사항에 맞게, 실행 커맨드 이외의 독립 파일들은 /srcs 내에 넣어 두고, 이를 Dockerfile 커맨드에서 COPY 명령어로 복사해서 끌어올 수 있다. 이제 Dockerfile을 작성해 보자.
FROM
지시어를 사용해서 어떤 이미지를 기반으로 새로운 이미지를 생성할 것인지를 나타낸다.ft_server 루트 디렉토리 내에 Dockerfile 을 생성한다.
touch Dockerfile
Dockerfile에 아래 커맨드 작성.
FROM debian:buster
Dockerfile에 아래 커맨드 이어서 작성.
RUN apt-get update
RUN apt-get install -y wget nginx php-fpm php-mysql php-mysqlnd php-mbstring mariadb-server mariadb-client
wget, nginx, php-fpm, php-mysql, mariadb-server, mariadb-client 모듈은 이전 포스팅에서 설명했으니 넘어간다. php-mysqlnd은 MySQL Native Driver의 약자로 libmysqlclient (MySQL Qlient Library)의 대체 라이브러리이다. 이를 사용하면 libmysqlclient 대신 네이티브 드라이버를 사용하도록 데이터베이스 확장을 컴파일 할 수 있다. php-mbstring 모듈은 multi-byte 문자열 함수를 지원하기 위해 쓰인다.
config.inc.php 파일, default 파일 (nginx config), wp-config.php 파일을 미리 작성해 /srcs 내에 옮겨둔다. 작성법에 대해서는 이전 포스팅에서 다루었으니 생략.
COPY ./srcs/default ./etc/nginx/sites-available/default
RUN openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -subj "/C=KR/ST=Seoul/L=Seongbuk-gu/O=42/OU=Student/CN=ckang" -keyout /etc/ssl/private/localhost.key -out /etc/ssl/certs/localhost.crt
WORKDIR /var/www/html
RUN mkdir phpmyadmin
RUN wget https://files.phpmyadmin.net/phpMyAdmin/4.9.5/phpMyAdmin-4.9.5-all-languages.tar.gz
RUN tar -xvf phpMyAdmin-4.9.5-all-languages.tar.gz --strip-components=1 -C ./phpmyadmin && rm -rf phpMyAdmin-4.9.5-all-languages.tar.gz
COPY ./srcs/config.inc.php ./phpmyadmin
이전 포스팅에서 localhost 80번 포트로 이동했을 때, autoindexing list에서 phpMyAdmin-5.0.2-all-languages.tar.gz 파일이 떠 있었던 이유는, 위에서 보이듯 rm -rf phpMyAdmin-5.0.1.english.tar.gz
에 해당하는 파일 삭제 명령을 해 주지 않았기 때문이었던 것 같다.
RUN wget https://wordpress.org/latest.tar.gz
RUN tar -xvf latest.tar.gz && rm -rf latest.tar.gz
COPY ./srcs/wp-config.php ./wordpress
RUN chown -R www-data:www-data /var/www/* && chmod -R 755 /var/www/*
CMD service mysql start;\
service php7.3-fpm start;\
echo "CREATE USER 'ckang'@'%' identified by '';" | mysql -u root --skip-password;\
echo "CREATE DATABASE my_server;" | mysql -u root --skip-password;\
echo "GRANT ALL PRIVILEGES ON *.* TO 'ckang'@'%';" | mysql -u root --skip-password ;\
echo "FLUSH PRIVILEGES;" | mysql -u root --skip-password;\
service nginx start;\
sleep inf
맨 첫 포스팅에서 알아본 바와 같이 CMD 커맨드는 RUN 커맨드와 비슷한 듯 다르다. RUN, CMD, ENTRYPOINT의 차이점을 잘 알아두자.
1) RUN
- 새로운 layer를 생성하거나, 생성된 layer 위에서 command를 실행.
- package를 설치하는 명령어를 주로 사용
2) CMD
- docker가 실행될때 실행되는 명령어 정의
- 만약 docker run 으로 실행될 때 사용자가 직접 실행할 명령어를 입력시
CMD의 명령어는 실행되지 않는다.
ex)
docker run <image_name> echo world
"world" 가 출력됨.
Dockerfile에 있는 CMD는 실행되지 않음
3) ENTRYPOINT
- docker run으로 생성하거나,
docker start로 중지된 container를 시작할 때 실행되는 명령어
(CMD와 동일한 역할)- Dockerfile 내에서 1번만 정의 가능함.
- CMD와 다른 점으로
docker run으로 실행시 command를 입력하면,
ENTRYPOINT의 파라미터로 인식한다.
ex)
docker run <image_name> echo world
"echo world"를 파라미터로 인식함
여기까지 하면 Dockerfile 작성이 완료되었다.
이후 프로젝트 폴더에서,
docker build -t ft_server .
을 입력해서 현재 폴더의 Dockerfile 내용을 ft_server라는 이름으로 빌드한다. 이후 빌드가 완료되면,
docker run -it -p 80:80 -p 443:443 ft_server
을 입력해서 빌드된 컨테이너를 실행해 본다. 첫 화면에 autoindex 기능을 통해 디렉토리 리스팅이 제대로 되는지 확인해 보고, https://localhost 로 접속하여 SSL을 확인하고, phpmyadmin으로 비밀번호 없이 유저 권한 로그인을 해 보고, wordpress 블로그가 실행이 잘 되는지도 확인해 본다.
다 잘 되면 끝이다!