애플리케이션을 컨테이너 기술을 이용해 빠르게 배포하고 실행할 수 있도록 돕는 오픈소스 플랫폼
도커 컨테이너 : 도커 이미지를 바탕으로 생성된 가볍고 독립적인 실행 단위. 가상머신에 비해 오버헤드가 적어서 가볍고 빠르게 실행된다.
환경의 영향을 받지 않고 독립적인 컨테이너 단위로 사용할 수 있다.
$ docker run -it --name mycontainer -p 8080:8080 openjdk:11
docker run : 도커 컨테이너를 생성하고 실행
-it : 컨테이너와 상호작용을 위해 표준입력을 연결
--name mycontainer : 컨테이너 이름 지정
-p {호스트포트}:{컨테이너포트} : 호스트의 특정 포트와 컨테이너의 포트를 매핑
open jdk:11 : 베이스 이미지 지정
종료는 컨트롤 + D
$ docker start {컨테이너 이름 or ID}
start도 run과 마찬가지로 옵션을 넣어줄 수 있다.
start와 run의 옵션은 다르다.
-a : 컨테이너와 터미널 연결
-i : 컨테이너와 상호작용을 위해 표준입력 연결
-p : 호스트와 컨테이너 포트 연결
-d : 컨테이너를 백그라운드에서 실행
-e : 컨테이너 내부의 환경변수 설정
-u : 컨테이너 내부에서 실행될 사용자 설정
$ docker stop {컨테이너 이름 or ID}
stop도 옵션을 넣어줄 수 있다.
-t : 컨테이너가 종료되기까지 대기하는 시간 지정. 디폴트는 10초
-time-format : 대기 시간의 형식 지정. 디폴트는 s
$ docker ps
디폴트는 가동 중인 컨테이너만 출력한다.
-a : 모든 컨테이너 목록 출력
-f : 원하는 리스트를 필터링한다.
name, label, exited, status(created, restarting, running), ancestor(이미지를 공유받은 컨테이너), before(설정 컨테이너를 기준으로 전에 만들어진 컨테이너 확인), since(설정 컨테이너 기준으로 이후에 만들어진 컨테이너 확인)
--format : 출력할 정보의 포맷 지정
-n, --last : 최근 생성한 n개의 컨테이너 목록 출력
-l, --latest : 가장 최근에 생성한 컨테이너 출력
--no-trunc : 모든 정보 출력
-q : 컨테이너 ID만 출력
-s : 파일의 사이즈 출력
$ docker rm {컨테이너 이름 or ID}
-f : 실행 중인 컨테이너를 강제로 삭제
-l : 해당 컨테이너를 참조하는 링크 제거
-v : 컨테이너와 관련된 볼륨 제거
-n : 컨테이너의 이름 지정
-q : 컨테이너의 ID만 출력
도커 이미지를 저장, 관리, 공유할 수 있는 곳
$ docker push {유저명}/{이미지명}:{태그}
도커 컨테이너를 생성하기 위한 템플릿
애플리케이션을 실행하는데 필요한 모든 환경, 라이브러리, 소스 코드 등을 포함한다.
한 번 생성하면 수정할 수 없다.
$ docker images
$ docker pull {이미지명}
$ docker pull {이미지명}:{버전} // 특정 버전의 이미지를 다운로드 받고싶을 때
-a : 모든 목록 출력. 이 옵션이 없는 경우에는 dangling 이미지를 제외한다
--digests : 이미지의 digest 정보 출력
--no-trunc : 모든 컬럼 정보 출력
-q : 이미지 ID 정보만 출력
--filter : 필터링
--format : 출력할 정보의 형식 지정. Go 템플릿 형식을 사용한다
$ docker rmi {이미지명orID}
-f : 이미지를 강제로 삭제한다
--no-prune : 해당 이미지를 참조하는 다른 이미지나 컨테이너를 삭제하지 않는다
-q : 삭제한 이미지 ID만 출력
도커 이미지를 생성하는 과정
#베이스 이미지 설정
FROM openjdk:11
#JAR_FILE 변수 설정
ARG JAR_FILE=build/libs/*.jar
#도커 컨테이너로 복사
COPY ${JAR_FILE} app.jar
#컨테이너가 시작될 때 실행될 명령 설정
ENTRYPOINT ["java", "-jar", "/app.jar"]
$ docker build -t {dockerhub유저명}/{dockerhub저장소명}:tag .
.은 현재 디렉토리의 dockerfile을 사용하기 위해 사용
FROM <base_image> 빌드할 이미지의 기반이 되는 도커 이미지 선택
LABEL <key>=<value> 이미지에 메타데이터 추가
RUN <command> 컨테이너 내에서 실행할 명령어 지정
COPY <source> <destination> 로컬 파일 시스템에서 파일 혹은 디렉토리를 이미지에 복사
ADD <source> <destination> COPY와 유사하지만 다양한 기능을 제공한다. 주로 원격 파일 다운로드, 압축 파일 해제 등에 사용
WORKDIR <directory> 작업 디렉토리 지정
ENV <key>=<value> 환경 변수 설정
EXPOSE <port> 컨테이너가 외부에 노출할 포트 지정
CMD <command> 컨테이너가 시작될 때 실행할 기본 명령어 지정. 하나의 명령어만 사용할 수 있는데, 만약 Dockerfile에 CMD가 여러 번 나타날 경우 마지막 CMD가 실행된다.
docker run -p 8080:8080 -v .\build\libs\docker-0.0.1-SNAPSHOT.jar:\app\docker.jar openjdk:11 java -jar \app\docker.jar
-p 로 포트를 연결하고
-v 로 로컬 파일을 컨테이너로 공유
FROM openjdk:11
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
$ docker build -t myimage:0.0.1 .
$ docker run -p 8080:8080 myimage:0.0.1
// 이미지를 {허브유저명}/{허브repository명}:tag 으로 바꾸기
$ docker tag myimage:0.0.1 {허브유저명}/{허브repository명}:tag
$ docker run -p 8080:8080 {허브유저명}/{허브repository명}:tag
$ docker push {허브유저명}/{허브repository명}:tag
denied: requested access to the resource is denied
이런 오류가 발생한다면
$ docker login
으로 로그인한 후 진행