지금까지 배운 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에 로그인 해두고 아이디 확인
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_net은 compose_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]
'Networks > Docker & Linux' 카테고리의 다른 글
SK networks AI Camp - ubuntu 실행 시 에러 슈팅 (0) | 2024.07.30 |
---|---|
SK networks AI Camp - Linux(설명,명령어 및 예제) (0) | 2024.07.30 |
SK networks AI Camp - Network & docker 통신 (0) | 2024.07.30 |
SK networks AI Camp - docker 명령어 사용(2) (0) | 2024.07.29 |
SK networks AI Camp - docker 명령어 사용 (0) | 2024.07.29 |