[ft_server] 도커 설치.

kihkim·2021년 1월 14일
0

42seoul

목록 보기
3/5
post-thumbnail

ft_server 도전과제

소개
이 주제는 시스템 관리를 소개하기위한 것입니다. 그것은 당신을 인식하게 할 것입니다
작업을 자동화하기 위해 스크립트를 사용하는 것이 중요합니다. 이를 위해 당신은
"docker"기술을 사용하여 완전한 웹 서버를 설치합니다. 이 서버는 실행됩니다
다중 서비스 : Wordpress, phpMyAdmin 및 SQL 데이터베이스.

제 2 장
일반 지침
• 서버 구성에 필요한 모든 파일을 폴더에 저장해야합니다.
srcs라고합니다.
• Dockerfile 파일은 리포지토리의 루트에 있어야합니다. 그것은 당신의
컨테이너. docker-compose를 사용할 수 없습니다.
• WordPress 웹 사이트에 필요한 모든 파일은 srcs 폴더에 있어야합니다.

필수 부분

  • 1.하나의 docker 컨테이너에서만 Nginx로 웹 서버를 설정해야합니다. 그만큼 컨테이너 OS는 데비안 버스터 여야합니다.

  • 2.웹 서버는 여러 서비스를 동시에 실행할 수 있어야합니다. 서비스 WordPress 웹 사이트, phpMyAdmin 및 MySQL이 될 것입니다. 당신은 만들 필요가 있습니다
    SQL 데이터베이스가 WordPress 및 phpMyAdmin과 함께 작동하는지 확인하십시오.

  • 3.서버가 SSL 프로토콜을 사용할 수 있어야합니다.

  • 4.URL에 따라 서버가 다음으로 리디렉션되는지 확인해야합니다.
    올바른 웹 사이트.

  • 5.또한 서버가 자동 색인(Auto Index)을 사용하여 실행 중인지 확인해야합니다.
    비활성화 될 수 있습니다.

주의

  • - Verify if the server is running with an autoindex which can be deactivated when the container is launched (via an environment variable for example).
    : 컨테이너가 시작될 때 비활성화 할 수있는 자동 색인으로 서버가 실행 중인지 확인합니다. (예: 환경 변수를 통해.)

  • 나는 이 부분을 놓쳐서 리트라이 했다.ㅠㅠ
    오토 인덱스 기능을 환경 변수로 조절하는 방법도 공부하자.

뭐지.

  • 위에 나온 ft_server의 목표만 보면 도대체 뭐를 하라는 건지 모르겠다.
  • 대충 이해해보자면 docker라는 컨테이너에서 Nginx(엔진엑스)라는 웹 서버를 이용해 서버를 열라는 소리같다.
  • 그리고 서버에 접속하면 워드프레스나 phpMyadmin MySQl 같은 서비스도 사용할 수 있게 구축하라고 한다.
  • 처음 보는 개념이 많아서 막막하지만 시도해보자.

현재 사용자 환경

  • 윈도우의 우분투(Ubuntu 20.04.1 LTS) 사용.
  • WSL2(Linux용 윈도우 하위 시스템) 사용.

우분투 도커 설치

  • 우분투의 터미널 내에서 다양한 도커 서버의 터미널에 접속하기 위함.
  • 우분투 도커는 자신이 원하는 이미지를 만들거나 불러올 때 사용한다.
  • 물론 docker for windows로도 이미지를 만들 수 있지만, 세세한 설정을 하려면 우분투 도커를 설치하고, 명령어로 만들어야 한다.

1. 설치 환경 구성

  • 우선 우분투 내부에서 도커를 설치해야하므로, 우분투의 설치툴이 정상적인지 확인 한다.
  • sudo apt-get update 명령어를 실행.
  • sudo apt-get upgrade

[정보]apt와 apt-get 두가지 명령어 중에 무엇을 써야할까?

이름장점단점
apt설치시 진행바가 나옴.apt-get에 비해 기능이 제한됨.
apt-get라이브러리 설치할 떄, 에러가 적음.설치할 떄, 진행바 안 나옴.

2. 우분투 내부 도커 설치.

- sudo apt update
- sudo apt install apt-transport-https ca-certificates curl software-properties-common
-curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
-sudo apt update
-apt-cache policy docker-ce
-sudo apt install docker-ce
  • 위의 명령어를 차례대로 수행해, 도커 설치.
  • sudo systemctl status docker 또는 sudo service docker status로 활성화 여부 확인.
  • sudo service docker restart로 도커 실행.

윈도우 도커 설치

  • 우분투 도커만으로도 서버를 열고 관리하는 것이 가능하지만, 좀 더 좋은 UI로 관리할 수 있는 윈도우 도커도 추가 설치한다.

