DockerFile?

docker에서 사용하는 Vagrant 파일이라고 생각하면 편하다.
미리 어떤 이미지를 이용하여 어떤 로직을 이용해 환경을 구축 할 것다! 라는 것을 구성한다
사용할 이미지, 파일 실행, 네트워크 등등을 작성 할 수 있다.
실제 이해한게 맞는지 모르겠지만, Dockerfile은 기본적으로 Image파일을 생성하기 위해 사용하는 것으로 이해했다.
물론 그것에 CLI명령어를 합쳐서 사용할 수 있지만, 다중 컨테이너를 사용하려면 docker-compose를 사용하는 것이 좋아보인다.

작성 방법

DockerFile에 작성된 주석은 실제 실행 시에는 제거되고 실행된다.

FROM

Docker Image 가져오기

  • Docker hub에 존재하는 Image를 다운로드 받아서 사용 혹은 생성한 Local Image를 사용한다
    • build 전에 docker pull을 이용하여 미리 다운 받아 사용 가능하다
  • 형식은 보통 서비스명:버전 형식으로 구성이 되는 것으로 보인다.
  • 만약 build 시 예외시키고 싶은 디렉토리, 파일 등이 존재한다면, .dockerignore File을 생성하면 된다.
# .dockerignore 예시
**/__pycache__/
tests/
docs/
# FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
# FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
# 아래 2가지 방법은 동일한 결과를 보여준다.
ARG AIRFLOW_IMAGE:apache/airflow:2.6.3-python3.7
FROM ${AIRFLOW_IMAGE}

FROM apache/airflow:2.6.3-python3.7

실행

크게는 RUN과 CMD가 존재한다

  • RUN
    • 용도
      • Docker Image를 Build 시 실행할 명령어
      • mount , network, security 설정을 할 수 있다.
        • mount : FS 를 추가하는 것.
          • 간단히 말하면 HDD/SSD같은 Disk 혹은 usb등을 PC에 삽입하고 인식시키는 것
        • 상세 설정이 필요하면 위 링크로 들어가서 확인해보자
    • \ 을 마지막에 붙여서 여러 개행하여 사용 할 수 있다.
  • CMD
    • 용도
      • Container 최초 실행 시 실행할 명령어
  • ENTRYPOINT
    • 용도
      • Container 실행 시 실행할 명령어
        • 어플리케이션 실행 명령어과 같은 것들을 주로 사용하는 것으로 보임.
# RUN은 기본적으로 /bin/bash -c를 기본값으로 실행시킨다.
# RUN 명령어
# RUN ["명령어", "param1", "param2"]
# 아래 3개는 동일하게 echo 'hello'를 출력한다.
RUN echo 'hello'
RUN /bin/bash -c echo 'hello'
RUN ["/bin/bash", "-c", "echo hello"]
# Mount 
RUN --mount=[type=<TYPE>][,option=<value>[,option=<value>]...]
# Network
RUN --network=<Type>
# Security
RUN --security=<Type>

# CMD
# 형식, 사용 방법은 RUN과 동일하다.
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

# ENTRYPOINT
ENTRYPOINT ["executable", "param1", "param2"]
# 실제로 가장 많이 본 형식은 아래와 같이 sh 파일을 copy하여 사용하는 것을 많이 봤다.
ENTRYPOINT ["filePath/entrypoint.sh"]

MetaConfig

  1. LABEL
    1. key=value 형식으로 image에 Meta정보를 삽입하는 것
# 공백으로 구분하여 여러 LABLE을 추가 가능
LABEL version="0.0.1" createBy="bapa"
LABEL description="\
이렇게 이미지에 대한 정보를 작성할 수 있습니다.
This is how you can write information about an image.
"

변수

  1. ENV
    1. 환경 변수 등록
  2. ARG
    1. 임시 변수로써 dockerfile 내부에서만 사용되는 변수
# =은 생략 가능하
ENV key1=val1 key2=val2
ARG key=val

Network

  1. EXPOSE
    1. 외부로 노출시킬 Port 설정
# 형식
EXPOSE [<external port>]:<internal port>/[<Protocol>]
# 아래 3개는 동일
EXPOSE 80 
EXPOSE 80:80
EXPOSE 80:80/tcp
# 만약 내부 외부 포트를 다르게 하고 싶다면 아래와 같이 변경시킬 수 있다.
EXPOSE 81:80/udp 

마운트

  1. VOLUME
    • docker 영역에서 생성한 Volume과 마운트 하는 것
  2. Bind-Mount
    • Host영역에서 관리 가능한 Volume과 마운트 하는 것
    • RUN 명령어를 이용하여 마운트
    • docker doc 이곳에 적혀있는 것을 보면 Volume과 차이를 볼 수 있다.
      • the first field is the path to the file or directory on the host machine.
# 형식
VOLUME ["/data"]
VOLUME /data

# 형식
RUN --mount=[type=<TYPE>][,option=<value>[,option=<value>]...]

WORKDIR

RUN,COPY 등 이 실행될 경로
간단히 말하면 Linux의 CD명령어를 이용하여 디렉토리 변경하는 것 이라고 보면된다.
그럼으로 WORKDIR를 이용하여 명령어 실행 위치를 변경 할 수 있다.

# 형식
WORKDIR /path/to/workdir

파일 복사

  1. ADD
    1. 압축된 파일을 풀어서 복사한다.
    2. URL 혹은 local path를 이용하여 복사
  2. COPY
    1. 파일 복사
    2. Local path만 지원
    3. –parents 옵션 추가 시 src의 디렉토리 경로까지 같이 복사 됨
ADD [--chown=<user>:<group>] [--chmod=<perms>] [--checksum=<checksum>] <src> <src> <src>... <dest>
ADD [--chown=<user>:<group>] [--chmod=<perms>] ["<src>","<src>","<src>"... "<dest>"]

COPY [--chown=<user>:<group>] [--chmod=<perms>] <src> <src> <src>... <dest>
COPY [--chown=<user>:<group>] [--chmod=<perms>] ["<src>","<src>","<src>"... "<dest>"]

# --parents 추가시 아래와 같이 복사됨/
COPY ./y/a.txt /no_parents/
# /no_parents/a.txt
COPY --parents./y/a.txt /parents/
# /parents/y/a.txt

사용자 권한

  1. USER
    1. 실행 권한을 적용
# 형식
# USER <user>[:<group>]
# USER <UID>[:<GID>]

USER root
# root 권한으로 실행
USER shb
# shb 권한으로 실행

개인적으로 이해한 그림

Pasted image 20231123112207.png**

[ Reference ]


개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!

Docker?

서비스를 패키징 및 배포를 하는데 유용한 오픈소스 프로그램
즉 , 컨테이너를 모듈식 가상 머신처럼 사용 가능하게 만들어주는 프로그램
카카오 컨퍼런스 이것을 보면 너무 컨테이너 관련 설명을 잘해주신다

기존 Linux Container과 차이점

Pasted image 20231122151223.png
Red Hat

위 사진을 보면 LXC는 간단히 설명하면 VM과 같은 머신을 이용하여 가상 환경을 띄우는 것 인데,
VM은 각 환경마다 OS 를 구축을 해야하지만, Docker은 Docker Engine 상에 프로세스를 띄워 사용하는 방식이기 때문에 보다 가벼워 졌다고 볼 수 있다.
과거에 Vagrant로 Hadoop EchoSystem을 구축해본 경험이 있는데 상당이 느리게 구축하였다, 하지만 Docker를 이용하니 상당히 빠른시간에 Build 및 구축이되서 상당히 당황스러웠다.

장점

  • 위와 같이 각각의 App, Service? 단위로 독립된 공간에 존재하여 서로 충돌이 발생하지 않게 구성하기 용이하다.
    • 마이크로 아키텍쳐 구성을 하기 용이하다.
  • 배포 시 이미지를 그대로 운영 서버에 배포하면 된다.
  • 같은 이미지를 사용하면, 같은 환경이라 봐도 무방하기 때문에 환경에 대한 제약이 적어져 배포, 확장이 용이해진다.

기본 준비 사항

window 기본적으로 Docker는 linux kernel 기반으로 동작을 하는 것으로 알고 있다.
Window에서 wsl 설정을 하여 우분투 환경을 구축 하고 docker desktop을 설치 혹은 docker를 설치하여 사용할 수 있다.
Docker Doc 혹은 MS Doc에 들어가서 따라하면 쉽게 할 수 있을 것 이다.

Docker 를 설치하였다면, Dockerfile혹은 docker-compose을 이용하여 이미지 빌드, 배포를 하여 사용할 수 있다.

[ Reference ]


개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!

'프로그래밍 및 IT > docker' 카테고리의 다른 글

docker-compose  (1) 2023.11.27

www.docker.com/get-started

 

Get Started with Docker | Docker

Learn about the complete container solution provided by Docker. Find information for developers, IT operations, and business executives.

www.docker.com

 

우선 도커는 가상화 환경을 만들어주는 좋은 친구입니다.

 

그런데 가상화가 되는 이라는 것은 컴퓨터가 가상화를 지원해야합니다.

 

본인의 PC에서 가상화를 지원하지 않는다면 아쉽게 사용을 하지 못 하는 것으로 알고 있습니다.

가상화 지원여부

위와같이 작업관리자(ctrl + shift + esc ) ->  성능 -> cpu클릭 하시면 위와같이 볼 수 있습니다. 가상화가 "사용"이길 빌어봅시다.

 

또 윈도우도 업데이트를 해줘야하는 것으로 알고있습니다. ( 앞자리가 20대인것 ) 

윈도우 버전

win + r 을 누르셔서 winver 검색하시면 위와같이 20으로 시작하지 않으시면 윈도우 업데이트를 하시면 될겁니다.

 

 

 

필요하신 것을 설치해줍니다.

 

설치하면서 회원가입도 해주세요 ㅎㅎ

 

 

설치를 눌러주면 위와같이 열심히 알아서 무언가를 깔고 있습니다. 다깔고 나면 체크하는 것들이 나오는데, 그것들은 제가 까먹고 캡쳐를 안 했습니다.

기억으로는 리눅스 컨테이너대신 윈도우 컨테이너 사용여부 정도 있던거 같은데 다 체크해주시면 됩니다.

 

 

그러면 아마 wsl 2install 뭐시기 경고 문구가 나타날 것 입니다.

거기서 시키는대로 순차적으로 진행시켜줍니다.

저는  window powerShell을 관리자권한으로 실행하시고, 5단계 까지 진행하고, 재시작하고 도커를 실행하니 잘 놀랍게도 에러가 사라졌습니다. ( 캡쳐못한게 너무 슬프네요. 다시 지우고 할 수도 없고..ㅎㅎ 다음에 컴퓨터 포멧하면 캡쳐해서 올려보겠습니다. ) 

 

업데이트를 다 하시면 위와 같이 하시면됩니다.

이제 개인적으로 서버를 구축하셔도 되고  hub.docker.com/  에 들어가셔서 원하시는 os를 다운 받으셔서 사용하셔도 됩니다. 

 

저도 이제 시작하는 것이여서 잘 아는게 없어서 많은 것을 포스팅하지 못 하네요.. 더 발전해서 올려보겠습니다.

 

 

'프로그래밍 및 IT > 도커 ( Docker )' 카테고리의 다른 글

도커 오라클 설치  (0) 2021.05.06

+ Recent posts