- 워드프레스는 MySQL 데이터베이스랑 같이 작동
저는 mysql대신 mariadb를 사용했습니다. 제 글에선 mysql을 mariadb로 생각하시면 될거 같습니다.
과제는 mysql을 사용하는것이였지만, 저는 몰래 mariaDB를 사용햇습니다. ㅠ..ㅠ
docker build -t MySQL srcs/MySQL/
FROM alpine:3.12
RUN apk update && apk upgrade \
&& apk add mariadb mariadb-client curl \
&& apk add openrc \
&& rm -rf /var/cache/apk/*
ADD https://dl.influxdata.com/telegraf/releases/telegraf-1.6.3-static_linux_amd64.tar.gz ./
RUN tar -C . -xzf telegraf-1.6.3-static_linux_amd64.tar.gz && \
chmod +x telegraf/* && \
cp telegraf/telegraf /usr/bin/ && \
rm -rf *.tar.gz* telegraf/
COPY telegraf.conf /etc/telegraf/
COPY my.cnf /etc/
COPY start_mariadb.sh .
COPY hoylee_db.sql .
COPY create_db .
COPY ./healthy.sh /tmp/healthy.sh
VOLUME ["/var/lib/mysql"]
EXPOSE 3306
ENTRYPOINT sh start_mariadb.sh
추가적으로 my.cnf 에서도 datadir 경로를 설저합니다.
[mysqld]
socket=/run/mysqld/mysqld.sock
port=3306
datadir=/var/lib/mysql
user=root
bind-address=0.0.0.0
skip-networking=false
mysql.sock은 Unix Domain Socket 입니다.
unix domain soket은 컴퓨터가 다른 프로세스와는 통신할수 없고, 같은 컴퓨터에 있는 프로세스끼리 통신이 가능함. (tcp/ip보다 속도가 빠르다., 여기서는 mariadb서버와 mariadb클라이언트 사이를 연결하는데 사용한다., 아무래도 DB데이터 이다보니 소켓중에서도 tcp/ip를 쓰는 통신이 아닌 내부망끼리 연결하는 통신을 사용한거 같다. 추측입니다.)
tcp/ip연결는 4계의 계층으로 연결되어 있다. 그림참조 7계층 설명
우리가 만든 워드프레스와 mysql은 응용계층에 해당하고, 이 두개의 응용 개층끼리 통신을 하기 위해서는 아래와 같이 캡슐화 되는 작업이 필요하다.캡슐화그림참조
만약 wordpress에서 marieaDB로 tcp/ip통신을 한다면 wordpress의 http 정보 -> 전송계층형태로 캠슐화 -> 네트워크 계층형태 캡슐화 -> 데이터링크 계층형태 캡슐화 -> 라우터 -> mariadb 데이터링크 -> mariadb 네트워크 계층 -> 전송계층 -> mariadb 응용계층 순으로 정보를 전달하게 된다. osi 7 계층 설명
datadir=/var/lib/mysql : 데이터 디렉토리 경로 지정
데이터 디렉토리란? : 데이터 디렉토리는 시스템 카탈로그에 수록된 데이터를 접근하기 위한 정보를 유지하는 시스템데이터디렉토리란? 참고
시스템 디렉토리란? : 시스템 카탈로그는 데이터베이스 관리자의 도구로, 데이터베이스에 저장되어 있는 모든 데이터 개체들에 대한 정의나 명세에 대한 정보가 수록되어 있는 시스템 테이블이다.시스템 디렉토리?
var/lib 폴더 = 해당 계층은 어플리케이션이나 시스템에 관련된 상태 정보를 수행한다. 상태 정보라 함은 프로그램이 실행되는 동한 수정하고 특정 호스트의 호출과 관련된 데이터를 말한다.var 폴더 정리 사이트 good!
bind-address=0.0.0.0 : bind-address는 mysql server의 listen ip로 맞추어 주면된다. (sudo net stat -ntlp |grep mysqld) 라고 입력해서 나오는 아이피로 입력해도 되고, 지금처럼 0.0.0.0으로 입력해줘도 된다. 클라이언트랑 서버사이에 연결을 위해 입력함.
skip-networking=false : skip-networking 이 지시가 활성화 되면, 오로지 sock 파일로만 통신 됨(우린 포트로 클라이언트랑 통신함.)
rc default
/usr/bin/telegraf &
/etc/init.d/mariadb setup
rc-service mariadb start
mysql -u root mysql < create_db
mysql -u root my_db < hoylee_db.sql
rc-service mariadb stop
/usr/bin/mysqld_safe & telegraf & /usr/bin/mysqld_safe
mariadb를 설치 해주고, rc를 통해 시작함. (debian os에서는 service mariadb start 이렇게 바로 실행햇는데 alpine에서는 바로 실행할수가 없어서 openrc를 이용함)
앞에도 있는 내용이지만 한번더..
실행한 mysql의 아이디와 설정들을 진행해주고, 설정한 계정을 적용시키기 위해,rc-service mariadb stop를통해 중지시키고 /usr/bin/mysqld_safe로 재시작해준다.
/usr/bin/mysqld_safe 명령어는 mariadb를 실행하는 명령어
CREATE DATABASE my_db;
CREATE USER 'admin'@'%' IDENTIFIED BY 'password';
GRANT ALL ON my_db.* TO 'admin'@'%' WITH GRANT OPTION;
The WordPress website will have several users and an administrator.
과제에서 워드프레스에 접속했을때 유저와 관리자가 있어야한다고 했다.
mysql과 wordpress가 연결된 상태에서 wordpress에 접속하면, sql파일이 생성되는데 이 파일에 관리자 사용자를 추가한 생태로 저장해서 marieadb 이미지를 구울때 업로드 해주는 원리다.(아래와 같이 유저를 추가한 상태로, phpmyadmin 접속)
phpmyadmin 에서 내보내기를 통해 파일을 다운받고, 원하이름으로 파일 명을 변경하면 된다. 나는 hoylee_db.sql로 변경했다.
mysql -u root my_db < hoylee_db.sql 그후 파일을 이렇게 절대 권한으로 들어가서 써주면 적용이된다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mariadb-volume-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mariadb-deploy
spec:
selector:
matchLabels:
app: mariadb
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: mariadb
spec:
containers:
- name: mariadb-container
image: mysql
imagePullPolicy: Never
ports:
- containerPort: 3306
volumeMounts:
- mountPath: "/var/lib/mysql"
name: mariadb-volume
volumes:
- name: mariadb-volume
persistentVolumeClaim:
claimName: mariadb-volume-claim
---
apiVersion: v1
kind: Service
metadata:
name: cip-mariadb
spec:
type: ClusterIP
ports:
- port: 3306
name: mariadb
targetPort: 3306
selector:
app: mariadb
PersistentVolumeClaim 이란? 일반적으로 디스크 볼륨을 설정하려면 물리적 디스크를 생성해야한다. 쿠버네티스는 물리적 디스크를 생성하는 복잡한 과정을 추상화를 통해서 간단하게 개발자가 볼륨을 생성하는 기능을 제공하는데 그건 바로 PersistentVolumeClaim와 PersistentVolume 을 이용하는 방법이다.
시스템 관리자가 실제 물리 디스크를 생성한 후에, 이 디스크를 PersistentVolume이라는 이름으로 쿠버네티스에 등록한다.
개발자는 Pod를 생성할때, 볼륨을 정의하고, 이 볼륨 정의 부분에 물리적 디스크에 대한 특성을 정의하는 것이 아니라 PVC를 지정하여, 관리자가 생성한 PV와 연결한다.
조대협님의 persistentvolume참고