1. Dockerfile로 특정 작업을 실행하는 이미지를 만들면 좋은점

- 특정 작업을 실행하는 이미지를 만들어 해당 작업을 어디서든 실행시킬 수 있다.

- 도커컨테이너로 작업하면 실행 환경이 보장되기 때문에 안정적인 배포가 가능하다.

- 이를 통해 CI/CD를 할 수 있다.

 

2. Dockerfile를 만드는 법

- 실습을 위해 폴더를 하나 만들고 아래와 같이 main.py와 Dockerfile이라는 파일을 만들자.

# main.py
# argparse로 특정 인자를 실행할 때 받는 코드

import argparse

parser = argparse.ArgumentParser(description="Process two arguments.")
parser.add_argument("arg1", help="The first argument.")
parser.add_argument("arg2", help="The second argument.")
args = parser.parse_args()

print(f"arg1: {args.arg1}, arg2: {args.arg2}")
# Dockerfile (확장자가 없는 파일입니다.)
FROM python:3.9-slim

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

# main.py 복사
COPY main.py .

# 파이썬 로그가 보이게 버퍼 설정
ENV PYTHONUNBUFFERED=1

# 실행 설정
ENTRYPOINT ["python", "main.py"]

- 평소에 argparse를 사용했다면 main.py에 arg가 2개 들어가야 한다는 것을 알것이다.

- 해당 arguments는 이미지를 실행(run) 할 때 넣으면 된다.

 

3. Dockerfile로 image 만들기

- Dockerfile이 있는 경로에서 아래와 같은 명령어를 실행한다.

# main-with-args라는 이름과 1.0이라는 tag를 가지고 docker image가 생긴다
docker build -t main-with-args:1.0

# build가 성공적으로 완료되면 설정한 이름으로 이미지가 생성됐는지 본다.
docker image list

성공했다면 이렇게 조회된다.

 

4. arguments를 써서 컨테이너를 실행하기

- 단순히 컨텐이너를 실행할 때 arguments를 붙이면 된다.

# test-arguments라는 컨테이너 이름으로 first와 second라는 arguments를 붙여서 실행한다.
docker run --name test-arguments main-with-args:1.0 first second

# 실행이 완료되면 docker logs로 확인하자
docker logs test-arguments

아래와 같은 로그가 나오면 성공이다.

 

5. arguments가 아니라 환경변수 값으로는 안될까?

- arguments가 아니라 환경변수를 인자로 받아서 실행하고 싶은 경우도 있을 것이다.

- 그런경우 아래와 같이 환경 변수를 Dockerfile에서 줄 수 있고 실행해서 확인할 수 있다.

# MY_ARG1, MY_ARG2라는 이름으로 설정된 환경 변수를 가져온다.
import os

print(f"MY_ARG1: {os.environ.get('MY_ARG1')}, MY_ARG2: {os.environ.get('MY_ARG2')}")
# 환경 변수를 설정했으니 main.py에 환경변수를 받는 코드가 있으면 된다.
FROM python:3.9-slim

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

# main.py 복사
COPY main.py .

# 파이썬 로그가 보이게 버퍼 설정
ENV PYTHONUNBUFFERED=1

# 환경 변수 설정
ENV MY_ARG1="first my env"
ENV MY_ARG2="second my env"

# 실행 설정
ENTRYPOINT ["python", "main.py"]

 

6. 위와 동일하게 이미지를 만들고 실행해보자

- 명령어는 동일한 방식으로 사용하면 된다.

- 물론 이번에는 arguments를 받는 경우가 아니므로 컨테이너를 그냥 실행하기만 하면 된다.

# 이미지를 생성한다.
docker build -t main-with-envs:1.0 .

# arguments를 주는 코드가 아니므로 실행만한다.
docker run --name test-envs main-with-envs:1.0

# 로그를 살펴보자!
docker logs test-envs

정상적으로 적용된 것을 알 수 있다.

 

7. 결론

- 상황에 따라 적절하게 이미지를 생성해서 사용하자.

- 주로 환경변수로 작업을 진행할테지만 상황에 따라 arguments를 부여해야하는 경우가 있으니 적절히 사용해보자!

1. 문제상황

  • Dockerfile로 특정 print문이 있는 작업을 실행했다.
  • 이 print문은 while문 내에 있다.
  • 실시간으로는 log가 보이지 않고, 강제 종료하면 log가 생기는데 어떻게 하지??

2. 해결 방법

  • Dockerfile에서 ENV PYTHONUNBUFFERED=1을 작성한다.
  • docker logs에서 파이썬 프로세스가 종료되기 전에 발생하는 로그들도 확인할 수 있다.

1. 문제 상황

- 기본 값을 사용하여 도커를 설치하는 경우 도커 컨테이너의 network는 172.17.xxx.xxx 대역으로 생성된다.

- 도커 기반의 서비스 구성에서 IP가 172.17.xxx.xxx인 곳에 접근하려는 경우 도커 브릿지 네트워크 대역폭과의 충돌이 문제가 되는 경우가 있다.

 

 

 

2. 해결 방안

- 기본으로 설정된 대역폭을 임의로 변경하여 문제를 해결한다.

- 기본적인 IP 대역폭을 변경하는 방법은 매우 쉽다.

- 아래의 설명대로 /etc/docker/daemon.json 파일을 설정을 변경하면 된다.

https://docs.docker.com/network/bridge/#use-the-default-bridge-network

 

Use bridge networks

 

docs.docker.com

 

 

 

3. 변경 과정

- /etc/docker/daemon.json 파일이 없는 경우에는 생성하면 된다.

- 일반적인 설정 값은 기본 값을 써도 무방하므로 아래와 같이 bip만 변경하자.

- ip는 예시 이므로 임의로 다른 것을 지정해도 된다.

{
  "bip": "192.168.1.1/24"
}

- 이후 도커 서비스를 restart하면 끝이고, 기존에 기본 네트워크를 사용하던 컨테이너들은 자동으로 새로운 대역폭으로 ip 생성된다.

+ Recent posts