1.docker for windows 설치.

  • 튜토리얼대로 진행하면 자동으로 필요한 파일을 설치해준다.
    아마도 이미지나 컨테이너 파일을 받아오는게 아닐까;;

맥OS(클러스터) 도커 설치.

  • 1.클러스터 PC 용량 제한으로 인한 도커 설치 불가능
    클러스터의 맥PC에는 용량이 심하게 제한되어 있다.
    그래서 처음에 맥에 도커를 설치하려고 도커 홈페이지에 접속해 받았는데, 용량 부족으로 다운로드에 실패했다.
    다른 방법이 있나 찾던 중, managed software center를 이용하면 된다는 것을 깨달았다.
    managed software center는 맥에 자체적으로 설치되어 있다.
    대충 APP STORE와 비슷한 개념이라고 보면 됨.
    그래서 맥 PC 하단에 매니저 소프트웨어 센터 아이콘을 누르고 들어가서 도커를 찾아 설치했다.
    (참고로 이미 설치되어 있을 경우엔 굳이 설치할 필요는 없다.)

  • 2.클러스터 PC 용량 제한으로 인한 이미지 빌드 불가능

  • 마찬가지로 용량 문제 때문에, 우리는 Dockerfile을 빌드 할 수 없다.(빌드 한 이미지 용량만 100메가 넘게 나오기 때문.)
    맥OS에서 goinfre라는 폴더가 있다.
    여기서는 용량 제한이 Desktop 폴더에 비해 비교적 널널하기 때문에 여기에서 빌드를 하면 용량 제한에 걸리지 않는다.
    그래서 우리는 42-toolbox를 이용한다.(https://github.com/alexandregv/42toolbox)
    툴박스 기능 중에 도커를 초기화하는 스크립트가 있다.
    그것을 사용하면 자동으로 도커 관련 파일들을 goinfre랑 링크를 해주기 때문에, 마음껏 이미지를 빌드해도 된다.
    (도커 초기화 스크립트는 도커가 설치되어 있어야 작동한다.)

debian buster 설치.

  • docker pull debian:buster로 docker hub에서 이미지 받아오기.
    (docker images를 해보면 debian이라는 이미지가 추가됨을 알 수 있다.)
  • docker run -it -p 80:80 -p 443:443 debian:buster하여 데비안을 OS로 하여 터미널에 접속한다.
    (명령어 -i와 -t로 터미널에 접속, 입출력 가능)
    (http로 접속해야 하기에 -p 80:80으로 80포트 개방._
    (ssh(https) 보안을 사용해야 하기에 -p 443:443으로 443포트도 개방.)
    [추가] 만약 컨테이너 이름을 설정하고 싶으면 --name 옵션을 사용하면 된다.
    ex) docker run -it --name test_container -p 80:80 debian:buster
  • 위에서 docker run 명령어를 하면 컨테이너가 생성되는 것과 동시에, 컨테이너를 활성화 시킨다.
  • 이 경우엔 Dockerfile로 미리 설정해둔 것이 없으므로, 아무 것도 설치되어 있지 않다.
    (nginx가 없음) (텅 빈 순정 상태)

nginx 설치.

  • 이후 나온 데비안 터미널 창에서 cat /etc/issue을 해보면 현재 운영체제(OS)와 버전을 확인할 수 있다.
  • 텅 빈 데비안 OS에 nginx라는 서버 소프트웨어를 설치해 보자.
  • 이것을 통해 서버의 프론트엔드 기능을 조작할 수 있다.
  • 데비안 터미널에서 apt-get install nginx로 nginx 설치.
  • 다만 이것이 첫 시도라면 E: Unable to locate package nginx에러에 걸릴 수 있다.
  • 안된다면 apt-get update && apt-get upgrade로 apt 툴을 보완 후 시도해보자.

nginx 서버 열기.

  • 이제 service nginx start를 해서 서버를 연다.
  • 인터넷에서 localhost:80주소로 접속하면 자신이 연 서버를 볼 수 있다.
  • nginx의 페이지 배경은 /usr/share/nginx/html의 index.html 파일을 통해서 바꿀 수 있다. (내 경우엔 welcome nginx 부분을 welcome 42seoul로 바꿔보았다.ㅎㅎ)

SSL

1. openssl 설치

apt-get -y install openssl

2. 개인키 및 인증서 생성 방법1(간단하게 한 번에.)

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

2-1 개인키 및 인증서 생성 방법2(하나씩 정확하게.)

2-2 개인키 생성(.key)

  • 명령어는 genrsa로 .key를 생성한다.

패스워드 없는 걸로.
openssl genrsa -out server.key 2048

  • -2048 : 2048bit의 RSA 인증서를 의미.

패스워드 있는 걸로.
openssl genrsa -des3 -out server.key 2048

  • -des3 옵션은 개인키를 만들기 전에 지정한 방식으로 암호화를 합니다.
    암호화를 풀기 위해서는 지정한 패스워드를 입력해야 합니다.
des3란?
  • DES는 암호화 방법이고 DES3 (트리플 DES라고도 함)는 암호화를 강화하기 위해 연속으로 3 번 실행되는 동일한 방법입니다.

  • DES3는 많이 사용되는 표준입니다 ( -des3). 예를 들어 브라우저가 포트 443 (SSL)으로 리디렉션 될 때 RSA 키 교환 후 나머지 기간 동안 DES3가 사용됩니다 (RSA 키와 함께).

출처: https://stackoverflow.com/questions/25459512/what-is-diffrent-between-rsa-and-rsa-des3 (갓택 오버플로우)

2-3 인증요청서 생성(.csr)

openssl req -new -key server.key -out server.csr
명령어는 req로 .csr을 생성한다.

Country Name : 이것은 두 자로 된 ISO 형식의 국가 코드입니다.
State or Province Name : 시 이름을 입력해야 하며 약어를 사용할 수 없습니다.
Locality Name : 이 필드는 대부분의 경우 생략이 가능하며 업체가 위치한 곳를 나타냅니다.
Organization : 사업자 등록증에 있는 회사명과 일치되는 영문 회사명을 입력하시면 됩니다.
Organization Unit : "리눅스 관리팀", "윈도우 관리팀" 등과 같이 업체의 부서를 입력할 수 있습니다.
Common Name : 인증받을 도메인 주소를 입력하시면 됩니다.

A challenge password : 뭔지 몰라서 엔터 쳤어용.
An optional company name : 뭔지 몰라서 엔터 쳤어용.

2-4인증서 생성(.crt)

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

  • days 3650 : 3650일, 즉 10년의 효력을 가진 인증서를 뜻한다.
  • -in server.csr -signkey server.key -out server.crt :
    위에서 만든 인증요청서(.csr)와 개인키(.key)를 사용해 인증서(.crt)를 만들겠다는 의미.

참고 사이트.

3. 권한제한

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
  • 권한을 600으로 하는 이유.
    권한을 600으로 하면 사용자만 이 파일을 쓰고, 읽을 수 있다. (4 = 읽기, 2 = 쓰기, 1 = 실행.) ( 6 = 읽기 + 쓰기)
    즉, 사용자를 제외하면 아무도 보안키와, 인증서에 간섭하지 말라는 의미.

4.포트 리다이렉션(포트 포워딩)

  • 1.apt-get install vim으로 편집 프로그램인 vim을 설치한다.

  • 2.vim etc/nginx/sites-available/default 파일을 수정한다.(nginx 설정 파일)
    여기서 홈페이지의 포트와 ssl 설정을 추가할 것이다.

  • 3.보면은 이미 80포트로 nginx 설정이 되어있는데, 80포트 server 함수의 끝에 return 을 추가한다.
    return 301 https://$host$request_uri;
    이건 HTTP를 HTTPS로 리다이렉트 시킨다는 뜻이다.

  • 301 리다이렉션: HTTP 응답 상태 코드 301 Moved Permanently는 영구적인 URL 리다이렉션을 위해 사용된다.
    이 새 URL은 응답에 포함된 위치 필드에 지정되어야 한다.
    301 리다이렉트는 사용자가 HTTP를 HTTPS로 업그레이드하게 만드는 최상의 방법으로 간주된다.

  • 4.밑에 HTTPS 서버 설정을 따로 추가한다.

server {
	listen 443 ssl;
	listen [::]:442 ssl;

	ssl on;
	ssl_certificate /etc/ssl/certs/localhost.dev.crt;
	ssl_certificate_key /etc/ssl/private/localhost.dev.key;
}
  • html이나 서버 이름은 이미 위에서 설정해두어서 딱히 추가할 필요는 없을 것 같다.

확인.

  • 이렇게 포트 포워딩이 끝났다.
  • localhost:80으로 접속하면 자동으로 443포트로 접속된다.(이때, 주소를 보면 포트는 없는 localhost라고 뜸.)
  • 당연히 localhost:443으로 접속해도 됨.(가끔 localhost:443하면 에러가 뜨기도 하는데, localhost:80으로 접속하고 다시 443으로 접속하면 된다.)

정말로 SSL이 적용이 된건가?

  • localhost로 접속하면 크롬브라우저에서 URL창 옆에 빨간 경고 표시와 함께 https 보안 연결이 사용되지 않는다고 나와있다.
  • 다만 이것은 openssl(SSL)을 설치하기 이전에는 뜨지 않았으므로, https 설정이 된 것은 맞다고 생각한다.
    (실제로 url 주소도 https://localhost로 되어있다., 다만 https부분에 빨간줄이 그어져있다.)
  • 저런 경고가 뜨는 이유는 https가 적용이 되었으나, 현재 컴퓨터가 ssl의 인증서 요청을 하지 않았기 때문인 것 같다.

인증서 요청해보기.

  • 검색해보니까 그냥 당연한 거였다.
  • 경고 창을 클릭하여 인증서 정보를 보니 신뢰할 수 없는 인증서라고 나타났다.
  • 즉, 인증서는 이미 있었다.
  • 그리고 인증서는 CA루트에서 인정한 것만 허용되는데, 나같은 경우에는 openssl에서 받은 사설 인증서를 사용했으니 신뢰할 수 없다고 뜨는게 당연했다.

AutoIndex

  • 오토인덱스는 서버에서 지정한 html파일이 존재하지 않을 경우, 사용자 스스로가 서버 디렉토리에 있는 html 파일에 접근할 수 있는 기능을 말하는 거라고 생각한다.
  • 예를들어 서버는 index.html이라는 파일을 사이트에 출력해야 한다.
    그런데 호스트가 실수로 파일 이름을 inde.html로 해서 사이트에 문제가 생겼다.
    이 경우에 autoindex를 통해 임시조치를 취하는 거라고 생각핟다.

적용방법.

  • 오토인덱스는 nginx의 자체 기능이기에 딱히 따로 설치할 필요가 없다.
  • /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 [::]:442 ssl;

	ssl on;
	ssl_certificate /etc/ssl/certs/localhost.dev.crt;
	ssl_certificate_key /etc/ssl/private/localhost.dev.key;

	root /var/www/html;

	index index.html index.nginx-debian.html

	server_name ft_server;
	location / {
		autoindex on;
		try_files $uri $uri/ =404;
	}
}

추가 기능은 새로 만든 443 server 함수에 넣자. (중요)

  • 기존에 80포트 함수 부분에 있는 기능인 root 디렉토리와, html 목록을 주석처리 해줘야 한다.
root /var/www/html;
index index.html index.nginx-debian.html
  • 왜냐하면 80포트 server 함수의 역할은 그냥 80포트로 들어오면 443포트로 넘기는 역할이다.
    그 이외에 기능이 들어가더라도 443포트로 이동하는 과정에서 몽땅 사라짐.
    그래서 root디렉토리, 기본 html설정, php 등, 기능은 아래에 새로 만든 443 server 함수에 추가해야 한다.

확인.

  • 실제로 /etc/nginx/sites-available/default파일에서 나열된 html파일들을 주석처리하고 접속하니, index of라는 제목과 함께 html파일을 선택할 수 있는 창이 떴다.
  • [실험]그러면 오토인덱스가 꺼져있으면 어떻게 될까?
  • 403 Forbidden이라는 에러와 함께 html파일을 선택조차 할 수 없다.

서비스 적용하기.(MariaDB, wordpress, phpMyAdmin)

  • 워드프레스: 설치형 블로그, CMS(Content Management System: 컨텐츠 관리 시스템), 쉽게 말해 사이트 제작 오픈소스 툴이다.
  • MySQL: 데이터베이스의 한 종류.
  • phpMyAdmin: 웹상에서 MySQL 데이터 베이스를 관리하기 위한 도구.

MariaDB

  • mysql이 아닌 MariaDB를 사용하는 이유.
    현재 사용 중인 OS가 데비안 버스터이다. (정확히는 데비안 버스터 10)
    문제는 데비안 환경은 데비안 8에서 9로 바뀌면서, 기본 DB가 MariaDB로 바뀌었다는 것이다.
    어차피 mysql과 용량이나 기본 명령어는 똑같으므로 MariaDB를 설치하자.

  • 설치
    apt-get -y install mariadb-server php-mysql php-mbstring

php-fpm 설치.

  • 워드프레스와 phpmyadmin은 동적 프로그램이다.(블로그의 게시물 게시나, 로그인 같은 것 담당)
  • php-fpm은 정적만 허용하는 데비안에서 동적인 활동을 가능하게 해주는 툴이다.
  • 설치
    apt-get install php-fpm

nginx와 php-fpm 연결.

  • vim /etc/nginx/sites-available/default 파일에서 아래 항목을 추가한다.
root /var/www/html;

index index.html index.php;

location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    }
  • location ~ \.php$ 부분에서 역슬래시가 안되면, 을 써도 된다.
  • 수정하고 service php7.3-fpm start해서 정상 작동되면 이상없는 것.
  • [정보] 참고로 서비스를 설치하고 한 번도 실행한 적이 없는데, restart 기능을 사용하면 무조건 fail이 뜬다. (처음 설치한 서비스는 start를 사용하자.)
  • index.php를 반드시 추가하자.
    추가하지 않으면 wordpress 화면을 불러올 수 없다.

