12.1 9:28 pm
이제부터 할거는 html 코드 수정 + python 코드 수정 해서 제대로 동작할 수 있게 하는 것 뿐이다
즉 docker container 로 동작하게하는 환경 설정이 모두 끝났기 때문에
python , mysql , php-apache 3개의 컨테이너에 대한 docker-compose 파일과
jenkins container + hub.docker + git repo 를 이용한 CI/CD 환경을 설계+구축 해보자
구름 국비지원 프로젝트 할때 해봤으니 훨씬 쉬울듯
12.4 9:07 pm
처음부터 해보자
diagram
CICD FLOW
1. 사용자가 코드를 코딩 + git repo에 push
2. git repo 에 설정된 webhook이 발생 + jenkins build trigger catch
3. jenkinsfile stages
- image build test
- image push to hub.docker
- ansible 통해 원격지 docker-compose up
나중에 다른 프로젝트들이 더 올라가면 k8s 로 마이그레이션하는걸로 하고
지금은 일단 jenkins container 가 돌아가는 개발용 docker instance 하나랑
운영 환경용 instance 하나로 구성해보자
서울 리전에 기본 vpc의 기본 public 서브넷중 하나를 선택해서 운영환경을 구성해볼 예정이다.
그리고 기본 vpc 안에 private subnet 을 하나 만들어서 db server 로 돌릴 instance 를 싼걸로 하나 만들어줬다.
i/o 성능은 크게 중요하지 않으니까 용량만 프리티어 최대치로 맞춰놓고 생성해줬다.
12.5 7:49 pm
인스턴스 환경
Jenkins server | Web server | DB server | |
OS | ubuntu 22.04 | ubuntu 22.04 | ubuntu 22.04 |
인스턴스 유형 | t3a.medium | t3a.small | t2.micro |
key pair | dev-all | prod-blackpink | dev-all |
VPC | default | default | default |
subnet | 2a | 2a | 2a |
public ip | EIP | yes | yes |
SG-inbound | 22,8080 | 22,80,443 | 22,3306 |
SG-outbound | anywhere | anywhere | anywhere |
storage | 16GiB | 16GiB | 30GiB |
container | jenkins | php-apache, python | mysql |
리소스 태그
Jenkins server | Web server | DB server | private subnet | S3 bucket | |
tag - Name | ec2-jenkins_server-01 | ec2-web_server_01 | ec2-db_server_01 | subnet-ap_northeast_2a-private_01 |
s3bucket-ap_northeast_2-public_image_storage
|
tag - Project | General | ResponsiveWeb-blackpinkinyourarea | General | General | ResponsiveWeb-blackpinkinyourarea |
tag - Environment | Develop | Production | General | Production | Production |
- 보안그룹 태그
SG-ssh | SG-for-jenkins_server | SG-for-web_server |
SG-for-db_server
|
|
tag - Name | sg-default_vpc-ec2-ssh | sg-default_vpc-ec2-jenkins | sg-default_vpc-ec2-webserver |
sg-default_vpc-ec2-dbserver
|
tag - Project | General | General | ResponsiveWeb-blackpinkinyourarea | General |
tag - Environment | General | Develop | Production | General |
- jenkins server 는 앞으로도 cicd 환경을 구축할때 사용하고 또 빌드가 실행될 곳이기 때문에 medium 에 EIP 를 할당해주려고 한다
- db server 의 스토리지는 프리티어 최대 사용량인 30GiB 로 설정해줬다
- 인스턴스의 들의 보안그룹은 SG-ssh, SG-for-jenkins_server, SG-for-web_server, SG-for-db_server 이렇게 4개 사용할 예정이다
- S3 bucket 은 사진 다운로드를 위해 퍼블릭 액세스 오픈해서 사용한다
이정도로 설계하고
테라폼으로 하면 좋겠지만
지금은 일단 수동으로 생성해보자
12.5 8:42 PM
subnet
먼저 서브넷을 만들어줬다
CIDR 는 기본 vpc 에서 남은 대역중 다음 대역을 선택해줬다
SG
보안그룹도 설계에 맞춰서 생성해줬다
EIP
그리고 위 설계에 맞춰 jenkins server 를 만들어주고
ubuntu 22.04 이미지를 선택해 준다음
EIP 를 연결해줬다
EIP 태그
Name : eip-ap_northeast_2-conn_jenkins
Project : General
Environment : Develop
이후 jenkins 서버에
- 도커 설치
- sudo 없이 도커 명령 실행
이렇게 설치해놓은 다음에 AMI 를 떠서 나머지 서버에 적용시킬 예정이다.
이전 포스트 에서 다시 참고
https://yeonwoo97.tistory.com/314
업데이트 및 필요 패키지 설치
sudo apt update
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
Docker GPG key 추가
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
리포지토리 설정
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker 엔진 설치
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
Docker daemon 설정
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl enable --now docker
- CRI container runtime 설치
cri-docker 패키지 다운로드
https://github.com/Mirantis/cri-dockerd/releases/tag/v0.2.6
cri-docker 패키지 설치
sudo apt install ./<해당버전>.deb
cri-docker 패키지 설치 후
sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket
sudo 없이 docker 명령어 실행
그룹 추가
sudo groupadd docker
그룹에 사용자 추가
sudo usermod -aG docker {user_id}
docker 재시작
sudo service docker restart
권한오류 Got permission denied while trying to ...
sudo chown root:docker /var/run/docker.sock
혹은
sudo chmod 666 /var/run/docker.sock
이제 인스턴스 종료하고 AMI 로 떠보자
12.5 7:49 pm
AMI
ami tag
Name : ami-docker_in_ubuntu
Project : General
Environment : General
이제 사용 가능하다고 하면 나머지 인스턴스 2개도 각각 만들고
host이름까지만 바꿔놓자
12.5 10:01 PM
인스턴스 생성
sudo 없이 docker 명령이 잘 실행 되는 모습
그런데 mysql 최소사양을 봤는데
하드웨어 사양(시스템 요구 사항)
|
12.7 7:35 pm
private subnet 에 위치한 db server 에 mysql container 환경설정
먼저 개발 환경에서 docker image 를 tar 로 압축해서 보내줌
그리고 private subnet 에 위치한 ec2 에 ssh 접속해서
docker load 로 image 에 저장해줌
이후 mysql container 생성해줌
ubuntu@ip-172-31-78-182:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ubuntu@ip-172-31-78-182:~$
ubuntu@ip-172-31-78-182:~$ docker run -it --name mysql-db -e MYSQL_ROOT_PASSWORD=비밀번호 -d -p 3306:3306 mysql:latest
f30f097dd22fdd38581b9e7c9cc44991a5440423d6b6262fa4fe9408569e7810
ubuntu@ip-172-31-78-182:~$
ubuntu@ip-172-31-78-182:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f30f097dd22f mysql:latest "docker-entrypoint.s…" 7 seconds ago Up 4 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-db
ubuntu@ip-172-31-78-182:~$
ubuntu@ip-172-31-78-182:~$
db 랑 테이블을 만들어보자
DB : blackpink | |||
table : test | table : blackpink_img_data | ||
column | type | column | type |
sample_no | int | DB_MEM_NAME | varchar(10) |
sample_name | varchar(100) | DB_YEAR | int |
DB_MONTH | int | ||
DB_DAY | int | ||
DB_FILENUM | int | ||
DB_S3URL | varchar(300) | ||
DB_DOWNLOAD | int |
위처럼 간단하게 2개 테이블만 만들어보자
create table test (
sample_no int,
sample_name varchar(100)
);
create table blackpink_img_data (
DB_MEM_NAME varchar(10),
DB_YEAR int,
DB_MONTH int,
DB_DAY int,
DB_FILENUM int,
DB_S3URL varchar(300),
DB_DOWNLOAD int
);
테스트 데이터 넣어보고 확인하기
액셀 백업 파일 안의 데이터 db로 옮기기
이전에 액셀파일로 백업해놨던 데이터를
private subnet 의 mysql container 안으로 옮겨보자
private subnet 에 위치한 db server 로 mysql connect 해야하기 때문에
기존 개발 환경인 instance 에서 접속해볼 예정이다.
import pandas as pd
import pymysql
con = pymysql.connect(host='172.31.78.182', user='root', password='비밀번호',
db='blackpink', charset='utf8') # 한글처리 (charset = 'utf8')
cur = con.cursor()
excel_sheet = pd.read_excel('/home/ubuntu/db-backup.xlsx',
sheet_name = 'backup-data', engine='openpyxl')
sql_insert_1 = 'insert into blackpink_img_data values(%s, %s, %s, %s, %s, %s, %s)'
for idx in range(len(excel_sheet)):
cur.execute(sql_insert_1, tuple(excel_sheet.values[idx]))
con.commit()
con.close()
db server 와 같은 vpc 에 위치한 dev server 에서 실행할 내용
ubuntu@blackpinkinyourarea:~$ python3 migration_backup_data.py
ubuntu@blackpinkinyourarea:~$
실행
2170 개 데이터 모두 잘 옮겨진 모습
mysql 쪽 container 는 된거같고 이제 운영 환경에 CI/CD 적용을 해보자
'Archive > [Infra+Web] fanpage:BLACKPINKINYOURAREA' 카테고리의 다른 글
[Web]BLACKPINK IN YOUR AREA-25-CI/CD 환경 구축-3 (0) | 2022.12.18 |
---|---|
[Web]BLACKPINK IN YOUR AREA-24-CI/CD 환경 구축 + 부분 문서화-2 (0) | 2022.12.07 |
[Web]BLACKPINK IN YOUR AREA-22-python+mysqlDB 연동 (1) | 2022.12.01 |
[Web]BLACKPINK IN YOUR AREA-21- php-ahache docker container에 mysqli 설치 + 적용 (0) | 2022.12.01 |
[Web]BLACKPINK IN YOUR AREA-20-Apache 가 포함된 PHP container 설치 (동작 실패) (0) | 2022.11.13 |