Amazon EC2 Linuxํ๊ฒฝ์์ ์งํํ๋ค.
1. EC2์ Docker ์ค์น
sudo yum update -y
์์ํ๊ธฐ ์ ์ yum ํจํค์ง๋ฅผ ๋ชจ๋ ์ต์ ๋ฒ์ ์ผ๋ก ์
๋ฐ์ดํธ ํด์ฃผ์๋ค.
sudo yum install docker -y
yum์ ์ด์ฉํด์ docker๋ฅผ ์ค์นํ๋ค.
- Docker ๋ฒ์ ํ์ธ
docker -v
- Docker ์์
sudo service docker start
- Docker ๊ทธ๋ฃน์ ec2-user ๋ฅผ ๋ฃ์ด์ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์คํํ ์ ์๊ฒ ํด์ค๋ค.
sudo usermod -aG docker ec2-user
- ์ต์ ๋ฒ์ ์ Docker Compose ์ค์น
sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
์ดํ, ์ธ์คํด์ค ์ฌ ์์ ํ Docker ๋ช ๋ น์ด๋ฅผ ์คํํด๋ณด์.
docker run hello-world
2. AWS IAM ์ค์ (์๋ต ๊ฐ๋ฅ)
AWS IAM ์ AWS์ ๊ธฐ๋ฅ๋ค์ ์๊ฒฉ์ผ๋ก ์ฌ์ฉํ ๊ถํ์ด ์๋ ์ฌ์ฉ์๋ฅผ ๊ด๋ฆฌํ๋ ์๋น์ค์ด๋ค.
์๋๋ IAM์ ์ค์ ํ์ฌ github์ ๊ฐ์ํ๊ฒฝ ๋ด์์ ๋ด AWS์ ์ ์ํ์ฌ ํด๋น EC2์
์ธ๋ฐ์ด๋ ๊ท์น์ github IP๋ฅผ ์ถ๊ฐํ๊ณ , ์ ์ ํ์ ๋ค์ ์ ๊ฑฐํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๋ค.
github์ IP๋ ์์๋ก ๋ฐ๋๊ธฐ ๋๋ฌธ์ ์ค์ ํด๋ ๊ฒ์ด์๋๋ฐ, ๋ฐฉ๋ฒ๋ง ์ ์ด๋๊ณ ๋๋ 22๋ฒ ํฌํธ๋ง ์ด์ด๋์๋ค.
AWS์์ ๊ณ์ ๋ ๋ด๋ผ๊ณ ํ๊ธฐ ๋๋ฌธ์
aws์์ IAM ์๋น์ค๋ก ๋ค์ด๊ฐ์ ์ฌ์ฉ์๋ก ๋ค์ด๊ฐ๋ค.
์ฌ์ฉ์ ์ถ๊ฐ๋ฅผ ๋๋ฌ์ฃผ์.
์ํ๋ ์ด๋ฆ์ ์ ๋ ฅํ๊ณ ๋ค์์ ๋๋ฅธ๋ค.
๊ถํ ์ค์ ์ค์, ์ง์ ์ ์ฑ ์ฐ๊ฒฐ์์ EC2FullAcess๋ฅผ ๊ฒ์ํ๊ณ ์ถ๊ฐํด์ค๋ค.
๊ทธ๋๋ก ์ฌ์ฉ์ ์์ฑ์ ๋๋ฌ์ค๋ค.
์ฌ์ฉ์๊ฐ ์์ฑ ๋์๋ค๋ฉด, ๋๋ฌ์ ์ธ๋ถ ์ค์ ์ ํด์ฃผ์.
์๋์ ๋ณด์ ์๊ฒฉ ์ฆ๋ช
ํญ์ ๋๋ฅด๋ฉด, ์์ธ์ค ํค ๋ง๋ค๊ธฐ ๋ฒํผ์ด ์๋ค.
AWS ์ปดํจํ
์๋น์ค์์ ์คํ๋๋ ์ดํ๋ฆฌ์ผ์ด์
์ ์ ํํ๊ณ ๋ค์์ ๋๋ฅธ๋ค.
์ํ๋ ํ๊ทธ๋ฅผ ์ ๋ ฅํ๋ฉด, ์์ธ์ค ํค๊ฐ ๋ฐ๊ธ๋๋ค.
์์ธ์ค ํค๋ฅผ ์ด๋ ๊ณณ์๋ค๊ฐ ๋ณต์ฌํด ๋๊ฑฐ๋, csvํ์ผ์ ๋ฐ์๋์ ์์คํ ์ ๋ณด๊ดํด๋์.
๋ค๋ฅธ ๊ณณ์(ํนํ github)์ ์ ๋๋ก ์ ์ถ๋๋ฉด ์๋๋ค!!
3. EC2 ์ ๊ทผ ์ค์ (ID, PW)
์๋๋ ssh๋ฅผ ์ด์ฉํด์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๊ฒ ์ง๋ง,
EC2 ๋ด์์ ID์ Password๋ฅผ ์ด์ฉํด์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ด์ฉํด ๋ณด๊ฒ ๋ค.
whoami
๋ณดํต์ ec2์ username์ ec2-user์ด๋ค. ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด์ ๋ฏธ๋ฆฌ ํ์ธํด ๋ณด์.
sudo passwd {username}
sudo passwd ec2-user
์ ๋ช ๋ น์ด๋ฅผ ํตํด ์๋ก์ด ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ ํ ์ ์๋ค. ์ํ๋ ๋น๋ฐ๋ฒํธ๋ก ์ค์ ํด์ฃผ์.
์ด์ , ๋น๋ฐ๋ฒํธ๋ฅผ ํตํด ์ ๊ทผํ๋ ๊ฒ์ ํ์ฉํด์ฃผ์.
sudo vi /etc/ssh/sshd_config
ํธ์ง๊ธฐ๋ฅผ ์ด์ด์ PasswordAuthentication ์ yes๋ก ๋ฐ๊ฟ์ฃผ์.
/Password ๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค.
sudo systemctl restart sshd
์ค์ ํ๊ณ ๋๋ฉด sshd๋ฅผ ์ฌ์์ ํด์ค๋ค.
์ด์ , ec2๋ฅผ ๋์์(ctrl+D) ๋น๋ฐ๋ฒํธ๋ก ์ ๊ทผ์ด ๋๋์ง ํ์ธํด๋ณด์.
sudo ssh [username]@[ec2 ์ธ์คํด์ค ip (ํผ๋ธ๋ฆญ IPv4 DNS)]
sudo ssh ec2-user@ip
4. Docker Token ์ค์
Docker Hub์์ ๋ด ๊ณ์ ์ค์ ์ ๋ค์ด๊ฐ๋ค.
Security๋ถ๋ถ์ New Access Token์ ๋๋ฌ์ ํ ํฐ์ ๋ง๋ค์ด ์ค๋ค.
ํด๋นํ๋ ์ด ํ ํฐ์ ์์คํ ์ ๊ฐ๊ณ ์์.
5. GitHub Action Secret ์ค์
์ Action ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ๋ ์ฌ๋ฌ ํค๋ค์ Secret์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
Settings -> Secrets and Variables -> Actions์ ๋ค์ด์์
New repository secret์ ๋๋ฌ์ฃผ์.
์ฌ๊ธฐ์ ์ฌ๋ฌ ํค๋ค์ ์์ฑํ ์ ์๋๋ฐ, ๋ค์ ํค๋ค์ ์์ฑํด ์ฃผ์.
- DOCKERHUB_USERNAME : Docker Hub ๋๋ค์ ์ ๋ ฅ
- DOCKERHUB_TOKEN : ๋ฐฉ๊ธ ๋ฐ์๋ Docker Hub ํ ํฐ ์ ๋ ฅ
- AWS_ACCESS_KEY_ID : ์ AWS IAM์์ ๋ฐ๊ธ๋ฐ์ ACESS KEY๋ฅผ ์ ๋ ฅ (IAM์ค์ ์๋ต ์ ์๋ต ๊ฐ๋ฅ)
- AWS_SECRET_ACCESS_KEY : IAM์์ ๋ฐ๊ธ ๋ฐ์ SECRET KEY๋ฅผ ์ ๋ ฅ (IAM์ค์ ์๋ต ์ ์๋ต ๊ฐ๋ฅ)
- AWS_SG_ID : EC2 ๋ณด์๊ทธ๋ฃนID
- EC2_HOST : EC2์ ํผ๋ธ๋ฆญ IPv4 ์ฃผ์.
- EC2_PASSWORD : EC2์ ์ ๊ทผ/์ฐ๊ฒฐ ์ค์ ํด๋์๋ ํจ์ค์๋.
- EC2_SSH_PORT : SSH๋ก ์ ๊ทผํ port. (22)
- EC2_USERNAME : EC2์ ๊ณ์ ๋ช . (ec2-user)
- APPLICATION_YML : ์๋ฒ์ ymlํ์ผ. (base64๋ก ์ธ์ฝ๋ฉํด์ ๋ฃ์ด์ผ ํ๋ค.)
์ฌ๊ธฐ์ ๋ณด์๊ทธ๋ฃนID๋, ํด๋น ์ธ์คํด์ค์ ๋ณด์๊ทธ๋ฃน์ ๋ค์ด๊ฐ์ ํ์ธํ ์ ์๋ค.
๋ชจ๋ KEY๋ค์ ์์ฑํ๋ค.
์ด KEY๋ค์ GitHub Action์ ์คํฌ๋ฆฝํธ ๋ด์ ์๋ง๊ฒ ๋ค์ด๊ฐ์ ์คํ ๋ ๊ฒ์ด๋ค.
6. ํ๋ก์ ํธ Dockerfile ์ค์
Spring ํ๋ก์ ํธ ๋ด์ Dockerfile์ ๋ง๋ค์ด์ฃผ์. ํ์ผ ์ด๋ฆ์ด ๊ผญ Dockefile !!
์๋ ๋ด์ฉ์ ์์ฑํด์ค๋ค.
- maven
# Java Version
FROM openjdk:11-jdk
# Jar ํ์ผ์ ์์น
ARG JAR_FILE=target/*.jar
# ํ๋ก์ ํธ build ํ์ผ์ app.jar๋ก ๊ฐ์ ธ์ค๊ธฐ
COPY ${JAR_FILE} app.jar
# 8080ํฌํธ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ. (์๋ต ๊ฐ๋ฅ)
EXPOSE 8080
# ํ๋ก์ ํธ ๋น๋
ENTRYPOINT ["java", "-jar", "/app.jar"]
# ์ต์
์ถ๊ฐ ๊ฐ๋ฅ
# ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=docker", "/app.jar"]
- gradle
FROM openjdk:11-jdk
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "-jar", "app.jar"]
gradle์ด๋ผ๋ฉด build.gradle์ ์๋ ๋ด์ฉ๋ ์ถ๊ฐํด์ค๋ค.
jar {
enabled = false
}
→ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๋ฉด, ~~.jar ๊ณผ ~~-plain.jar ๋ ๊ฐ์ ํ์ผ์ด ์๊ธด๋ค.
plain ๋น๋ ํ์ผ์ gradle.build์ ์ถ๊ฐํด๋์๋ depdencies๋ค์ด ํฌํจ๋์ง ์๋ ํ์ผ์ด๋ค.
docker ์ปจํ ์ด๋์์๋ app.jar๋ก ๊ฐ์ ธ์์ ์ค๋ธ์ ํธ๋ค์ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ depdency๋ค์ด ํฌํจ๋ jarํ์ผ์ ์ฌ์ฉํด์ผ ํ๋ค.
enabled = false ์ต์
์ ์ฌ์ฉํ๋ฉด plain์ด ์์ฑ๋์ง ์๋๋ค.
๋ฒ์ ์ด ๋ค๋ฅธ ๋ด์ฉ์ด ์์ผ๋ฉด ์๋ง๊ฒ ๋ฐ๊ฟ์ ์ฌ์ฉํ๋ฉด ๋๋ค!
7. Docker ๋ก๊ทธ์ธ
EC2์์ docker์ ์ ์ํ๊ธฐ ์ํด ๋ก๊ทธ์ธ ํด๋์.
docker login -u [username]
๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์๋์ผ๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํํ์ฌ ์ ์ฅํด๋๋ค.
8. GitHub Action ์ค์
์ํ๋ ๋ ํฌ์งํ ๋ฆฌ > Actions์ ๋ค์ด์๋ณด์.
์ฌ๊ธฐ์ Java with Gradle์ ์ ํํ๋ฉด,
gradle.yml ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ์ ์๋ค.
์๋ ๋ด์ฉ์ ์์ฑํด์ฃผ์.
name: Java CI with Gradle
on:
push:
branches: [ "main" ] #pushํ ๊ฒฝ์ฐ ์ฌ์ฉ ํ branch ๋ช
๊ธฐ์
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
# Java Version ๊ธฐ์
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'temurin'
#Secret์ ์ค์ ํด๋ YMLํ์ผ (BASE64๋ก ์ธ์ฝ๋ฉ ๋์ด์์ด์ผ ํจ) ์ค์
- name: Set YML
run: |
mkdir -p src/main/resources
echo "${{ secrets.APPLICATION_YML }}" | base64 --decode > src/main/resources/application.yml
find src
#gradlew ๊ถํ ์ค์
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
# Spring Boot Build
- name: Spring Boot Build
run: ./gradlew clean build -x test
#------------------- Docker --------------------
# Docker Image Build
- name: Docker Image Build
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_IMAGENAME }} .
# DockerHub Login
- name: Docker Hub Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# Docker Hub push
- name: docker Hub push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_IMAGENAME }}
#------------------- EC2 --------------------
# AWS EC2 Server Connect & Docker ๋ช
๋ น์ด ์คํ
- name: AWS EC2 Connection
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
password: ${{ secrets.EC2_PASSWORD }}
port: ${{ secrets.EC2_SSH_PORT }}
timeout: 60s
script: |
sudo docker stop ${{ secrets.DOCKERHUB_IMAGENAME }}
sudo docker rm ${{ secrets.DOCKERHUB_IMAGENAME }}
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_IMAGENAME }}
sudo docker run -it -d -p 443:443 --name ${{ secrets.DOCKERHUB_IMAGENAME }} -e TZ=Asia/Seoul ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_IMAGENAME }}
Github AWS ์ฐ๊ฒฐ ๊ณต์ ๋ฌธ์ >> https://github.com/appleboy/ssh-action
์ค๊ฐ์ ํ๋ก์ ํธ์ ๋ง๋ Java ๋ฒ์ , Docker Image๋ช , ์ํ๋ port๋ฑ์ ์์ ํด์ ์ฌ์ฉํ๋ฉด ๋๊ฒ ๋ค.
๋ก์ง์ ๊ฐ๋จํ๊ฒ, ๊นํ๋ธ์์ push๋ฅผ ๊ฐ์งํ๋ฉด ๊ฐ์ํ๊ฒฝ ๋ด์์
1. Java ํ๊ฒฝ์ ์ธํ
ํ๊ณ ymlํ์ผ์ ์ค์ ํ๋ค.
2. ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๋ค.
3. ๋ง๋ค์ด์ง ํ๋ก์ ํธ๋ฅผ ๋์ปค ์ด๋ฏธ์ง๋ก ๋น๋ํ๋ค.
4. ๋์ปค์ ๋ก๊ทธ์ธํ๊ณ ์ด๋ฏธ์ง๋ฅผ ํธ์ํ๋ค.
5. EC2์ ์ ์ํ์ฌ ์คํํ๋ ์ปจํ ์ด๋๋ฅผ ๋ฉ์ถ๊ณ , ์ด๋ฏธ์ง๋ฅผ pull ๋ฐ์ ํ ๋ค์ ์คํ์ํจ๋ค.
๋๋ ํ๋ก์ ํธ์ https์ค์ ๊น์ง ํด๋์ด์ 443ํฌํธ๋ก ์ด์๋ค. ์ถ๊ฐ๋ก, ํ๊ตญ ์๊ฐ ์ค์ ์ต์ TZ=Asia/Seoul ๊น์ง ๋ฃ์ด๋์๋ค.
9. Push ํ ์คํธ
์ด์ ๊นํ๋ธ์ ํธ์๋ฅผ ์งํํด๋ณด์.
ํธ์๋ฅผ ์งํํ๋ฉด, Action์์ push๋ฅผ ๊ฐ์งํ๊ณ ์ปค๋ฐ ๋ฉ์ธ์ง ๋ช ์ผ๋ก ๋ Action์ ์์ํ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ Action์ด ๋ชจ๋ ์๋ฃ๋๋ฉด, ์๋์ ๊ฐ์ด ์ฑ๊ณต์ผ๋ก ๋ฌ๋ค.
์ฌ๊ธฐ์ ์ค๋ฅ๊ฐ ๋๋ค๋ฉด, ์์ผ๋ก ๋ค์ด๊ฐ์ ์ด๋๊ฐ ์ค๋ฅ ๋ฌ๋์ง ์ฐพ์๋ณด๊ณ ๊ณ ์ณ์ผํ๋ค.
๋๋ถ๋ถ์ ์คํฌ๋ฆฝํธ ๋ด์ ์ค์ ์ค๋ฅ์ผ ํ๋ฅ ์ด ๋๋ค. gradle.yml ํ์ผ์ ๋ด๊ฐ ๋ฃ์ ์ค์ ์ด ๋ง๋์ง ํ์ธํด๋ณด์.
๋ง์ฝ ๋ชจ๋ ์คํฌ๋ฆฝํธ๊ฐ ์ฑ๊ณตํ๋ค๋ฉด,
Docker Desktop์ ์ด๋ฏธ์ง๊ฐ ์ ์์ ์ผ๋ก push๋๋์ง ํ์ธํด๋ณด์.
์๋ฒ์์ ์ ์์ ์ผ๋ก ์คํ๋๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด
์๋ ๋ช ๋ น์ด๋ก ๋์ปค๊ฐ ์ปจํ ์ด๋๊ฐ ์คํ ์ค์ธ์ง ํ์ธํ ์ ์๋ค.
docker logs {docker์ด๋ฏธ์ง๋ช
}
'DevOps > Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[FastAPI & Docker] uvicorn์ Dockerfile (0) | 2023.11.20 |
---|---|
[Docker] ์ด๋์ ์๋ ๋ฐฐํฌ๊ฐ ์ ์ฉ๋์ง ์์ ๋ (0) | 2023.09.02 |