1. Dockerfile
2. DockerBuild
3. 캐시
컨테이너를 생성하기위해 필요한 이미지는 다음 두가지 방법 통해 얻을 수 있음.
- Download : 컨테이너 생성시 기입한 이미지를 가지고 있지 않을 경우, docker hub에 있다면 자동다운로드
- Docker build : 내 입맛대로 이미지 만듦
도커파일로 이미지를 생성하다보면, Removing~container 라는 명령어가 반복해서 나온다.
이유는 명령어를 순차적으로 실행할 때 마다, 다음과 같은 과정을 거치기 때문
- 컨테이너생성 (이전까지 얻은 이미지로)
- 명령어 실행
- 레이어 생성
- 이미지로 커밋
- FROM : Base image 지정 / 반드시 한번이상 입력필요
- RUN : 패키지 설치 및 명령 실행
- COPY/ADD : 파일 또는 폴더 가져옴
- COPY : 일반적인 파일 복사만 가능
- ADD : 압축파일, 네트워크 상의 파일도 가능
- LABEL : 메타데이터 추가
- WORKDIR : 작업 디렉토리 지정
- 없으면 새로 생성 후 이동 / 있으면 해당 경로로 이동
- 이후 명령어는 해당 디렉토리를 기준으로 동작
- EXPOSE : Dockerfile 빌드로 생성된 이미지에서 열어줄 포트 지정
- 외부에 공개할 예정인 포트를 지정 하는것.
- EXPOSE 만 할 경우 아
~무 의미가 없음- docker run -p 에서 맵핑시 컨테이너의 포트로 사용해야 의미있음
- 또한
docker run -P
사용시 EXPOSE로 개방된 포트들에 자동 맵핑 가능- CMD/ENTRYPOINT : 빌드된 이미지로 만들어진 컨테이너를 생성, 실행할때 실행되는 명령어
- CMD : 추가적인 명령어에 따라 설정한 명령어를 수행
- ENTRYPOINT : 무~조건 실행되는 명령
- ENV : 이미지에서 사용할 환경변수값을 지정
# FROM <이미지 이름>:<태그>
# 예1)
FROM ubuntu:20.04
# 예2)
FROM nvidia/cuda:11.1.1-cudnn8-runtime-ubuntu20.04
# RUN <패키지 또는 명령어>
RUN apt-get update
# COPY 경로/파일 경로/파일
COPY index.html /home/workspace # index 파일 복사
COPY . /home/workspace # 현재경로에 있는 파일 전부 복사
# LABEL <key>=<value>
LABEL title="TEST DOCKER"
LABEL version="0.1"
LABEL description="Docker Test Label"
# WORKDIR 경로
WORKDIR /home/workspace
# EXPOSE <PORT 번호>
EXPOSE 8888
docker run --name <container-name> -p 10055:888 <image-name>
docker run --name <container-name> -P exposed-ports <image-name>
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 내부에 여러 줄 작성 가능하지만, 결국 마지막 한줄만 사용됨
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 -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 ~~~
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/