Commit 0be71506 authored by JooHan Hong's avatar JooHan Hong

docker swarm init

parent 79a453ad
Pipeline #5160 passed with stages
in 3 seconds
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* Docker * Docker
# GitLab Runner Overview ## GitLab Runner Overview
Runner는 yaml을 파일을 수행한다. 특정 프로젝트에 국한되거나, 여러 프로젝트에서 사용할 수 있도록 제공된다. 여기서 모든 여러 프로젝트에서 사용할 수 있는 Runner를 **Shared Runner**이라고 하며, 특정 프로젝트에 국한되서 사용되는 Runner를 **Specific Runner**라고 한다. Runner는 yaml을 파일을 수행한다. 특정 프로젝트에 국한되거나, 여러 프로젝트에서 사용할 수 있도록 제공된다. 여기서 모든 여러 프로젝트에서 사용할 수 있는 Runner를 **Shared Runner**이라고 하며, 특정 프로젝트에 국한되서 사용되는 Runner를 **Specific Runner**라고 한다.
...@@ -192,3 +192,8 @@ GitLAB의 pipeline을 보면, 다음과 같이 진행된 것을 확인할 수 ...@@ -192,3 +192,8 @@ GitLAB의 pipeline을 보면, 다음과 같이 진행된 것을 확인할 수
- **STEP 4** : Stag 서버에서 변경된 내역을 확인한다. - **STEP 4** : Stag 서버에서 변경된 내역을 확인한다.
## 동영상을 통한 소스배포 절차 검증
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# www.hongsnet.net Container Deploy
![source_overview](./images/hongsnet-container-deploy_dockerswarm.png)
## 구성 요소
* Git and GitLab (gitlab-ci.yml)
* gitlab-runner
* **Docker Swarm Cluster**
## GitLab Runner Overview
Runner는 yaml을 파일을 수행한다. 특정 프로젝트에 국한되거나, 여러 프로젝트에서 사용할 수 있도록 제공된다. 여기서 모든 여러 프로젝트에서 사용할 수 있는 Runner를 **Shared Runner**이라고 하며, 특정 프로젝트에 국한되서 사용되는 Runner를 **Specific Runner**라고 한다.
홍쓰넷 컨테이너 배포에는 `Specific Runner`를 사용한다.
## Container Deploy Overview
- **STEP 1** : STAG 시스템에 먼저 Docker Image를 배포한 후 검증한다.
> 사전에 devel 브랜치로 checkout을 수행한다.
- **STEP 2** : STAG 시스템에서 검증이 완료되면, 다음과 같이 두 가지 Stage가 수행된다.
- First : **push** stag는 GitLAB의 Container Registry에 Container Image를 PUSH 한다.
- Second : **deploy** stag는 Docker Swarm Manager 서버에 Image 배포를 명령한다. 단, 모든 WORKER Node가 한 번에 업데이트되는 것이 아니라 한 대씩(**--update-parallelism 1**) 업데이트를 수행하게 된다.
## www.hongsnet.net **Dockerfile**
```bash
# cat Dockerfile
FROM registry.hongsnet.net/joohan.hong/docker/centos:7.6.1810
MAINTAINER Hongs <master@hongsnet.net>
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone &&\
yum -y install epel-release
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
RUN yum -y install glibc glibc-common freetype-devel libjpeg-devel openssl-devel net-tools vi vim iproute vsftpd wget postfix cronie crontabs supervisor
COPY config/libmcrypt-config /usr/local/bin/libmcrypt-config
COPY config/mm-config /usr/local/bin/mm-config
COPY config/mcrypt.h /usr/local/include/mcrypt.h
COPY config/mm.h /usr/local/include/mm.h
COPY config/libmm.so.14.0.22 /usr/local/lib/libmm.so.14.0.22
COPY config/libmm.so.14 /usr/local/lib/libmm.so.14
COPY config/libmm.so /usr/local/lib/libmm.so
COPY config/libmhash.a /usr/local/lib/libmhash.a
COPY config/libmhash.la /usr/local/lib/libmhash.la
COPY config/libmhash.so /usr/local/lib/libmhash.so
COPY config/libmhash.so.2 /usr/local/lib/libmhash.so.2
COPY config/libmhash.so.2.0.1 /usr/local/lib/libmhash.so.2.0.1
COPY config/libmcrypt.la /usr/local/lib/libmcrypt.la
COPY config/libmcrypt.so /usr/local/lib/libmcrypt.so
COPY config/libmcrypt.so.4 /usr/local/lib/libmcrypt.so.4
COPY config/libmcrypt.so.4.4.7 /usr/local/lib/libmcrypt.so.4.4.7
RUN ln -s /usr/lib64/libpng.so /usr/lib/libpng.so &&\
ln -s /usr/lib64/libjpeg.so /usr/lib/libjpeg.so
COPY config/bashrc /root/.bashrc
COPY config/main.cf /etc/postfix/main.cf
COPY config/master.cf /etc/postfix/master.cf
COPY binary/mysql /usr/local/mysql
COPY binary/apache /usr/local/apache
RUN chmod 701 /usr/local/apache/htdocs
COPY binary/php /usr/local/php
COPY binary/curl /usr/local/curl
RUN mkdir /usr/lib64/curl_backup
RUN mv /usr/lib64/libcurl.so* /usr/lib64/curl_backup/
RUN cp -rf /usr/local/curl/lib/libcurl.so* /usr/lib64/
RUN rpm -ivh http://pds.hongsnet.net:8888/packages/filebeat-7.9.3-x86_64.rpm
COPY config/filebeat.yml /etc/filebeat/filebeat.yml
COPY config/supervisord.conf /etc/supervisor/supervisord.conf
COPY config/hongsnet.conf /etc/supervisor/conf.d/hongsnet.conf
EXPOSE 80
RUN echo "hongsnet, 2020-01-20(5b23e123)" > /root/release_image
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]
```
다음은 배포에 대한 정책을 수행하는 **.gitlab-ci.yml** 파일에 대한 내역이다.
## GitLAB .gitlab-ci.yml 파일의 작성
```python
# cat .gitlab-ci.yml
stages:
- devel
- push
- deploy
variables:
GIT_STRATEGY: clone
GIT_SSL_NO_VERIFY: "1"
GITLAB_TOKEN: "XXXXXX"
BUILD_IMAGE: ${CI_PROJECT_DIR}/hongsnet
before_script:
#- export RELEASE_DATE=`date +"%Y%m%d"`
push:
stage: push
only:
- deploy
script:
- docker login -u juhanida21@nate.com -p $GITLAB_TOKEN registry.hongsnet.net
- /usr/bin/docker tag hongsnet-dev:init registry.hongsnet.net/joohan.hong/docker/hongsnet:latest
- /usr/bin/docker push registry.hongsnet.net/joohan.hong/docker/hongsnet:latest
tags:
- deploy
deploy:
stage: deploy
only:
- deploy
script:
- docker login -u juhanida21@nate.com -p $GITLAB_TOKEN registry.hongsnet.net
- docker service update --image registry.hongsnet.net/joohan.hong/docker/hongsnet:latest --update-parallelism 1 web_hongsnet
tags:
- backup
build:
stage: devel
only:
- devel
script:
- cd /DATA/DOCKERS/hongsnet-dev; docker-compose down
- cd ${BUILD_IMAGE}
- docker build --rm -t hongsnet-dev:init .
- (if [[ `docker images -f "dangling=true" -q` != "" ]]; then docker rmi $(docker images -f "dangling=true" -q); fi);
- (rm -rf /DATA/DOCKERS/hongsnet-dev/docker-compose.yml; cp -rf /DATA/DOCKERS/hongsnet-dev/docker-compose.yml_init /DATA/DOCKERS/hongsnet-dev/docker-compose.yml);
- (sed 's/init/${CI_COMMIT_SHA}/g' -i /DATA/DOCKERS/hongsnet-dev/docker-compose.yml);
- cd /DATA/DOCKERS/hongsnet-dev; docker-compose up -d
tags:
- devel
```
## 컨테이너 배포 절차
- **STEP 1** : devel 브랜치를 Checkout 한다.
```bash
# git checkout devel
# git branch
* devel
deploy
master
```
- **STEP 2** : 컨테이너 이미지에 대한 작업을 수행한다.
> Working...
컨테이너 이미지 생성 시 **Git의 Commit SHA 값으로 컨테이너의 Tagging을 지정**한다.
```python
(rm -rf /DATA/DOCKERS/hongsnet-dev/docker-compose.yml; cp -rf /DATA/DOCKERS/hongsnet-dev/docker-compose.yml_init /DATA/DOCKERS/hongsnet-dev/docker-compose.yml);
```
**docker-compose.yml** 파일내역은 다음과 같다.
```bash
# cat docker-compose.yml_init
version: '3'
services:
hongsnet:
image: hongsnet-dev:init
hostname: 'dev.hongsnet.net'
volumes:
- "/DATA/SERVICE/passwd:/etc/passwd"
- "/DATA/SERVICE/group:/etc/group"
- "/DATA/SERVICE/shadow:/etc/shadow"
- "/DATA/SERVICE:/home"
- "/DATA/SERVICE/logs:/usr/local/apache/logs"
- "/DATA/DOCKERS/hongsnet-dev/ssl:/etc/letsencrypt"
- "/WEB_DATA/EDU/Data:/home/edu/public_html/HongsBoard/Data"
- "/WEB_DATA/EDU/Web_editor/EDU:/home/edu/public_html/HongsBoard/Web_editor/EDU"
- "/WEB_DATA/EDU/Web_editor/FILE:/home/edu/public_html/HongsBoard/Web_editor/FILE"
- "/WEB_DATA/HONGSNET/Data:/home/hongsnet/public_html/Data"
- "/WEB_DATA/HONGSNET/Web_editor/FILE:/home/hongsnet/public_html/Web_editor/FILE"
- "/WEB_DATA/NEWHONGSYSTEM/Data:/home/newhongsystem/public_html/Data"
- "/WEB_DATA/NEWHONGSYSTEM/Web_editor/FILE:/home/newhongsystem/public_html/Web_editor/FILE"
ports:
- "80:80"
```
**!참고**
.gitlab-ci.yml 파일에 정의된 내역을 보면 다음과 같이 **Git Commit SHA 값**으로 변경하는 명령이 존재한다.
```python
- (sed 's/init/${CI_COMMIT_SHA}/g' -i /DATA/DOCKERS/hongsnet-dev/docker-compose.yml);
```
이는 `Commit 된 SHA 값`을 향후 **참조하기 위한 용도**로 사용된다.
![container_dev](./images/gitlab_ci_cd_container.png)
- **STEP 3** : **STAG** 시스템에서 Docker Image의 상태를 확인한다.
```bash
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29bc33723517 hongsnet-dev:d7f4a64cc6098bd61af337e0c822bc53c5ed35b7 "/usr/bin/supervisor…" 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp hongsnet-dev_hongsnet_1
0779415724e2 portainer/portainer-ce:latest "/portainer" 4 weeks ago Up 4 weeks 8000/tcp, 0.0.0.0:9000->9000/tcp portainer
```
- **STEP 4** : Stag 단계에서 문제가 없다면, 다음과 같이 배포하고, **실제 서비스에 적용**한다.
먼저 deploy 브랜치로 Checkout 한다.
```bash
# git checkout deploy
Switched to branch 'deploy'
```
**!중요**
Stag 과정 중에 Commit 된 ${CI_COMMIT_SHA} 변수를 /root/release_image 파일에 업데이트함으로써 증적을 기록한다.
```bash
# cat Dockerfile
...중략
RUN echo "hongsnet, 2020-01-20(d7f4a64cc6098bd61af337e0c822bc53c5ed35b7)" > /root/release_image
```
이제 add/commit/push를 진행하면 된다.
```bash
# git add hongsnet/Dockerfile
# git commit -m "2020-01-20(d7f4a64cc6098bd61af337e0c822bc53c5ed35b7)"
# git push -u origin deploy
```
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
- **구성 요소** : LoadBalancer(Ha-Proxy), Docker Container, K8s, Apache, PHP, MariaDB, ElasticStack, Zabbix, - **구성 요소** : LoadBalancer(Ha-Proxy), Docker Container, K8s, Apache, PHP, MariaDB, ElasticStack, Zabbix,
Promeheus, KVM Virtualization, Network Switching Promeheus, KVM Virtualization, Network Switching
- **사이트 운영이력** : 2010년 ~ 현재 - **사이트 운영이력** : 2010년 ~ 현재
- **운영 형태** : On-Premise - **운영 형태** : On-Premise, `비영리`
## edu.hongsnet.net 교육시스템 운영 현황 ## edu.hongsnet.net 교육시스템 운영 현황
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment