Docker는 Linux 기반의 Container RunTime 오픈소스이다. Virtual Machine과 상당히 유사한 기능을 가지면서, Virtual Machine보다 훨씬 가벼운 형태로 배포가 가능하다.
출처: https://bcho.tistory.com/805 [조대협의 블로그]
VM : Host OS가 깔리고, 그 위에 Hypervisor (VMWare,KVM,Xen etc)가 깔린 후에, 그위에, Virtual Machine이 만들어진다. Virtual Machine은 일종의 x86 하드웨어를 가상화 한 것이라고 보면된다. 그래서 VM위에 다양한 종류의 Linux나, Windows등의 OS를 설치할 수 있다.
Docker : Docker는 VM처럼 Hardware를 가상화 해주는 것이 아니라, Guest OS (Container)를 Isolation해준다.무슨 말인가 하면, Container의 OS는 기본적으로 Linux OS만 지원하는데, Container 자체에는 Kernel등의 OS 이미지가 들어가 있지 않다. Kernel은 Host OS를 그대로 사용하되, Host OS와 Container의 OS의 다른 부분만 Container 내에 같이 Packing된다.
: 다음으로 Docker의 특징중의 하나는 repository 연계이다.Container Image를 중앙의 Repository에 저장했다가, 다른 환경에서 가져다가 사용할 수 있다. 마치 git와 같은 VCS (Version Control System)과 같은 개념인데, 이를 통해서 Application들을 Container로 패키징해서 다른 환경으로 쉽게 옮길 수 있다는 이야기다.
: Docker의 Container Image를 packing하기 위해서, Docker는 Base Image와 Docker file이라는 두가지 컨셉을 이용한다. 쉽게 설명하면, Base Image는 기본적인 인스톨 이미지, Docker file은 기본적인 인스톨 이미지와 그 위에 추가로 설치되는 스크립트를 정의한다.
예를 들어 Base Image가 Ubuntu OS 이미지라면, Docker File은 Ubuntu OS + Apache, MySQL을 인스톨하는 스크립트라고 보면 된다.
: 데비안의 특징은 패키지 설치 및 업그레이드의 단순함에 있다. 일단 인스톨을 한 후 패키지 매니저인 APT 업데이트 방식을 이용하면 소프트웨어의 설치나 업데이트에서 다른 패키지와의 의존성 확인, 보안관련 업데이트 등을 자동으로 설정 및 설치해준다. 주로 서버를 목적으로 사용한다.
: 배포되고있는 리눅스OS 중 서버의 안정성이 높고, 포함하고 있는 패키지도 많음.
Nginx는 Igor Sysoev라는 러시아 개발자가 개발한 동시접속 처리에 특화된 웹 서버 프로그램이다. Apache보다 동작이 단순하고, 전달자 역할만 하기 때문에 동시접속 처리에 특화되어 있다.
출처: https://whatisthenext.tistory.com/123
출처: https://whatisthenext.tistory.com/123
Apache의 동작 방식
: Apache는 Client에서 요청을 받으면 MPM (Multi Processing Module : 다중처리모듈) 이라는 방식으로 처리를 하는데 대표적으로는 Prefork와 Worker방식이 있다.
a. Prefork MPM
: 실행중인 프로세스가 복제되어 처리된다. 각 프로세스는 한번에 한 연결만 처리하고 요청량이 많아질수록 프로세스는 증가하지만 복제시 메모리영역까지 복제되어 동작하므로 프로세스간 메모리 공유가 없어 안정적이라 볼수 있다.
b. Worker MPM
: Prefork 동작방식이 1개의 프로세스가 1개의 스레드로 처리가 되었다면 Worker 동작방식은 1개의 프로세스가 각각 여러 쓰레드를 사용하게 된다. 쓰레드간의 메모리를 공유하며 PreFork방식보다 메모리를 덜 사용하는 장점이 있다.
출처: https://taetaetae.github.io/2018/06/27/apache-vs-nginx/#top
스레드와 프로세스: https://m.blog.naver.com/crom77x/50046897200
Nginx의 동작 방식
: Nginx는 요청이 들어오면 어떤 동작을 해야하는지만 알려주고 다른요청을 처리하는 방식인 Event Driven방식으로 동작한다. 프로세스를 fork하거나 쓰레드를 사용하는 아파치와는 달리 CPU와 관계없이 모든 IO들을 전부 Event Listener로 미루기 때문에 흐름이 끊기지 않고 응답이 빠르게 진행이 되어 1개의 프로세스로 더 빠른 작업이 가능하게 될수 있다. 이때문에 메모리적인 측면에서 Nginx가 System Resource를 적게 처리한다는 장점이 있다고 한다.
출처: https://whatisthenext.tistory.com/123
Event-Driven: https://blog.naver.com/jhc9639/221108496101
기타 다른 차이
- Apache는 과거 Java Servlet이 대중적이지 않을 당시에 웹 기반 어플리케이션을 만들수 있는 거의 유일한 대안이었다.바로 CGI를 이용하는 것인데, 이때는 많은 웹 서비스들이 C나 Perl로 만들어져 있는 CGI를 이용해서 서비스를 제공했다.( 초장기 Naver의 서비스도 거의 모두 C나 Perl로 만들어진 CGI를 통해서 서비스를 제공했다.) 이러다 보니 processe-base(fork 방식)로 개발할 수 밖에 없었고, 상대적으로 NginX는 웹 어플리케이션을 서비스하기 위한 목적보다 Http Proxy의 목적으로 개발되었기 때문에 event-base(비동기 방식의 요청 전달)방식으로 개발되어 동시 사용자에 대한 처리 능력이 더 좋을 수 있게 된것 같다. 실제로 Nginx는 FCGI, SCGI 기능은 제공하지만 CGI나 ISAPI는 제공하지 않는다.
출처: https://knot.tistory.com/88 [용이의 블로그]
Nginx와 Apache 튜닝 포인트 비교: https://duksoo.tistory.com/entry/Nginx와-Apache-튜닝-포인트-비교
SSL(Secure Socket Layer)이란 보안 소켓 계층을 이르는 것으로, 인터넷 상에서 데이터를 안전하게 전송하기 위한 인터넷 암호화 통신 프로토콜 (HTTPS = HTTP + SSL)
출처: https://m.blog.naver.com/xcripts/70122755291
http: https://ko.wikipedia.org/wiki/HTTP
1) 클라이언트가 서버에 접속하면 서버인증서(서버의 공개키를 인증기관이 전자서명으로 인증한 것)를 전송받는다. (이때, 클라이언트 인증을 필요로 할 경우 클라이언트의 인증서를 전송)
2) 클라이언트는 받은 서버 인증서를 분석하여 신뢰할 수 있는 인증서인지를 검토한 후, 서버의 공개키를 추출.
3) 클라이언트가 세션키로 사용할 임의의 메세지를 서버의 공개키로 암호화하여 서버에 전송.
4) 서버에서는 자신의 개인키로 세션키를 복호화하여 그 키를 사용하여 대칭키 암호방식으로 메시지를 암호화하여 클라이언트와 통신.(https://)
SSL인증서: https://opentutorials.org/course/228/4894
php-fpm은 로그인이나 게시글 등록을 할 때마다 변하는 동적인 페이지를 구현하기 위해 필요한 CGI이다. PHP FastCGI Process Manager(php-fpm)는 FastCGI는 위에서 말한 CGI보다좀더 빠른 버전이라고 할 수 있다. FastCGI은 요청할때마다 새로운 프로세스 생성하는 것이 아니라 이미 생성한 프로세스를 재활용하는 방법을 사용하기때문에 처리가 빠르다는 장점이 있다.
출처: https://conory.com/blog/42956
phpMyAdmin은 MySQL을 월드 와이드 웹 상에서 관리할 목적으로 PHP로 작성한 오픈 소스 도구이다. 데이터베이스, 테이블, 필드, 열의 작성, 수정, 삭제, 또 SQL 상태 실행, 사용자 및 사용 권한 관리 등의 다양한 작업을 수행할 수 있다.
MySQL은 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)이다.다중 스레드, 다중 사용자 형식의 구조질의어 형식의 데이터베이스 관리 시스템으로서 오라클이 관리 및 지원하고 있으며, Qt처럼 이중 라이선스가 적용된다.
데이터베이스를 관리하거나 자료를 관리하기 위한 GUI 관리툴은 내장되어 있지 않다. 따라서 이용자들은 명령 줄 인터페이스 도구들을 이용하거나 또는 데이터베이스를 만들고, 관리하고, 데이터를 백업하는데, 상태를 검사하고, 데이터베이스 구조를 생성하는데, 또는 데이터 레코더를 작성하는데 있어서 MySQL 프론트엔드 데스크톱 소프트웨어나 웹 애플리케이션을 사용해야 한다.
워드프레스(WordPress)는 세계 최대의 오픈 소스 블로그 소프트웨어이다. 테마를 설치해 자유롭게 전환할 수 있고, 테마 안의 PHP와 HTML 코드는 좀 더 세분화된 맞춤 페이지를 위해 편집할 수 있다. 사용자와 개발자는 리치 플러그인 아키텍처를 통해 기능을 확장할 수 있다. 수많은 써드파티 테마와 플러그인 제작자들에의해 제공되는 무료, 유료 플러그인을 설치해 사이트 디자인을 바꾸고 기능을 확장시키는 것이 큰 장점이다.
출처: https://namu.wiki/w/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4
기본적으로 42 wiki https://yeosong1.github.io/%EB%8F%84%EC%BB%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%AA%A8%EC%9D%8C 를 참고하여 과제를 진행.
부족한 부분은 daelee's velog https://velog.io/@hidaehyunlee/ftserver-총-정리-도커-설치부터-워드프레스-구축까지 활용
docker pull debian:buster
docker run -it -p 80:80 -p 443:443 debian:buster
apt-get update
버전문제로 설치오류가 발생하는 것을 방지apt-get -y install nginx
nginx 설치service nginx start
nginx 시작service nginx status
nginx 동작 상태 확인 (curl localhost
를 활용하면 더욱 구체적인 상태를 확인할 수 있다.)apt-get -y install openssl
apt-get -y install vim
openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=Gun/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
etc/nginx/sites-available/
) 1 server {
2 listen 80;
3 listen [::]:80;
4
5 return 301 https://$host$request_uri;
6 }
7
8 server {
9 listen 443 ssl ;
10 listen [::]:443 ssl ;
11
12 ssl on;
13 ssl_certificate /etc/ssl/certs/localhost.dev.crt;
14 ssl_certificate_key /etc/ssl/private/localhost.dev.key;
.
.
apt-get -y install php-fpm
vim /etc/nginx/sites-available/default
) 26 location ~ \.php$ {
27 include snippets/fastcgi-php.conf;
28 fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
29 }
service php7.3-fpm start
service php7.3-fpm status
/var/www/html/
위치에 phpinfo.php
파일 생성<?php phpinfo(); ?>
내용 입력service nginx reload
수정사항 적용localhost/phpinfo.php
접속 시, 아래와 같은 화면이 출력되면 성공apt-get -y install mariadb-server php-mysql
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/
cp -rp var/www/html/phpmyadmin/config.sample.inc.php var/www/html/phpmyadmin/config.inc.php
$cfg['blowfish_secret'] = 'Blowfish 암호 입력'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
service nginx reload
service mysql start
service php7.3-fpm restart
mysql < var/www/html/phpmyadmin/sql/create_tables.sql -u root --skip-password
localhost/phpmyadmin
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
cp var/www/html/wordpress/wp-config-sample.php var/www/html/wordpress/wp-config.php
vim 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', 'djeon' );
/** MySQL database password */
define( 'DB_PASSWORD', 'djeon' );
/** 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', '' );
service nginx reload
-> localhost/wordpress
접속vim etc/nginx/sites-available/default
location / {
autoindex on;
try_files $uri $uri/ =404;
}