본문 바로가기
Activities/공부

[42Seoul] ft_server 실행 기록 및 제출파일 작성

by 코드포휴먼 2021. 4. 7.

본 서브젝트는 Mac OS 10.14.6 Mojave 환경에서 진행했다.

(M1 Mac에서는 Docker가 정상작동하지 않을 수 있다.)

 

도커 설치

Docker Desktop for Mac에서 Stable 버전의 도커 프로그램을 설치한다. 

설치가 완료되면 상단 우측에 고래 아이콘이 등장하고, 도커가 실행된다.

터미널에서 도커 명령어를 사용할 수 있다.

 

Debian Buster 이미지 다운로드

Docker Hub로부터 Debian 이미지를 가져온다. 

docker pull debian:buster

buster 부분은 TAG 명인데, debian:buster로 자동으로 최신 버전을 불러온다.

 

이후 images 명령을 입력해서 이미지 리스트를 확인한다.

docker images 

 

Debian Buster 이미지 실행 및 컨테이너 접속

다운로드한 debian:buster 이미지를 실행한다.

이미지를 run 하여 컨테이너에 접속할 수 있는데, 이때 아래와 같이 다양한 옵션을 줄 수 있다.

docker run -it --name 컨테이너이름 -p 80:80 -p 443:443 debian:buster
  • -i (--interative) : 표준 입출력을 활성화시켜 bash에서 명령어를 입력 받는다. 
  • -t (--tty 터미널) : bash를 사용하기 위해 써야 하는 옵션이다.
    사용하지 않는다면 명령어를 입력할 순 있어도 쉘에 표시되지 않는다.
    (i 와 t 옵션을 함께 씀으로써 일반적으로 터미널 사용하는 것처럼 컨테이너 환경을 만들어준다.)
  • --name : 컨테이너의 이름을 줄 수 있는 옵션이다.
    옵션을 주지 않으면 docker의 daemon이 형용사+과학자 이름을 랜덤으로 지어준다.
    --name 컨테이너이름 형식으로 사용한다.
  • -p (--publist list) : 호스트에 연결된 컨테이너의 특정 포트(들)을 외부에 노출시킨다. 
    -p 호스트포트번호 : 컨테이너포트번호 형식으로 사용한다.
    보통 웹서버의 포트를 노출할 때 사용하는데, http는 80, https는 443이 기본 포트다. 
  • debian:buster라고 TAG 명시를 하지 않아도 Docker Hub에서 자동으로 최신 버전을 불러온다.
    다만 TAG 이름이 latest가 되어 이미 debian:buster를 불러온 적이 있다면, 서로 다른 이미지가 된다.

 

run 한 뒤 bash 입장을 확인해본다.

터미널이 root@edfa6b4a101e:/# 와 같은 식으로 변경되면 debian:buster 컨테이너 bash에 들어가진 것이다.

 

컨테이너 터미널을 종료하고 싶다면 exit를 활용하면 되며, 이때 터미널 접속만 나가는 것이지 컨테이너 실행이 중지되는 것은 아니다.

exit한 컨테이너를 다시 접속하려 한다면 docker attach 명령어로 접속할 수 있다. 컨테이너 이름 혹은 ID로 접근하면 된다.

docker attach [OPTIONS] CONTAINER

 

또한 이미지를 컨테이너화 한 이후에 옵션을 뒤늦게 추가해야 한다면 docker commit 명령어를 사용할 수 있다.

이 경우에는 현재 실행중인 컨테이너 터미널에서 현재 상태를 commit 하여 이미지로 저장하고, 저장한 이미지를 다시 run하면 된다.

# 컨테이너 터미널
docker commit 컨테이너이름 새이름

# 일반 터미널
docker run -it -p 80:80 -p 443:443 새이름
더보기

예를 들어 docker run -it --name 컨테이너이름 debian:buster 으로만 컨테이너를 실행했다가

추가적으로 80과 443 포트를 열고 싶다면 -p 옵션을 줘야 한다. 

이 경우 아래와 같이 시도하면 성공적으로 포트가 열린다.

(docker stop, restart 등을 시도해보았지만 실패했다.)

 

docker commit 컨테이너이름 새이름
docker run -it -p 80:80 -p 443:443 새이름

 

컨테이너 리스트를 확인하는 명령어는 pscontainer ls가 있다.

두 명령어 모두 컨테이너 목록을 보여주는 기능으로 완전히 동일하며, container 명령이 1.13버전에 추가된 명령이다.

# 현재 구동중인 컨테이너 리스트만 반환
docker ps 
docker container ls

# 존재하는 모든 컨테이너 리스트를 반환
docker ps -a
docker container ls -a

 

컨테이너에 Nginx 과 curl 설치

