42 Seoul: ft_server: Dockefile 작성, 컨테이너 빌드, 서비스 실행

Chaewon Kang·2020년 10월 9일
0

42 seoul

목록 보기
5/17
post-custom-banner

Dockerfile 작성

이제 우리가 해야 할 일은 지금까지 Bash에 입력했던 명령들을 Dockerfile 지시어와 함께 보기 좋게 정리해 주는 일이다. Dockerfile 지시어들은 Shell Script 언어와 조합하여 사용할 수 있다. 프로젝트의 요구 사항에 맞게, 실행 커맨드 이외의 독립 파일들은 /srcs 내에 넣어 두고, 이를 Dockerfile 커맨드에서 COPY 명령어로 복사해서 끌어올 수 있다. 이제 Dockerfile을 작성해 보자.

1) Docker Desktop 실행

2) 데비안 운영체제 버스터 버전의 이미지를 가져다가 컨테이너의 운영체제 생성하기. FROM 지시어를 사용해서 어떤 이미지를 기반으로 새로운 이미지를 생성할 것인지를 나타낸다.

ft_server 루트 디렉토리 내에 Dockerfile 을 생성한다.

touch Dockerfile

Dockerfile에 아래 커맨드 작성.

FROM debian:buster

3) atp-get 도구를 최신 버전으로 업데이트 및 업그레이드 하고 -y 옵션을 달아 자동으로 질문에 YES를 입력하게 해 준다. wget, nginx, php-fpm, php-mysql, php-mysqlnd php-mbstring mariadb-server mariadb-client를 설치한다.

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 문자열 함수를 지원하기 위해 쓰인다.

4) srcs 폴더 내부에 파일 준비하기.

config.inc.php 파일, default 파일 (nginx config), wp-config.php 파일을 미리 작성해 /srcs 내에 옮겨둔다. 작성법에 대해서는 이전 포스팅에서 다루었으니 생략.

5) nginx 설정 파일 옮기기

COPY ./srcs/default ./etc/nginx/sites-available/default

6) openssl로 self-signed certification 생성하기.

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

7) root 경로로 워킹 디렉토리를 이동해 준다.

WORKDIR /var/www/html

8) phpmyadmin 설치하고, 압축 해제하고 압축 파일 삭제하기. 미리 작성해 둔 config.inc.php 파일을 ./phpmyadmin으로 옮기기.

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 에 해당하는 파일 삭제 명령을 해 주지 않았기 때문이었던 것 같다.

9) Wordpress 설치하고, 압축 해제하고 압축 파일 삭제하기. 미리 작성해 둔 wp-config.php 파일을 ./wordpress로 옮기기.

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

10) 권한 변경하기

RUN chown -R www-data:www-data /var/www/* && chmod -R 755 /var/www/*

11) 서비스를 실행하고, 유저와 데이터베이스 생성하기.

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 블로그가 실행이 잘 되는지도 확인해 본다.

다 잘 되면 끝이다!

profile
문학적 상상력과 기술적 가능성
post-custom-banner

0개의 댓글