CPU, 디스크, 네트워크 등의 물리적인 컴퓨터 자원을 여러 실행환경이 공유해 효율적으로 자원을 사용하도록 해주는 기술
호스트 운영체제 위에서 가상의 하드웨어를 서비스하는 것
호스트 운영체제와 게스트 운영체제의 완전한 분리
호스트 운영체제의 커널을 공유하면서 격리된 자원을 제공하는 가상화 기술. 애플리케이션 실행환경의 가상화
CPU, 메모리, 디스크 등의 자원에 대한 쿼터(Quota) 설정
서로의 실행환경 격리로 보안 문제
Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼
Docker Desktop for Mac stable 설치
🥊 debian:buster 설치
docker pull debian:buster
🥊 debian:buster 이미지를 사용해 컨테이너 생성 및 실행
docker run -it --name [container_name] -p 80:80 -p 443:443 debian:buster
container_name은 원하는 이름으로 설정
-p 80:80
호스트의 80번 포트를 컨테이너의 80번 포트와 연결
호스트의 443번 포트를 컨테이너의 443번 포트와 연결
이미지로 컨테이너 생성 및 실행
docker run [options] [image_name] [command] [arg...]
options | 설명 |
---|---|
-p | 호트스와 컨테이터 포트 연결 (포워딩)-p [호스트 포트 번호]:[컨테이너 포트 번호] |
--name | 컨테이너 이름 설정 |
-i | 컨테이너와 상호적으로 주고받겠다는 뜻 (interactive), 입력에 대한 출력을 제공 |
-t | tty를 사용하겠다는 뜻, 터미널과 비슷한 환경을 조성 |
도커파일로 이미지 생성
docker build [options] [image_name] [Dockerfile path]
options | 설명 |
---|---|
-t, --tag | -t [저장소 이름]/[이미지 이름]:[태그] 설정 |
현재까지 작업한 컨테이너를 이미지로 생성
docker commit [container_id/name] [image_name]
docker images
로 확인 가능#보유한 이미지 목록
docker images
#실행중인 컨테이너 목록
docker ps
#모든 컨테이너 목록(실행중인지, 사용중인 포트, 기반으로 하는 이미지, 컨테이너 이름 등)
docker ps -a
#컨테이너 삭제
docker rm [container_id/name]
#이미지 삭제
docker rmi [image_id/name]
#해당 이미지로부터 생성된 컨테이너도 함께 삭제 (이미지와 컨테이너 모두 삭제)
docker rmi -f [image_id/name]
#컨테이너 모두 삭제
docker rm `docker ps -a -q`
docker start [container_name] #컨테이너 start하기
docker attach [container_name] #접속하기
docker exec -it [container_name] /bin/bash #stop 안 하고 나온 컨테이너 들어가기
exit #컨테이너 stop 하고 나오기
ctrl + P + Q #컨테이터 stop 안 하고 나오기
docker stop [container_name] #컨테이너 stop하기
cd /var/www/html/
클라이언트(브라우저)에게 html, css, javascript 등의 정보를 전송하는 웹서버
🥊 nginx 설치
apt-get update && apt-get -y install nginx
service nginx start
service nginx status
service nginx reload
🥊 nginx 시작
service nginx start
🥊 주소창에 localhost 치고 들어가서 아래 화면처럼 Welcome to nginx가 나오면 성공
웹서버의 요청을 바탕으로 데이터베이스의 데이타를 받아 html로 만들어 웹서버에 전달하는 웹서버상의 언어
🥊 php 설치
apt-get -y install php-fpm vim
🥊 vim /etc/nginx/sites-available/default 에서 아래와 같이 주석 풀기
location ~ \.php$ {
include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
🥊 vim /etc/nginx/sites-available/default 에서 아래처럼 index.php 추가
index index.html index.html index.nginx-debian.html index.php
<?php phpinfor(); ?>
service php7.3-fpm start
service php7.3-fpm status
service nginx reload
localhost/phpinfo.php
다음 화면이 뜨면 php가 잘 작동된다는 의미
웹서버와 브라우저 간의 보안을 위한 프로토콜
인증서는 웹서버의 신원을 증명
웹서버와 브라우저는 서로 암호화된 http 데이터들을 전송
🥊 openssl 설치
apt-get -y install openssl
🥊 인증서와 키 생성
openssl req -newkey rsa:4096 -x509 -days 365 -nodes -subj "/C=KR/ST=GAEPO/L=Seoul/O=ECOLE42/OU=42SEOUL/CN=localhost" -keyout private.dev.key -out private.dev.crt
mv private.dev.crt etc/ssl/certs/
mv private.dev.key etc/ssl/private/
chmod 600 etc/ssl/certs/private.dev.crt etc/ssl/private/private.dev.key
req
인증서 요청 및 생성 유틸리티 (Linux man 페이지)-newkey [arg]
새 인증서와 새 비공개키를 생성rsa:[nbits]
RSA 키의 크기를 n 비트로 지정. 비트를 명시 안 하면 디폴트값으로 설정-x509
인증서발급 요청대신 자체 서명된 인증서를 출력. (자체인증에 사용)-days [n]
-x509 옵션이 사용된 경우, n으로 유효기간을 지정. 디폴트는 30일-nodes
개인키가 생성되었을 때 암호화하지 않음-subj [arg]
인증서에 대한 정보/C=국가/S=/ST=/L/O/OU/CN
-keyout [filename]
새로 만들 개인키 이름out [filename]
새로 만들 인증서 이름🥊 vim etc/nginx/sites-available/default 에서 아래와 같이 ssl 관련 부분 추가
server {
listen 80 default_server;
listen [::]:80 default_server;
}
server {
listen 443;
ssl on;
ssl_certificate /etc/ssl/certs/private.dev.crt;
ssl_certificate_key /etc/ssl/private/private.dev.key;
.
.
.
}
🥊 설정 업로드를 위해 nginx 재시동
service nginx reload
🥊 https://localhost로 들어가 아래 화면이 뜨면 ssl이 잘 적용된 것
chrome에서는 Not Secure와 같은 경고창이 뜨는 것으로 확인 가능
Maria DB는 오픈소스 관게형 데이터베이스(RDBMS)
데이터베이스들이 담겨있는 데이타베이스 서버로 MySQL과 거의 모든 기능이 동일
- 데이터베이스 - 실시간으로 접근, 삽입, 삭제, 수정이 가능한 데이터의 집합
- 테이블 - 행/열에 데이타가 담긴 테이블
🥊 mariadb설치
apt-get -y install mariadb-server
🥊 mysql 실행 및 설치내역 적용을 위한 nginx와 php 재시작
service mysql start
service nginx reload
service php7.3-fpm restart
apt-get install --reinstall php
후 시작🥊 mysql 접속
mysql
🥊 계정 생성
*.*
user_id
와 user_password
설정CREATE USER [user_id]@localhost IDENTIFIED by '[user_password]';
GRANT ALL PRIVILEGES ON *.* to [user_id]@localhost;
🥊 wordpress 데이타베이스 생성 (나중을 위한 것)
CREATE DATABASE IF NOT EXISTS wordpress;
show databases;
exit
mysql -u [user_id] -p [user_password]
웹기반으로 mysql을 관리할 수 있는 무료 소프트웨어 (콘솔보다 쉽게 데이타베이스 관리)
🥊 phpMyAdmin설치
php-mysql는 php에서 mysql을 사용하기 위한 모듈로 설치 필수
온라인 자료를 바로 받을 수 있는 wget 설치
wget으로 phpmyadmin을 온라인에서 바로 다운로드
config.inc.php 파일 생성
apt-get -y install php-mysql 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
🥊 vim var/www/html/phpmyadmin/config.inc.php
Blowfish secret generator에서 암호 생성 후 아래 '여기'
에 복붙
$cfg['blowfish_secret'] = '여기';
🥊 phpmyadmin 데이타베이스 생성
mysql -u root --skip-password < var/www/html/phpmyadmin/sql/create_tables.sql
--skip-password
로 비밀번호 생략<
create_tables.sql이라는 파일의 내용을 입력🥊 사파리에서 https://localhost/phpmyadmin 접속해서 아래 화면이 뜨면 성공
블로그와 홈페이지 제작이 가능한 CMS(Content Management System)
만들기 쉽고, 관리하기 쉽고, 모바일 웹도 지원하고, 소셜네트워크와 연동도 잘 되며 검색시 노출도 잘 되는 오픈소스 소프트웨어
🥊 wordpress 설치
chown
파일의 개인/그룹 소유자 변경 참고-R
재귀적으로 적용 (해당 파일 및 그 그룹의 파일들 소유자 변경)www-data
php 실행시 수정이 가능한 권한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
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );
/** MySQL database username */
define( 'DB_USER', '[user_id]' );
/** MySQL database password */
define( 'DB_PASSWORD', '[user_paddword]' );
만약 위의 정보가 mysql에 입력한 정보와 다르면 아래와 같은 에러화면이 뜬다
🥊 nginx 재가동
service nginx reload
🥊 https://localhost/wordpress에서 아래 화면이 뜨면 성공
wordpress에 들어가면 여러가지 테마를 다운받아 설치할 수 있는데 여기에 직접 만든 테마도 추가할 수 있다. css 적용을 성공하지 못해 그만두었으나 대략적인 방법을 아래에 기록한다.
필수 파일 index.php
, style.css
mine 폴더를 생성해 index.php
와 style.css
를 담는다 (폴더명은 원하는 테마이름)
index.php
는 html 파일과 동일하게 작성하면 된다.
style.css
는 상단에 아래와 같이 주석에 테마 정보를 입력해야 wordpress에 뜬다
/*
Author: jehong
*/
mv theme /var/www/html/wordpress/wp-config/themes/mine
이에 추가로 등의 문법을 이용해 추가 php 파일을 불러오거나 워드프레스의 입력사항을 불러올 수도 있다.
nginx 인덱스 페이지에서 root 디렉토리 파일 목록을 보여주는 기능
🥊 vim etc/nginx/sites-available/default
아래처럼 autoindex on;
내용 추가
server_name _;
location / {
autoindex on;
try_files $uri $uri/ =404;
}
🥊 index.nginx-debian.html 제거
index.nginx-debian.html
, phpmyadmin
, wordpress
가 있을 것이다. 여기서 인덱스 파일을 제거해주면 오토인덱싱을 적용할 수 있다rm -rf /var/www/html/index.nginx-debian.html
🥊 https://localhost 에서 pypmyadmin
과 wordpress
가 목록으로 작성된 페이지를 볼 수 있다
오토인덱스 페이지를 커스터마이즈할 수 있으나 css 적용이 뜻대로 되지 않아 그만뒀다. 완벽하지는 않지만 기록용으로 방법을 아래에 작성한다.
index.html
과 stylesheet.css
파일을 추가해 오토인덱스 페이지를 커스터마이즈할 수 있다
/etc/nginx/theme
theme 폴더를 만들어 그 안에 html과 css 파일을 넣는다 (폴더명은 달라도됨)
vim /etc/nginx/sites-available/default
theme 폴더 위치를 알려주고 오토인덱스(body) 앞뒤로 해당하는 파일을 적어준다.
만약 index.html 하나만 있다면 하나만 원하는 위치에 설정
server {
...
}
server {
...
location /theme/ {
root /etc/nginx/
}
location / {
autoindex on;
add_before_body /theme/header.html;
add_after_body /theme/footer.html;
}
}
여태까지 만든 컨테이너를 보관하는 방법은 여러가지가 있다. 컨테이터 그대로 가지고 있을 수도 있고 이미지를 생성해서 보관해도 된다. 또 다른 방법은 이미지를 생성할 수 있는 도커파일을 가지고 있는 것이다. 도커파일로 보관할 경우 컨테이터에 어떤 패키지가 어떤 설정값으로 설치되었는지 쉽게 확인할 수 있다. 이를 위해 세 가지가 필요하다
- Dockerfile
- 설정값이 담긴 srcs 폴더
- 패키지 설정을 마칠 쉘스크립트 파일
베이스가 될 이미지 지정
FROM [image]:[tag]
#example
FROM debian:buster
MAINTAINER [name]
MAINTAINER [email address]
MAINTAINER [name] [email address]
파일이나 디렉토리를 이미지로 복사
COPY [src] [dest]
COPY와 유사
src
에 URL 입력 가능
src
에 압축 파일 입력시 자동으로 압축 해제하며 복사
ADD [src] [dest]
명령어 그대로 실행
/bin/sh -c
뒤에 실행\
를 사용해 긴 명령어를 여러 줄로 나눌 수 있다RUN [command1] \
[command2] \
[command3]
#예시
RUN apt-get upadate && apt-get install -y \
nginx \
openssl \
vim
도커 컨테이너가 실행되었을 때 요청을 기다리고 있는 포트 지정
EXPOSE 80 443
EXPOSE [port]
도커 컨테이너가 실행되었을 때 실행되는 명령어 정의
CMD [src] [dest]
🥊 도커파일 작성
FROM debian:buster
MAINTAINER jehong <jehong@student.42seoul.kr>
RUN apt-get update && apt-get install -y \
nginx \
php-fpm \
vim \
openssl \
mariadb-server \
php-mysql
COPY /srcs/default ./etc/nginx/sites-available/
COPY /srcs/phpMyAdmin-5.0.2-all-languages.tar.gz ./
COPY /srcs/config.inc.php ./
COPY /srcs/latest.tar.gz ./
COPY /srcs/wp-config.php ./
COPY /srcs/install.sh ./
EXPOSE 80 443
CMD bash install.sh
설정파일들은 매번 작성하기 번거로우므로 srcs 폴더에 따로 저장해둔다
추후에 컨테이너 내부로 복사해서 배치해주면 간편하게 설정을 마칠 수 있다
이 작업을 위해서는 먼저 srcs 폴더에 해당 파일들을 담아야 한다.
컨테이터 >>> srcs 폴더
docker cp [container_name]:[path_in_container] [path_in_container]
#ft_server 컨테이너의 /var/www/html에 있는 phpmyadmin을 srcs 폴더로 복사
docker cp ft_server:/var/www/html/phpmyadmin /srcs/
docker cp [file_name || directory_name] [container_name]:[path_in_container]
#phpmyadmin 폴더를 ft_server 컨테이너 내에 phpmyadmin이라는 이름으로 복사
docker cp scrs/phpmyadmin ft_server:phpmyadmin
🥊 srcs 폴더에 작성이 복잡한 설정파일들을 모두 옮겨준다
docker cp ft_server:/var/www/html/phpmyadmin/config.inc.php /srcs/
docker cp ft_server:/var/www/html/wordpress/wp-config.php /srcs/
docker cp ft_server:/etc/nginx/sites-available/default /srcs/
쉘스크립트 이름은 install.sh 로 정했다 (바꿔도됨)
#!/bin/bash
아래 명령어들을 bash 명령어로 인식echo "CREATE DATABASE IF NOT EXISTS wordpress;" | mysql -u root --skip-password
mysql에 패스워드 없이 들어가서 CREATE DATABASE IF NOT EXISTS wordpress;
를 입력하라는 명령어다bash
마지막에 안 넣어주면 도커가 제대로 작동하지 않는다🥊 쉘스크립트 작성
#!/bin/bash
# setup ssl
openssl req -newkey rsa:4096 -x509 -days 365 -nodes -subj "/C=KR/ST=GAEPO/L=Seoul/O=ECOLE42/OU=42SEOUL/CN=localhost" -keyout /etc/ssl/private/private.dev.key -out /etc/ssl/certs/private.dev.crt
chmod 600 etc/ssl/certs/private.dev.crt etc/ssl/private/private.dev.key
# install phpmyadmin
tar -xvf phpMyAdmin-5.0.2-all-languages.tar.gz
rm -rf phpMyAdmin-5.0.2-all-languages.tar.gz
mv phpMyAdmin-5.0.2-all-languages /var/www/html/phpmyadmin
mv config.inc.php /var/www/html/phpmyadmin/
# setup DB
service mysql start
mysql -u root --skip-password < var/www/html/phpmyadmin/sql/create_tables.sql
echo "CREATE DATABASE IF NOT EXISTS wordpress;" | mysql -u root --skip-password
echo "CREATE USER jehong@localhost IDENTIFIED by '1111';" | mysql -u root --skip-password
echo "GRANT ALL PRIVILEGES ON *.* to jehong@localhost;" | mysql -u root --skip-password
# intall wordpress
tar -xvf latest.tar.gz
rm -rf latest.tar.gz
mv wordpress /var/www/html/
chown -R www-data:www-data /var/www/html/wordpress
mv wp-config.php /var/www/html/wordpress/
# remove index for autoindexing
rm -rf /var/www/html/index.nginx-debian.html
# start services
service php7.3-fpm start
service nginx start
service mysql restart
bash
도커파일로 컨테이너를 만들어 잘 마무리되었는지 확인해본다
🥊 Dockerfile로 이미지 생성
.
잊지말 것docker build -t ft_server .
🥊 생성한 컨테이너 생성 및 실행
docker run -it -p 80:80 -p 443:443 ft_server
🥊 https://localhost/phpmyadmin