SERVER 기초(Docker/WordPress/phpMyAdmin/MySQL)
[문제]
- 하나의 도커 컨테이너에서 Nginx기반의 웹서버를 구축. 이 컨테이너의 OS는 'Debian:Buster' 이어야함.
- 1의 웹서버는 동시에 WordPress, phpMyAdmin을 굴려야 하는데, 이 두 가지는 MySQL 기반의 SQL DB가 연동된다. (OS와의 호환성으로 Maria DB로 대체되기도 함)
- URL에 기반하여, 1의 웹서버가 올바른 웹사이트에 리디렉션 되어야 함.
- 1의 웹서버는 '비활성화 가능한 autoindex'와 같이 구동되어야 함.
[실습 순서]
FROM debian:buster
setting WORKDIR
WORKDIR /
sources
COPY ./srcs/ /srcs/
change mirror to kakao
RUN sed -i 's/deb.debian.org/mirror.kakao.com/g' /etc/apt/sources.list
- sed -i: sed '/pattern to match/g' file [출처] sed 활용 예시
intall nginx, php, vim w/localtime
when installing php-fpm, php is dependency
RUN apt-get update && apt-get upgrade -y RUN apt-get install -y nginx RUN apt-get install -y php7.3-fpm RUN apt-get install -y wget vim RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
- php7.3-fpm: php가 dependency로 설치된다.
- wget: phpMyAdmin 설치할 때 필요하다.
- localtime(선택): https://proni.tistory.com/entry/🐳-Docker-Timezone시간-설정하기
openssl
- openssl conf: https://www.phildev.net/ssl/opensslconf.html (thx to @sanam)
- req reference(증명서 서명 요청 관리, 플래그 포함): https://www.openssl.org/docs/man1.1.0/man1/openssl-req.html
- CSR파일과 CRT파일?
- .csr(Certificate Signing Request): 대부분 PEM 포맷이자 텍스트 파일 SSL 발급 신청을 위해서 본 파일 내용을 인증기관 CA 에 제출하는 요청서 파일임을 구분하기 위해서 붙이는 확장자
- .crt: 유닉스/리눅스 기반 시스템에서 인증서 파일임을 구분하기 위해서 사용되는 확장자.
- (참고)PEM(Privacy Enhanced Mail): Base64 인코딩된 ASCII 텍스트. 파일 구분 확장자로 .pem 을 주로 사용한다. 노트패드에서 열기/수정도 가능. 개인키, 서버인증서, 루트인증서, 체인인증서 및 SSL 발급 요청시 생성하는 CSR 등에 사용되는 포맷이며, 가장 광범위하고 거의 99% 대부분의 시스템에 호환되는 산업 표준 포맷. (대부분 텍스트 파일)
[생성방법 1. command 1번]
CSR을 명시적으로 생성하지 않고, key와 부가정보들을 입력하여 직접 self-sign
가이드: [Nginx] HTTP/2
RUN openssl req -newkey rsa:4096 -x509 -days 365 -nodes -subj "/C=KR/ST=Gangnam-gu/L=Seoul/O=42Seoul/OU=hycho/CN=localhost" -keyout 42server.key -out 42server.crt
RUN mv 42server.crt etc/ssl/certs/
RUN mv 42server.key etc/ssl/private/
- 포맷: https://c10106.tistory.com/2364 (원문: https://stackoverflow.com/questions/10175812/ )
- -newkey arg: arg는 보통 rsa:nbits로 구성된다.
- -x509(테스트인증서 OR 자체서명된 루트CA): 인증서 요청 대신, self-sign된 인증서를 출력할 때 쓰는 옵션. 기존 리퀘스트에 -in 옵션이 있는 경우에는 self-sign 인증서로 변환을 해주고, 아니면 새로운 리퀘스트 생성.
- -days: 유효일 수, -x509가 사용될 때 날짜 지정이 가능하다. 기본값은 30일.
- -nodes: 비밀키 생성되었을 때, 암호화되지 않는다. == 재부팅 시 수동으로 암호를 입력하는 일을 생략. (좋은 건가?)
- -subj arg: subject 이름을 설정하거나 대체할 때 사용. 공백은 무시.
- -keyout filename: 새로만든 개인 키를 쓸 파일 이름을 제공.
- -out filename: 기본 출력할 '파일 이름 OR 표준 출력'을 지정
RUN chmod 600 etc/ssl/certs/42server.crt etc/ssl/private/42server.key
여기서는 (1) 디렉토리 및 파일 소유자는 root로 (2) 디렉토리 권한은 700 옵션을 주었다.
[생성방법 2. command 2번]
CSR 명시적 생성 -> 인증서에 self-sign -> 인증서 완성
- 참고:
OpenSSL Essentials: Working with SSL Certificates, Private Keys and CSRs | DigitalOcean
thx to @yopark
RUN openssl req -new -newkey rsa:2048 -nodes -keyout /etc/ssl/private/42server.key -out /etc/ssl/certs/42server.csr -subj '/C=KR/ST=Gangnam-gu/L=Seoul/O=42Seoul/OU=hycho/CN=localhost'
- https://phoenixnap.com/kb/openssl-tutorial-ssl-certificates-private-keys-csrs (csr → crt [0])
- https://basic-x.tistory.com/21 (csr → crt [1])
- https://blog.naver.com/kletgdgo/90118978766 (csr → crt [2])
RUN openssl x509 -req -days 365 -in /etc/ssl/certs/42server.csr -signkey /etc/ssl/private/42server.key -out /etc/ssl/certs/42server.crt
- x509(다목적 인증서 유틸리티): https://www.openssl.org/docs/man1.0.2/man1/x509.html
- (x509) -req: 인증서의 입력이 예상됨. 인증서 요청이 (사전에)필요함.
- (x509) -in filename: 인증서를 어떤 파일에서 읽어올지 지정. 미지정시 stdin.
- (x509)-signkey: 제공된 개인키를 가지고 입력파일에 자체 서명.
- 입력파일이 인증서인 경우, 발급자 이름을 제공된 subject로 설정. 날짜는 -days로 설정. (-clrext 옵션이 없는 경우, 인증서 확장은 유지됨)
- 입력이 증명서 요청인 경우, 요청된 subject를 사용하는 개인키를 사용하여, 자체 서명된 인증서가 작성됨
RUN chmod 600 etc/ssl/certs/42server.crt etc/ssl/private/42server.key
- 혹시 모르니 권한 설정을 한다.
install mariadb-server, phpMyAdmin
RUN apt-get -y install mariadb-server php-mysql
RUN wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz
RUN tar -xvf phpMyAdmin-5.0.2-all-languages.tar.gz
RUN mv phpMyAdmin-5.0.2-all-languages phpmyadmin
RUN mv phpmyadmin /var/www/html/
- 현재 데비안은 MySQL 대신에 MariaDB를 Default로 사용하기에 이를 설치함
- phpMyAdmin은 apt-get으로 설치가 불가능. 그래서 wget을 이용하여 웹에서 다운로드 받는다.
- blowfish 암호생성기: http://www.passwordtool.hu/blowfish-password-hash-generator
wordpress 설치
RUN wget https://wordpress.org/latest.tar.gz
RUN tar -xvf latest.tar.gz
RUN mv wordpress/ var/www/html/
RUN chown -R www-data:www-data /var/www/html/wordpress
- chown: 리눅스에서 소유자를 변경하는 커맨드. -R은 –recursive. 에러 메시지가 있어도 출력하지 않게 하는 옵션. www-data는 우분투에서 Apache,PHP 실행시 수정이 가능한 옵션.
redirection port 80 to 443 (nginx)
- 아래대로 하면, 리디렉션 코드 밑의 http(80) 관련 코드는 주석 처리해도 상관없음을 알 수 있다.
Nginx 에서 HTTP 에서 HTTPS 으로 Redirect 하기
301, 302 리다이렉션
autoindex: on
Module ngx_http_autoindex_module
open ports
EXPOSE 80 443
http의 기본 포트가 80, https의 기본 포트가 443인 이유는 무엇일까?
- EXPOSE는 호스트와 연결할 포트 번호를 설정합니다. docker run 명령의 --expose 옵션과 동일합니다.
가장 빨리 만나는 Docker 7장 - 7. EXPOSE
start
CMD ["bash", "init.sh"]
One more ttttthing
- How to send files from docker to local (thx to @secho) ex) docker cp 1d4886ff1fca:/var/www/html/phpmyadmin/config.inc.php ./config.inc.php
결론: 호스트 마운트를 하면 된다. 도커 실행 전이든 실행 중이든, 방법만 다르지 할 수 이따
Docker Volume (호스트 볼륨 공유)-컨테이너 데이터를 호스트 디스크에 저장하기
- 사용중인 도커 컨테이너 저장하기
사용중인 docker 컨테이너를 그대로 저장하기 (commit)
- 루트계정으로 mysql에 접속해서, 표준입력으로 받기 (mysql -u root < /tmp/root_setup)
- 리눅스 find 옵션 (급하게 파일 찾을때... find / -name [FILE] )
리눅스 find 명령어 사용법. (Linux find command) - 리눅스 파일 검색.
- Docker 모든 컨테이너 삭제 명령
- 모든 컨테이너 삭제하기
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
- 모든 이미지 삭제하기
docker rmi $(docker images -q)
- Exit 상태의 모든 컨테이너 삭제하기
docker rm $(docker ps --filter 'status=exited' -a -q)
'code' 카테고리의 다른 글
exit() 함수에 대한 메모(?) (0) | 2020.08.14 |
---|---|
vim을 intellisense처럼 써보기... [w/Ctags] (0) | 2020.08.09 |
VIM configure file (.vimrc) (0) | 2020.07.13 |
malloc, calloc (0) | 2020.07.09 |
Mac 창 분할 및 Vim 단축키 쓰기 (0) | 2020.07.02 |