wordpress 설치.

wget?

  • wget은 http나 https 같은 와이드 웹의 다운로드 주소를 통해 내려받는 도구다.
  • apt-get install -y wget

1. 설치 및 압축해제

wget https://wordpress.org/latest.tar.gz
tar -xvf latest.tar.gz
mv wordpress/ /var/www/html/

2. 유저 그룹 권한설정

chown -R www-data:www-data /var/www/html/wordpress

  • nginx.conf를 보면 user로 www-data가 작성되어있다.
    cat /etc/nginx/nginx.conf
  • 이 명령어는 wordpress의 유저 그룹을 그에 맞게 설정해준 것이다.

www-data는 무엇인가.

  • www-data: php 실행시 수정이 가능한 권한.(우분트의 데몬 실행 권한.(?))
    대충 root보다 보안은 좋지만, 기능이 제한된 유저 권한이라 생각하면 될 듯.
  • https://kldp.org/node/141854

유저 그룹 변경 전 (ls -al)
drwxr-xr-x 5 nobody nogroup 4096 Apr 15 02:08 wordpress

유저 그룹 변경 후 (ls -al)
drwxr-xr-x 5 www-data www-data 4096 Apr 15 02:08 wordpress

3.mysql과 wordpress의 연결.

  • mysql로 마리아DB접속.
    만약 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)이런 에러가 뜬다면
    service mysql status로 서비스가 실행 중인지 확인하자.

