Networks/Docker & Linux

SK networks AI Camp - docker 예제

코딩하는 Español되기 2024. 7. 30. 18:30

지금까지 배운 docker를 예제로 배웠습니다.

이전에 있던 파일을 삭제하고 다시 c:/dev/docker 폴더에서 진행하겠습니다.

도커에서 이미지와 컨테이너 다 삭제해주시고 파일도 다 지워주세요.

 

2024.07.29 - [컴퓨터 공학/Networks] - SK networks AI Camp - docker 명령어 사용

 

 

2024.07.29 - [컴퓨터 공학/Networks] - SK networks AI Camp - docker 명령어 사용(2)

 

1번 도커 이미지 예제

1. 아래 코드의 파일명을 hello.js로 설정 후 아래 코드를 복붙해주세요.

const http = require('http');
const os = require('os');
console.log("Test server starting...");

const handler = function(req, res) {
    console.log("Received request from "+req.connection.remoteAddress);
    res.writeHead(200);
    res.end("Container Hostname: "+os.hostname()+"\n");
};

let www = http.createServer(handler);
www.listen(8080);

2. Dockerfile 확인 및 생성

 

○ Dockerfile 생성 후 아래 코드 복사

# base image
FROM node:12

# 코드 복사
COPY hello.js /

# 실행
CMD ["node", "/hello.js"]

3. Docker hub에 로그인 해두고 아이디 확인

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.

hub.docker.com

4. Dockerfile을 이용하여 hello.js 이미지 생성 및 확인

 

○ 명령어 : docker build -t <도커허브아이디>/<이미지명> .

docker build -t joowon582/hellojs .
docker images

5. 실행 및 확인

 

○ 명령어 : docker run --name <컨테이너이름> -d -p 포트:포트 <도커허브아이디>/<이미지명>

 

6. hellojs-web에 접속

 

○ 크롬창에 localhost:8080 실행

 

7. docker 로그인

 

○ 명령어 : docker login

* 브라우저에서 미리 로그인하면 아이디, 패스워드 입력 안해도 됩니다.

* 로그인 안하였다면 아이디, 패스워드를 입력해야 합니다.

docker login

 

8. 도커허브로 이미지 업로드 및 확인

 

○ 명령어 : docker push <도커허브아이디>/<이미지명>

docker push joowon582/hellojs

 

문제1) 로컬에 있는 것을 지운 후 허브에 있던 걸 다운로드 하여 컨테이너로 띄우기

더보기

1. 컨테이너와 이미지를 삭제

docker rm -f hellojs-web
docker ps -a

 

2. 이미지 다운로드 및 확인

 

○ 명령어 : docker pull <도커허브아이디>/<이미지이름>

docker pull joowon582/hellojs
docker images

 

3. 도커 컨테이너 생성 및 확인

docker run --name hellojs-web -d -p 8080:8080 joowon582/hellojs
docker ps

2번 도커 이미지 예제

* 시작 전 컨테이너, 이미지 모두 삭제

1. 파일 2개(dockerfile, hello.js) 삭제 후 가상환경 설정(python 3.12버전)

py -3.12 -m venv .venv

 

2. 가상환경 접속과 pip upgrade

 .\.venv\Scripts\activate
 python -m pip install --upgrade pip

 

3. PyMySQL 설치

pip install PyMySQL

 

4. 아래 코드 복붙(반드시 앞의 작업을 한 후 시행하기)

 

설명 : >옆에 있는 파일로 저장된다는 내용

배포시 가상환경을 배포할 수 없음

그래서 가상환경에 설치된 모듈과 버전을 requirements.txt 파일로 저장하는 것

requirements.txt를 열어보면 설치한 PyMySQL 버전이 등록되어 있음

pip freeze > requirements.txt

 

5. Pandas, seaborn을 설치하고 requirements.txt 업데이트

* 확인 하셨으면 PyMySQL로 바꾸고 나머지는 지워주세요.

pip install pandas seaborn
pip freeze > requirements.txt

6. main.py 파일 생성 및 아래 코드 복사

 

import time
import pymysql

def get_con():
  con = pymysql.connect(host='compose-mysql-db', user='root', password='root1234', charset='utf8') # 한글처리 (charset = 'utf8')
  return con

def show_databases():
  con = None
  cur = None
  try:
    con = get_con();
    cur = con.cursor(pymysql.cursors.DictCursor)
    sql = "show databases"
    cur.execute(sql)

    rows = cur.fetchall()
    print("show databases is >> ")
    print(rows)
  except Exception as e:
    print("Exception > "+str(e))
  finally:
    if cur:
      cur.close()
    if con:
      con.close()

if __name__== "__main__":
  print ("Sleep 5 seconds from now on...")
  time.sleep(5) # mysqldb가 생성될 시간동안 대기.....
  
  print("[Docker Compose][main] Start!!")
  show_databases()
  print("[Docker Compose][main] End!!")

 

7. Dockerfile 생성 및 아래 코드 복붙

FROM ubuntu:18.04 

RUN apt-get -y update && \
    apt-get install -y python3-pip

COPY requirements.txt /root/
COPY main.py /root/ 

WORKDIR /root

RUN pip3 install -r requirements.txt
CMD ["python3", "main.py"]

 

8. database 폴더 생성

 

9. docker-compose.yml 파일 생성 및 아래 코드 복붙

 

* 코드 설명 : 두 개의 컨테이너 정의(2개), 두 개의 컨테이너가 속한 네트워크 정의(1개) ==> 총 3개를 정의함

○ services :  mysql-db(compose-mysql-db), python-mysql(compose-python-mysql)

○ ports : container가 실행되는 컴퓨터 : container

networks : compose-net에 포함이 됨

○ depends_on : mysql_db가 먼저 생성되어야 커넥션 오류가 발생하지 않으니까 python-mysql에 작성

compose_netcompose_mysql_net의 이름이고 bridge 모드로 작성

version: "3"

# 참고문서: https://docs.docker.com/compose/gettingstarted/
services:
  mysql-db:
    container_name: compose-mysql-db
    image: mysql
    restart: always
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./database:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: "root1234"
      MYSQL_DATABASE: "examplesdb"
      MYSQL_USER: "urstory"
      MYSQL_PASSWORD: "u1234"
    ports:
      - "3306:3306"
    networks:
    - compose_net
  python-mysql:
    container_name: compose-python-mysql
    build: .
    depends_on:
    - mysql-db
    networks:
    - compose_net

# 참고문서: https://docs.docker.com/compose/networking/
networks:
  compose_net:
    name: compose_mysql_net
    driver: bridge

 

10. 백그라운드로 실행

docker-compose up -d

 

 

 

문제2) streamlit & mysql → docker compose

*실행 전 이미지와 컨테이너 삭제하기

더보기

1. streamlit 설치

pip install streamlit pandas numpy matplotlib seaborn finance-datareader

 

2. 간단한 streamlit 화면 만들기 및 연결

 

ex-01.py 생성 및 코드 입력

import streamlit as st

conn = st.connection("mydb", type="sql", autocommit=True)

df = conn.query("show databases", ttl=3600)
st.dataframe(df)

 

3. Host에 컨테이너 이름 넣기(secrets.toml)

[connections.mydb]
dialect = "mysql"
username = "root"
password = "root1234"
host = "compose-mysql-db"
database = "examplesdb"

 

4. requirements.txt 수정

streamlit
pandas
SQLAlchemy
mysqlclient

 

5. Dockerfile 수정

○ mkdir : 디렉토리(폴더 생성)해서 돌리기

○ COPY : app을 홈 디렉토리로 설정해서 /app/으로 해줌(2번째 줄 : WORKDIR /app)

○ EXPOSE : 포트 번호 8501로 설정

○ HEALTHCHECK : 없어도 상관없음 단순 확인용

○ ENTRYPOINT : 모든 포트에서 연결 가능하도록 하기

FROM python:3.12


# 작업 디렉토리 설정
WORKDIR /app

RUN mkdir -p /app/.streamlit

# 소스 복사 
COPY ex-01.py requirements.txt /app/
COPY .streamlit/secrets.toml /app/.streamlit/secrets.toml

# 라이브러리 설치 
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt

# 포트 오픈 
EXPOSE 8501

# 컨테이너 헬스 체크
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health

# 애플리케이션 실행 
ENTRYPOINT ["streamlit", "run", "ex-01.py", "--server.port=8501", "--server.address=0.0.0.0"]

 

6. docker-compose.yml

python-mysql 부분에서 포트 번호(8501)container_name을 알아보기 쉽게 수정

version: "3"

# 참고문서: https://docs.docker.com/compose/gettingstarted/
services:
  mysql-db:
    container_name: compose-mysql-db
    image: mysql
    restart: always
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./database:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: "root1234"
      MYSQL_DATABASE: "examplesdb"
      MYSQL_USER: "urstory"
      MYSQL_PASSWORD: "u1234"
    ports:
      - "3306:3306"
    networks:
    - compose_net
  python-mysql:
    container_name: compose-streamlit
    build: .
    ports:
      - "8501:8501"
    depends_on:
    - mysql-db
    networks:
    - compose_net

# 참고문서: https://docs.docker.com/compose/networking/
networks:
  compose_net:
    name: compose_mysql_net
    driver: bridge

 

7. 시현

명령어 : docker-compose up -d

 

8. docker 확인 및 포트 접속

 

9. 접속 해제

○ 명령어 : docker ps로 컨테이너 ID 확인 후 docker stop [컨테이너 ID]