
Koren 넷 챌린지 9기 대회를 진행하면서 Mysql-PHP-Apache 환경을 구성해야 하는 일이 생겼다.
핸드폰 앱과 Mysql을 연동하고자 함인데, 서버를 쿠버네티스 환경에 구성하고자 했고, 진행했던 과정 그대로 정리해보고자 한다.
먼저 아래 깃허브 레포지토리를 찾아서 이를 기반으로 했다.
https://github.com/mochizukikotaro/k8s-php-apache-mysql
Docker compose로 구성해보기
먼저 레포지토리 내부를 보면 php 폴더와 mysql 폴더가 있고, 그 내부에 각각의 Dockerfile이 있다.
먼저 php 폴더 내부의 Dockerfile이다.
FROM php:7-apache
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
&& apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev \
&& docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt
이는 php-apache 이미지를 가지고 필요한 라이브러리들을 설치해주는 도커파일이다.
다음은 mysql 폴더 내부의 Dockerfile이다.
FROM mysql:5.7
COPY ./my.cnf /etc/mysql/conf.d/
이를 로컬 도커 환경에서 구성하는데, 위에서 소개한 깃허브 레포지토리에서는 docker-compose를 활용해서 실행한다.
레포지토리의 README에 나온 대로 따라했을 때 mysql의 특정 DB를 사용할 수 있도록
use [database_name]
을 해주는 것과
users_for_local.php 파일이 아니라 users_local.php 파일인 것 빼고는 잘 돌아갔었다.
Docker compose를 사용하지 않고 구성해보기
도커 컴포즈를 사용하지 않고 구성해보려고 했던 이유는
K8S에 올라갈 mysql과 php-apache 도커 이미지를 내가 직접 구성해서 사용하고 싶었기 때문이다.
도커 컴포즈는 여러 컨테이너를 동시에 하나의 yaml파일로 쉽게 띄울 수 있는 장점과 동시에
yaml파일 내부에 있는 컨테이너들끼리 연결해주는 역할을 한다.
먼저 필요한 파일들을 넣어주고 볼륨 마운트 등 레포지토리에 있던 도커 컴포즈 파일에서 설정해주던 부분들을
도커 파일 내부에 작성했다.
PHP-APACHE 도커파일
FROM php:7-apache
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
&& apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev libonig-dev \
&& docker-php-ext-install pdo_mysql mysqli mbstring gd iconv \
&& pecl install mcrypt-1.0.4 \
&& docker-php-ext-enable mcrypt
ADD index.php /var/www/html
ADD users_local.php /var/www/html
EXPOSE 80
먼저 pecl ... 과 docker-php... 부분은 도커 파일 빌드 시에 오류를 해결하면서 추가했던 부분인데,
왜 도커 컴포즈에서 빌드할 때는 에러가 나지 않던 부분이 도커 파일만 따로 빌드하면 에러가 나는지 아직 알지 못했다.
그 외에 ADD 를 통해서 필요한 php파일을 경로에 추가해주었고,
EXPOSE를 통해서 80번 포트를 노출할 것으로 설정했다.
EXPOSE 사용 시 주의할 점으로, EXPOSE는 단지 포트를 노출만 할 뿐
이후 컨테이너 생성 시 호스트와의 연결을 위해서는 -p 옵션을 사용해서 호스트의 포트와 연결해주어야 한다
MYSQL 도커파일
FROM mysql:5.7
COPY ./my.cnf /etc/mysql/conf.d/
ENV MYSQL_ROOT_PASSWORD pass
VOLUME /var/lib/mysql
바뀐 부분은 마찬가지로 도커 컴포즈에서 설정해주던 부분들을 가져와서 추가해주었다.
패스워드를 저렇게 설정하지 않고 k8s에서 secret을 만들어서 하는 방법이 있지만, 빠른 테스트를 위해 그냥 진행했다.
도커파일 빌드
이후 도커파일을 빌드한다.
#mysql Dockerfile이 있는 디렉토리로 이동
docker build -t dks01972/mysql:1.0 .
#php-apache Dockerfile이 있는 디렉토리로 이동
docker build -t dks01972/php:1.0 .
-t를 통해 태그를 설정하고 내 도커 허브 ID인 dks01972과 image_name, 버전을 작성하고 빌드했다.
본인 아이디를 작성하거나, / 앞은 빼도 상관없다.
맨 뒤에 .을 항상 빼먹었었는데, .은 현재 디렉토리에서 Dockerfile을 찾으라는 뜻이다.
이렇게 mysql과 php 이미지를 빌드해 준 후
docker run -d --name mysql -v db:/var/lib/mysql dks01972/mysql:1.0
docker run -d --name php --link mysql:mysql -p 80:80 dks01972/php:1.0
위와 같이 docker run을 해주면 된다.
1. -d : 작성한 터미널에서 바로 컨테이너가 실행되지 않고 백그라운드에 실행할 수 있도록 함.
2. --name : 컨테이너 이름 지정.
3. -v : 호스트 볼륨과 컨테이너 볼륨 연결
4. --link : 컨테이너 간 연결
Docker Compose에서는 컨테이너를 자동으로 연결해주지만 도커를 따로 켜면 link를 해줘야 정상적으로 연결이 된다.
실행
docker exec -it mysql /bin/bash
이 명령어로 mysql의 bash에 접근할 수 있다. 접근이 완료되면
mysql -uroot -ppass
위 명령어를 통해 mysql에 접근한다.
이후 레포지토리에 나온 것과 동일하게 테스트용 DB를 생성한다.
mysql> create database mochizuki_test;
mysql> use mochizuki_test;
mysql> create table users (id int auto_increment, name varchar(255), primary key(id));
mysql> insert into users (name) values ('ken'), ('taro'), ('yuki');
mysql> exit
이후 http://localhost/users_local.php 로 접속하면
위와 같은 테스트 페이지가 보일 것이다. 이 페이지가 보이면 mysql 컨테이너와 php 컨테이너가 연동이 완료된 것이다.
다음으로는 쿠버네티스 환경에서 방금 만든 이미지들을 활용해서 yaml파일을 작성하고 apply 해본 후
nodePort 서비스를 통해 포트를 뜷어준 고정IP를 가진 다른 컴퓨터에서 접근할 수 있도록 구성할 계획이다.
'쿠버네티스' 카테고리의 다른 글
NodeJS 쿠버네티스에 업로드 (0) | 2022.08.10 |
---|---|
쿠버네티스 환경에 Mysql-PHP-Apache 세팅하기 (2) - K8S 환경에 올리기 (0) | 2022.07.21 |
K8S error validating data: couldn't find type: v1beta1.Deployment 해결 (0) | 2022.07.20 |
K8S 특정 파드 및 컨테이너 접속 시 오류 (error dialing backend: dial tcp: lookup pod_name on IP : no such host) (0) | 2022.07.20 |