[ft_services] 6. wordpress 이미지파일을 만들고, 쿠버네티스를 통해 배포해보자.

이호용·2021년 5월 10일
0

42_ft_services

목록 보기
6/8
post-thumbnail

해야할일

  • 워드프레스에 컨테이너에 nginx서버를 사용, wordpress를 돌려야한다.
  • wordpress를 동적요청도 처리하기 위해 mariaDB와 연동을 시켜주자.
  • phpmyadmin도 비슷하다.
  • mariaDB의 데이터들을 좀더 쉽게관리하는 phpmyadmin을 설치하고 mariaDB에 연결해주자.

wordpress 설정 조건

  • 워드프레스 웹 사이트는 5050 포트를 수신
  • 워드프레스는 MySQL 데이터베이스랑 같이 작동
  • 두 서비스 모두 별도의 컨테이너에서 실행되어야합니다.
  • 워드프레스 웹 사이트에는 여러 사용자와 관리자를 갖습니다.
  • 워드프레스 자체 nginx 서버가 필요합니다.
  • 로드 밸런서는 이 서비스로 직접 리디렉션 할 수 있어야 합니다.
    과제해석 참고

srcs/wordpress/dockerfile

alpine linux 공홈위키 - wordpress 설치방법

FROM alpine:3.12
RUN apk update && apk upgrade && \
	apk add --no-cache nginx php7 php7-fpm php7-opcache php7-gd php7-mysqli \
	php7-zlib php7-curl php7-mbstring php7-json php7-session
COPY ft_wordpress.sh default.conf wp-config.php ./

RUN adduser -D -g 'www' www && mkdir -p /www \
	&& chown -R www:www /var/lib/nginx && chown -R www:www /www

RUN	mkdir -p /run/nginx

ADD https://wordpress.org/latest.tar.gz .
RUN tar -xvf latest.tar.gz && \
	mv wordpress /www && \
	mv wp-config.php /www/ && \
	rm -f latest.tar.gz

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 ./healthy.sh /tmp/healthy.sh
RUN mv ./default.conf /etc/nginx/conf.d/default.conf

EXPOSE 5050

ENTRYPOINT sh ft_wordpress.sh
  • wordpress의 독자적인 nginx를 설치하라고 해서 nginx를 설치하였고, 포트번호는 5050으로 지정해서 설정해 주었다. dockerfile에서의 설정은 저번에 nginx에서 설정과 동일하다.
  • add를 통해, 워드프레스 홈페이지에서 파일을 다운받아주고, 아래 코드를 통해,압출을 풀고 www폴더에 넣어주었다. (왜 www 폴더에 넣는지, 이유는 모르겠다. 워드프레스에서 그렇게 설정한건데, www폴더가 뭐하는 폴더인지 찾아보면 알수 있지 않을까? 아 웹이 이래서 싫다. 논리 없이 그냥 다 약속이다. 약속약속) 도커파일 만들떄 참고 한 사이트
  • healthy.sh 는 livenessprobe를 위해 설치해주었고, telegraf는 influxDB를 위해 설치했다.
  • wp-config.php : 여기서 mariaDB와 연결을 해준다.
  • 필요한 툴 설치
