초보를 위한 도커 안내서 - 이미지 만들고 배포하기
가장 빨리 만나는 Docker
Dockerfile reference
를 참고하였습니다.
FROM <이미지 이름>:<태그>
🤔 왜 항상 BASE 이미지를 설정해줘야 하는 걸까?
Docker 이미지는 항상 기존에 만들어진 이미지를 기반으로 생성하기 때문, 즉 Docker는 이미지를 만들기 위해 컨테이너의 상태를 그대로 이미지로 저장하는 방법을 사용한다.
MAINTAINER <name> <email>
RUN <command>
RUN ["executable", "param1", "param2"]
🤔 RUN 명령 실행 방식이 왜 2가지인가?
1. 셸(/bin/sh)로 명령 실행RUN apt-get install -y nginx RUN echo "Hello Docker" > /tmp/hello RUN curl -sSL https://golang.org/dl/go1.3.1.src.tar.gz | tar -v -C /usr/local -xz
- RUN <명령> 형식
- 셸 스크립트 구문을 사용할 수 있음
- FROM으로 설정한 이미지에 포함된 /bin/sh 실행 파일을 사용하게 되며 /bin/sh 실행파일이 없으면 사용할 수 없음
2. 셸 없이 바로 실행RUN ["apt-get", "install", "-y", "nginx"] RUN ["/usr/local/bin/hello", "--help"]
- RUN ["<실행파일>", "<매개변수1>", "<매개변수2>"] 형식
- FROM으로 설정한 이미지의 /bin/sh 실행 파일을 사용하지 않는 방식
- 셸 스크립트 문법이 인식되지 않으므로 셸 스크립트 문법과 관련된 문자를 그대로 실행 파일에 넘겨줄 수 있음
- RUN으로 실행한 결과는 캐시되고 다음 빌드 때 재사용
- 캐시된 결과를 사용하지 않으려면
docker build
명령에서--no-cache
옵션을 사용하면 됨
#1. 셸 없이 바로 실행할 때
CMD ["executable", "param1", "param2"]
#2. 셸로 명령 실행
CMD command param1 param2
docker run
명령으로 컨테이너를 생성하거나 docker start
로 정지된 컨테이너를 시작할 때 실행COPY <src> <dest>
<src>
파일 혹은 디렉토리를 이미지의 <dest>
에 복사ADD <src> <dest>
<src>
파일 혹은 디렉토리를 이미지의 <dest>
에 복사🤔 COPY VS ADD
1. 공통점
:<src>
는 Context 아래를 기준으로 하며, Context 바깥의 파일, 디렉터리 경로, 절대경로는 사용 못 함
:<src>
는 파일 뿐만 아니라 디렉터리를 지정할 수 있는데, 디렉터리 지정시 디렉터리의 모든 파일을 복사
EX) 와일드 카드를 사용하여 특정 파일만 복사 가능 -ADD *.txt /root/
txt파일만 /root 디렉 내에 복사해라!
:<dest>
는 항상 절대 경로로 설정해야 하며, 마지막이 /로 끝나면 디렉터리가 생성되고 파일은 그 아래로 복사
:.dockerignore
파일에 설정한 파일과 디렉토리는 제외됨
2. 차이점
: ADD는 src에 압축파일이 있는 경우 자동으로 압축을 해제하면서 복사하지만 COPY는 압축파일 그대로 복사
: ADD는 src에 파일 대신 URL을 입력할 수 있지만 COPY는 사용할 수 없음
EX)ADD http://example.com/hello.txt /home/hello/
와 같이 설정시 /home/hello/hello.txt에 파일이 복사
WORKDIR <path>
RUN
, CMD
, `ADD', 'COPY' 명령이 실행될 기본 디렉터리를 설정WORKDIR
을 사용EXPOSE <port> [<port>...]
EXPOSE 3000
-> docker run -p 80:3000 이미지 이름
으로 외부포트 80포트에서 컨테이너 3000 포트로 접속docker run
명령의 -p
, -P
옵션을 사용해야 함
- docker는 컨테이너를 생성하고 주체인 host 컴퓨터의 포트와 컨테이너가 가진 포트와 연결하는 역할을 한다. 즉, host 8080포트에 들어온 신호를 컨테이너에게 전달하여 컨테이너를 운영할 수 있고, 이를 포트 포워딩이라고 한다.
- 컨테이너는 가상 IP주소를 할당 받기 때문에 외부에서 컨테이너 접근은 불가능하다. 따라서 포트 포워딩을 통해 외부와 연결 통로를 뚫어야 함.
ENV <key> <value>
RUN
, CMD
등에 적용된다.ENV GOPATH /go