3-1DB 생성.

  • CREATE DATABASE <추가할DB이름>;

3-2유저 생성.

  • CREATE USER 유저이름@localhost;

3-3비밀번호 생성.

SET PASSWORD FOR 유저이름@localhost= PASSWORD("비밀번호");

3-4 권한 부여.

  • 이제 앞서 만들어둔 데이터베이스에대한 권한을 새로운 사용자에게 부여해줘야하는데요.
    특정 DB에대한 읽기, 쓰기 모든 권한은 아래 형태로 부여해줍니다.
    GRANT ALL PRIVILEGES ON 데이터베이스이름.* TO 유저이름@localhost IDENTIFIED BY ‘비밀번호’;

4. wp-config.php 파일 수정

  • wp-config-sample.php 을 복사해 wp-config.php 를 만든다.
cp -rp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php 
  • wp-config.php 파일의 DB_NAME, DB_USER, DB_PASSWORD 3가지 항목을 수정해준다.
    (위의 mysql에서 작성한 값 그대로 작성한다.) (vim wp-config.php 로 수정.)

5.확인

  • 이제 localhost/wordpress에 들어가서 정상적으로 되는지 확인한다.
  • [에러1]만약 정상적인 접속이 되지 않는다면, 서비스를 점검해보자.
service nginx reload
service php7.3-fpm restart
service mysql restart
  • [에러2]만약 localhost/wordpress주소가 /var/www/html/wordpress와 겹쳐서 오토 인덱스로 접속되었을 때.
    이건 wordpress가 동작하지 않거나, php화면을 불러올 수 없다는 소리다.
    vim /etc/nginx/sites-available/default에서 index 리스트에 index.php가 추가되어 있는지 확인해 보자.

  • [에러3]만약 wordpress에 접속은 되지만, wp-config.php Error establishing a database connection에러가 뜬다면 mysql의 값과 wp-config.php의 값이 다른 것이다.

