도커 이미지 만들기
도커는 이미지를 만들기 위해 컨테이너의 상태를 그대로 이미지로 저장하는 단순한 방법을 사용함
예를 들어, 어떤 애플리케이션을 이미지로 만든다면, 리눅스만 설치된 컨테이너에 애플리케이션을 설치하고 그 상태를 그대로 이미지로 저장함
저자 제공 sample 파일을 download
$ git clone https://github.com/asashiho/dockertext2
Docker 파일이란
명령에 의한 Docker 이미지의 작성 방법 (기존 방식)
베이스가 되는 Docker 이미지를 바탕으로 Docker 컨테이너를 생성하고, 생성한 Docker 컨테이너 안에서 OS의 설정이나 미들웨어의 설치, 파라미터의 설치를 수동으로 수행
만들어진 컨테이너에서 서버를 구축한 상태를 바탕으로 Docker 이미지를 생성
Dockerfile 파일에 의한 Docker 이미지의 작성 방법 (현재 방법 )
Dockerfile은 Docker상에서 작동시킬 컨테이너의 구성 정보를 기술하기 위한 파일
Docker build명령은 Dockerfile에 기술된 구성정보를 바탕으로 Docker 이미지를 생성
Dockerfile
텍스트 파일 형식의 파일로 에디터 등을 이용해서 작성
확장자는 필요 없음
dockerfile 이외의 다른 이름 사용 시 docker build 명령 시 “-f” 옵션 사용
FROM 명령(필수 명령)
베이스 이미지를 지정함
tag 생략 시 최신 버전 지정됨
이미 만들어진 다양한 베이스 이미지는 Docker hub에서 확인 가능
Docker 이미지 생성 실습
Dockerfile의 빌드
Docker파일을 이미지로 바꿔준다.
-t sample:1.0은 tag
$PWD/sample은 docker파일의 경로를 나타낸다 ($PWD는 현재 작업 디렉토리)
Note
베이스 이미지와 작성한 두 개의 이미지의 이미지 ID(image ID)가 모두 동일
이미지로서는 각각 다른 이름이 붙어 있지만, 그 실체는 모두 동일한 이미지라는 것을 나타냄
Dockerfile이 아닌 파일을 사용한 Docker Build
$ docker build –t sample -f Dockerfile.base
Docker 이미지의 layer 구조
Dockerfile을 빌드하여 Docker 이미지를 작성하면, Dockerfile의 명령별로 이미지를 작성함
작성된 여러 개의 이미지는 layer 구조로 되어 있음
Dockerfile 작성
nginx와 index.html를 통해 새로운 Dockerfile을 만들어 준다.
$ docker build -t webap .
를 이용해서 Dockerfile을 도커이미지로 build 해준다.
$ docker container run -d -p 80:80 --name webserver_2 webap
을 통해서 webserver_2라는 container를 만들어주고 실행한 다음
내 서버로 들어와보면 index파일대로 표시가 된다.
* 여기서 유의할 점은 index.html를 수정하고 다시 컨테이너를 실행하면 안된다. Dockerfile를 도커 이미지로 바꿀 때의
index파일로 되어있기 때문이다.
명령 실행(RUN 명령)
□ Shell 형식으로 기술 : shell에서 실행하는 형식으로 기술
- apt 명령으로 Nginx를 설치할 경우
□ Exec 형식으로 기술
- shell을 경유하지 않고 직접 실행(JSON 배열 형식): 환경 변수 ($HOME 사용 불가)
데몬 실행(CMD 명령)
이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행할 경우
□ Exec 형식으로 기술: CMD ["nginx", "-g", "daemon off;"]
□ Shell 형식으로 기술: CMD nginx -g 'daemon off;
□ ENTRYPOINT 명령의 파라미터로 기술
Exec 형식으로 기술: ENTRYPOINT ["nginx", "-g", "daemon off;"]
Shell 형식으로 기술: ENTRYPOINT nginx -g 'daemon off;'
ENTRYPOINT 명령과 CMD명령을 조합한 예
$ docker build -t sample_cmd_entr .
10초마다 갱신되는 모습을 보여주고 있다.
CMD 명령은 Docker container run 수행 시 외부에서 overwrite 가능하다.
-d 2를 이용해서 2초마다 갱신으로 바꿔주는 command를 추가해줬다.
'DevOps' 카테고리의 다른 글
[Airflow] Connection 연결 시 [TEST] 버튼 비활성화 해결방법 (0) | 2024.10.22 |
---|---|
[Airflow] Airflow 설치 (Docker) (0) | 2024.10.22 |
[Vector] Logstash 대체안 Vector (0) | 2024.04.19 |
[Grafana] Customizing Grafana Alerting Notification Templates (0) | 2024.03.08 |
[SonarQube/Jenkins] SonarQube + Jenkins + GitLab 연동하기 (0) | 2023.04.24 |