도커 이미지를 빌드하기 위해서는 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 |