[Docker]도커허브에 이미지 올리기

김윤섭·2024년 7월 10일
1
post-thumbnail

도커허브에 접속해서 계정을 만든다.

도커허브?

도커 이미지를 저장하고 공유할 수 있는 클라우드 기반의 저장소
https://hub.docker.com

레포지토리를 만든다. 깃허브 레포지토리 개념으로 생각하면 쉽다.


도커에 이미지를 푸시할 때 형식이 중요하기에 기억해둔다. 다르게 하면 오류가 발생해서 푸시가 안된다.

로컬환경에서 app.py 라는 파이썬 파일을 작성한다.

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def home():
    return jsonify(message="Hello, Docker World!")

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5002)

현재 디렉토리에 Dockerfile을 생성한다.

#현재 디렉토리에 Dockerfile을 생성
touch Dockerfile
vim Dockerfile

Dockerfile?

애플리케이션을 컨테이너 이미지로 빌드하기 위한 명령어들을 순서대로 기술한 스크립트 파일

# 단일 스테이지 Dockerfile
FROM python:3.11-slim

WORKDIR /app

# 시스템 패키지 업데이트 및 Python 관련 패키지 설치
RUN apt-get update && \
    apt-get install -y python3 python3-pip && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Flask 설치
RUN pip install flask

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 5002

CMD ["python", "app.py"]

requirements.txt 파일을 만들어준다.(Python 프로젝트에서 필요한 패키지들과 그 버전을 명시하는 텍스트 파일)

Flask==2.0.1

이미지를 빌드하고 도커 허브에 푸시한다. 형식을 잘 지켜야 푸시가 된다.

docker login

docker build -t 유저이름/앱이름:제목 .
#.는 현재 디렉토리를 의미함
#이 점은 도커가 현재 디렉토리에서 Dockerfile을 찾아서 그 파일을 기반으로 이미지를 빌드하도록 지시하는 것

docker run -p 5002:5002 유저이름/앱이름:제목 

docker push 유저이름/앱이름:제목 

이미지 파일이 올려진 모습

도커허브에서 이미지 받아오기(pull)

docker pull username/repository:tag

#이미지 실행
docker run -d -p 5002:5002 username/repository:tag

CLI 환경에서도 할 수 있지만 도커 앱을 이용하여 GUI 환경에서도 진행할 수 있다.

이미지 실행 확인

http://localhost:5002 주소로 들어가보면 확인할 있다.

curl 명령어로도 확인할 수 있다.

도커앱의 컨테이너 목록에서 curl이나 웹사이트 접속할때마다 로그가 남겨지는 것을 확인할 수 있다.
재밌는 사실은 컨테이너 이름을 따로 지정해주지 않으면 boring_wing처럼 두 단어를 조합해서 자동으로 만들어준다는 것이다.

종료 및 컨테이너 삭제

➜  ~ docker stop <컨테이너 id>

➜  ~ docker rm <컨테이너 id>

결론

도커 허브를 통해서 다른 사람이 만든 이미지도 풀해보고 본인이 만든 이미지도 직접 올려보고 여러 실습을 진행해봤다. git이랑 명령어도 비슷하고 사이트의 형태도 비슷해서 금방 이해를 했었다. 예전에 유니티로 게임을 만들때 사용했었던 asset store과도 비슷한 부분이 있는것 같다.
도커도 git이나 유니티만큼 큰 생태계라는 것을 알았고 도커 이미지를 이용하면 프로젝트 초기에 귀찮고 실수도 잦은 환경변수 설정이나 패키지들을 일일이 설치 안해도 되기에 팀원간의 협업에 있어서 효율성을 극대화 시킬 수 있을것이다.

0개의 댓글