phpMyAdmin

  • 데이터베이스를 GUI로 편하게 다룰수 있게 해주는 툴.
  • 설치
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/

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

  • 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

$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

blowfish는 암호 알고리즘이다.

위에서 ssl키를 만드는 데 사용한, DES 같은 거.

  • nginx 재시작(service nginx reload)

  • phpmyadmin/sql 폴더의 create_table.sql 파일을 mysql로 리다이렉션 시켜준다.
    phpmyadmin에 mysql의 정보를 넣어주는 것.
    mysql < /var/www/html/phpmyadmin/sql/create_tables.sql

  • localhost/phpmyadmin으로 접속을 하니까 로그인 창이 성공적으로 나왔다.

phpmyadmin으로 무엇을 할 수 있는가.

  • phpmyadmin은 wordpress와 연동되어 있다.
    wordpress(블로그)를 관리 할 때, phpmyadmin라는 데이터베이스라는 표의 형태로 편하게 관리 할 수 있다.

  • 글 삭제, 변경
    wp_posts 항목에 들어가면 사용자가 올린 항목을 볼 수 있다.
    우리는 블로그 관리자 이므로 이것을 마음대로 변경할 수 있다.

  • 사용자 탈퇴, 생성
    wp_user 항목에 들어가면 이 블로그에 가입한 사용자 목록을 볼 수 있다.
    여기서 슈퍼 계정을 만들거나, 계정을 삭제할 수 있다. (아마도?)

