<aside> 💡 **실습 목표
</aside>

FastAPI 예제 코드를 생성하여 서버에서 Docker Container 를 실행해 본다.
app/main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "MLOps"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
app/requirements.txt
fastapi
uvicorn
서버에 docker-compose 설치
sudo apt install docker-compose
FROM python:3.9
WORKDIR /app
COPY ./app/requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /app
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
version: "3"
services:
web:
build: .
container_name: fastapi-app
volumes:
- .:/code
ports:
- "80:80"
docker-compose build web
docker images
docker-compose up -d
docker ps -a
Jenkinsfile 을 작성하여 Jenkins 에서 배포해 본다.
sudo gpasswd -a jenkins docker
sudo vi /usr/lib/systemd/system/docker.service (에러 발생 시에만 시도)
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376 --containerd=/run/containerd/containerd.sock
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo service jenkins restart
pipeline {
agent any
parameters {
choice(name: 'VERSION', choices: ['1.1.0','1.2.0','1.3.0'], description: '')
booleanParam(name: 'executeTests', defaultValue: true, description: '')
}
stages {
stage("init") {
steps {
script {
gv = load "script.groovy"
}
}
}
stage("Checkout") {
steps {
checkout scm
}
}
stage("Build") {
steps {
sh 'docker-compose build web'
}
}
stage("test") {
when {
expression {
params.executeTests
}
}
steps {
script {
gv.testApp()
}
}
}
stage("deploy") {
steps {
sh "docker-compose up -d"
}
}
}
}
sudo service jenkins restartpipeline {
agent any
parameters {
choice(name: 'VERSION', choices: ['1.1.0','1.2.0','1.3.0'], description: '')
booleanParam(name: 'executeTests', defaultValue: true, description: '')
}
stages {
stage("init") {
steps {
script {
gv = load "script.groovy"
}
}
}
stage("Checkout") {
steps {
checkout scm
}
}
stage("Build") {
steps {
sh 'docker-compose build web'
}
}
stage("test") {
when {
expression {
params.executeTests
}
}
steps {
script {
gv.testApp()
}
}
}
stage("Tag and Push") {
steps {
withCredentials([[$class: 'UsernamePasswordMultiBinding',
credentialsId: 'docker-hub',
usernameVariable: 'DOCKER_USER_ID',
passwordVariable: 'DOCKER_USER_PASSWORD'
]]) {
sh "docker tag jenkins-pipeline_web:latest ${DOCKER_USER_ID}/jenkins-app:${BUILD_NUMBER}"
sh "docker login -u ${DOCKER_USER_ID} -p ${DOCKER_USER_PASSWORD}"
sh "docker push ${DOCKER_USER_ID}/jenkins-app:${BUILD_NUMBER}"
}
}
}
stage("deploy") {
steps {
sh "docker-compose up -d"
}
}
}
}