ubuntu를 포함한 Debian 계열의 Linux에서는 설치를 위해 패키지 관리자인 apt-get (Advanced Packaging Tool)을 활용한다.

apt-get은 Advanced Packaging Tool의 약자다.

apt-get -y update 
apt-get -y install nginx curl
  • apt-get -y update 을 통해 패키지 목록을 최신으로 받는다.
  • apt-get -y install nginx 을 통해 Nginx를 설치한다.
  • curl은 서버와 통신할 수 있는 커맨드 명령어 툴이다. url을 이용하여 http 프로토콜을 이용해 웹 페이지의 소스를 가져온다거나 파일을 다운받을 수 있다. ftp 프로토콜을 이용해서는 파일을 받을 수 있을 뿐 아니라 올릴 수도 있다. (추가 사용법)
더보기

<리눅스 패키지 설치 명령어 apt-get>
apt-get update
운영체제에서 사용 가능한 패키지 리스트  버전에 대한 정보를 업데이트한다.
apt-get install 명령을 이용해서 특정 패키지를 설치할  없는 경우 최신으로 패키지 리스트를 업데이트해야  필요가 있다.

 

apt-get upgrade

운영체제에 apt-get install 명령으로 설치한 패키지들 최신 버전으로 업그레이드하는 명령어다.

apt-get upgrade 명령을 이용하면 apt-get update 가져온  패키지들의 최신 버전에 맞게 업그레이드를 한다.

 

apt-get 의 -y 옵션

패키지를 업데이트 할때 저장소에 패키지를 설치하면 공간을 사용한다는 문구와 함께 설치를 하겠냐는 물음이 나온다.

보통 설치를 하기 위해 쓰는 명령이기 때문에 yes에 해당하는 y를 누른다. -y 옵션을 넣어주면 이런 확인을 하지 않고 넘어간다.

 

Nginx 웹서버 구동 및 연결 확인

Nginx 구동을 시작시킨다.

service nginx start

 

잘 돌아가는지 확인한다.

service nginx status 

[ ok ] nginx is running 이 뜨면 서버가 잘 돌아가고 있다는 뜻이다.

브라우저에서 localhost 혹은 localhost:80을 요청했을 때 아래와 같이 접속된다면 서버와의 소통이 잘 된 것이다.

혹은 설치한 curl 을 통해 터미널 명령을 했을 때 아래 페이지에 대한 html 코드가 반환되어도 성공이다.

curl localhost

 

 

※ 서버 응답관련 오류 발생 시 체크해볼 것

 

  1. service nginx status 로 연결상태를 확인한다.
  2. lsof -Pni4 | grep LISTEN 을 통해 연결 중인 포트를 확인한다.
  3. lsof -i :[포트 번호] 를 통해 특정 포트 사용 상태를 확인한다. (비사용중이면 아무것도 안 나온다.)
  4. 위 명령어를 수행했을 때 아무것도 안 나오는데 이미 할당중이라고 나온다면 sudo lsof -i :[포트 번호] 를 한다.
  5. kill -9 [프로세스id] 를 통해 위 명령에서 발견한 활성 포트를 중단한다.
  6. ping 127.0.0.1 이런 식으로 특정 IP가 응답 중인지 알 수 있다.
더보기

 ◦ lsof 명령어는 list open files의 약자로 열린 파일 리스트를 보여준다.  사용한 옵션은 아래와 같다.

-P : 포트 번호가 네트워크 파일에 대한 포트 네임으로 변환되는 것을 금지한다. 변환 금지를 통해 lsof의 실행 속도가 빨라질 수 있다. 포트 네임 조회가 제대로 작동하지 않는 경우에도 유용하다. 

-n : 네트워크 번호가 네트워크 파일에 대한 호스트 네임으로 변환되는 것을 금지한다. 변환 금지를 통해 lsof의 실행 속도가 빨라질 수 있다. 호스트 네임 조회가 제대로 작동하지 않는 경우에도 유용하다.

-i : i로 지정한 주소와 일치하는 인터넷 주소의 파일 목록을 선택한다. 주소가 지정되지 않은 경우, i 옵션은 모든 인터넷 및 x.25(HP-UX) 네트워크 파일의 목록을 선택한다. -i4 또는 -i6을 다음 주소 없이 지정하면 지정된 IP 버전, IPv4 또는 IPv6의 파일만 표시된다. 

 

 ◦ kill 명령어 프로세스 종료하거나 신호를 전달하는 명령어다. 일반적으로 자주 사용되는 신호는 아래와 같다.

     1       HUP (hang up)

     2       INT (interrupt)

     3       QUIT (quit)

     6       ABRT (abort)

     9       KILL (non-catchable, non-ignorable kill)

     14      ALRM (alarm clock)

     15      TERM (software termination signal)

 

 ◦ ping 명령어는 ICMP ECO_REQUEST 패킷을 네트워크 호스트로 전송하는 명령어다.