Dockcerfile 제작.

  • ft_server에서 제시한 모든 기능을 추가했다.
  • 이제 Dockerfile이라는 파일을 만든다.
  • Dockerfile을 하면 위에서 했던 모든 과정들을 자동화 할 수 있다.

이미지를 빌드.

  • 기본 형식: docker build [OPTIONS] PATH | URL | -
  • docker build . -t ft_sss1 나는 이 명령어를 사용했다.
  • docker build : 기본적인 도커 빌드 명령어.
  • . : 도커파일이 있는 위치. (.이므로 현재 자신이 있는 경로를 뜻함.)
  • -t는 이미지의 이름을 따로 정하겠다는 옵션이다.
  • ft_sss1 : 내가 정한 이미지의 이름.
  • 도커파일을 만들고, 빌드할 때 사용.

FROM

  • 어떤 운영체제를 사용할 것인지 묻는 Dockerfile명령어.
  • 내 경우엔 데비안 버스터를 사용하므로, Dockerfile 첫번째 줄에 FROM debian:buster을 입력하자.
  • 물론 가지고 있는 이미지에 debian이 있어야 가능하다.(docker pull debian:buster)

RUN

  • 우리는 RUN 명령어를 통해 nginx 파일을 설치할 것이다.
    RUN ["apt-get", "install", "-y", "nginx"]

RUN VS CMD 차이.

이름특징사용처
RUN실행한 결과가 컨테이너의 Layer에 추가됨.패키지 설치.
CMD말 그대로 cmd. 쉘 내부의 명령과 차이 없음.설정 파일 조절.

ssl 설정.

  • 내 경우엔 미리 RUN을 통해서 openssl을 설치했다.
  • ex) RUN ["apt-get", "install", "-y", "openssl"]
  • 이제 CMD 명령어를 통해 인증서와 개인키를 만들고, 권한을 주자.
CMD openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=Lee/CN=localhost" -keyout localhost.dev.key -out localhost.dev.crt
CMD mv localhost.dev.crt /etc/ssl/certs/
CMD mv localhost.dev.key /etc/ssl/private/
CMD chmod 600 /etc/ssl/certs/localhost.dev.crt /etc/ssl/private/localhost.dev.key
  • 문제가 생겼다.
  • 이미지를 빌드하고 컨테이너를 실행하니까, 에러가 났다.
chmod: cannot access '/etc/ssl/certs/localhost.dev.crt': No such file or directory
chmod: cannot access '/etc/ssl/private/localhost.dev.key': No such file or directory
  • 인증서와 개인키를 찾지 못했다는 뜻이다.
  • 즉 인증서와 개인키를 생성하는, 첫번째 줄 CMD 명령어가 먹히지 않았다는 뜻이다.
  • 아무래도 명령어가 너무 길면 인식이 안 되는 듯하다.
    아니면 openssl이라는 명령으를 인식하지 못했거나.
  • 다행히 다른 해결책을 알고 있다.

run.sh에 명령어 넣기.

  • run.sh라는 파일을 만들고 여기다가 위에서 말한 CMD 명령어를 입력하여, 모든 명령어가 담긴 쉘 파일을 만든다.
  • run.sh파일을 src폴더에 넣고, CMD로 쉘 파일을 실행하면 된다.

Dockerfile

CMD run.sh

run.sh

#!/bin/bash

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

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

bash

#!/bin/bash의 의미.

  • 다른 쉘 스크립트를 봐도 대부분 첫줄에 저런 주석을 기재하곤 한다.
  • #!/bin/bash은 주석이 아니다.
  • '#'이 있어서 주석 처리되는 것처럼 보이지만, 저것은 엄연히 실행되는 명령어다.
  • 역할은 '현재 .sh 파일을 어떤 쉘로 실행시킬까?'라는 뜻이다.
  • 내 경우엔 /bin/bash이므로 bash쉘로 실행하겠다는 뜻이다.
  • bash이외에도 tcsh, ksh, sh, csh 등이 있다.
  • 참고로 bash와 sh는 심볼링 링크로 연결되어 있다. 즉 같은 의미이므로 아무거나 써도 된다.
  • [실험] 궁금해서 #!/bin/bash빼고 실행해봣는데, 딱히 달라진 건 없었다.
  • [실험] 마지막 줄에 있는 bash를 빼니까 작동이 되지 않았다. (어떤 역할을 하는지 알고 싶지만, 검색해도 나오지 않음)

