Docker - Dockerfile
Dockerfile
- 도커 이미지를 생성할 수 있는 설정 파일
- 사용자가 이미지를 조합하기 위해 명령줄에서 호출할 수 있는 모든 명령을 포함하는 텍스트 문서
- 완성된 이미지를 생성하기 위해 필요한 컨테이너, 패키지, 소스코드, 명령어 등을 하나의 파일에 기록
- 도커에서 이 파일을 읽어 자동으로 작업을 수행한 뒤 완성된 이미지로 만들어 줌
- 깃과 같은 개발도구를 통해 애플리케이션의 빌드 및 배포를 자동화 가능
Docker iamge 생성
- 기존 이미지로 컨테이너 생성 후 작업 완료된 컨테이너를 다시 이미지로 생성
-
- Dockerfile로 필요한 패키지, 소스코드, 명령어 등을 작성 후 빌드
Dockerfile 작성
- 컨테이너에서 수행해야 할 작업을 명시
- 정해진 형식과 명령어로 작성해야 함
- 문서 파일로 작성
- 한 줄에 하나의 명령어로 구성
- 명령어를 명시하고 뒤에 옵션을 추가
- 명령어는 대/소문자 상관없음(일반적으로 대문자로 표기)
- 위에서 아래로 한 줄씩 차례대로 실행됨
- 주석은 # 기호를 사용
Dockerfile 명령어
명령어 | 설명 |
---|---|
FROM <이미지명>이미지명> | 생성할 이미지의 베이스가 될 이미지. Dockerfile 작성 시 반드시 한번 이상 입력해야 함. 이미지 이름은 기본 도커 명령어에서 사용되는 형식과 동일.(저장소이름/이미지이름:태그) |
LABEL <"키:값"> | 이미지에 메타 데이터 추가.”키:값” 형태로 입력.여러 개의 메타데이터 입력 가능.docker inspect 명령어로 확인 가능 |
ADD <원본경로> <대상경로>, ADD ["추가할 파일명", … , "추가될 위치"]대상경로>원본경로> | 로컬 디렉터리나 외부 URL 및 tar 파일에서 이미지로 파일 복사. 기본 Dockerfile이 위치한 디렉터리에서 파일을 가져옴. JSON배열의 형태로 사용 가능. 추가할 파일명을 콤마(,)로 구분해서 나열한 뒤 가장 마지막에 추가될 디렉터리 경로를 작성 |
COPY <원본경로> <대상경로>대상경로>원본경로> | 로컬 디렉터리에서 이미지로 파일을 복사 |
RUN <명령어>, RUN ["실행가능한 파일" , "명령줄 인자 1", "명령줄 인자2" , … ]명령어> | 이미지를 만들기 위해 컨테이너 내부에서 실행할 명령어 입력. 명령어 실행 시 대화형 입력이 뜨지 않도록 옵션을 지정해야 함. JSON배열 형태로 사용 가능 |
WORKDIR <디렉터리>디렉터리> | 명령어를 실행할 디렉터리로 이동. cd 명령어를 입력하는 것과 같은 기능 |
EXPOSE <포트번호>포트번호> | Dockerfile의 빌드로 생성된 이미지에서 사용될 포트 설정 |
CMD <명령어>, CMD ["실행가능한 파일", "명령줄 인자1", "명령줄 인자2", ...]명령어> | 컨테이너가 시작될 때 마다 실행할 명령어 설정. Dockerfile 에서 한번만 사용 가능. JSON배열 형태로 사용 가능 |
Dockerfile 작성 예제
- 수업 때는 vsCode에 Docker extension을 설치해서 사용했다.
# 베이스 이미지를 tomcat:8.5.72-jdk8로 지정
FROM tomcat:8.5.72-jdk8
# 작성자 라벨 작성
LABEL maintainer "kh<kh@iei.com>"
# 버전 라벨 생성
LABEL versiion="1.0"
# /user/local/tomcat/webapps 디렉토리에 ROOT.war 파일 추가(Dockerfile 기준 경로)
ADD ROOT.war /user/local/tomcat/webapps
# TImezone 환경 변수를 Asia/Seoul로 설정
ENV TZ=Asia/Seoul
# 이미지에서 8080 포트 사용
EXPOSE 8080
# 컨테이너 실행 시 catalina.sh 파일 자동 실행
CMD ["catalina.sh", "run"]
ROOT.war 파일은 Dockerfile이랑 같은 위치에 복사해서 넣었다.
Build Context : Dockerfile이 존재하는 폴더. 빌드할 때 이 폴더에 있는 파일을 다 읽어감.
그 다음에 powershell로 와서 dockerfile이 있는 경로로 변경해주었다.
-
ls 명령어를 통해 검색해서 잘 생성이 되었는지 확인했다.
Dockerfile 빌드
- 작성한 Dockerfile을 이용해 이미지를 생성하는 과정
docker build [옵션] <Dockerfile이 존재하는 디렉터리 경로>
명령어 | 설명 |
---|---|
-f <파일명>파일명> | Dockerfile 의 파일명 별도 지정. 기본값은 지정된 디렉터리 경로 내 “Dockerfile” 이름으로 사용됨 |
-t <이미지명:태그> [이미지명:태그 …]이미지명:태그> | 생성될 이미지 이름 지정. 지정하지 않으면 16진수 형태 이름으로 자동 생성됨 |
// 실습 때 사용했던 거
docker buile -t tomcat-web:1.0 .
// . : 현재 경로
생성된 이미지 상세 정보 보기
- inspect
docker inspect tomcat-web:1.0
생성된 이미지로 컨테이너 실행
docker run -d --name myweb -p 80:8080 --link mydb:db tomcat-web:1.0
localhost:80/main으로 접속하면 잘 연결되었고,
회원가입/로그인/로그아웃도 모두 된다.