ft_server

bahn·2021년 3월 18일
0

2-Circle

목록 보기
1/5

ft_server

Docker 웹 서버 구동 명령어

docker start [컨테이너 이름 또는 아이디]
docker restart [컨테이너 이름 또는 아이디]

docker 컨테이너를 재시작, 재실행을 하고 싶을 경우 위 명령어를 실행 

docker build [Dockerfile이 존재하는 디렉토리 경로] -t [이미지 이름:태그]

Dockerfile이 존재할 경우 build 옵션을 통해 이미지 생성

=> docker build . -t ft_server

docker run -it --name [컨테이너 이름] -p 80:80 -p 443:443 [이미지 이름:태그]

docker run 명령어를 통해 컨테이너를 생성하고 명시된 이미지 환경 실행 및 접속

docker run 명령어에 대한 옵션은 다음과 같다. 

-i 옵션 : interactive(입출력)

-t 옵션 : tty(터미널)를 활성화하는 옵션으로써 일반적으로 터미널 사용하는 것처럼 컨테이너 환경을 만들어주는 옵션

--name [컨테이너 이름] 옵션 : 컨테이너 이름을 지정.

-p 호스트 포트 번호 : 컨테이너 포트 번호 옵션은 컨테이너의 포트를 개방한 뒤 호스트 포트와 연결한다. 

docker를 종료하고 싶을 경우 docker bash 쉘에서 exit 명령어를 실행

=> docker run -it --name ft_server -p 80:80 -p 443:443 ft_server