COPY (PC의 파일을 컨테이너 내부로 옳기기)

  • COPY는 호스트의 파일을 컨테이너 안의 경로로 복사하는 DOCKER 명령어다.
  • 우린 /etc/nginx/sites-available/default 파일을 바꿔치기 해야한다.
  1. Dockerfile이 있는 경로에 src라는 폴더를 생성.
  2. src 폴더 안에 이미 완성된 default 파일을 넣는다.
  3. Dockerfile에 COPY src/default /etc/nginx/sites-available/default 명령어 삽입.
  4. 끝.

[정보] 참고로 도커 내부의 파일을 호스트로 옳길 떄는 docker cp 기능을 사용했다.

어째서 파일을 옳겨야 하는가?

  • 옳겨야 할 파일은 3가지다.
  • default(ssl, autoindex, php 등 여러 동적인 기능을 nginx에서 사용하겠다는 파일)
  • config.inc.php(PhpMyAdmin관련 파일, 미리 만든 blowfish 번호가 담겨 있다.)
  • wp-config.php(Wordpress관련 파일, 마리아 DB의 사용자 정보를 담고 있다.)
  • 이 파일들은 사용자가 직접 수정해야 하는 파일들이다.
  • Dockerfile이란 자동화에서 수정 작업을 할 수 없으니, 아예 완성품을 미리 받아와서 복사해 사용하는 것.

mysql

mysql을 쉘(.sh)에서 동작하기.

echo "쿼리;" | mysql -u"root" -p"비밀번호"

위 명령어는 다음과 같다.
 echo "쿼리; " : "쿼리;"를 출력한다.
