no image
[Docker] Docker-Compose에 대해 알아보자
이번에는 Docker-Compose에 대해 정리하려고 합니다.도커 컴포즈란?도커 컴포즈는 여러 도커 컨테이너들을 정의하고 동시에 실행할 수 있도록 하는 도구입니다. 이를 통해서 단일 애플리케이션을 구성하는 여러 컨테이너를 정의하고 한 번에 실행할 수 있도록 관리합니다. 도커 컴포즈를 왜 사용할까?도커 컴포즈를 사용하는 이유는 다음과 같습니다.복잡한 애플리케이션 구성을 위한 컨테이너 관리컨테이너, 서비스, 백과 프론트간의 의존성 관리배포 용이성 도커 컴포즈 설치apt-get install docker-compose# 또는sudo apt-get install docker-compose# 네트워크 설치docker network create nat설치가 완료되면 잘 설치했는지 확인합니다.docker-compos..
2024.05.18
no image
[Docker] Docker Container SSH 접속하는 방법
오늘은 Docker Container을 SSH로 접속해서 사용할 수 있는 방법에 대해 알려드리려고 합니다. 각자의 포트를 통해 컨테이너에 따로 접속해서 서로 영향을 미치지 않고 사용할 수 있게 됩니다.Dockerfile 작성하기FROM python:3.12RUN apt-get update && apt-get upgrade -y && apt-get install -y vim openssh-server net-tools가장 최소한으로 작성하였습니다. SSH 접속을 할 때, Dockerfile은 크게 고려하지 않으셔도 됩니다. Container를 실행할 때 포트포워딩이 핵심입니다. 이미지 빌드하기docker build -t ssh_image . Container 실행하기# docker run -idt -p 원..
2024.05.03
no image
[Docker] Dockerfile 명령어 모음집
Dockerfile에서 사용하는 명령어에 대해 정리한 글입니다. Overview 자주 사용하는 명령어 10가지입니다. 명령어 설명 FROM 이미지를 시작할 베이스 이미지 설정합니다. RUN 이미지를 빌드하는 동안 명령을 실행합니다. 패키지 설치나 설정 파일 수정 등의 작업에 사용됩니다. ENV 이미지의 환경변수를 설정하기 위해 사용됩니다. CMD 컨테이너가 시작될 때 실행할 기본 명령을 설정합니다. CMD는 Dockerfile에 한 번만 존재할 수 있습니다. EXPOSE 실제로 포트 공개하는 것이 아닌, 어떤 포트를 공개될 예정인지에 대한 정보를 제공합니다. COPY 로컬의 폴더 혹은 파일들을 컨테이너 이미지로 복사합니다. WORKDIR 작업 디렉토리를 변경합니다. ENTRYPOINT 추후 작성 예정 F..
2024.04.19
no image
[Docker] Container 내부에서 GPU 사용하는 방법
안녕하세요, 오늘은 Docker Container 내부에서 GPU를 간단하게 사용할 수 있는 방법에 대해 소개하려고 합니다. 총 2가지를 진행하면 됩니다. 간단하게 nvidia-docker 설치와 같은 방법을 사용하지 않고 진행합니다. Dockerfile 환경변수 추가 설정 Docker Container 실행시 매개변수 추가 Dockerfile 환경변수 추가 설정 # Dockerfile FROM python:3.8 ADD . /workdir RUN apt-get update && apt-get install vim -y RUN pip install torch && pip install transformers && pip install gpustat ##### 다음 줄 추가 ##### ENV CUDA_VI..
2024.04.10
no image
[Docker] Docker와 Google Cloud를 이용해 Flask Web서버 배포하기
안녕하세요, 오늘은 Docker와 Google Colud Console을 이용해서 Flask로 만든 Web을 배포해보겠습니다. 업로드 할 것은 다음과 같이 진행할 예정입니다. Google Cloud 기본 설정 VM instance 생성 Docker설치, app.py 생성 및 설정 Dockerfile 생성, 빌드 및 Container 생성 방화벽 설정 완성 Google Cloud 기본 설정 https://cloud.google.com/ 클라우드 컴퓨팅 서비스 | Google Cloud 데이터 관리, 하이브리드 및 멀티 클라우드, AI와 머신러닝 등 Google의 클라우드 컴퓨팅 서비스로 비즈니스 당면 과제를 해결하세요. cloud.google.com VM instance를 생성하기 전 위의 링크로 들어가서..
2024.04.07
728x90

 