ft_server - Dockerfile 명령문 문법

  • FROM

    FROM은 어떤 이미지를 기반으로 이미지를 생성할 것인지 정의한다.
    FROM <이미지>:<태그> 형식을 가진다.
    태그는 해당 이미지의 별칭으로, 입력하지 않으면 latest(최신버전)가 디폴트로 붙는다.
    당연하게도 <이미지>는 생략할 수 없다.
    이미지를 생성할 때 과거에 생성한 적 있는 기반 이미지라면
    이미 로컬에 데이터가 있을 것이므로 그대로 불러와서 활용하고,
    없으면 Docker Hub에서 받아온다.
    FROM을 여러개 사용하여 Dockerfile 하나에 여러개의 기반이미지를 가져올 수 있다.
    FROM을 두 개 쓰면 두 개의 이미지가 생성되는 것이다.

    ft_server 과제는 debian:buster 이미지를 요구하므로

    "FROM debian:buster" 형식으로 작성한다.

  • MAINTAINER

    MAINTAINER는 이미지를 생성한 사람의 정보를 입력한다. 자유형식 입력이 가능하다.

    MAINTAINER bahn bbu0704@gmail.com 형식으로 작성해보았다.

  • RUN

    RUN은 FROM에서 설정한 이미지 위에서 명령어를 실행시킨다.
    RUN에 의해 실행된 쉘 스크립트 명령의 결과가 새로운 이미지로 생성되고
    실행 내역은 이미지 히스토리에 기록된다.

    쉘 명령이 실행되는 원리는 FROM에서 가져온 이미지에 담겨잇는
    /bin/sh 실행파일을 이용하는 것이다.

    실행 결과는 캐시되고, 다음 빌드할 때 재사용된다. 캐시를 재활용하고 싶지 않으면 docker build 명령에서 --no-cache 옵션을 사용한다.

    RUN 명령은 /bin/sh 상에서 실행되지 않고 바로 실행시키는 방법도 있다.

    RUN ["쉘명령어","매개변수1","매개변수2"...] 로 단순하다.

    ft_server에서 필요한 패키지들을 다운받는 과정을 RUN 명령문에 작성해야할 것 같다.

    RUN apt-get update && apt-get upgrade && apt-get -y install \
    nginx \
    curl \
    openssl \
    vim \
    mariadb-server \
    php-mysql \
    php-mbstring \
    wget \
    php-fpm

  • CMD

    컨테이너가 시작되고 가장 처음 실행될 명령어를 지정한다.

    하나의 Dockerfile을 만들 때 딱 한번만 쓸 수 있는 명령어이다.
    제일 첫 명령을 지정하는 것이니 당연히 한 번만 사용 가능하다.
    굳이 할 작업이 없다면 사용하지 않아도 관계없는 명령어이다.

    docker run 으로 컨테이너를 생성하거나
    docker start 며령으로 정지된 컨테이너를 재시작시킬 때 동작한다.

    CMD 또한 RUN과 마찬가지로 /bin/sh를 거치지 않고 바로 실행되도록 할 수 있다.

    CMD ["쉘명령어","매개변수1","매개변수2"...]

  • WORKDIR

    RUN, CMD, ENTRYPOINT에서 설정한 실행 파일이 실행될 디렉토리 위치를 지정한다.

  • ADD || COPY

    ADD와 COPY는 파일을 이미지에 추가하는 역할을 한다.

    ADD <복사할 파일 경로(호스트)> <파일이 위치할 경로(이미지내부)>

    COPY <복사할 파일 경로(호스트)> <파일이 위치할 경로(이미지내부)> 의 형식을 가진다.

    Dockerfile이 존재하는 경로의 하위경로에 존재하는 파일만 이미지 내부로 넣을 수 있다.

    물론 파일뿐 아니라 하위 디렉토리 자체를 넣을 수도 있으며, *를 사용할 수 있다.

    따라서 Dockerfile을 작성할 때 별도로 파일 저장용 폴더를 하나 만들어놓고 이미지에 옮겨담을 파일들을 미리 모아두면 편하다.

    웹에서 파일을 가져다가 넣을 수도 있다. 파일의 URL을 경로에 그대로 써넣으면 된다.

    또한 경로의 마지막에 /를 붙이면 새로운 디렉토리를 생성하고 그 아래에 파일을 복사한다.

    압축된 tar.* 파일은 자동으로 압축 해제되어 파일만 저장되므로 새로운 디렉토리를 따로 잡아주는게 좋다.

    주의할 점으로는 경로를 입력할 때 반드시 절대경로를 입력해야 한다는 점에 유의한다.

    COPY 는 기능적으로는 동일하나 부가 기능면에서 ADD보다 부족하다. 보다 직관적으로 파일의 복사 자체에만 집중한 명령어로, 경로에 웹사이트 파일 URL을 입력할 수도 없고, 파일의 압축이 저절로 풀리는 기능도 제공하지 않는다.

    srcs 디렉토리 안에 있는 파일들을 ADD 또는 COPY 명령문을 통해 이미지에 추가시키면 될 것 같다.

  • ENV

    ENV 명령은 환경변수를 설정한다. 설정한 환경변수는 RUN, CMD, ENTRYPOINT에 즉각 반영된다.

    마찬가지로 형식은 ENV <환경변수> <값> 이다.

    환경변수는 docker run 명령의 -e 옵션으로도 지정할 수 있다.

    docker run -e <환경변수>=<값> <이미지이름> 의 형식을 가진다.

  • EXPOSE

    EXPOSE는 호스트와 연결할 포트 번호를 설정하는 명령이다.

    동시에 여러개의 포트를 설정할 수도 있다.

    docker run 명령의 --expose 옵션과 동일하다.

    단, EXPOSE는 호스트와 연결하는 포트를 설정할 뿐,

    몇 번 포트가 호스트와 연결되었는가를 공개하지는 않는다.

    호스트와 연결된 포트를 외부에 공개하려면 docker run 명령의 -p 옵션을 사용한다.

  • VOLUME

    VOLUME 명령에 의해 지정된 디렉토리는 컨테이너에 저장하지 않고 호스트에 저장하도록 한다.

    형식은 두 가지를 가진다. 후자는 여러개의 디렉토리를 지정할 때 쓰인다.

    VOLUME <디렉토리>

    VOLUME ["디렉토리1", "디렉토리2"]

    VOLUME 명령은 디렉토리를 호스트와 연결시키는 명령은 아니다.

    이 기능은 docker run 명령의 -v옵션으로 구현되어있다.

    docker run -v <호스트 디렉토리>:<이미지 내부 디렉토리> 이미지이름

    docker run -v /root/tmp:/home/newfolder imagename

  • USER

    명령을 실행할 사용자 계정을 설정하며, RUN, CMD, ENTRYPOINT에 즉각 반영된다.

    USER <사용자계정> 의 형식을 가진다.

  • ONBUILD

    지금까지 하나의 Dockerfile을 생성하는 경우에 대해서만 생각했다면,

    ONBUILD 명령은 조금 더 넓은 개념으로 쓰이는 명령어이다.

    누군가에게는 쓰지 않아도 그만인 명령어일 수 있다.

    위의 과정을 거쳐 생성된 이미지들은 그 자체로 기능을 하기에 문제가 없다.

    그러나 어떤 경우에는 기존에 있는 이미지를 가져다가 일부 수정하여 쓰고 싶은 경우가 있다.

    이 경우 사용하는 명령이 ONBUILD 이다.

    ONBUILD는 이미 생성된 이미지를 기반으로 다른 이미지를 파생시킬 때

    실행할 명령어들을 지정하는 명령어이다.

    즉, 맨 처음 ONBUILD 명령을 입력해서 최초 이미지를 생성한 사람에게는

    ONBUILD 명령이 동작하지 않는다.

  • ARG

    ARG 명령문은 docker build 커맨드로 이미지를 빌드 시, --build-arg 옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용합니다.

    예를 들어, Dockerfile에 다음과 같이 ARG 명령문으로 port를 인자로 선언해주면,

