Docker - 3. Image & Build

최창우·2022년 11월 7일
0

Docker

목록 보기
3/7
post-thumbnail

📌목차

1. Dockerfile
2. DockerBuild
3. 캐시

컨테이너를 생성하기위해 필요한 이미지는 다음 두가지 방법 통해 얻을 수 있음.

  • Download : 컨테이너 생성시 기입한 이미지를 가지고 있지 않을 경우, docker hub에 있다면 자동다운로드
  • Docker build : 내 입맛대로 이미지 만듦

📕 Dockerfile

  • Docker file은 Image를 만들기 위한 설정파일
  • 여러 명령어를 토대로 Docker file을 작성하면 설정된 내용대로 이미지 생성됨

📖 Docker file 로 이미지 생성되는 과정

도커파일로 이미지를 생성하다보면, Removing~container 라는 명령어가 반복해서 나온다.

이유는 명령어를 순차적으로 실행할 때 마다, 다음과 같은 과정을 거치기 때문

  1. 컨테이너생성 (이전까지 얻은 이미지로)
  2. 명령어 실행
  3. 레이어 생성
  4. 이미지로 커밋

📖 Docker file 작성하기

  1. FROM : Base image 지정 / 반드시 한번이상 입력필요
  2. RUN : 패키지 설치 및 명령 실행
  3. COPY/ADD : 파일 또는 폴더 가져옴
    • COPY : 일반적인 파일 복사만 가능
    • ADD : 압축파일, 네트워크 상의 파일도 가능
  4. LABEL : 메타데이터 추가
  5. WORKDIR : 작업 디렉토리 지정
    • 없으면 새로 생성 후 이동 / 있으면 해당 경로로 이동
    • 이후 명령어는 해당 디렉토리를 기준으로 동작
  6. EXPOSE : Dockerfile 빌드로 생성된 이미지에서 열어줄 포트 지정
    • 외부에 공개할 예정인 포트를 지정 하는것.
    • EXPOSE 만 할 경우 아~무 의미가 없음
    • docker run -p 에서 맵핑시 컨테이너의 포트로 사용해야 의미있음
    • 또한 docker run -P 사용시 EXPOSE로 개방된 포트들에 자동 맵핑 가능
  7. CMD/ENTRYPOINT : 빌드된 이미지로 만들어진 컨테이너를 생성, 실행할때 실행되는 명령어
    • CMD : 추가적인 명령어에 따라 설정한 명령어를 수행
    • ENTRYPOINT : 무~조건 실행되는 명령
  8. ENV : 이미지에서 사용할 환경변수값을 지정
  1. FROM
# FROM <이미지 이름>:<태그> 

# 예1)
FROM ubuntu:20.04

# 예2)
FROM nvidia/cuda:11.1.1-cudnn8-runtime-ubuntu20.04
  1. RUN
# RUN <패키지 또는 명령어>
RUN apt-get update
  1. COPY
# COPY 경로/파일 경로/파일
COPY index.html /home/workspace # index 파일 복사
COPY . /home/workspace # 현재경로에 있는 파일 전부 복사
  1. LABEL
# LABEL <key>=<value>
LABEL title="TEST DOCKER"
LABEL version="0.1"
LABEL description="Docker Test Label"
  1. WORKDIR
# WORKDIR 경로
WORKDIR /home/workspace
  1. EXPOSE
# EXPOSE <PORT 번호>
EXPOSE 8888 
docker run --name <container-name> -p 10055:888 <image-name>
docker run --name <container-name> -P exposed-ports <image-name>
  1. CMD
CMD echo 'This is a test"
docker run --name <container-name> <image-name>
>> This is a test

docker run --name <container-name> <image-name> echo 'Hello'
>> Hello

위 결과를 보면 컨테이너 생성시 마지막에 다른 문자열을 출력하라고 할경우 해당 명령어가 실행된다. CMD는 Dockerfile 내부에 여러 줄 작성 가능하지만, 결국 마지막 한줄만 사용됨

  1. ENTRYPOINT
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]
docker run --name <container-name> <image-name> 
>> Hello world

docker run --name <container-name> <image-name> ME
>> Hello ME
ENTRYPOINT jupyter notebook --allow-root --ip=0.0.0.0 --port=8888 --no-browser
ENTRYPOINT jupyter lab --allow-root --ip=0.0.0.0 --port=8888 --no-browser

📕 Docker Build

이미지 빌드 명령어

docker build -t <이미지 이름:이미지 버전> <Dockerfile 의 경로>

# 예시 1) 도커파일이 현재경로에 존재
docker build -t apache-image:0.1 .

# 예시 2) 도커파일이 workspace/ 경로에 존재
docker build -t test_version:0.1 workspace/

📕 캐시

한번 이미지 빌드를 마치고 난뒤 다시 같은 빌드를 진행 할 시
같은 명령어를 만나게 되므로, 이전의 이미지 빌드에서 사용했던 캐시를 들고와 사용함. 아래 사진을 보면, Using Cache라는 출력내용이 나타나고 Removing~container 명령어는 나타나지 않았음. 이는 이전에 생성했던 레이어를 활용해 이미지를 생성하기 때문.

캐시기능이 문제가 되는 경우는, 코드가 변경되어 있을수도 있는데 명령어 문장이 같기 때문에 이전에 생성된 캐시값을 들고와서 최신버전이 반영안될 수 있음. 이럴때는 --no-cache 옵션을 추가하여 캐시기능을 끄고 빌드 가능하다.

$ docker build --no-cache ~~~

📕 Error

  1. error checking context: 'can't stat
  • 도커빌드시 발생하는 에러임
  • 해결 : 새폴더 생성하여 (1) 도커파일 과 (2) 사용할 폴더(파일)을 넣고 빌드

  • - (1) : workspace 라는 폴더 생성
    - (2) : workspace 폴더에 dockerfile과 사용할 폴더 넣음
    - (3) : ls 했을 때 workspace 폴더가 보이는 경로에서 docker build 수행

📚 Reference

https://velog.io/@ckstn0777/%EB%8F%84%EC%BB%A4%ED%8C%8C%EC%9D%BCDockerfile
https://wooono.tistory.com/123
https://blog.d0ngd0nge.xyz/docker-dockerfile-write/

profile
유능한 개발자가 되고 싶은 헬린이

0개의 댓글