DevOps/Docker, K8s

[Docker] dockerfile를 만들어 이미지 빌드하는 방법

cob 2024. 3. 14. 08:29

 

 

 

 

1. 이미지에 COPY 할 파일 생성

로컬에서 copy 할 파일을 만든다. 따로 이미지 빌드 시에 사용할 파일이 있다면 [2. DockerFile 생성]부터 진행

1-1)  파이썬 소켓 코드 파일 생성

$ vi test_server.py

import socket

with socket.socket() as s:
    s.bind(("0.0.0.0", 12345)) # 12345 포트 오픈
    s.listen()
    print("server started...")
    
    conn, addr = s.accept() # 클라이언트의 요청 수락
    with conn:
        print("Connected by", addr)
        while True:
            data = conn.recv(1024)
            print(f"recv data: {data.decode().strip()}")
            if 'q'==data.decode().strip(): break
            conn.sendall(data)
  • 정상적으로 만들어졌는지 확인하기 위해 파이썬 소켓 통신 스크립트 생성

 

1-2) 파이썬 스크립트 실행

python3 test_server.py

 

1-3) 소켓 통신 테스트

Netcat은 소켓 통신을 테스트하고 디버깅하는 데 주로 사용된다.
nc 127.0.0.1 12345
  • nc : 네트워크 연결을 생성하고 관리하는 데 사용되는 유틸리티
    - 포트 스캐닝 : 특정 포트가 열려있는지 확인
    - 포트 리스닝 : 특정 포트에서 연결을 대기하고, 들어오는 연결을 확인
    - 파일 전송 :  네트워크를 통해 파일 전송

nc 통신

 

 

 

 

반응형

 

2. DockerFile 생성

동일한 경로에 copy할 파일과 dockerfile를 생성한다. 
// 프로젝트 디렉터리를 생성
mkdir my_project

// 생성판 파이썬 파일 이동
mv test_server.py my_project

// 경로 이동
cd my_project

// 도커 파일 생성
vi dockerfile
  • dockerfile : 대소문자를 구분하지 않지만, 파일 이름은 dockerfile로 동일해야 한다.(일반적으로 소문자 사용)

 

[dockerfile]

FROM python:3.7

RUN mkdir /echo
COPY test_server.py /echo

// 파이썬이 하나만 설치되어있기 때문에 python이라고 지정 가능 두개 이상시 정확히 명시해줘야한다.
CMD ["python", "/echo/test_server.py"]
  • FROM, RUN, COPY는 build시 실행되는 명령어고, CMD는 컨테이너가 실행될 때 자동으로 실행되는 명령어다.
명령어 설명 사용법
FROM 우분투와 같은 운영체제 이름이나 필요한 애플리케이션 이름을 지정 FROM ubuntu:14.04
RUN 컨테이너가 빌드될 때 실행할 명령어 RUN ["mv", "1234", "5678"]
EXPOSE 컨테이너 외부에 노출할 포트 지정 EXPOSE 80
ENV 환경 변수 이름 지정 ENV abc /tmp
echo ${abc}
CMD 컨테이너가 시작될 때 실행할 명령어 CMD ["echo", "1234"]
ENTRYPOI NT 컨테이너가 실행될 때 기본 명령어 지정 (CMD와 달리 옵션을 넘길 수 있음) ENTRYPOINT ["python"]
...
$ sudo docker run -t 이미지 -c "print('1234')"
WORKDIR 작업할 디렉토리를 세팅 WORKDIR /project
USER 도커 실행 시 사용할 유저 이름 또는 uid를 지정 USER user 또는 USER user:group
VOLUME 호스트의 디렉토리를 도커에 연결
커밋 없이 사용 가능하며 주로 로그 수집이나 데이터 저장용도로 사용
VOLUME ["/tmp"]
COPY, ADD 파일이나 디렉토리를 복사할 때 사용하는 명령어
명령어를 대신 사용하면 URL도 가능하며 압축된 파일은 압축을 해제하 면서 옮김
COPY file /copy/to/path
ADD http://example.com/big.tar.xz
/usr/src/things/ ADD rootfs.tar.xz /
SHELL 원하는 타입의 쉘을 사용 SHELL ["/bin/sh", "-c"]
SHELL ["cmd", "/S", "/C"]

 

 


3. build

// 이미지 빌드
docker build -t echo_test .

// 이미지 조회
docker images
  • -t : 이미지 이름 지정
  • . : 현재 경로 (dockerfile과 test_server.py가 있는 경로)에서 build 실행

dockerfile build

 

 

 


4. 도커 컨테이너 생성

생성한 이미지(echo_test)로 도커 컨테이너를 실행한다.
 docker run -t -p 12345:12345 --name et echo_test
  • -t : 터미널 옵션
  • -p :  포트 설정
  • --name : 컨테이너 이름

 

실행 후 [1-3) 소켓 테스트]를 다시 실행하여 정상적으로 통신이 되는지 확인한다.

 

 

반응형