ARG port

다음과 같이 docker build 커맨드에 --build-arg 옵션에 port 값을 넘길 수가 있습니다.

$ docker build --build-arg port=8080 .

인자의 디폴트값을 지정해주면, --build-arg 옵션으로 해당 인자가 넘어오지 않았을 때 사용됩니다.

ARG port=8080

설정된 인자 값은 다음과 같이 ${인자명} 형태로 읽어서 사용할 수 있습니다.

CMD start.sh -h 127.0.0.1 -p ${port}

Dokcerfile

FROM debian:buster

MAINTAINER bahn <https://github.com/AhngBeom>

RUN apt-get update && apt-get -y upgrade && apt-get -y install \
            nginx \
            curl \
            openssl \
            mariadb-server \
            php-mysql \
            php-mbstring \
            wget \
            php7.3-fpm

COPY ./srcs/initialize.sh /copy/
COPY ./srcs/default /copy/
COPY ./srcs/wp-config.php /copy/
COPY ./srcs/config.inc.php /copy/

EXPOSE 80 443

CMD bash ./copy/initialize.sh

default

server {
        listen 80; // IPv4 주소 처리
        listen [::]:80; // IPv6 주소 처리

        return 301 https://$host$request_uri;
}

server {
        listen 443; // IPv4 주소 처리
        listen [::]:443; // IPv6 주소 처리

        ssl on; // OpenSSL 프로토콜 사용
        ssl_certificate /etc/ssl/certs/openssl_x509.crt;
        ssl_certificate_key /etc/ssl/private/openssl_rsa4096.key;
        // OpenSSL 개인키 및 인증서 위치 경로 명시

        root /var/www/html; // 서버의 root 디렉토리 설정

        index index.html index.htm index.php; #index.nginx-debian.html;
        // nginx 기본 메인 페이지를 주석처리하여 AutoIndex 페이지를 메인 페이지로 설정

        server_name ft_server;
        // 서버 이름 설정

        location / {
                autoindex on; // autoindex 기능 활성화
                try_files $uri $uri/ =404;
                /* nginx는 정적 파일 호스팅을 기본적으로 지원하지 않기에,
                root 폴더 내에 uri 에 따른 폴더가 있는지 찾아보고, 
                만약 없다면 404 에러를 보여주도록 설정 */
        }

        location ~ \.php$ { // 정규식표현 형식으로 활용하여 php 확장자인 파일에 대한 요청 처리
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
                // 유닉스 도메인 소켓 프로토콜(UDP)을 사용할 경우 sock 파일의 위치를 명시해 요청이 FastCGI서버에 전달되게 지정한다.
        }
}

wp-config.php

//  wp-config.php
...
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );

/** MySQL database username */
define( 'DB_USER', 'bahn' );

/** MySQL database password */
define( 'DB_PASSWORD', '1234' );

// initialize.sh 에서 DB 생성과 함께 생성한 유저의 이름과 패스워드 대입

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
...

config.inc.php

...
/**
 * This is needed for cookie based authentication to encrypt password in
 * cookie. Needs to be 32 chars long.
 */
$cfg['blowfish_secret'] = 'IMZt9EC{Dj-wqTUY,oa;1L[5Ydcj{7le';
...

컨테이너가 시작되고 가장 처음 실행될 명령어들이 집합된 쉡 스크립트 파일 initialize.sh

#!/bin/bash

## 쉘 스크립트 파일 실행 권한 부여
chmod +x ./copy/initialize.sh

# OpenSSL 개인 키 & 인증서 생성 및 이동, 권한 변경
# 아래 명령어는 CSR(Certificate Signing Request) 신청서 양식을 작성하는 명령이다.
# 인증기관으로부터 공식적인 인증서를 받기 위한 신청서를 생성하는 단계로 
# 신청자를 구분하고자 몇가지 정보를 입력해야 한다.
openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=bahn/CN=localhost" -keyout openssl_rsa4096.key -out openssl_x509.crt
mv openssl_rsa4096.key etc/ssl/private/
mv openssl_x509.crt etc/ssl/certs/
chmod 600 etc/ssl/private/openssl_rsa4096.key etc/ssl/certs/openssl_x509.crt 
# 개인키와 인증서 파일의 소유자에게만 읽기, 쓰기 권한을 부여


