서버는 네이버 클라우드 플랫폼(NCP)에 생성했다.
처음 서버를 만들게 되면 비공인IP(사설IP)만 만들어지기 때문에 공인IP도 할당 받았다. 서버를 만들 때 발급받은 인증키는 잘보관하도록 하자. (카카오톡 나한테 보내기로 저장 & 바탕화면에 저장)
적절한 도메인 이름을 구매
wogus.net 이라는 이름을 구매했다. (연간 17달러) 구매는 위 사이트에서 했지만 관리는 https://dnszi.com/ 이곳에서 한다.
구매한 도메인 이름을 dnszi에 등록하면 네임서버 5개를 알려준다. 이 네임서버 5개를 iwantmyname 사이트의 도메인 관리창에 업데이트 해준다.
이제 dnszi 사이트에서 아래와 같이 도메인과 서버 IP를 연결해 주자.
포트 포워딩을 하는 이유 : 간단하게 cmd 창에서 ‘nslookup 도메인’을 입력하는 것으로 해당 서버의 IP를 알아낼 수 있다. 따라서 해커가 IP와 포트를 알기 때문에 (리눅스의 원격제어 포트는 22번 포트) 마구잡이로 비밀번호를 입력해서 원격제어를 시도할 수 있다.
따라서 포트 포워딩을 통해 실제 서버에 바로 접근하는 것을 막도록 하자
NCP에 들어가 보면 포트 포워딩 정보가 있다. 편집 버튼을 눌러서 포트 포워딩 정보를 입력해주자. 정리하자면 현재 IP는 3개이다.
즉, 이제 원격제어를 위해서 접속하려면 서버 접속용 공인 IP의 2227번 포트를 이용해서 접근해야 진짜 서버의 22번 포트를 접근할 수 있다.
도커 설치 명렁어
# 도커 설치
sudo yum install yum-utils device-mapper-persistent-data lvm2 -y
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo -y
sudo yum install docker-ce -y
sudo systemctl start docker
sudo systemctl enable docker
# 도커 컴포즈 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 도커를 sudo 없이 사용
sudo usermod -aG docker ${USER}
# 도커를 sudo 없이 사용하려면, putty 재시작 필수
도커 설정 초기화 명령어
# 컨테이너 삭제
docker rm -f $(docker ps -qa)
# 이미지 삭제
docker rmi -f $(docker images -qa)
# 안쓰는 네트워크 삭제
docker network prune -f
# 안쓰는 볼륨 삭제
docker volume prune -f
# 도커 프로젝트 삭제
sudo rm -rf /docker/projects
sudo rm -rf /docker_projects
NGINX 설치 전에 DB를 먼저 설치해줘야 NGINX 로그가 남는다고 하니 먼저 설치하자. root 계정의 비밀번호는 0000으로 설정해준다.
# 컨테이너 실행
docker run \
--name mariadb__1 \
-d \
--restart unless-stopped \
-e MARIADB_ROOT_PASSWORD=0000 \
-e TZ=Asia/Seoul \
-p 3306:3306 \
-v /docker_projects/mariadb__1/conf.d:/etc/mysql/conf.d \
-v /docker_projects/mariadb__1/mysql:/var/lib/mysql \
-v /docker_projects/mariadb__1/run/mysqld:/run/mysqld/ \
mariadb:latest
# mariadb__1 컨테이너 안에서 ls 명령을 실행
docker exec mariadb__1 ls
# mariadb__1 컨테이너 안에서 mysql -u root -p 명령을 실행
# 복잡한 명령언 -it 옵션을 붙어야 한다.
docker exec -it mariadb__1 mysql -u root -p
exit;
기존 원격제어를 위해서 22번 포트만 서버에서 열어두었었다. 이제 MySQL, HTTPS, HTTP 등을 위해 81, 80, 443, 3306 포트를 열자.
계정정보 | 계정명 | 비밀번호 |
---|---|---|
서버 (210.89.189.222 (2227), 115.85.181.76) | jea / root | 둘 다 jh20141836 |
DB (MySQL, 외부 접근 가능) | jea / root | 둘 다 0000 |
DB (MySQL, 원격지에서 접속 불가능 오직 서버에서만 접속 가능) | jealocal | 1234 |
# 보안설정
docker exec -it mariadb__1 /usr/bin/mariadb-secure-installation
- Switch to unix_socket authentication [Y/n] n
- Change the root password? [Y/n] n
- 나머지 Y
# 마스터계정(jea 생성) 및 DB 생성
docker exec -it mariadb__1 mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO jea@`%` IDENTIFIED BY '0000';
GRANT ALL PRIVILEGES ON *.* TO jealocal@`localhost` IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON *.* TO jealocal@172.17.0.1 IDENTIFIED BY '1234';
CREATE DATABASE nginx;
exit;
❓ 3306 포트 포워딩 해주지 않아도 되는건가? 원격 접속 포트(22)만 해주면 되는건가?
복잡한 NGINX 설정, SSL 설정등에서 해방되기위해서 NGINX PROXY MANAGER 설치
NGINX에 80 / 81 / 443 포트를 열어두었다. 8024는 의미없음.
이제 서버에 들어오는 80 / 81 / 443 포트는 NGINX가 받는다.
# 컨테이너 compose 파일이 담길 폴더 생성
sudo mkdir -p /docker_projects/nginx__1
cd /docker_projects/nginx__1
# 컨테이너 compose 파일 생성
sudo vim docker-compose.yml
# docker-compose.yml 내용 시작
version: "3"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
- '8024:8024' # Additional Sample Port
environment:
TZ: "Asia/Seoul"
DB_MYSQL_HOST: "172.17.0.1"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "jea"
DB_MYSQL_PASSWORD: "0000"
DB_MYSQL_NAME: "nginx"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
# docker-compose.yml 내용 끝
# 설정파일대로 컨테이너 생성
docker-compose up -d
# 관리콘솔 접속확인
http://wogus.net:81/
젠킨스 설치
docker run \
--name jenkins_1 \
-p 8081:8080 \
-e TZ=Asia/Seoul \
-v /docker_projects/jenkins__1/var/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /docker_projects/jenkins_1/data:/data \
-u root \
-d \
--restart unless-stopped \
jenkins/jenkins:lts
java 17 설치
docker exec -it jenkins_1 bash
apt-get update
apt-get install openjdk-17-jdk -y
exit
docker exec jenkins_1 apt-get update
docker exec jenkins_1 apt-get install openjdk-17-jdk -y
접속
docker exec -it jenkins_1 bash
확인
java --version
env
env | fgrep JAVA_HOME
mlocate 설치 및 검색
apt-get install mlocate
updatedb
locate java | fgrep 17 | fgrep javac
#찾음 : /usr/lib/jvm/java-17-openjdk-amd64
JAVA_HOME 환경변수 변경
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
#JAVA_HOME 환경변수 변경 확인
echo $JAVA_HOME
jenkins_1 bash 접속
docker exec -it jenkins_1 bash
jenkins_1 bash 도커 설치
apt-get update -y
apt-get install -y ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
rm /etc/apt/keyrings/docker.gpg
curl -fsSL https://download.docker.com/linux/debian/gpg | 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/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install -y docker-ce docker-ce-cli docker-compose-plugin
exit
프로젝트 경로
/var/jenkins_home/damda1
chmod 744 ./gradlew
./gradlew clean build
Dockerfile
FROM openjdk:17-jdk-alpine
ARG JAR_FILE=build/libs/damda-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
docker build -t damda .
이미지 실행
docker run \
--name=damda_1 \
-p 8080:8080 \
-d \
damda
docker rm -f damda_1
docker rmi -f damda
pipeline {
agent any
tools {
jdk 'openjdk-17-jdk'
}
stages {
stage('Prepare') {
steps {
git branch: 'master',
credentialsId: '8adcdfea-cde9-4613-983c-8294600d5082',
url: 'git@github.com:likelion-backendschool/DAMDA_project.git'
}
post {
success {
sh 'echo "Successfully Cloned Repository"'
}
failure {
sh 'echo "Fail Cloned Repository"'
}
}
}
stage('Build Gradle Test') {
steps {
sh (script:'''
echo "Build Gradle Test Start"
''')
dir('.') {
sh """
chmod +x gradlew
"""
}
dir('.') {
sh """
./gradlew clean build
"""
}
}
post {
success {
sh 'echo "Successfully Build Gradle Test"'
}
failure {
sh 'echo "Fail Build Gradle Test"'
}
}
}
stage('Docker Rm') {
steps {
sh 'echo "Docker Run Start"'
sh """
docker stop damda_1
docker rm -f damda_1
docker rmi -f damda
"""
}
post {
success {
sh 'echo "Docker Rm Success"'
}
failure {
sh 'echo "Docker Rm Fail"'
}
}
}
stage('Bulid Docker Image') {
steps {
sh 'echo " Image Bulid Start"'
sh """
docker build -t damda .
"""
}
post {
success {
sh 'echo "Bulid Docker Image Success"'
}
failure {
sh 'echo "Bulid Docker Image Fail"'
}
}
}
stage('Docker Run') {
steps {
sh 'echo "Docker Run Start"'
sh """
docker run \
--name=damda_1 \
-p 8080:8080 \
-v /docker_projects/damda_1/volumes/gen:/gen \
--restart unless-stopped \
-e TZ=Asia/Seoul \
-d \
damda
"""
}
post {
success {
sh 'echo "Docker Run Success"'
}
failure {
sh 'echo "Docker Run Fail"'
}
}
}
}
}