Description) The ping utility uses the ICMP protocol's mandatory ECHO_REQUEST datagram to elicit an ICMP ECHO_RESPONSE from a host or gateway.  ECHO_REQUEST datagrams (''pings'') have an IP and ICMP header, followed by a ''struct timeval'' and then an arbitrary number of ''pad'' bytes used to fill out the packet.

 

 

openssl 설치 및 self-signed SSL 인증서 생성

아래 명령어를 통해 openssl을 설치하고, 개인키 및 CSR을 생성한다.

apt-get -y install openssl

 

.csr을 생성하는 기본 틀은 아래와 같다.

그러나 CSR을 명시적으로 생성하지 않고, key와 부가정보들을 입력하여 직접 self-sign하여 인증서를 완성할 예정이다.

openssl req -new -key 키이름.key -out csr 이름.csr 

 

따라서 아래 명령어에서 .key 개인키로 .csr 파일 대신 바로 .crt 파일을 만든다.

개인키 및 인증서를 생성한다.

openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=Kim/CN=localhost" -keyout localhost.dev.key -out localhost.dev.crt

 

openssl req의 옵션은 아래와 같다. (openssl req --help 확인)

  • req : openssl 을 생성하기 위한 유틸리티
  • -new : 새로운 요청을 의미하는 옵션
  • -key 개인키이름 : 발급을 위해 사용할 개인키를 명시
  • -newkey rsa:비트수 : 개인키를 생성하기 위한 옵션. 생성할 rsa의 개인키 비트 수 지시 (ex. 2048, 4096)
  • -out 인증서이름 : output할 파일을 명시하는 옵션
  • -days 일자 : 인증서의 유효기간을 작성하는 옵션 
  • -nodes : 생략 시 재부팅할 때마다 수동으로 암호를 입력해야 한다.
  • -subj "서버정보" : 서버 정보를 입력한다.
더보기

인증서 사용 표기

 

 

생성한 개인키와 인증서를 etc/ssl/ 디렉토리로 이동시킨다.

mv localhost.dev.crt /etc/ssl/certs/
mv localhost.dev.key /etc/ssl/private/

 

권한을 제한한다.

chmod 600 /etc/ssl/certs/localhost.dev.crt etc/ssl/private/localhost.dev.key

 

 

Nginx에 SSL 설정 및 url redirection 추가 - default 파일 설정 변경

nginxssl을 더하기 위한 default 파일의 설정을 변경한다.

vim을 수정용으로 설치하고, default 파일을 수정한다.

apt-get -y install vim
vi /etc/nginx/sites-available/default

 

기존 default 파일은 서버 블록이 한개이며 80번 포트만 수신대기 상태다.

https 연결을 위해 아래와 같이 443 포트를 수신대기하는 서버 블록을 추가로 작성해야 한다.

http로 요청할 시 https로 요청되게끔 리다이렉션 시켜준다.

https 서버 블록에는 ssl on과 인증서 경로를 작성하고, 나머지는 기존에 있던 설정을 그대로 유지한다.