이번에는 Docker-Compose에 대해 정리하려고 합니다.

도커 컴포즈란?


도커 컴포즈는 여러 도커 컨테이너들을 정의하고 동시에 실행할 수 있도록 하는 도구입니다. 이를 통해서 단일 애플리케이션을 구성하는 여러 컨테이너를 정의하고 한 번에 실행할 수 있도록 관리합니다.

 

도커 컴포즈를 왜 사용할까?


도커 컴포즈를 사용하는 이유는 다음과 같습니다.

  • 복잡한 애플리케이션 구성을 위한 컨테이너 관리
  • 컨테이너, 서비스, 백과 프론트간의 의존성 관리
  • 배포 용이성

 

도커 컴포즈 설치


apt-get install docker-compose
# 또는
sudo apt-get install docker-compose

# 네트워크 설치
docker network create nat

설치가 완료되면 잘 설치했는지 확인합니다.

docker-compose -v

 

도커 컴포즈 파일 문법 사용법(docker-compose.yml)


도커 컴포즈 파일은 애플리케이션의 필요한 상태, 컨테이너가 실행 중일 때 어떤 상태여야하는지 기술하는 파일이다. docker container run 명령으로 실행해야할 컨테이너 명령어들을 모여놓은 단순한 형식의 파일(.yml)입니다. 

도커는 docker-compose.yml에 작성된 내용을 통해  container들을 실행합니다. 

YML 또는 YAML 파일을 사용하는 이유 : YAML 문법은 들여쓰기를 통해 간단하게 작성할 수 있으며, JSON형식으로 변환하기 쉬워서 사용합니다.

도커 컴포즈 파일은 다음과 같은 세 개의 최상위 문(statement)으로 구성됩니다.

  • version : 도커 컴포즈 파일 형식의 버전을 가리킵니다.
  • service : 애플리케이션을 구성하는 모든 컨테이너에 대한 정보들을 열거하는 부분입니다.
  • networks : 서비스 컨테이너가 연결된 모든 도커 네트워크를 열거하는 부분입니다.

이에 대해 자세하게 설명해드리겠습니다.

 

version 

version: '3.8' # Compose 파일 버전

Docker Compose 파일의 버전을 지정합니다. 이는 Compose 파일의 형식을 정의하며, 사용할 수 있는 기능과 옵션을 결정합니다.

 

service

도커 컨테이너 생성할 때 사용하는 태그

services:
  container_name:
    image: image_name:latest

image : 컨테이너를 생성할 때 사용하는 Docker hub 또는 로컬 image를 지정합니다.

services:
  container_name:
    build: 
    	context: . #Dockerfile Directory
        dockerfile: Dockerfile

build : 로컬 디렉토리에서 Docker 이미지 빌드하며, 'context'는 Dockrefile의 디렉토리입니다.

services:
  container_name:
    port: 
    	- "80:80"

ports : 호스트와 컨테이너간의 포트 매핑을 지정합니다

services:
  container_name:
    enviorment:
    	a : b

enviroment : 컨테이너에서 사용할 환경 변수를 설정합니다. 변수 a에 b의 값을 설정합니다.

services:
  container_name:
    command: ["python", "-m", "flask", "run"]

command: 컨테이너가 시작될 때 실행할 명령어를 지정합니다.

services:
  container_name:
    depends_on:
      - db

depends_on : 서비스가 시작되기 전에 시작되어야 할 다른 서비스를 지정합니다.

healthcheck: 추후 추가 예정

restart : 추후 추가 예정

labels : 추후 추가 예정

networks : 추후 추가 예정

 

network 

