소개
이 주제는 시스템 관리를 소개하기위한 것입니다. 그것은 당신을 인식하게 할 것입니다
작업을 자동화하기 위해 스크립트를 사용하는 것이 중요합니다. 이를 위해 당신은
"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).
: 컨테이너가 시작될 때 비활성화 할 수있는 자동 색인으로 서버가 실행 중인지 확인합니다. (예: 환경 변수를 통해.)
나는 이 부분을 놓쳐서 리트라이 했다.ㅠㅠ
오토 인덱스 기능을 환경 변수로 조절하는 방법도 공부하자.
docker for windows
로도 이미지를 만들 수 있지만, 세세한 설정을 하려면 우분투 도커를 설치하고, 명령어로 만들어야 한다.sudo apt-get update
명령어를 실행.sudo apt-get upgrade
이름 | 장점 | 단점 |
---|---|---|
apt | 설치시 진행바가 나옴. | apt-get에 비해 기능이 제한됨. |
apt-get | 라이브러리 설치할 떄, 에러가 적음. | 설치할 떄, 진행바 안 나옴. |
- 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
로 도커 실행.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랑 링크를 해주기 때문에, 마음껏 이미지를 빌드해도 된다.
(도커 초기화 스크립트는 도커가 설치되어 있어야 작동한다.)
docker pull debian:buster
로 docker hub에서 이미지 받아오기.docker run -it -p 80:80 -p 443:443 debian:buster
하여 데비안을 OS로 하여 터미널에 접속한다.-p 80:80
으로 80포트 개방._-p 443:443
으로 443포트도 개방.)--name
옵션을 사용하면 된다.docker run -it --name test_container -p 80:80 debian:buster
cat /etc/issue
을 해보면 현재 운영체제(OS)와 버전을 확인할 수 있다.apt-get install nginx
로 nginx 설치.E: Unable to locate package nginx
에러에 걸릴 수 있다.apt-get update && apt-get upgrade
로 apt 툴을 보완 후 시도해보자.service nginx start
를 해서 서버를 연다.localhost:80
주소로 접속하면 자신이 연 서버를 볼 수 있다.welcome nginx
부분을 welcome 42seoul
로 바꿔보았다.ㅎㅎ)apt-get -y install openssl
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
genrsa
로 .key를 생성한다.패스워드 없는 걸로.
openssl genrsa -out server.key 2048
-2048
: 2048bit의 RSA 인증서를 의미.패스워드 있는 걸로.
openssl genrsa -des3 -out server.key 2048
-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 (갓택 오버플로우)
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 : 뭔지 몰라서 엔터 쳤어용.
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
: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
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;
}
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 함수에 넣자. (중요)
root /var/www/html;
index index.html index.nginx-debian.html
403 Forbidden
이라는 에러와 함께 html파일을 선택조차 할 수 없다.mysql이 아닌 MariaDB를 사용하는 이유.
현재 사용 중인 OS가 데비안 버스터이다. (정확히는 데비안 버스터 10)
문제는 데비안 환경은 데비안 8에서 9로 바뀌면서, 기본 DB가 MariaDB로 바뀌었다는 것이다.
어차피 mysql과 용량이나 기본 명령어는 똑같으므로 MariaDB를 설치하자.
설치
apt-get -y install mariadb-server php-mysql php-mbstring
apt-get install 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
를 사용하자.)apt-get install -y wget
wget https://wordpress.org/latest.tar.gz
tar -xvf latest.tar.gz
mv wordpress/ /var/www/html/
chown -R www-data:www-data /var/www/html/wordpress
cat /etc/nginx/nginx.conf
www-data는 무엇인가.
유저 그룹 변경 전 (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
mysql
로 마리아DB접속.ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
이런 에러가 뜬다면CREATE DATABASE <추가할DB이름>;
CREATE USER 유저이름@localhost;
SET PASSWORD FOR 유저이름@localhost= PASSWORD("비밀번호");
GRANT ALL PRIVILEGES ON 데이터베이스이름.
* TO 유저이름@localhost IDENTIFIED BY ‘비밀번호’;
cp -rp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php
vim wp-config.php
로 수정.)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의 값이 다른 것이다.
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 /var/www/html/phpmyadmin/config.sample.inc.php var/www/html/phpmyadmin/config.inc.php
vim /var/www/html/phpmyadmin/config.inc.php
$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
위에서 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은 wordpress와 연동되어 있다.
wordpress(블로그)를 관리 할 때, phpmyadmin라는 데이터베이스라는 표의 형태로 편하게 관리 할 수 있다.
글 삭제, 변경
wp_posts 항목에 들어가면 사용자가 올린 글 항목을 볼 수 있다.
우리는 블로그 관리자 이므로 이것을 마음대로 변경할 수 있다.
사용자 탈퇴, 생성
wp_user 항목에 들어가면 이 블로그에 가입한 사용자 목록을 볼 수 있다.
여기서 슈퍼 계정을 만들거나, 계정을 삭제할 수 있다. (아마도?)
docker build [OPTIONS] PATH | URL | -
docker build . -t ft_sss1
나는 이 명령어를 사용했다.docker build
: 기본적인 도커 빌드 명령어..
: 도커파일이 있는 위치. (.
이므로 현재 자신이 있는 경로를 뜻함.)-t
는 이미지의 이름을 따로 정하겠다는 옵션이다.ft_sss1
: 내가 정한 이미지의 이름.FROM debian:buster
을 입력하자.docker pull debian:buster
)RUN ["apt-get", "install", "-y", "nginx"]
이름 | 특징 | 사용처 |
---|---|---|
RUN | 실행한 결과가 컨테이너의 Layer에 추가됨. | 패키지 설치. |
CMD | 말 그대로 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
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
이므로 bash쉘로 실행하겠다는 뜻이다.#!/bin/bash
빼고 실행해봣는데, 딱히 달라진 건 없었다.COPY src/default /etc/nginx/sites-available/default
명령어 삽입.[정보] 참고로 도커 내부의 파일을 호스트로 옳길 떄는 docker cp
기능을 사용했다.
default(ssl, autoindex, php 등 여러 동적인 기능을 nginx에서 사용하겠다는 파일)
config.inc.php(PhpMyAdmin관련 파일, 미리 만든 blowfish 번호가 담겨 있다.)
wp-config.php(Wordpress관련 파일, 마리아 DB의 사용자 정보를 담고 있다.)
echo "쿼리;" | mysql -u"root" -p"비밀번호"
위 명령어는 다음과 같다.
echo "쿼리; " : "쿼리;"를 출력한다.
| : 파이프, 앞 명령어의 내용을 뒷 명령어의 표준 입력으로 넣는다
이름 | 데비안 버스터 | run.sh |
---|---|---|
mysql 접속하기 | mysql | mysql -u"root" -p"비밀번호" |
mysql 데이터베이스 보기. | show databases; | `echo "show databases;" |
[ ok ] Starting MariaDB database server: mysqld.
Enter password:
Enter password:
Enter password:
Enter 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
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/
이전에 다른 컨테이너에서 실험을 할 때, 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
mysql < var/www/html/phpmyadmin/sql/create_tables.sql
-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파일에 적혀있으니 확인하면 된다.
default_autoindex_off
라는 기존의 default
파일에서 인덱스 리스트만 주석처리 한 것을 새로 만든다.Dockerfile
COPY srcs/default /etc/nginx/sites-available/default
COPY srcs/default temp/default
COPY srcs/default_autoindex_off temp/default_autoindex_off
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가 1이면 활성화, 0이면 비활성화)
docker run -it --name uv_container77 -e AUTOINDEX=0 -p 80:80 -p 443:443 aaaaa
-e
옵션으로 환경 변수 설정.uv_container77
은 앞으로 만들 컨테이너 이름이다.aaaaa
는 이미지 이름이다.