server {
	listen 80 default_server; 
	listen [::]:80 default_server;

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

server {
	listen 443 ssl;
	listen [::]:443 ssl;
    
	# ssl 설정
	ssl on;
	ssl_certificate /etc/ssl/certs/localhost.dev.crt; 
	ssl_certificate_key /etc/ssl/private/localhost.dev.key;
    
	# 서버의 root 디렉토리 설정
	root /var/www/html;
    
	# index 읽을 파일 목록
	index index.html index.htm index.nginx-debian.html;

	server_name ft_server;
	location / {
		try_files $uri $uri/ =404;
	}
} 
  • listen : 서버에서 라우팅할 특정 port를 정의한다.
  • default_server : 별도의 지정하지 않은 도메인으로 들어오는 다른 모든 요청에 대해 해당 블록이 처리함을 의미한다. 여러 개의 서버 블록을 작성할 때 단 하나의 서버 블록에만 존재해야 한다. 

 

바뀐 설정을 적용하여 nginx를 리로드한다.

service nginx reload 

 

만약 restart, reload에 실패한다면 cat /var/log/nginx/error.log 해서 오류내역을 볼 수 있다.

 

 

브라우저에서 https://localhost 혹은 https://localhost:443 으로 접속 시 경고문구가 뜨면 잘 된 것이다.

발급한 인증서는 특정 도메인에 대한 CA 공인 기관 인증서가 아닌, 로컬 호스트의 self-signed 인증서이기 때문에 브라우저가 서버를 신뢰할 수 없다는 메시지를 띄운다.

 

mac의 chrome에서는 ‘고급’ 설정을 통해서 안전하지 않은 사이트임을 인지하고 접속하는 버튼이 없다.

"안전하지 않음" 이라고 접속이 불가하다면 아래와 같이 임시 조치를 한다. (꼭 신뢰하는 사이트에서만 사용할 것)

  1. NET::ERR_CERT_REVOKED 화면의 빈 공간의 아무 곳에서 마우스 좌클릭.
  2. 키보드로 thisisunsafe 문자열 입력. (화면에 보이지 않으니 그냥 입력)
  3. 접속하고자 하는 화면이 보이면 성공. 보이지 않으면 화면 Refresh 하고 다시 시도.

 

php-fpm 설치 및 Nginx 설정

웹서버 인터페이스인 php-fpm을 설치하여 Nginx와 php를 연동한다. 

# apt-get -y install php-fpm
apt-get -y install php7.3-fpm

7.3버전을 설치해준다.

 

Nginx의 default 파일에 php 처리를 위한 설정을 추가한다.

vi /etc/nginx/sites-available/default
server {
	listen 80 default_server; 
	listen [::]:80 default_server;

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

server {
	listen 443 ssl;
	listen [::]:443 ssl;
    
	# ssl 설정
	ssl on;
	ssl_certificate /etc/ssl/certs/localhost.dev.crt; 
	ssl_certificate_key /etc/ssl/private/localhost.dev.key;

	# 서버의 root 디렉토리 설정
	root /var/www/html;
    
	# index 읽을 파일 목록
	index index.html index.htm index.nginx-debian.html index.php;

	server_name ft_server;
	location / {
		try_files $uri $uri/ =404;
	}
    
	# PHP 추가
	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
		fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
	}
} 

원래 친절히 기본 default 파일에 php 설정이 주석처리 되어있어 주석해제만 하면 된다.

또한 기본 index 리스트에 index.php 파일도 추가해준다.

더보기

/etc/nginx/ 디렉토리 구성 

/sites-available : 설정 파일들이 들어있다.

/sites-enabled : 실행시킬 파일들만 symlink로 연결해서 여기에 넣어둔다.

nginx.conf : sites-enabled에 있는 파일들을 호출하는 파일이다. 서버 실행에 관한 정보를 적어 둔다.

 

Nginx의 autoindex 설정하기

autoindex 가 뭔지 알고싶다면 먼저 웹서버가 리소스 매핑과 접근을 어떻게 하는지 부터 알아야한다.

<웹서버는 어떻게 수 많은 리소스 중 요청에 알맞은 콘텐츠를 제공할까?>
일반적으로 웹서버 파일 시스템의 특별한 하나의 폴더를 웹 콘텐츠를 위해 사용한다.

이 폴더를 문서루트 혹은 docroot라고 부른다.
리소스 매핑의 가장 단순한 형태는 요청 URI를 dotroot 안에 있는 파일의 이름으로 사용하는 것이다.
만약 파일이 아닌 디렉토리를 가리키는 url에 대한 요청을 받았을 때는 요청한 url에 대응되는 디렉토리 안에서 index.html 혹은 index.htm으로 이름 붙은 파일을 찾아 그 파일의 콘텐츠를 반환한다. 이를 autoindex 라고 부른다.

 

그래서 우리는 autoindex 기능을 켜줘야한다. nginx default 파일에서 location / 부분에 autoindex on 을 추가한다.

server {
	listen 80 default_server; 
	listen [::]:80 default_server;

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

server {
	listen 443 ssl;
	listen [::]:443 ssl;
    
	# ssl 설정
	ssl on;
	ssl_certificate /etc/ssl/certs/localhost.dev.crt; 
	ssl_certificate_key /etc/ssl/private/localhost.dev.key;

	# 서버의 root 디렉토리 설정
	root /var/www/html;
    
	# index 읽을 파일 목록
	index index.html index.htm index.nginx-debian.html index.php;

	server_name ft_server;
	location / {
		# autoindex on 추가
		autoindex on;
		try_files $uri $uri/ =404;
	}
    
	# PHP 추가
	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
		fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
	}
} 
  • 만약 autoindex가 꺼져 있거나 해당 디렉토리에 index 목록에 해당하는 파일이 없다면,
    웹 서버는 자동으로 그 디렉토리의 파일들 크기, 변경일, 해당 파일에 대한 링크와 함께 열거한 HTML 파일을 반환한다.
  • 루트 디렉터리인 /var/www/html 에 존재하는 index.ngiinx-debian.html 을 주석처리해보면,
    읽을 파일이 없다고 생각하고 아래처럼 전체 파일 목록을 반환하는 것을 확인할 수 있다.

 

MySQL(MariaDB) 설치

ft_server 과제에서는 mysql을 설치하라고하지만, 

Debian 9.0부터 MySQL은 MariaDB를 디폴트로 사용하게 하므로 MariaDB를 설치했다

MariaDB도 MySQL을 기반으로 만들어졌기때문에 mysql 명령어와 완전히 호환된다.

apt-get -y install mariadb-server php-mysql php-mbstring
  • php-mysql은 php에서 mysql에 접근할 수 있게 해주는 모듈이다.
  • php-mbstring은 2바이트 확장 문자를 읽을 수 있도록 해주는 모듈이다.

 

Wordpress 설치 및 관련파일 수정

우선 apt-get 을 통해 웹 상의 자료를 다운로드 하는 wget 패키지를 설치한다. 

apt-get install -y wget

 

wget으로 직접 wordpress의 최신 버전을 다운 받는다. (wordpress 다운로드 사이트에서 tar.gz 확장자 다운 링크를 복사)

tar.gz 압축파일은 리눅스 환경에서 대부분 사용하고 있고, TAR 파일을 압축하는 방식으로 가장 좋은 압축 옵션이다.

wget https://wordpress.org/latest.tar.gz
tar -xvf latest.tar.gz
mv latest wordpress
mv wordpress /var/www/html/
  1. wget 로 워드프레스 압축파일 다운로드
  2. 압축파일 tar.gz을 해제
  3. 압축해제한 latest 디렉토리명을 wordpress로 변경 
  4. /var/www/html/ 로 디렉토리를 이동

 

그리고 유저 그룹 권한설정을 변경한다.

chown -R www-data:www-data /var/www/html/wordpress
  • -R : –recursive 옵션으로 에러 메시지가 있어도 출력하지 않게 한다.
  • www-data : 리눅스에서 Nginx(Apache), php 실행 시 수정이 가능한 권한이다.
    계정 권한을 부여할 때 root, www-data, www, nginx 등 대표성 있는 이름을 사용한다.
    nginx.conf에 user의 권한이 www-data으로 작성되어 있어서 wordpress의 유저 그룹을 그에 맞게 설정한다.

 

wp-config-sample.php 을 복사해 wp-config.php 를 만든다.

cp -rp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php
더보기

[cp 옵션]
-r 또는 -R (--recursive) : 복사대상이 하위디렉토리와 파일들을 가지고 있을때 모두 동일하게 복사하는 옵션이다.

--preserve[=ATTR_LIST] : 복사되어 새로 생성되는 파일에 대하여 원본파일과 동일한 속성을 가지도록 하는 옵션이다. 이때 속성을 별도로 지정해야 한다. 만약 별도로 지정하지 않는다면 파일퍼미션, 소유자 정보, 시간정보이 3가지 속성을 기본 적용한다. 이 외에 지정할 수 있는 속성들은 context, links 등이 있으며 모든 속성을 지정하고자 할 경우에는 all 을 사용하면 된다.

-p : 복사되어 새로 생성되는 파일이 원본파일과 동일한 모드, 소유자, 시간정보를 가지도록 하는 옵션이다. 이 옵션은 --preserve 옵션에서 mode,ownership,timestamps 3가지 속성을 동시에 지정한 것과 같다. 즉, "--preserve=mode,ownership,timestamps" 를 사용한 것과 동일한 결과를 가진다.

 

wp-config.php 파일의 DB_NAME, DB_USER, DB_PASSWORD 세 가지 항목을 수정한다.

vi /var/www/html/wordpress/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', '사용자명' );

/* MySQL database password */ 
define( 'DB_PASSWORD', '비밀번호' );

/* 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', '' );

 

Wordpress를 위한 DB 테이블 생성

DB 설정을 위해 mysql을 실행시킨다.

service mysql start

 

mysql에 접속한다. 터미널에서 mysql 명령을 하면 mysql에 접속한다.

mysql

 

데이터베이스 wordpress를 생성한다.

# mysql 접속상태
CREATE DATABASE wordpress;

 

사용자 계정을 만들어서 그 계정에게 로컬 접속 시 wordpress 디비에 대한 모든 권한을 넘겨준다.

root 사용자는 최대한 이용하지 않는 것이 좋기 때문에 새로운 사용자를 만든다.

# mysql 접속상태
CREATE USER '사용자명'@'localhost' IDENTIFIED BY '비밀번호';
GRANT ALL PRIVILEGES ON wordpress.* TO '유저네임'@'localhost' WITH GRANT OPTION;

@'localhost' 는 로컬 접속만 허용하겠다는 뜻이고 @'%'로 작성하면 외부 접속을 허용하겠다는 뜻이다.

 

 

생성한 데이터베이스 wordpress 의 테이블들을 볼 수 있다.

# mysql 접속상태
USE wordpress;
SHOW TABLES;

아직 생성한 테이블이 없어서 Empty set 으로 나올 것이다.

exit 명령을 사용하면 접속한 mysql을 빠져나올 수 있다.

 

 

php-mysql로 php 설정이 변경되었으므로, php7.3-fpm를 재시작한다. (구동 안 했을 시 시작 start 으로 수행한다.)

service php7.3-fpm restart

 

 

wordpress 로컬로 접속해보기

wordpress와 관련된 데이터베이스 설정은 모두 끝났다.

https://127.0.0.1/wordpress/ 로 접속했을때 아래와 같은 페이지가 나오면 설정이 잘 된 것이다.

 

이후 사이트 제목, 사용자명, 비밀번호 등 몇 가지 설정을 마치면 wordpress가 설치된다.

 

 

대시보드 및 첫 워드프레스 홈페이지를 확인해볼 수 있다.

 

phpMyAdmin 설치

Debian OS에 phpMyAdmin을 바로 다운로드하는 패키지는 현재 없으니 wget으로 직접 다운로드 한다.
(phpmyadmin 
다운로드 사이트에서 tar.gz 확장자 다운 링크를 복사)

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/
  • wget으로 phpmyadmin을 설치하고 tar로 압축파일을 해제한다.
  • 압축 해제 후 폴더 이름을 phpmyadmin 으로 바꿔서 서버의 루트 디렉토리 /var/www/html에 위치시킨다.

 

쿠키 권한을 위한 blowfish 암호 설정

phpmyadmin을 설치하고 블로피쉬 비밀암호를 설정해줘야 한다. 

왜냐면 /phpmyadmin에 처음 로그인 할 때 페이지 하단에 다음과 같은 오류가 표시될 수 있기 때문이다.

ERROR: The configuration file now needs a secret passphrase (blowfish_secret)

따라서 blowfish 암호 생성 사이트에서 32자의 암호 문자열을 생성하여 붙여넣으면 된다.

32자가 아니면 적용되지 않는다고 한다.

 

phpmyadmin 폴더에 들어가보면 정말 많은 파일들이 있다.

그 중 config.sample.inc.php을 복사해 config.inc.php 파일을 만든다.

cp -rp /var/www/html/phpmyadmin/config.sample.inc.php /var/www/html/phpmyadmin/config.inc.php

 

 

생성한 암호문자열을 복사하여 config.inc.php 에 추가한다.

vi /var/www/html/phpmyadmin/config.inc.php 

$cfg['blowfish_secret'] = '이 부분에 넣는다'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

 

nginx를 재시작한다.

service nginx reload

 

그래도 같은 오류가 뜬다면 권한 문제가 있을 수 있으며 phpMyAdmin 구성 폴더의 소유권 및 그룹을 변경해야 한다.

/var/www/html/phpmyadmin/ 디렉토리에 대한 권한을 chmod 755 혹은 775로 변경한다. (스택오버플로우 확인 )

 

phpmyadmin을 위한 DB테이블 생성

create_tables.sql을 가져와서 phpMyAdmin을 위한 테이블을 만든다.

우선 데이터베이스 설정을 위해 mysql을 실행시킨다.

service mysql start

 

phpmyadmin/sql 폴더의 create_table.sql 파일을 mysql로 리다이렉션 시켜준다.

mysql < /var/www/html/phpmyadmin/sql/create_tables.sql

 

https://127.0.0.1/phpmyadmin 에 접속한 뒤 wordpress/wp-config.php 에서 설정한 사용자이름과 비밀번호를 입력하면

(앞서 root 사용자가 아닌 별도의 사용자를 생성했다.)

아래 사진처럼 데이터베이스를 웹 GUI로 편리하게 관리할 수 있다.

 

만약 phpMyAdmin으로 접속하는데 
Your Composer dependencies require the following PHP extensions to be installed: xml 에러가 생기면 
apt install php-xml 를 시도해본다.

 

 

과제 제출파일 만들기

실행 원리를 파악했으니, 이제부터 해야할 일은 다음과 같다. 앞의 과정을 Dockerfile과 쉘스크립트로 옮겨적는다.

어떤 설정이라도 빠져서는 안되고 순서에 맞게, 다른 사람이 처음 봤을 때 이해하기 쉽게 나눠야한다.

  • Dockerfile 문법 확인 및 작성하기
  • docker container 내부의 설정파일들 hostOS의 srcs/ 폴더로 옮기기
  • 빌드 자동화를 위한 쉘 스크립트 작성하기
  • Dockerfile 빌드하기
  • ft_server 과제 요구사항 체크하기

 

과제 요구사항에 맞게 프로젝트 루트 폴더에는 Dockerfile 과 srcs/ 디렉토리만 둬야한다.

  • Dockerfile : 프로젝트 컨테이너 환경에 필수적인 패키지 설치 명령어
    ▫︎ nginx 
    ▫︎ mariadb-server
    ▫︎ php7.3-fpm && php-mysql && php-mbstring
    ▫︎ openssl
    ▫︎ vim
    ▫︎ wget
  • srcs/default : etc/nginx/sites-available/default
    (nginx 서버의 ssl, autoindex, redirection 설정파일)
  • srcs/config.inc.php : var/www/html/phpmyadmin/config.inc.php
    (blowfish 설정파일)
  • srcs/wp-config.php : var/www/html/wordpress/wp-config.php
    (mysql의 wordpress DB 설정파일)
  • srcs/run.sh : 그 외 프로젝트 설정을 위해 실행했던 모든 명령어들

 

Container 내부의 파일들을 HostOS/srcs 디렉토리로 복사

위에서 작성한 nginx 설정파일, php 설정파일, 워드프레스 설정파일을 ./srcs로 옮긴다.

docker cp [container name]:[container 내부 경로] [host 파일경로]

 

Dockerfile 작성하기

내가 작성한 도커파일 예시는 아래와 같다.

웹 서버는 Nginx를 통해 구축할 것이며, 호스트에서는 MySQL을 이용해 제작한 데이터 베이스에 접근할 수 있는 워드프레스 웹사이트와 phpmyadmin을 구동할 수 있어야 한다.

# a basis of image
FROM	debian:buster

# label
LABEL	maintainer="taeekim@student.42seoul.kr"

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

# copy content
COPY	./srcs/run.sh ./
COPY	./srcs/default ./tmp
COPY	./srcs/wp-config.php ./tmp
COPY	./srcs/config.inc.php ./tmp

# port
EXPOSE	80 443

CMD 	bash run.sh
  • FROM
    • 새 작업을 시작할 베이스 이미지를 지정한다.
    • 유효한 Docker 파일은 FROM 명령으로 시작해야 한다. 반드시 한번 이상 입력해야 한다.
    • 우리 과제에서는 debian:buster로 설정하여 Debian OS의 배포판으로 지정한다.
      (예를 들어 Ubuntu:14.04는 Ubuntu OS의 14.04버전을 기본 이미지로 사용한다는 의미다.)

  • LABEL
    • 이미지에 메타데이터를 추가한다.
      • 이미지의 버전 정보, 작성자, 코멘트와 같이 이미지 상세 정보를 작성해두기 위한 명령이다.
      • 도커 공식문서에 따르면 기존의 MAINTAINER 명령어(Image의 author필드를 설정)는 deprecate 되었다.
      • 대신 LABEL 명령을 사용하면 더 유연하게 메타 데이터를 설정할 수 있으며 쉽게 확인해볼 수 있다.
    • 아래 명령어로 이미지의 메타데이터를 확인할 수 있다.
      docker image inspect --format="{{ .Config.Lables }}" [이미지명]
  • RUN
    • 새 이미지 레이어를 만들어 명령을 실행하고 결과를 커밋한다.
    • 백슬래시(\)를 사용하여 다음 줄에 RUN 명령을 계속할 수 있다.
    • 주의 : 항상 apt-get update 와 apt-get install는 같은 RUN 실행줄에서 동시에 실행해 캐싱 문제를 방지한다.
      (같은 결과를 가져오더라도 RUN을 여러줄로 작성하면 image layer가 여러개 생성되고, RUN을 한줄로 작성하면 image layer가 하나 생성된다. 이 포스트 참고)
  • COPY
    • 호스트OS의 파일 또는 디렉토리를 컨테이너 안의 경로로 복사한다.
    • ft_server 과제를 위해 작성한 설정 파일들을 이 명령어로 미리 tmp 에 넣어두고, 추후 스크립트 파일이 tmp 디렉토리의 복사본 파일을 사용할 것이다. 
  • EXPOSE
    • 호스트에 연결된 컨테이너의 특정포트를 노출시킨다.
    • 해당 컨테이너가 런타임에 지정된 네트워크 포트에서 수신 대기중이라는것을 알려준다.
    • 일반적으로 dockerfile을 작성하는 사람과 컨테이너를 직접 실행할 사람 사이에서 공개할 포트를 알려주기 위해 문서 유형으로 작성할 때 사용한다.
    • EXPOSE를 두 번 작성하지 않고, EXPOSE 하나로 포트 번호를 두 개 이상 동시에 설정할 수 있다.
    • EXPOSE 명령 자체가 작성된 포트를 실행하여 listening 상태로 올려주지는 않기 때문에, 노출시킨 포트를 외부에 공개하려면
      docker run 에서 -p 옵션을 사용해야 한다.
      docker run -p 80:80/tcp -p 80:80/udp 등
    • docker run 명령의 --expose list 옵션과 동일하다.
    • http는 80, https는 443이 기본 포트다.
    • 프로토콜을 지정하지 않으면 기본값은 TCP다.
  • CMD
    • 컨테이너가 시작될 때 실행할 쉘 명령어(command)로서, Dockerfile에서 한번만 사용할 수 있다.
    • 도커 파일에 CMD가 두 개 이상 있는 경우 마지막 CMD만 유효하다.

 

빌드 자동화를 위한 쉘 스크립트 작성하기

쉘 스크립트는 쉘 명령어를 한줄씩 순차적으로 읽어 실행되도록 작성된 프로그램이다.

.sh 확장자를 가진 파일이다.

srcs에 default, config.inc.php, wp-config.php, run.sh가 있도록 한다.

 

작성법은 아래와 같다.

  • 헤더
    • 아래 내용을 파일 상단에 써주면, 뒤에 나오는 코드를 모두 bash 명령어로 인식한다.
#!/bin/bash
  • 개행
    • 모든 명령어는 개행을 기준으로 순서대로 실행된다.
  • 주석
    • # 을 사용한다. 
  • 변수
    • = 를 이용해서 선언하고 ${변수명}으로 사용한다.
    • = 는 공백 없이 붙여써야한다.
    • "" 로 감싸서 사용하면 더 안전하다. (문자열에 공백도 포함해서 값을 이용할 수 있기 때문이다.)
    • 지역변수에는 local을 붙인다.
#!/bin/bash

test="abc"
num=100

echo "${test}"
echo "${num}"
  • 백그라운드 실행
    • 한 명령어를 실행하는 동안 다른 명령어를 수행하고 싶다면 & 를 사용하면 된다.
[파일명] &

 

실행방법은 간단하다.

$ ./파일명
$ sh 파일명
$ bash 파일명

 

Dockerfile로 Image 빌드하기

build 명령어의 사용법은 아래와 같다.

docker build [OPTIONS] PATH | URL | -

 

이미지를 빌드할때 –t 옵션을 주면 저장소 이름과 태그 정보까지 같이 생성할 수 있다.

-t(tag) 옵션은 이미지 이름과 태그(태그는 옵션)를 'name:tag' 형식으로 지정해줄 수 있는 옵션이다.

더보기

예를 들어 아래처럼 하면 dockerbook이라는 저장소에 stable이라는 태그를 가진 이미지가 생성된 걸 확인할 수 있다.
docker build -t dockerbook:stable  ./

 

Dockerfile이 있는 디렉토리에서 빌드를 실행하려면 아래와 같이 하면 된다.

이 명령이 입력되면 docker는 현재 디렉토리에 Dockerfile이 있는지 확인한 다음에 그 Dockerfile을 이용해서 이미지를 빌드한다. 

docker build ./

 

아래처럼 빌드할 때 localhost에 접속할 수 있다면 성공이다.

docker build . -t ft_server
docker run -it -p80:80 -p443:443 ft_server

 

ft_server 과제 요구사항 체크하기

 

 


apt-get

티스토리 ithuman ithuman.tistory.com/entry/aptget-update-aptget-upgrade-%EB%AA%85%EB%A0%B9

FALINUX 포럼 forum.falinux.com/zbxe/index.php?document_srl=791534&mid=lecture_tip

 

debconf 에러

ubuntu manuals manpages.ubuntu.com/manpages/bionic/man7/debconf.7.html

 

tar.gz 압축파일

티스토리 복싱과 IT의 공생 suzxc2468.tistory.com/166

 

cp 옵션

티스토리 WEBDIR https://webdir.tistory.com/139

 

docker commit

블로그 opencvlib https://opencvlib.weebly.com/blog/docker-run

 

openssl 사용법

ssl.com 공식문서 www.ssl.com/ko/%EB%B0%A9%EB%B2%95/openssl%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EC%84%9C%EB%AA%85-%EC%9A%94%EC%B2%AD-csr%EC%9D%84-%EC%88%98%EB%8F%99%EC%9C%BC%EB%A1%9C-%EC%83%9D%EC%84%B1/

 

nginx.conf의 권한설정 (www-data)

opentutorials opentutorials.org/module/384/4530

stackoverflow stackoverflow.com/questions/9133024/www-data-permissions

 

쉘 스크립트 작성법

블로그 twpower twpower.github.io/131-simple-shell-script-syntax

 

과제 요구사항

42Seoul yeosong님 yeosong1.github.io/ft_server-%EC%B1%84%EC%A0%90-%EB%B0%A9%EB%B2%95

velog hidaehyunlee velog.io/@hidaehyunlee/ftserver-%EB%A7%88%EB%AC%B4%EB%A6%AC-Dockerfile-%EB%A7%8C%EB%93%A4%EA%B8%B0

댓글