networks:
  network_name:
    external:
      name: nat

external : 외부 네트워크 참조합니다.

 

예시

도커 컴포즈를 사용하면 정리가 잘되어서 시각적으로 잘 확인할 수 있습니다.

docker container run -p 8020:80 --name todo-web --network nat todo-list

위의 명령어를 아래와 같이 작성해서 실행할 수 있습니다.

# docker-compose.yml

version: '3.7'

services:
  
  todo-web:
    image: todo-list
    ports:
      - "8020:80"
    networks:
      - app-net

networks:
  app-net:
    external:
      name: nat

docker-compose.yml 파일을 만들고 명령어를 실행합니다.

docker-compose up

이를 통해 다중 컨테이너 애플리케이션을 손쉽게 정의하고 관리할 수 있습니다. 개발 환경을 환경을 최소화합니다.

 

도커 컴포즈 명령어


docker-compose up
docker-compose up -d

docker-compose up: 포어그라운드에서 모든 로그를 출력하며 실행합니다.
docker-compose up -d: 백그라운드에서 (detach 모드로) 실행합니다.

docker-compose down

docker-compose down:  실행 중인 컨테이너, 네트워크, 볼륨, 이미지 등을 중지하고 제거합니다.

docker-compose stop

docker-compose stop : 실행 중인 컨테이너, 네트워크, 볼륨, 이미지 등을 중지합니다.

docker-compose scale container_name=3

docker-compose scale web=숫자 : 특정 서비스의 컨테이너 수를 조정합니다

 

Reference : https://docs.docker.com/compose/

728x90
728x90

오늘은 Docker Container을 SSH로 접속해서 사용할 수 있는 방법에 대해 알려드리려고 합니다. 각자의 포트를 통해 컨테이너에 따로 접속해서 서로 영향을 미치지 않고 사용할 수 있게 됩니다.

Dockerfile 작성하기


FROM python:3.12

RUN apt-get update && apt-get upgrade -y && apt-get install -y vim openssh-server net-tools

가장 최소한으로 작성하였습니다. SSH 접속을 할 때, Dockerfile은 크게 고려하지 않으셔도 됩니다. Container를 실행할 때 포트포워딩이 핵심입니다.

 

이미지 빌드하기


docker build -t ssh_image .

 

Container 실행하기


# docker run -idt -p 원하는포트:22 --name=my_ssh ssh_image
docker run -idt -p 8888:22 --name=my_ssh ssh_image

저는 8888 포트를 이용해 ssh에 접속을 할 것입니다.

이 코드를 통해 외부에서 8888포트로 들어오는 것을 컨테이너의 22번 포트로 들어오게 합니다. 이때 ssh의 기본포트는 22이므로 22로 설정했습니다.

 

Container 접속하기 및 라이브러리 설치


# Container 접속
docker exec -it my_ssh /bin/bash

컨테이너에 접속해서 root의 비밀번호를 설정합니다.

 

# 라이브러리 설치
apt-get update && apt-get upgrade -y && apt-get install -y vim openssh-server net-tools

혹시 다른 이미지를 빌드하신 분은 다음 코드를 입력해서 필요한 라이브러리를 설치합니다.

 

비밀번호 설정


# vi editor을 이용해 RootLogin을 설정합니다.
vi /etc/ssh/sshd_config

#PermitRootLogin prohibit-password를 다음과 같이 변경합니다.

그리고 :wq 입력해서 저장하고 나옵니다.

# 비밀번호 설정
passwd

passwd입력 후 비밀번호를 2번 입력합니다.

 

SSH service 켜기


service ssh start

service ssh status

netstat -ntl

다음과 같이 코드를 3개를 입력하고 출력이 된다면 성공입니다.

현재 22번 포트에 대해 입력을 받는 것을 확인할 수 있습니다.

 

SSH 접속하기


# ssh root@ip주소 -p 포트번호
ssh root@127.0.0.1 -p 8888
-> 비밀번호 입력

다음과 같이 ip주소를 입력하고 포트번호를 입력하고 비밀번호를 입력하면 ssh로 접속이 가능하게 됩니다.

 

 

