인프라

Docker(5) - 도커 이미지 업로드

조앤박 2023. 8. 8. 16:37

지난 글까지는 컨테이너를 다루는 것에 대해서만 배웠다.

이번 글에서는 도커 이미지를 업로드하는것을 배워보자.

 

다시 한 번 도커파일과 이미지의 관계에 대해서 정리해보자.

결국 도커 이미지를 만든다는 것은,

금형 설계서로 '제작'이라는 행위를 통해 금형을 만드는 것과 마찬가지로

Dockerfile을  'build'해서 제작 틀을 만들어서 추후 컨테이너 인스턴스를 뽑아내는 것과 유사하다.

 

실제 실무에서 사용하는 dockerfile 예제를 보고 참고해보자.

FROM golang:latest

RUN mkdir /appname
WORKDIR /appname
ADD bin/appname bin/appname
ADD conf conf
ADD public public
ARG BUILD_PORT
ENV PORT $BUILD_PORT
EXPOSE $BUILD_PORT
ENTRYPOINT ["bin/appname"]

https://docs.docker.com/build/guide/intro/

도커파일에 대한 공식 문서를 보면 나와있듯, syntax에 맞춰서 조건을 적으면 된다.

syntax는 여러가지가 있지만, 대표적으로 쓰이는 문법들은 다음과 같다.

  • FROM: 베이스 이미지 선정
  • INSTALL: 명령어를 기반으로 파일을 설치
    • shell에서 bash를 실행해 install을 돌리게 되면 진짜 설치할거냐고 묻는 ‘Y/N’ 이 뜨는데, 이게 뜨면 도커는 설치를 하지 않는다. 그래서 Y를 선택하게 하는 -Y 옵션도 주는 경우가 있다.
  • WORKDIR: work directory 선정
    • 사용자의 요청이 들어왔을 때, 그 요청을 어떤 디렉토리에서 찾게 하고 싶은가에 대해 선정하는 것
    • WORKDIR /var/www/html을 작성하면 shell에서는 mkdir -p /var/www/html을 하는 것과 같다.
    • 또한 추가적으로 현재 위치를 이동시키기까지 한다.
  • COPY: 복사할 파일 선정 (예: 작업한 서비스 파일들)
    • COPY [HOST] [DEST] 구조로 되어 있으며, host에 있는 파일을 DEST까지 복사한다.
  • RUN: 실행할 명령어
  • CMD: 실행할 명령어
    • RUN과 CMD는 실행할 명령어라는 공통점이 있지만,
    • RUN은 빌드가 실행되는 시점에서의 명령어로 "이미지에 반영"되고,
    • CMD는 빌드 후 컨테이너가 run될 때 실행되는 명령어로 "컨테이너에 반영"된다.
    • CMD는 조금 더 특이하게, PWD 명령어로도 오버라이딩 할 수 있다.
  • ENTRYPOINT: 컨테이너가 시작할 때 실행할 명령어 (예: 서버 실행)
  • EXPOSE: 컨테이너 외부에 노출할 포트 지정
  • ENV: 환경 변수 지정

자세한 예시를 덧붙여 더 많은 syntax를 작성한 글이 있다.

https://rampart81.github.io/post/dockerfile_instructions/#run

추후 도커파일을 만들 시에 참고하자.

 

이렇게 도커파일을 만들었으면, 이미지를 만들기 위해 build를 해보자.

빌드 신택스는 다음과 같다.

docker build [OPTIONS] PATH | URL | -

$ docker build -t web-server-build .

-t 옵션으로 태그(이미지 이름)를 달아주었다.

또, 현재 디렉토리에 도커파일이 있고, 이미지에 사용하는 파일들을 현재 디렉토리에 위치시킬 것이기 때문에 .(온점)을 달아준다.

 

한번 빌드 했으면, 나중에 태그를 바꿔 줄 때에는 

$ docker image tag [image name]

이 명령어를 주면 된다. 지금은 이미지 이름이 필요 없어도, 추후 태그가 필요한 상황이 꼭 오니 알아두자.

 

이렇게 만든 이미지를, docker hub라는 레지스트리에 올려서 많은 사람들이 내 이미지를 써보게 할 수도 있다.

이 이미지를 docker hub에 올려보자.

도커 허브에 이미지를 올릴 때에는 주의사항이 있다.

바로 '[Docker Hub 사용자명]/이미지명:[태그명]'이 있어야 한다.

따라서 아까 image tag 명령어를 이용해서 적절하게 이미지명이나 태그명을 변경해주자.

먼저, shell에서 docker hub에 로그인을 해야 한다. 로그아웃할때는 login 대신 logout을 치면 된다.

$ docker login
Username: choincnp
Password:

Authenticating with existing credentials...
Login Succeeded

Logging in with your password grants your terminal complete access to your account.
For better security, log in with a limited-privilege personal access token. Learn more at https://docs.docker.com/go/access-tokens/

성공적으로 로그인 했으면, 내가 만든 이미지를

이미지 태그를 바꿔서 그냥 push하기만 하면 된다.

$ docker image tag choincnp:ubuntu-git choincnp/test:latest
#                    이미지 이름     사용자명 /레포지토리명 : 태그
$ docker images
REPOSITORY               TAG          IMAGE ID       CREATED             SIZE
choincnp/test            latest       4999083f3cd2   2 hours ago         196MB
choincnp                 ubuntu-git   4999083f3cd2   2 hours ago         196MB

$ docker push choincnp/test:latest
The push refers to repository [docker.io/choincnp/test]
2439ff1afd0d: Pushed
59c56aee1fb4: Pushed
latest: digest: sha256:3954063a2c7d19a2dece00a8b8469efcdcf7b88dc5e43245e84cea301af68ef9 size: 741

 

 

도커허브에서 레포지토리에 들어가보면 내 이미지가 성공적으로 push되었다는 것을 알 수 있다.

이제 이 이미지 디렉토리인 choincnp/test/general을 통해, 사람들은

docker pull choincnp/test/general

라는 명령어로 내가 만든 이미지를 제각기 다른 환경에서 사용할 수 있다.

 

github처럼 immutable한 버전컨트롤인지는 다시 확인 해 봐야겠지만, 일단 성공했으므로 박수를 먼저 쳐보자.