Docker
이미지 빌드
수색…
매개 변수
매개 변수 | 세부 |
---|---|
--손잡이 | Dockerfile의 나머지 부분을 만들기 전에 기본 이미지 ( FROM )가 최신인지 확인합니다. |
Dockerfile에서 이미지 만들기
당신이 Dockerfile이 있으면, 당신은 사용하여에서 이미지를 구축 할 수 있습니다 docker build
. 이 명령의 기본 형식은 다음과 같습니다.
docker build -t image-name path
당신의 Dockerfile 이름이 지정되지 않은 경우 Dockerfile
, 당신은 사용할 수 있습니다 -f
구축하는 Dockerfile의 이름을 지정 플래그.
docker build -t image-name -f Dockerfile2 .
예를 들어, 현재 작업 디렉토리의 Dockerfile
에서 dockerbuild-example:1.0.0
이라는 이미지를 빌드하려면 Dockerfile
을 수행하십시오.
$ ls
Dockerfile Dockerfile2
$ docker build -t dockerbuild-example:1.0.0 .
$ docker build -t dockerbuild-example-2:1.0.0 -f Dockerfile2 .
더 많은 옵션과 설정은 docker build
사용 설명서 를 참조하십시오.
일반적인 실수는 사용자 홈 디렉토리 ( ~
)에 Dockerfile을 만드는 것입니다. 이것은 도 docker build -t mytag .
하기 때문에 나쁜 생각 docker build -t mytag .
이 메시지는 오랜 시간 동안 나타납니다.
컨텍스트 업로드 중
원인은 모든 사용자 파일 (홈 디렉토리와 서브 디렉토리 모두)을 복사하려고하는 docker 디먼입니다. 항상 Dockerfile에 대한 디렉토리를 지정하여이를 피하십시오.
.dockerignore
파일을 빌드 디렉토리 에 추가하는 것이 좋습니다 . 이 구문은 .gitignore
파일과 유사하며 원하는 파일과 디렉토리 만 빌드의 컨텍스트로 업로드되도록합니다.
간단한 Dockerfile
FROM node:5
FROM
지시문은 시작할 이미지를 지정합니다. 모든 유효한 이미지 참조 가 사용될 수 있습니다.
WORKDIR /usr/src/app
WORKDIR
지시문은 컨테이너 내부의 현재 cd
를 실행하는 것과 동일한 컨테이너 내부의 현재 작업 디렉토리를 설정합니다. (참고 : RUN cd
는 현재 작업 디렉토리를 변경 하지 않습니다 .)
RUN npm install cowsay knock-knock-jokes
RUN
은 컨테이너 내부에서 주어진 명령을 실행합니다.
COPY cowsay-knockknock.js ./
COPY
복사 빌드 컨텍스트 (로부터 첫 번째 인수에 지정된 파일이나 디렉토리 path
에 전달 docker build path
2 번째의 인수로 지정된 컨테이너에 위치).
CMD node cowsay-knockknock.js
CMD
는 이미지가 실행 되고 명령이 주어지지 않을 때 실행할 명령을 지정합니다. 그것은 docker run
명령을 전달하여 무시할 수 있습니다.
다른 많은 지침과 옵션이 있습니다. 전체 목록은 Dockerfile 참조 문서 를 참조 하십시오.
ENTRYPOINT와 CMD의 차이점
빌드 된 이미지에서 기본적으로 실행할 명령을 지정하는 Dockerfile
지시문이 두 가지 있습니다. CMD
만 지정하면 도커는 기본 ENTRYPOINT
인 /bin/sh -c
사용하여 해당 명령을 실행합니다. 기본 이미지를 시작할 때 진입 점 및 / 또는 명령 중 하나 또는 모두를 무시할 수 있습니다. 둘 다 지정하면 ENTRYPOINT
는 컨테이너 프로세스의 실행 파일을 지정하며 CMD
는 해당 실행 파일의 매개 변수로 제공됩니다.
예를 들어, Dockerfile
에
FROM ubuntu:16.04
CMD ["/bin/date"]
그런 다음 /bin/sh -c
의 기본 ENTRYPOINT
지시문을 사용하고 기본 엔트리 포인트를 사용하여 /bin/date
를 실행합니다. 컨테이너 프로세스의 명령은 /bin/sh -c /bin/date
입니다. 이 이미지를 실행하면 기본적으로 현재 날짜가 인쇄됩니다
$ docker build -t test .
$ docker run test
Tue Jul 19 10:37:43 UTC 2016
명령 행에서 CMD
를 겹쳐 쓸 수 있습니다.이 경우 명령은 사용자가 지정한 명령을 실행합니다.
$ docker run test /bin/hostname
bf0274ec8820
ENTRYPOINT
지시문을 지정하면 Docker는 해당 실행 파일을 사용하고 CMD
지시문은 CMD
의 기본 매개 변수를 지정합니다. Dockerfile
에 다음이 포함되어있는 경우
FROM ubuntu:16.04
ENTRYPOINT ["/bin/echo"]
CMD ["Hello"]
그런 다음 그것을 실행하면
$ docker build -t test .
$ docker run test
Hello
원하는 경우 다른 매개 변수를 제공 할 수 있지만 모두 /bin/echo
실행 /bin/echo
$ docker run test Hi
Hi
Dockerfile에 나열된 진입 점을 무시하려는 경우 (즉,이 컨테이너에서 echo
과 다른 명령을 실행하려는 경우) 명령 행에서 --entrypoint
매개 변수를 지정해야합니다.
$ docker run --entrypoint=/bin/hostname test
b2c70e74df18
일반적으로 ENTRYPOINT
지시문을 사용하여 실행할 기본 응용 프로그램을 가리키고 CMD
를 기본 매개 변수로 지정합니다.
Dockerfile에 포트 노출
EXPOSE <port> [<port>...]
EXPOSE
명령은 컨테이너가 런타임에 지정된 네트워크 포트에서 수신 대기한다는 것을 Docker에 알립니다.EXPOSE
는 컨테이너의 포트를 호스트가 액세스 할 수있게하지 않습니다. 이를 수행하려면,-p
플래그를 사용하여 포트 범위를 공개하거나 노출 된 모든 포트를 공개하는-P
플래그를 사용해야합니다. 하나의 포트 번호를 노출하고 다른 번호로 외부에 게시 할 수 있습니다.
예:
Dockerfile 내부 :
EXPOSE 8765
호스트 컴퓨터에서이 포트에 액세스하려면 docker run
명령에 다음 인수를 포함시킵니다.
-p 8765:8765
동사와 매개 변수로 본 ENTRYPOINT 및 CMD
Dockerfile이 다음으로 끝나는 것으로 가정하십시오.
ENTRYPOINT [ "nethogs"] CMD ["wlan0"]
이 이미지를
docker built -t inspector .
그런 Dockerfile로 빌드 된 이미지를 다음과 같은 명령으로 실행하십시오 :
docker run -it --net=host --rm inspector
nethogs는 wlan0이라는 인터페이스를 모니터합니다.
이제 eth0 (또는 wlan1, 또는 ra1 ...) 인터페이스를 모니터링하려면 다음과 같이하면됩니다.
docker run -it --net=host --rm inspector eth0
또는
docker run -it --net=host --rm inspector wlan1
Docker 허브 또는 다른 레지스트리로 이미지 밀어 넣기 및 당기기
로컬로 생성 된 이미지는 Docker Hub 또는 레지스트리라고하는 다른 docker repo 호스트에 푸시 될 수 있습니다. docker login
을 사용하여 기존의 도커 허브 계정에 로그인하십시오.
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: cjsimon
Password:
Login Succeeded
서버 이름을 지정하여 다른 도커 레지스트리를 사용할 수 있습니다. 이는 개인 또는 자체 호스팅 레지스트리에서도 작동합니다. 또한 안전을 위해 외부 자격 증명 저장소 를 사용할 수도 있습니다.
docker login quay.io
그런 다음 로그인 한 레지스트리에 이미지를 태그하고 푸시 할 수 있습니다. 저장소는 server/username/reponame:tag
로 지정해야합니다. 현재 서버를 생략하면 기본적으로 Docker Hub가 기본값으로 설정됩니다. 기본 레지스트리는 다른 공급자로 변경할 수 없으며이 기능을 구현할 계획 이 없습니다 .
docker tag mynginx quay.io/cjsimon/mynginx:latest
다른 태그를 사용하여 동일한 이미지의 다른 버전 또는 분기를 나타낼 수 있습니다. 여러 개의 다른 태그가있는 이미지는 각 태그를 동일한 repo에 표시합니다.
docker images
를 사용하여 새로 태그 지정된 이미지를 포함하여 로컬 컴퓨터에 설치된 설치된 이미지 목록을 확인하십시오. 그런 다음 밀어 넣기를 사용하여 레지스트리로 업로드하고 이미지를 다운로드하십시오.
docker push quay.io/cjsimon/mynginx:latest
-a
옵션을 지정하여 이미지의 모든 태그를 가져올 수 있습니다.
docker pull quay.io/cjsimon/mynginx:latest
프록시를 사용하여 빌드
종종 Docker 이미지를 작성할 때 Dockerfile은 인터넷에서 리소스를 가져 오는 프로그램을 실행하는 지침을 포함합니다 (예 : GitHub에서 프로그램 바이너리 빌드를 가져 오는 것과 같은 wget
).
Docker가 설정된 세트 환경 변수를 전달하도록 지시하여 해당 프로그램이 프록시를 통해 이러한 페치를 수행하도록 할 수 있습니다.
$ docker build --build-arg http_proxy=http://myproxy.example.com:3128 \
--build-arg https_proxy=http://myproxy.example.com:3128 \
--build-arg no_proxy=internal.example.com \
-t test .
build-arg
는 빌드시에만 사용 가능한 환경 변수입니다.