본문 바로가기

개인 공부

9/10 토_Docker

728x90

1. Docker

: 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계없이 언제나 동일하게 실행될 것을 보증한다. Build Once, Run Anywhere!

 

기존에 만들어둔 패키지를 도커로 감싸면, 이식성(가져와 사용하기에 얼마나 용이한지)이 월등히 좋아진다~

 

창현님이 오늘 도커로 말 것 있다 해서 본인 작업하는 것 화면 공유로 어떻게 하는지 보여줄 줄 알았더니,

도커 허브 가입부터 이미지/컨테이너 만들고 Docker Repository에 올리는 것까지 다 코칭해줬다ㅎㅎㅎ 🙇

 

아래에 절차를 정리해놨다.

 

1) Docker Hub 가입

 

2) 터미널로 Docker 설치

# apt 패키지 인덱스를 최신으로 업데이트
sudo apt-get update

# https repository를 사용할수 있도록 필요한 패키지들 설치
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# Docker의 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o \
/usr/share/keyrings/docker-archive-keyring.gpg

# stable repository 등록
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# apt 패키지 인덱스를 최신으로 업데이트
sudo apt-get update

# docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 생성된 docker group에 지금 접속 중인 사용자를 추가
sudo usermod -aG docker $USER

# Docker 재시작
sudo service docker restart

# 컴퓨터 재부팅
reboot

# Docker Hub에 가입한 계정으로 로그인
docker login

 

3) Dockerfile 생성

# Docker image로 만들 파일들을 넣을 폴더를 만들고 파일들을 담은 뒤 해당 경로로 이동
cd /mnt/FE0A5E240A5DDA6B/workspace/jeon2_package/docker/

# Dockerfile 생성 -> IDE(VS Code) 열리면서 작성할 수 있게됨
code Dockerfile

on IDE(VS Code)

# FROM ubuntu:20.04
FROM python:3.8.14-bullseye

# Docker image 빌드 시 Timezone 설정(UTC -> KST)
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul
RUN apt-get install -y tzdata

# RUN mkdir ~/jiyeon # 작업 디렉터리 생성

WORKDIR /tmp # 작업 경로 설정

RUN pip install --upgrade pip

RUN pip install -U requests datetime requests beautifulsoup4 pyyaml

COPY KoreaStockAutoTrade.py ./KoreaStockAutoTrade.py

COPY config.yaml ./config.yaml

# CMD [ ~/bin/sh", "-c", ""] # CMD, ENTRYPOINT 둘 중 하나만 쓰기

ENTRYPOINT [ "python", "KoreaStockAutoTrade.py"]

 

4) 로컬 터미널

# Docker image 빌드
docker build -t stock_trade .

# Docker image를 기반으로 새로운 컨테이너를 생성/실행(실행 후 자동 종료. :~는 태그)
docker run stock_trade:latest

# Docker image를 기반으로 새로운 컨테이너를 생성/실행(자동 종료 중지 옵션으로 실행)
docker run -d stock_trade:latest sleep infinity

# 모든 Docker container(-a 옵션은 실행 중이지 않은 컨테이너들도 포함)의 리스트를 출력
docker ps -a

# 이미 백그라운드에서 실행 중인 Docker container 내부로 접속
docker exec -it caa1c1de7f9e /bin/bash

# 생성된 Docker image 확인
docker images

# 잘못 만든 Docker image 있을 경우 image id 넣고 삭제
docker image rm -f 5b89ef988c30

# https repository에 올릴 Docker image에 태그(commit) 남기기
docker tag stock_trade:latest ljy9969/stock_trade:v0.1

# https repository에 push
docker push ljy9969/stock_trade:v0.1
728x90

Docker Tag and Push
Docker Hub

 

5) 컨테이너 실행

 

6) 실행 중인 컨테이너 내부로 접속하고 싶은데

만약 자동 중지 옵션을 꺼놓고 컨테이너를 생성/실행해도 꺼진다면 (docker run -d stock_trade:latest sleep infinity),

Docker image 만들 때 하단에 코드를 추가하여 이를 고칠 수 있다.

# keeping a Docker container alive(아래 셋 중 하나 쓰기)
ENTRYPOINT ["tail", "-f", "/dev/null"]
# CMD ["tail", "-f", "/dev/null"]
# CMD ["sleep", "infinity"]

실행 중인 컨테이너 종료하려면

docker stop [OPTIONS] CONTAINER [CONTAINER…]

중지된 모든 컨테이너를 일괄 삭제하려면

docker container prune -y

 

cf. docker run 옵션들 by 우노님

 

728x90