apk add --no-cache php7 php7-fpm php7-opcache php7-gd php7-mysqli \
	php7-zlib php7-curl php7-mbstring php7-json php7-session
  • php7-fpm : PHP FastCGI Process Manger의 약자로, CGI보다 빠른 버전이라고 말할 수 있습니다.
  • php7-opcache : php를 bytecode로 컴파일하고, 해당 데이터를 공유메모리에 저장 시켜 성능을향상시키는 모듈
  • php7-gd : gd는 png, jpg, gif 등 을 다루는 library
  • php7-mysqli : mysqli는 뭔가 했더니 mysql보다 더 빠르고, 더 안전한 쿼리문이라는거
    대충 이런식이다. 나도 알고 설치를한게 아니라, alpine 공식 홈페이지에서 wordpress를 설치할떄 필요한 설치 자료들을 보고 따라했다. (alpine 공식 wiki)[https://wiki.alpinelinux.org/wiki/WordPress]

cgi란? : CGI란 공통 게이트웨이 인터페이스(Common Gateway Interface)의 약어로, 웹서버와 외부 프로그램 사이에서 정보를 주고받는 방법이나 규약들을 말한다.
우리가 사용하는 nginx, apach 등 서버들은 클라이언트에서 요청이 들어오면 해당 요청에 맞는 정보를 제공하는게 일반적인 서버(정적인 작업만 가능)의 기능이다.
문제는 이러한 정적인 작업만 가능하면, 회원가입을 할 떄 사용자가 입력한 데이터들이나 인터넷 주문을 할떄 필요한 사용자 정보들을 db에 저장할수 없다. 이러한 문제점을 해결하기 위해서는, 외부 프로그램과 정보를 주고받을 규약이 필요했고, 이것을 cgi라고 한다.
참고자료 - cgi란 무엇인가?, 웹서버와 웹 어플리케이션 서버 차이, 위키 cgi란?

srcs/wordpress/default.conf

server {
	listen   5050;
	listen   [::]:5050;
   root 		/www/wordpress;
   index		index.html index.htm index.php;
   location ~ \.php$ {
      fastcgi_pass      127.0.0.1:9000;
      fastcgi_index     index.php;
      include           fastcgi.conf;
   }
   location / {
      try_files         $uri $uri/ =404;
   }
}
  • nginx랑 다른 점은 fastcgi를 추가했는데, 이를통해 php-fpm과 nginx가 소켓통신으로 연결되게 된다. nginx로 전해지는 php파일을 좀더 빨리 html형식으로 변환시켜준다.

php란? : 원래는 동적 웹 페이지를 만들기 위해 설계되었으며 이를 구현하기 위해 PHP로 작성된 코드를 HTML 소스 문서 안에 넣으면 PHP 처리 기능이 있는 웹 서버에서 해당 코드를 인식하여 작성자가 원하는 웹 페이지를 생성한다.

fastcgi란? : CGI는 데이터 처리요청이 있을 때마다 매번 프로세서를 실행해야만 했다. FastCGI는 매번 프로세스를 만들지 않고, 미리 만들어 놓은 프로세스와 데이터를 주고 받음으로서 CGI 보다 더 효츌적으로 작동한다. 이러한 해결책으로 CGI를 진화시킨 기술로 FastCGI 입니다 20년 넘는 기간 동안 표준이 되었고 대부분의 웹서버(Nginx, IIS, Apache)가 FastCGI 기능을 제공합니다

srcs/wordpress/wp-config.php

<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://wordpress.org/support/article/editing-wp-config-php/
 *
 * @package WordPress
 */

// ** 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', 'hoylee' );

/** MySQL database password */
define( 'DB_PASSWORD', 'hoylee' );

/** MySQL hostname */
define( 'DB_HOST', 'cip-mariadb' );
define('WP_HOME', 'http://192.168.99.10:5050' );
define('WP_SITEURL', 'http://192.168.99.10:5050' );
/** 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', '' );
  • db와 wordpress를 연결시킨다.
  • 'DB_HOST', 'cip-mariadb' 이렇게 설정했는데, DB_HOST에 mariadb의 services이름을 적어주었다. 그리고 접속할떄 필요한 아이디와 비밀번호, 를 설정해주었다. 이를 통해, mariadb와 wordpress사이에 tcp/ip통신을 구축했다. 같은 쿠버네티스 상의 파드들이지만, tcp/ip로 통신을 시켰다. 다른 좋은 방법도 있을까?

wordpress.yalm

  • 이제 이미지 파일은 모두 만들었고 생성한 이미지 파일을 yaml파일을 통해 container들을 생성해주고 생성된 컨테이너를 service를 통해 관리 및 외부 통신을 해보자.

wordpres.yalm_service

apiVersion: v1
kind: Service
metadata:
  name: service-wordpress
  labels:
    app: wordpress
  annotations:
    metallb.universe.tf/allow-shared-ip: wp
spec:
  externalTrafficPolicy: Cluster
  type: LoadBalancer
  loadBalancerIP: 192.168.99.10
  ports:
    - port: 5050
      name: http
      protocol: TCP
      targetPort: 5050
        # 셀렉터에 해당하는 라벨로트래픽을 보내준다.
        #  targetport는 특정포드로 접근하기 위핸 포트 넘버, (deployment 에서 설정한 pod의 포트 넘버)
  selector:
    app: wordpress
  • nginx와 같으므로 설명은 생략하겟습니다.

wordpres.yalm_Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
        - name: wordpress
          image: wordpress
          imagePullPolicy: Never
          ports:
            - containerPort: 5050
          livenessProbe:
            exec:
                command:
                - sh
                - /tmp/healthy.sh
            initialDelaySeconds: 8
            periodSeconds: 5
  • 이 친구도 nginx와 같이 사용했습니다.

phpmyadmin

alpine linux 공식위키 - phpmyadmin 설치방법

FROM alpine:3.12

RUN	echo "http://dl-2.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories

RUN mkdir -p /run/nginx

RUN	apk update && apk upgrade
RUN		apk add nginx openrc openssl telegraf \
		php7 php7-fpm php7-mysqli php7-xml php7-simplexml php7-json \
    	php7-iconv php7-tokenizer php7-xmlwriter php7-session php7-mbstring

COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY telegraf.conf /etc/telegraf/
COPY ./healthy.sh /tmp/healthy.sh

RUN wget http://files.directadmin.com/services/all/phpMyAdmin/phpMyAdmin-5.0.2-all-languages.tar.gz
RUN tar -zxvf phpMyAdmin-5.0.2-all-languages.tar.gz
RUN rm phpMyAdmin-5.0.2-all-languages.tar.gz
RUN mv phpMyAdmin-5.0.2-all-languages phpmyadmin

COPY config.inc.php phpmyadmin/config.inc.php
RUN chmod 644 phpmyadmin/config.inc.php

COPY	./start_php.sh .
EXPOSE	5000

CMD		sh start_php.sh
  • nginx랑 phpmyadmin에서와 큰 차이가 없습니다.
  • openrc는 alpine os가 경량화된 os이다보니, 프로세스를 제어하는 기본 명령이 없습니다.
  • openrc를 통해 프로세스 재시작 이나 프로세스 종료를 시작하기 위해 추가했습니다.

start_php.sh

#!/bin/sh

openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=AITEAM/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
telegraf & /usr/sbin/php-fpm7 --nodaemonize & nginx -g 'daemon off;'
  • 크게 다르지 않습니다. 설명은 생략하겟씁니다.

phpmyadmin/config.inc.php

<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */

/**
 * This is needed for cookie based authentication to encrypt password in
 * cookie. Needs to be 32 chars long.
 */
$cfg['blowfish_secret'] = 'hello world'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

/**
 * Servers configuration
 */
$i = 0;

/**
 * First server
 */
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'service-mariadb';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['user'] = 'admin';
$cfg['Servers'][$i]['password'] = 'password';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;

/**
 * Directories for saving/loading files from server
 */
$cfg['UploadDir'] = '';
$cfg['SaveDir'] = '';
  • mariaDB와 연결해주기위해 사용햇습니다.
  • 다른 부분들도 앞서 진행했던, nginx 와 wordpress와 비슷해서 다른 설명은 생략하겟씁니다.

0개의 댓글

관련 채용 정보