728x90
728x90

Dockerfile에서 사용하는 명령어에 대해 정리한 글입니다. 

Overview


자주 사용하는 명령어 10가지입니다.

명령어 설명
FROM  이미지를 시작할 베이스 이미지 설정합니다.
RUN  이미지를 빌드하는 동안 명령을 실행합니다. 패키지 설치나 설정 파일 수정 등의 작업에 사용됩니다.
ENV  이미지의 환경변수를 설정하기 위해 사용됩니다.
CMD 컨테이너가 시작될 때 실행할 기본 명령을 설정합니다. CMD는 Dockerfile에 한 번만 존재할 수 있습니다.
EXPOSE 실제로 포트 공개하는 것이 아닌, 어떤 포트를 공개될 예정인지에 대한 정보를 제공합니다.
COPY 로컬의 폴더 혹은 파일들을 컨테이너 이미지로 복사합니다. 
WORKDIR 작업 디렉토리를 변경합니다.
ENTRYPOINT 추후 작성 예정

 

Format


# Comment
INTROUCTION arguments

INTRODUCTION은 대문자를 구분하지 않지만, 일반적으로 인수와 쉽게 구별하기 위해 대문자로 작성하는 것이 관례입니다.

 

FROM


FROM 지시문은 새로운 빌드 단계를 초기화하고 이후 지시문에 대한 베이스 이미지를 설정합니다. 이미지는 유효한 이미지라면 어떤 것이든 사용할 수 있습니다.

FROM [--platform=<platform>] <image> [AS <name>]

## 예시
FROM python:3.12

다음 Dockerfile은  Python 3.12이미지를 빌드합니다.

ARG와 FROM를 이용해서 사용하기

ARG  CODE_VERSION=latest
FROM python:${CODE_VERSION}

다음과 같이 작성해서 파이썬을 계속 최근 버전을 사용할 수 있도록 합니다.

 

RUN


RUN 지시문은 현재 이미지 위에 새로운 레이어를 생성하기 위해 명령을 실행합니다. 추가된 레이어는 Dockerfile의 다음 단계에서 사용됩니다. RUN은 두 가지 형태가 있습니다.

# Shell form:
RUN [OPTIONS] <command> ...
# Exec form:
RUN [OPTIONS] [ "<command>", ... ]

 

명령어를 여러 개를 사용할 때 다음과 같이 작성할 수 있습니다.

RUN <<EOF
apt-get update
apt-get install -y curl
EOF

## 또는

RUN apt-get update && apt-get install -y curl

 

ENV


ENV 지시문은 환경 변수 <key><value> 값으로 설정합니다. 이 값은 빌드 단계의 모든 이후 지시문에서 환경에 포함되며, 많은 경우에 인라인으로 대체될 수도 있습니다. 값은 다른 환경 변수들을 위해 해석되므로, 이스케이프 처리되지 않은 경우 인용 부호는 제거됩니다.

ENV <key>=<value>

사용 예시는 다음과 같습니다.

ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog

 

CMD


CMD 명령은 이미지에서 컨테이너를 실행할 때 실행할 명령을 설정합니다.

사용 방법은 다음과 같이 2가지가 있습니다.

## exec form
CMD ["executable","param1","param2"] (exec form)

## shell form
CMD command param1 param2 (shell form)

 

EXPOSE


Dockerfile 안에서 사용되며, 해당 Docker 이미지가 컨테이너 내에서 특정 프로토콜을 사용하여 특정 포트에서 리스닝하고 있음을 문서화합니다. 이 지시문은 컨테이너의 메타데이터에 정보만 추가할 뿐, 실제 포트를 외부에 공개하지 않습니다.

EXPOSE <port> [<port>/<protocol>...]

사용 예시는 다음과 같습니다.

EXPOSE 80/udp

Docker 이미지가 컨테이너 내에서 TCP 프로토콜을 사용하여 80번 포트에서 리스닝을 할 것을 암시합니다.

 