| : 파이프, 앞 명령어의 내용을 뒷 명령어의 표준 입력으로 넣는다
이름데비안 버스터run.sh
mysql 접속하기mysqlmysql -u"root" -p"비밀번호"
mysql 데이터베이스 보기.show databases;`echo "show databases;"
  • 다만 이렇게 할 경우 아래처럼 컨테이너를 실행할 때마다 암호를 확인하라는 메세지가 뜬다.
[ ok ] Starting MariaDB database server: mysqld.
Enter password:
Enter password:
Enter password:
Enter password:
  • 그냥 엔터를 누르면 넘어가긴 하지만 이 과정도 귀찮으므로 비밀번호를 패스한다.
  • 방법1. mysql -u root --skip-password
  • 방법2. mysql -u root
  • --skip-password이 있고 없고의 차이는 잘 모르겠지만 둘 다 사용해도 넘어가졌다.

run.sh

# wordpress를 위한 DB 테이블 생성

service mysql start
echo "CREATE DATABASE IF NOT EXISTS wordpress;" \
	| mysql -u root --skip-password
echo "CREATE USER IF NOT EXISTS 'pisciner'@'localhost' IDENTIFIED BY 'pisciner';" \
	| mysql -u root --skip-password
echo "set password for pisciner@localhost= password('1234');" \
	| mysql -u root --skip-password
echo "GRANT ALL PRIVILEGES ON wordpress.* TO 'pisciner'@'localhost' WITH GRANT OPTION;" \
	|  mysql -u root --skip-password

phpMyAdmin

phpMyAdmin을 run.sh(Dockerfile)을 이용해 자동 설치.

apt-get install -y wget
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/
  • 이전에도 한 번 설치했을 때, 사용한 명령어를 단순히 run.sh에 붙여넣기 하면 된다.
  • 그러면 실행할 때마다 위 코드를 자동으로 실행시켜 설치가 된다.

blowfish 암호 설정.

  • 이전에 다른 컨테이너에서 실험을 할 때, blowfish 암호 생성 사이트 에서 키를 생성/복사한 뒤 config.inc.php에 입력하여 사용했다.

  • 저번에 만들었던 config.inc.php 파일을 호스트 밖으로 불러와 srcs에 집어넣어 사용한다.

  • 1.저번에 만든 config.inc.php 파일 밖으로 뺴내기.
    docker cp [container name]:[container 내부 경로][host 파일경로]
    docker cp second_debian:var/www/html/phpmyadmin/config.inc.php ./srcs
    (second_debian은 이전에 실험으로 사용한 blowfish 암호 파일을 생성했던 컨테이너 이름이다.)

  • 2.빼낸 파일을 자동으로 삽입하도록, Dockerfile에 명령어 입력.
    (temp 폴더에 config.inc.php파일 복사)
    (복사한 파일에는 이전에 만들고 넣은 암호가 들어있다.)

Dockerfile.

COPY srcs/default /etc/nginx/sites-available/default
COPY ./srcs/run.sh ./
COPY ./srcs/wp-config.php temp/wp-config.php
COPY ./srcs/config.inc.php temp/config.inc.php

run.sh.

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 -rp ./temp/config.inc.php var/www/html/phpmyadmin/config.inc.php
  • [정보] 여기서 config.inc.php 파일을 왜 굳이 temp파일에 넣고 run.sh에서 다시 var/www/html/phpmyadmin/ 에 넣는지 궁금할 것이다.
  • Dockerfile에 있는 COPY 명령어는 run.sh보다 더 빨리 실행된다.
  • 즉, COPY 명령어와 phpMyAdmin을 설치하는 과정에서 파일 경로 충돌이 나지 앉게 하기 위함이다.
  • (아직 phpmyadmin이 설치 되지도 않았는데 var/www/html/phpmyadmin폴더가 있는 것은 극히 이상한 일이니까.)

phpmyadmin에 DB데이터 넣기.

  • 아직 끝이 아니다.
  • 이전에도 했던 것처럼 phpmyadmin/sql 폴더의 create_table.sql 파일을 mysql로 리다이렉션 시켜야 한다.(phpmyadmin에 mysql의 정보를 넣어주는 것.)
  • run.sh에 명령어 추가.
    mysql < var/www/html/phpmyadmin/sql/create_tables.sql

실행.

phpMyAdmin - 오류(권한 오류)

  • 설정 파일에 잘못된 권한이 지정되어있습니다. 익명 쓰기 권한이면 안됩니다!
  • 사이트에 들어가니까 위와 같은 오류 메세지가 뜬다.
  • 말 그대로 phpMyAdmin 관련 파일 중에서 익명 쓰기 권한으로 설정된 것이 있는 듯 하다.
  • 우리는 당연히 어떤 파일이 잘못됐는지 알고 있다. =>config.inc.php
  • ls -al로 확인해 보았다.
-rw-r--r--  1 root root 162473 Mar 21  2020 composer.lock
-rwxrwxrwx  1 root root   4573 Feb  9 13:18 config.inc.php
-rw-r--r--  1 root root   4541 Mar 21  2020 config.sample.inc.php
  • 보시다시피 요 파일만 권한이 과하게 설정되있다.

  • chmod 명령어를 통해 고쳐주자.
    chmod 644 config.inc.php

  • 권한을 바꾸고 딱히 서버를 재시작할 필요도 없이 그냥 새로고침하니까 접속이 정상적으로 된다.

  • 참고로 들어가면 로그인 창이 뜨는데 아이디와 비밀번호는 wp-config.php파일에 적혀있으니 확인하면 된다.

컨테이너 실행 전에, 환경변수를 이용한 오토인덱스 사용여부 확인.

  • Verify if the server is running with an autoindex which can be deactivated when the container is launched (via an environment variable for example).
    : 컨테이너가 시작될 때 비활성화 할 수있는 자동 색인으로 서버가 실행 중인지 확인합니다.

구현 방법

  • default_autoindex_off라는 기존의 default 파일에서 인덱스 리스트만 주석처리 한 것을 새로 만든다.
  • 만들고 src 폴더에 집어넣어 사용할 수 있도록 한다.

Dockerfile

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

COPY srcs/default temp/default
COPY srcs/default_autoindex_off temp/default_autoindex_off
  • 두 종류의 default 파일을 사용할 수 있어야 하므로, 컨테이너 내부의 temp에 복사.

run.sh

# AutoIndex On/off
echo "AUTOINDEX = ${AUTOINDEX}"

if [ ${AUTOINDEX} == 1 ];then
	cp -rp /temp/default /etc/nginx/sites-available/default;
else
	cp -rp /temp/default_autoindex_off /etc/nginx/sites-available/default;
fi
  • 이로서 AUTOINDEX 값에 따라 두 개의 default파일 중 어느 것을 사용할 지 결정할 수 있다.

컨테이너 실행 전, 환경 변수 입력 방법.

컨테이너 실행 (이름짓기 + 환경 변수.)
(AUTOINDEX가 1이면 활성화, 0이면 비활성화)
docker run -it --name uv_container77 -e AUTOINDEX=0 -p 80:80 -p 443:443 aaaaa
  • -e 옵션으로 환경 변수 설정.
  • uv_container77은 앞으로 만들 컨테이너 이름이다.
  • aaaaa는 이미지 이름이다.

평가 목록.

  • http://localhost (https로 리다이렉션 되는가.)
  • http://localhost:80 (http로 접속 되는지 확인 -> 443으로 올바르게 리다이렉션이 되는가.)
  • https://localhost:443 (https(ssl인증서)가 적용되었는지 확인.)
  • https://localhost/wordpress (wordpress를 설치했는가. php 적용이 되었는가.)
  • https://localhost/phpmyadmin (MYSQL, phpmyadmin 설치가 되었는가.)
  • 이후 phpmyadmin 조작해보며 wordpress블로그와 연동되었는지 확인.
  • AutoIndex가 올바르게 적용되었는지 보여준다.
    (직접 default 파일에서 인덱스 리스트를 주석처리하는 둥.)
profile
신입

0개의 댓글