# 옵션 설명
#
#     req : 자체 서명 인증서 생성
# 
#     -newkey : 새로운 개인키를 생성 (RSA 4096비트 개인키 생성)
#         
#         RSA 암호는 공개키 암호시스템의 하나로,  
#         암호화뿐만 아니라 전자서명이 가능한 최초의 알고리즘으로 알려져 있다.
#         RSA가 갖는 전자서명 기능은 인증을 요구하는 전자 상거래 등에  
#         RSA의 광범위한 활용을 가능하게 하였다.
#
#     -days : 인증서의 유효기간 설정
#
#     -nodes : 내 개인키에 pass phrase 를 적용하지 않고 파일로 저장
#
#         pass phrase는 컴퓨터 시스템, 프로그램 또는 데이터에 대한 접근 권한을 제어하기 위한 단어들의 나열이다.  
#         비밀번호와 유사하지만 비밀번호는 짧은 반면, 여러 단어들의 조합으로 이루어진 패스프레이즈는 매우 길다.  
#         비밀번호보다 높은 보안성이 필요한 곳에 사용한다.
#
#     -x509 : 공개키 인증서와 인증 알고리즘을 사용하기 위한 PKI 표준
#
#     -keyout : 생성될 개인키 파일명
#
#     -subj : CSR 생성시 필요한 각 항목을 미리 명시하여 입력 과정을 생략.
#
#     -out : 생성될 인증서 파일명

## Dockerfile에 의해 복사된 default 파일을 nginx 웹 서버에 적용
cp -p ./copy/default /etc/nginx/sites-available/

## 워드프레스 구축
wget https://wordpress.org/latest.tar.gz
tar -xvf latest.tar.gz
mv wordpress/ /var/www/html/
cp -p ./copy/wp-config.php /var/www/html/wordpress

## MySQL 구문을 통해 워드프레스 DB 생성
service mysql start
echo "CREATE DATABASE IF NOT EXISTS wordpress;" | mysql -u root
echo "CREATE USER IF NOT EXISTS 'bahn'@'localhost' IDENTIFIED BY '1234';"  | mysql -u root
echo "GRANT ALL PRIVILEGES ON wordpress.* TO 'bahn'@'localhost' WITH GRANT OPTION;" | mysql -u root
# mysql 서비스를 활성화시킨 후
# mysql로 접속하여 echo 명령어와 파이프(|) 기능을 통해 mysql 구문을 수행

## phpMyAdmin 구축
wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz
tar -xvf phpMyAdmin-5.0.2-all-languages.tar.gz && \
mv phpMyAdmin-5.0.2-all-languages phpmyadmin
mv phpmyadmin /var/www/html/
cp -p ./copy/config.inc.php /var/www/html/phpmyadmin/ 
# blowfish 암호가 삽입된 srcs/config.inc.php 파일을 복사

## /var/www 경로의 소유자 및 그룹 설정 및 실행 권한 부여
chown -R www-data:www-data /var/www/
# chown : 파일을 소유하는 유저와 그룹을 변경
# /var/www/ 경로에 있는 모든 파일, 디렉토리의 소유 유저를 www-data 로 변경한다.
# 소유 그룹 또한 www-data로 변경한다.
# www-data가 아닌 다른 유저가 www-data 그룹에 속해있다면 공동 작업이 가능하다.  
# www-data는 Ubuntu의 웹 서버 (예 : Apache, nginx)가 기본적으로 일반 작업에 사용하는 사용자이다. 
# 웹 서버 프로세스는 www-data 파일에 액세스 할 수 있다.
chmod -R +x /var/www/
# /var/www/ 경로에 속해있는 Wordpress, phpMyAdmin 등과 관련된 
# 모든 파일 및 디렉토리에 실행 권한 부여

# 웹 서버 구동에 필요한 서비스들을 활성화
service nginx start
service php7.3-fpm start
service mysql restart

# 컨테이너가 자동 종료되는 것을 방지하기 위해 bash 쉘을 활성화
bash

평가 항목

http://localhost -> https로 리디렉션

http://localhost:80 -> https로 리디렉션

https://localhost:443 -> OpenSSL 프로토콜 동작

https://localhost/wordpress -> wordpress 구축

https://localhost/phpmyadmin

-> 설정한 유저명 + 비밀번호로 정상 접속, SSL CA 인증서 유무, 오토인덱스 정상 작동

워드프레스 계정 등록 후 phpMyAdmin 과의 DB 연동


ft_server 선행지식

Docker 입문

ft_server 서비스 목록

Install Docker Engine on Debian

ft_server - 총 정리 도커 설치부터 워드프레스 구축까지

ft_server - 서비스 목록

NGINX 소개

CURL 이란?

Dockerfile 문법 정리

Dockerfile 자주 쓰이는 명령문

Dockerfile, /srcs 구성

ft_server MySQL 오류 해결방법

profile
42Seoul-bahn

0개의 댓글