마지막으로 도커에서 포트를 열어주어야만 가능합니다.

docker run -p 80:80/tcp

 

COPY


로컬의 폴더 혹은 파일들을 컨테이너 이미지로 복사합니다. 

COPY [원본경로] [컨테이너 경로]

사용 예시는 다음과 같습니다.

COPY . /src

 

 

WORKDIR


WORKDIR 지시문은 그 이후에 오는 Dockerfile의 RUN, CMD, ENTRYPOINT, COPY, ADD 지시문에 대한 작업 디렉토리를 설정합니다. 만약 WORKDIR이 존재하지 않는다면, 이후의 Dockerfile 지시문에서 사용되지 않더라도 생성됩니다.

WORKDIR directory

 

여러번 사용할 수 있습니다. 상대 경로가 제공되면, 이전 WORKDIR 지시문의 상대 경로로 적용됩니다.

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

다음과 같이 pwd 명령어 실행시 디렉토리는 /a/b/c 입니다.

 

ENTRYPOINT


추후 작성 예정

 

 

 

출처 : https://docs.docker.com/reference/dockerfile/

728x90
728x90

안녕하세요, 오늘은 Docker Container 내부에서 GPU를 간단하게 사용할 수 있는 방법에 대해 소개하려고 합니다.

Docker Container에서 cuda가 실행되지 않는 모습

총 2가지를 진행하면 됩니다. 간단하게 nvidia-docker 설치와 같은 방법을 사용하지 않고 진행합니다.

  1. Dockerfile 환경변수 추가 설정
  2. Docker Container 실행시 매개변수 추가

 

 

Dockerfile 환경변수 추가 설정


# Dockerfile 

FROM python:3.8

ADD . /workdir

RUN apt-get update && apt-get install vim -y
RUN pip install torch && pip install transformers && pip install gpustat

##### 다음 줄 추가 #####
ENV CUDA_VISIBLE_DEVICES=0
##### 추가 #####

ENV CUDA_VISIBLE_DEVICES=0

 

다음과 같이 환경변수를 설정합니다.

 

Docker Container 실행시 매개변수 추가


위의 Dockerfile을 빌드합니다.(docker build -t <이미지 이름> <Dockerfile위치>)

 

# Container 생성
>>> docker run -dt --name test --gpus all image:latest

# Container 접속
>>> docker exec -it <container id> /bin/bash

여기서 컨테이너를 생성시 --gpus all 다음과 같은 매개변수를 추가합니다.

다음과 같이 GPU를 사용할 수 있게 됩니다. 

간단하게 로컬 GPU를 사용할 수 있도록 Docker image build 및 Container 생성에 대해 알아봤습니다.

728x90
728x90

안녕하세요, 오늘은 Docker와 Google Colud Console을 이용해서 Flask로 만든 Web을 배포해보겠습니다. 업로드 할 것은 다음과 같이 진행할 예정입니다.

  1. Google Cloud 기본 설정
  2. VM instance 생성
  3. Docker설치, app.py 생성 및 설정
  4. Dockerfile 생성, 빌드 및 Container 생성
  5. 방화벽 설정
  6. 완성

 

Google Cloud 기본 설정


https://cloud.google.com/

 

클라우드 컴퓨팅 서비스 | Google Cloud

데이터 관리, 하이브리드 및 멀티 클라우드, AI와 머신러닝 등 Google의 클라우드 컴퓨팅 서비스로 비즈니스 당면 과제를 해결하세요.

cloud.google.com

VM instance를 생성하기 전 위의 링크로 들어가서 카드를 등록해야합니다.

https://console.cloud.google.com/?hl=ko

카드를 등록하면, 다음과 같이 무료 체험판 사용을 위해 300$을 제공해줍니다. 그리고 좌하단에 VM 만들기로 들어갑니다.

https://console.cloud.google.com/marketplace/product/google/compute.googleapis.com

Compute Engine API를 사용 누릅니다. (1~2분 소요)

 

Google Cloud VM instance 생성


https://console.cloud.google.com/compute/instances?hl=ko

