본문 바로가기
해킹 기초지식

도커 파일(docker file)과 명령어, 도커 허브(docker hub)

by whiteTommy 2023. 11. 29.

도커 이미지를 빌드하기 위해서는 Dockerfile 이 필요하다. 이는 이미지를 생성하는데 필요한 명령어를 포함하며, 모든 설정이 정의된 파일이다. 운영체제와 버전, 환경 변수, 파일 시스템, 사용자 등을 정의한다.

 

아래는 Dockerfile 예시이다.

FROM ubuntu:22.04

ENV user chall
ENV chall_port 2222

RUN apt-get update
RUN apt-get install -y socat

RUN adduser $user

ADD ./deploy/flag /home/$user/flag
ADD ./deploy/$user /home/$user/$user

RUN chown -R root:$user /home/$user
RUN chown root:$user /home/$user/flag
RUN chown root:$user /home/$user/$user

RUN chmod 755 /home/$user/$user
RUN chmod 440 /home/$user/flag

WORKDIR /home/$user
USER $user
EXPOSE $chall_port
CMD socat -T 30 TCP-LISTEN:$chall_port,reuseaddr,fork EXEC:/home/$user/$user

 

자신만의 dockerfile을 만들고 싶은 경우 위와 같은 파일을 직접 작성해야 한다. 기본 형식은 다음과 같다.

# 주석
명령어 인자

# ---예시---
FROM ubuntu:18.04

 

docker build 명령어를 수행하면 자동으로 이름이 Dockerfile인 파일(확장자 X)을 찾아 이미지를 빌드한다. -f 옵션으로 원하는 이름의 도커 파일을 사용할 수도 있다.

 

Dockerfile 명령어

  • FROM : 생성할 이미지의 기반이 되는 base 이미지를 지정한다.  FROM 이미지 : 태그 형태로 표현한다.
  • ENV : dockerfile 내에서 사용하는 환경 변수를 지정한다. ENV 변수명 값 or ENV 변수명=값 형태로 표현한다. 파일 내에서 변수는 $변수명 혹은 ${변수명} 형태로 표현한다.
  • RUN : 이미지를 빌드할 때 실행할 명령어를 작성한다. RUN 명령어 or RUN ["명령어", "인자 1", "인자 2"] 형태로 표현한다.
  • COPY : src 파일이나 디렉터리를 이미지 파일 시스템의 dst로 복사한다. COPY src dst 형태로 표현한다.
  • ADD : src 파일이나 디렉터리, URL을 이미지 파일 시스템의 dst로 복사한다. ADD src dst 형태로 표현한다.
  • WORKDIR : dockerfile 내의 명령을 수행할 작업 디렉터리를 지정한다. WORKDIR 디렉토리 형태로 표현한다.
  • USER : 명령을 수행할 사용자 혹은 그룹을 지정한다. USER 사용자명 | UID or USER [사용자명|UID] : [그룹명|GID] 형태로 표현한다.
  • EXPOSE : 컨테이너가 실행 중일 때 들어오는 네트워크 트래플을 리슨 할 포트와 프로토콜을 지정한다. EXPOSE 포트 or EXPOSE 포트/프로토콜 형태로 표현한다. 기본적으로 TCP 프로토콜이 지정된다.
  • ENTRYPOINT: 컨테이너가 실행될 때 수행할 명령어를 지정한다. ENTRYPOINT 명령어 or ENTRYPOINT ["명령어", "인자 1", "인자 2"] 형태로 표한다.
  • CMD : 컨테이너가 실행될 때 수행할 명령어를 지정하거나, ENTRYPOINT 명령어에 인자를 전달한다. CMD 명령어 or CMD ["명령어", "인자 1", "인자 2"] or CMD  ["인자1", "인자 2"] 형태로 표현한다.
    • dockerfile 내에 CMD 명령이 여러 개 존재하면 마지막 CMD를 사용한다.
    • docker run의 인자를 작성하면 CMD 명령어는 무시된다. 
    • ENTRYPOINT가 있는 경우, docker run의 인자가 ENTRYPOINT의 인자로 들어간다.

 

Dockerfile이 아래와 같을 때, docker run [이미지]로 컨테이너를 실행하면 python app.py을 실행한다.

docker run [이미지] test.py로 컨테이너를 실행하면 python test.py를 실행한다.

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

 

 

Docker Hub

도커의 공식 레지스트리로, 도커 이미지를 저장하는 저장소이다. 

 

사용자가 이미지를 자유롭게 업로드하거나 다운로드하여 사용할 수 있도록 한다. Dockerfile이 아닌 이미지 그 자체를 보관하고 공유할 수 있다.

 

이제, Docker Hub 레포지토리에 이미지를 업로드하는 방법을 살펴보자.

 

1. docker login

: Docker Hub에 로그인한다.

user@user-VirtualBox:~$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: 
Password: 
WARNING! Your password will be stored unencrypted in /home/user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
user@user-VirtualBox:~$

 

2. docker build -t [사용자] / [레포지토리명] : [TAG] [Dockerfile 경로]

:Dockerfile을 이용하여 이미지를 빌드한다. 

user@user-VirtualBox:~/Desktop/ex-docker$ docker build -t user/exercise-docker:1 .
[+] Building 1.8s (18/18) FINISHED                                              
 => ...생략...                                
 => exporting to image                                                     0.0s
 => => exporting layers                                                    0.0s
 => => writing image sha256:9d201c4de2b62519383058265e31669b167c422502643  0.0s
 => => naming to docker.io/dreamhackofficial/exercise-docker:1             0.0s
user@user-VirtualBox:~/Desktop/ex-docker$ docker images
REPOSITORY                          TAG       IMAGE ID       CREATED         SIZE
user/exercise-docker   1         9d201c4de2b6   6 hours ago     122MB

 

3. docker push [사용자] / [레포지토리명] : [TAG]

:레포지토리에 이미지를 업로드한다.

user@user-VirtualBox:~/Desktop/ex-docker$ docker push user/exercise-docker:1
The push refers to repository [docker.io/user/exercise-docker]
5f70bf18a086: Pushed 
4958ae9bc6ae: Pushed 
4b9b1ff53c81: Pushed 
5d89cab1df92: Pushed 
557171cb0464: Pushed 
e04c36b2101d: Pushed 
c8fe798e77a1: Pushed 
714c2f225f87: Pushed 
60ac9e1e9e64: Pushed 
3cc715e175c0: Pushed 
0482f429f461: Pushed 
b93c1bd012ab: Mounted from library/ubuntu 
1: digest: sha256:b0288419aa476a56c62d380f41c384f345405b41f7cffffa41aa9c1860fe4617 size: 2818
user@user-VirtualBox:~/Desktop/ex-docker$

 

 

이제, 명령어를 복사해서 누구나 이미지를 다운로드할 수 있다. docker pull 명령어를 사용한다. 형태는 push와 같다.

'해킹 기초지식' 카테고리의 다른 글

마크다운(Markdown)  (0) 2023.11.30
nc 사용법  (0) 2023.11.29
정규 표현식(Regex)  (0) 2023.11.27
도커(Docker)와 명령어  (0) 2023.11.20
SSH(Secure Shell, Secure Socket Shell)  (2) 2023.11.20