
<출처 : https://aws.amazon.com/ko/compare/the-difference-between-docker-vm/ | https://aws.amazon.com/ko/docker/>

user = mysql
pid-file = /run/mysqld/mysqld.pid
socket = /run/mysqld/mysqld.sock
#port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
.....
bind-address = 0.0.0.0
이렇게 바꿔주고 conf파일을 따로 가지고 도커파일에서 COPY ./conf/50-server.cnf /etc/mysql/mariadb.conf.d/ 로 작성해주면 도커 실행시, 파일이 변경이 됨
sh파일세팅
flush privileges;
create database $MYSQL_DB;
create user '$MYSQL_USER'@'%' identified by '$MYSQL_PASSWORD';
grant all privileges on $MYSQL_DB.* to '$MYSQL_USER'@'%';
alter user '$MYSQL_ROOT'@'localhost' identified by '$MYSQL_ROOT_PASSWORD';
flush privileges;
server {
listen 443 ssl;
server_name seykim.42.fr;
ssl on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_certificate_key /etc/ssl/seykim.42.fr.key;
ssl_certificate /etc/ssl/seykim.42.fr.crt;
index index.html index.htm index.php;
root /var/www/html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php {
# php interpreter (aka Wordpress container)에게 위임.
fastcgi_pass wordpress:9000;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
}
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; document_root
# FastCGI 서버에 전송되는 환경 변수인 SCRIPT_FILENAME을 설정합니다.
# $document_root는 현재 서버의 문서 루트 디렉토리 -> 위의 root /var/www/html
# $fastcgi_script_name은 FastCGI 서버로 전송되는 스크립트 파일의 경로 SCRIPT_FILENAME
# fastcgi_param PATH_INFO $fastcgi_path_info;
# FastCGI 서버에 전송되는 환경 변수인 PATH_INFO를 설정합니다.
# $fastcgi_path_info는 클라이언트가 요청한 URL에서 스크립트 파일을 제외한 추가 경로 정보를 나타내며, 이 정보는 FastCGI 서버로 전달되어 동적인 콘텐츠 생성에 활용
# FastCGI 프로토콜을 통해 백엔드의 FastCGI 서버 (예: PHP-FPM)로 전달할 때 필요한 환경 변수를 설정하는 데 사용
443포트를 통해서 ssl통신을 하겠다는 것
ssl에서 프로토콜로 TLSv1.2 TLSv1.3을 쓰겠다는 것이며, 각각의 통신을 위한 인증키를 /etc/ssl/ 위치에서 찾아오겠다는 것
index -> 처음에 볼륨에서 가지고 있는 데이터들이 저장된 파일
FastCGI프로토콜 -> 프로그램을 웹 서버와 통신하기 위한 바이너리 프로토콜 정도로만 알고 있으면 될 것 같음
sh파일 설정
openssl req -newkey rsa:4096 -days 30 -nodes -x509 \
-subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=${COALITIONS}/CN=${INTRA_ID}.42.fr" \
-keyout "/etc/ssl/${INTRA_ID}.42.fr.key" \
-out "/etc/ssl/${INTRA_ID}.42.fr.crt" 2>/dev/null
openssl req: OpenSSL 명령어 중 하나로, 새로운 인증서 요청(Certificate Signing Request, CSR) 및 관련 키를 생성하거나 처리합니다.
newkey rsa:4096: RSA 알고리즘을 사용하는 4096 비트의 새로운 개인 키를 생성
rsa : RSA암호는 공개키 암호시스템의 하나로, 암호화뿐만 아니라 전자서명이 가능한 최초의 알고리즘
days 30: 생성된 자체 서명된 인증서의 유효 기간을 30일로 설정
nodes: 개인 키를 암호화하지 않음
x509: X.509 표준에 따라 서명된 자체 서명된 인증서를 생성 / x.509표준은 공개키 인증서와 인증알고리즘의 표준 가운데에서 공개 키 기반(PKI)의 ITU-T 표준을 쓰는 것
아래가 x509표준의 형식
Certificate
Version 인증서의 버전을 나타냄
Serial Number CA가 할당한 정수로 된 고유 번호
Algorithm Identifier 알고리즘 식별자
Signature 서명
Issuer 발행자
Validity 유효기간
Not Before 유효기간 시작 날짜
Not After 유효기간 끝나는 날짜
Subject 소유자
Subject Public Key Info 소유자 공개 키 정보
Public Key Algorithm 공개 키 알고리즘
Subject Public Key
Issuer Unique Identifier (Optional) 발행자 고유 식별자
Subject Unique Identifier (Optional) 소유자 고유 식별자
Extensions (Optional) 확장
...
Certificate Signature Algorithm
Certificate Signature
subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU={INTRA_ID}.42.fr": 인증서의 주체(subject) 필드를 설정
keyout "/etc/ssl/${INTRA_ID}.42.fr.key": 생성된 개인 키를 /etc/ssl/ 디렉터리에 ${INTRA_ID}.42.fr.key 파일로 저장
out "/etc/ssl/${INTRA_ID}.42.fr.crt": 생성된 자체 서명된 인증서를 /etc/ssl/ 디렉터리에 ${INTRA_ID}.42.fr.crt 파일로 저장
2>/dev/null: 표준 에러를 무시하도록 설정
listen = wordpress:9000
이 부분만 바꿔주면 됨 -> 9000포트를 통해서 통신하겠다는 설정
sh파일 작성
wp-cli core download --allow-root
-> 워드프레스의 코어를 다운로드, root로 실행할 때 사용 권한 문제를 허용
wp-cli config create --dbname=$MYSQL_DB --dbuser=$MYSQL_USER --dbpass=$MYSQL_PASSWORD --dbhost=$MYSQL_HOST --allow-root
-> wp-config.php파일을 생성하고 데이터베이스 관련 정보를 설정
wp-cli core install --url=$DOMAIN_NAME --title=$WP_TITLE --admin_user=$WP_ADMIN_USER --admin_password=$WP_ADMIN_PASSWORD --admin_email=$WP_ADMIN_EMAIL --skip-email --allow-root
-> url : 주소설정, title : 제목 설정, admin 관련 : 관리자 계정 설정
wp-cli user create $WP_USER $WP_USER_EMAIL --user_pass=$WP_USER_PASSWORD --role=subscriber --allow-root
-> role : 사용자 역할 설정
# 버전을 정의
version: '3.8'
# 각 서비들의 정의
services:
mariadb:
# 컨테이너 이름
container_name: mariadb
# 도커 허브에서 mariadb의 이미지를 사용
image: mariadb
# 컨테이너가 종료되면 항상 재시작을 하도록 설정
restart: always
# 해당 위치에서 mariadb를 빌드하도록 설정
build: requirements/mariadb/
# 호스트와 연결할 포트 설정
expose:
- "3306"
# MariaDB 데이터베이스 파일을 호스트 디렉터리와 공유합니다
volumes:
- mariadb-volume:/var/lib/mysql
# 내부 네트워크를 사용하도록 설정
networks:
- intra-network
# 환경변수 파일 지정
env_file:
- .env
wordpress:
# mariadb가 먼저 실행되어야지 실행됨을 의미
depends_on:
- mariadb
restart: always
build: requirements/wordpress
container_name: wordpress
image: wordpress
expose:
- "9000"
volumes:
- wordpress-volume:/var/www/html
networks:
- intra-network
env_file:
- .env
nginx:
# wordpress가 항상 먼저 시작되어야함을 의미
depends_on:
- wordpress
restart: always
build: requirements/nginx
container_name: nginx
image: nginx
# 컨테이너의 443포트와 호스트의 443포트를 연결
ports:
- "443:443"
volumes:
- wordpress-volume:/var/www/html
networks:
- intra-network
env_file:
- .env
# 사용자 네트워크의 정의
networks:
intra-network:
# driver: bridge: 사용자 정의 네트워크를 브릿지(bridge) 모드로 설정
# 브릿지 네트워크는 동일한 호스트에 있는 컨테이너 간의 통신을 지원
driver: bridge
name: intra-network
# 볼륨 설정
volumes:
mariadb-volume:
# 로컬 드라이버로 볼륨을 설정
driver: local
driver_opts:
# 볼륨의 유형을 'none'
type: none
# bind옵션 지정
o : bind
# 볼륨을 호스트 디렉터리에 바인딩
# 즉, 호스트 디렉터리와 컨테이너 내의 볼륨이 공유
device : /home/seykim/data/mariadb
wordpress-volume:
driver: local
driver_opts:
type: none
o: bind
device: /home/seykim/data/wordpress
# docker 컨테이너에 접근
docker exec -it nginx /bin/bash
# mysql에 접근
sudo mysql -u root -p
# 비밀번호 입력
-> 설정한 비밀번호 입력
# mariadb에 접근
use MARIADB
# 데이터베이스에서 접근 가능한 유저를 확인
show tables;
select * from wp_users
-> admin계정에서 user를 추가하고 select문을 실행시키면 추가가 된 것을 볼 수 있음
-> 마찬가지로 admin계정에서 user를 삭제하고 select문을 실행시키면 삭제가 된 것을 볼 수 있음
HOSTS_SETUP_SH=./srcs/requirements/tools/host.sh
VOLUME_SETUP_SH=./srcs/requirements/tools/volume.sh
FCLEAN_SETUP_SH=./srcs/requirements/tools/fclean.sh
TOOLS_SH_PATH = ./srcs/requirements/tools/
DOCKER_COMPOSE_FILE = ./srcs/docker-compose.yml
DOCKER_COMPOSE = docker compose --file $(DOCKER_COMPOSE_FILE)
all: up
up:
@chmod +x $(VOLUME_SETUP_SH)
@chmod +x $(HOSTS_SETUP_SH)
@chmod +x $(addsuffix info.sh, $(TOOLS_SH_PATH))
@chmod +x $(addsuffix fclean.sh, $(TOOLS_SH_PATH))
@$(VOLUME_SETUP_SH)
@$(HOSTS_SETUP_SH)
$(DOCKER_COMPOSE) up -d --build
down:
$(DOCKER_COMPOSE) down --volumes
clean:
sudo docker compose -f srcs/docker-compose.yml down -v --rmi all --remove-orphans
$(DOCKER_COMPOSE) down --rmi all --volumes
fclean: clean
sudo rm -rf ${HOME}/data
sudo docker system prune --volumes --all --force
sudo docker network prune --force
sudo docker volume prune --force
@$(FCLEAN_SETUP_SH)
re:
@make fclean
@make all
.PHONY: all up down clean fclean re
mount /dev/cdrom /cdrom/
cd cdrom
./VBoxLinuxAdditions.run
실행시키면 media에 설정되어있음
systemctl enable ssh // 먼저 해야 sshd_config가 생김
vim /etc/ssh/sshd_config //PermitRootLogin을 yes로 바꾼다.
systemctl restart ssh