다음 사이트에 접속을 하면 위의 사진과 같이 나오면서 인스턴스 만들기를 누릅니다

 

이름은 test-1로 바꾸고, 지역은 서울로 지정했습니다. 

액세스 범위에 대해서는 다음과 같이 설정했으며, 방화벽은 HTTP와 HTTPS 트래픽 허용을 체크하고 만들기 버튼을 눌렀습니다. (만들기 버튼 누르고 VM instance 생성까지 1 ~ 2분 소요)

다음과 같이 인스턴스가 만들어진 것을 볼 수 있습니다.

 

Docker설치, app.py 생성 및 설정


SSH 옆에 화살표 버튼을 눌러서 브라우저 창에서 열기 클릭

브라우저 창에서 열기를 통해서 인스턴스를 실행합니다.

 

다음과 같이 창이 나타나면서 이제부터 명령어를 실행합니다.

 

# docker 설치
sudo apt install docker.io -y

# app.py 생성
touch app.py

# app.py 수정
vi app.py

app.py 파일을 수정합니다.

# app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
	return "Hello, Flask"
    
if __name__ == "__main__":
	app.run()

마지막으로 ESC 버튼을 누르고 :wq Enter 누르고 파일을 저장하고 나갑니다.

 

Docker 파일 생성 및 설정


Dockerfile 생성 및 수정

# Dockerfile 생성
touch Dockerfile

# Dockerfile 수정
vi Dockerfile

 

Dockerfile 파일 내용

FROM python:3.12

ADD . /app

RUN pip install flask

CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]

i 버튼을 눌러서 Insert Mode로 설정한 뒤, 다음과 같은 Text를 입력한 뒤, :wq를 눌러서 저장하고 나갑니다.

 

Docker 파일 빌드 및 컨테이너 생성


명령어를 통해 생성한 Dockerfile을 빌드하고 컨테이너를 생성합니다.

# 현재 디렉토리에 있는 Dockerfile을 이용해 이름이 test인 이미지 빌드
sudo docker build -t test .

# 빌드된 이미지(test)를 이용해 아룸아 test1이라는 컨테이너 생성 및 5000포트를 이용하여 접속
sudo docker run --name=test1 -d -t -p 5000:5000 test

 

Conatiner ID 확인

# 현재 실행중인 Container 확인
sudo docker ps

다음과 같이 Container ID와 여러 정보를 알 수 있습니다.

 

Conatiner에서 Flask가 잘 실행되었는지 확인하기 위해 로그를 확인합니다.(logs 뒤에 Container ID의 앞자리만 입력하면 됨)

sudo docker logs 829

다음과 같이 실행이 잘 되고있는 것을 확인할 수 있습니다.

 

외부 IP와 5000 포트를 결합하여 입력창에 입력합니다. (여기서 https 가 아닌 http를 이용해서 접속해야 합니다.)

 

하지만 다음과 같이 무한로딩에 걸리면서 접속이 되지 않는데, 이 때 방화벽을 설정해주어야 합니다.

 

 

방화벽 설정


https://console.cloud.google.com/net-security/firewall-manager/firewall-policies/list?hl=ko

방화벽에 접근하는 방법

  1. 좌상단에 메뉴버튼 클릭
  2. VPC 네트워크 화살표 클릭
  3. 그 안에 있는 방화벽 메뉴 클릭

접근이 어려운 분들은 사진 밑에 링크 달아놨습니다.

 

상단에 있는 방화벽 규칙 만들기를 누릅니다.

 

다음과 같이 설정합니다.

  • 대상 : 네트워크의 모든 인스턴스
  • 소스 IPv4 범위 : 0.0.0.0/0
  • 프로토콜 및 포트 : 모두 허용

만들기 버튼을 눌러서 방화벽 규칙을 만듭니다.

다음과 같이 test2 방화벽이 만들어진 것을 확인할 수 있습니다.

 

 

완성


방화벽 생성 이후 다음과 같이 웹사이트에 접근할 수 있습니다.

 

이상입니다!

 

728x90