우노
[Docker] Dockerfile 개념 및 작성법 본문
Dockerfile
- Dockerfile은 DockerImage를 생성하기 위한 스크립트(설정파일)이다.
- 여러가지 명령어를 토대로 Dockerfile을 작성한 후 빌드하면
- Docker는 Dockerfile에 나열된 명령문을 차례대로 수행하며 DockerImage를 생성해준다.
- Dockerfile을 읽을 줄 안다는 것은 해당 이미지가 어떻게 구성되어 있는지 알 수 있다는 의미이다.
Dockerfile의 장점
(1) 이미지가 어떻게 만들어졌는지를 기록한다.
- 보통 사람들은 완성된 이미지를 가져다 쓰기 때문에 이미지가 어떻게 만들어졌는지에 대해서는 알 필요가 없다.
- 그러나 개발자의 경우라면 조금 다르다. 어떠한 애플리케이션을 담고 있는 이미지가 설치 되기 위한 과정은 어떠한지, 중간에 어떠한 과정을 수정해야 하는지 등을 알아야 하는 경우가 있다.
- 예를 들어 raw한 상태의 우분투 이미지에서 자신이 원하는 애플리케이션을 담은 이미지를 만들어내기까지, 그 과정들을 기록하고 수정하며 바꿔나갈 수 있다는 것이다.
- 이는 Dockerfile이 자동화된 스크립트 형태이기 때문이다.
(2) 배포에 용이하다.
- 어떠한 이미지를 배포할 때, 몇 기가씩이나 되는 이미지 파일 자체를 배포하기보다는 그 이미지를 만들 수 있는 스크립트인 Dockerfile만을 배포한다면 매우 편리할 것이다.
- 사용자는 그 스크립트를 실행시키기만 하면 스스로가 그 Dockerfile에 해당하는 이미지를 얻을 수 있기 때문이다.
- 실제로 Docker Hub에 가면, Dockerfile로 이미지를 배포하고 있는 사람들을 심심찮게 볼 수 있다. 물론 이미지로 배포하는 사람도 있지만.
(3) 컨테이너(이미지)가 특정 행동을 수행하도록 한다.
- 컨테이너 환경에서 애플리케이션을 개발하다 보면, 특정 행동을 취하도록 하는 컨테이너를(이미지를) 만들어야 할 때가 있다.
- 이는 사실 말로서 설명하기는 좀 어렵고, 실제 개발을 하다보면 '아, 이거 Dockerfile 쓰면 좀 간단해 지겠구나...' 라는 생각이 머릿속에서 불현듯 번개처럼 스칠때가 있다.
Dockerfile 작성 및 명령어
Dockerfile을 작성 할 땐 실제 파일의 이름을 'Dockerfile'로 해야합니다.
ubuntu에 아파치 서버를 설치하는 Dockerfile을 작성해보도록 하겠습니다.
Dockerfile을 담을 디렉토리를 생성 한 후 Dockerfile을 생성합니다.
mkdir apache-dockerfile && cd apache-dockerfile vi Dockerfile
Dockerfile의 내용은 아래와 같습니다.
# server image는 ubunutu 18.04를 사용 FROM ubuntu:18.04 # Dockerfile 작성자 MAINTAINER Wimes <yms04089@kookmin.ac.kr> # image가 올라갔을 때 수행되는 명령어들 # -y 옵션을 넣어서 무조건 설치가 가능하도록 한다. RUN \ apt-get update && \ apt-get install -y apache2 # apache가 기본적으로 80포트를 사용하기 때문에 expose를 이용해 apache server로 접근이 가능하도록 한다. EXPOSE 80 # 컨테이너가 생성 된 이후에 내부의 아파치 서버는 항상 실행중인 상태로 만들어준다. # apachectl을 foreground(즉, deamon)상태로 돌아가도록 한다. CMD ["apachectl", "-D", "FOREGROUND"]
- FROM : 베이스 이미지
- 어느 이미지에서 시작할건지를 의미한다.
- MAINTAINER : 이미지를 생성한 개발자의 정보 (1.13.0 이후 사용 X)
- LABEL : 이미지에 메타데이터를 추가 (key-value 형태)
- RUN : 새로운 레이어에서 명령어를 실행하고, 새로운 이미지를 생성한다.
- RUN 명령을 실행할 때 마다 레이어가 생성되고 캐시된다.
- 따라서 RUN 명령을 따로 실행하면 apt-get update는 다시 실행되지 않아서 최신 패키지를 설치할 수 없다.
- 위 처럼 RUN 명령 하나에 apt-get update와 install을 함께 실행 해주자.
- WORKDIR : 작업 디렉토리를 지정한다. 해당 디렉토리가 없으면 새로 생성한다.
- 작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작한다.
- cd 명령어와 동일하다.
- EXPOSE : Dockerfile의 빌드로 생성된 이미지에서 열어줄 포트를 의미한다.
- 호스트 머신과 컨테이너의 포트 매핑시에 사용된다.
- 컨테이너 생성 시 -p 옵션의 컨테이너 포트 값으로 EXPOSE 값을 적어야한다.
- USER : 이미지를 어떤 계정에서 실행 하는지 지정
- 기본적으로 root에서 해준다.
- COPY / ADD : build 명령 중간에 호스트의 파일 또는 폴더를 이미지에 가져오는 것
- ADD 명령문은 좀 더 파워풀한 COPY 명령문이라고 생각할 수 있다.
- ADD 명령문은 일반 파일 뿐만 아니라 압축 파일이나 네트워크 상의 파일도 사용할 수 있다.
- 이렇게 특수한 파일을 다루는 게 아니라면 COPY 명령문을 사용하는 것이 권장된다.
- ENV : 이미지에서 사용할 환경 변수 값을 지정한다.
- path 등
- CMD / ENTRYPOINT : 컨테이너를 생성 및 실행 할 때 실행할 명령어
- 보통 컨테이너 내부에서 항상 돌아가야하는 서버를 띄울 때 사용한다.
- CMD
- 컨테이너를 생성할 때만 실행됩니다. (docker run)
- 컨테이너 생성 시, 추가적인 명령어에 따라 설정한 명령어를 수정할 수 있습니다.
- ENTRYPOINT
- 컨테이너를 시작할 때마다 실행됩니다. (docker start)
- 컨테이너 시작 시, 추가적인 명령어 존재 여부와 상관 없이 무조건 실행됩니다.
- 명령어 형식
- CMD ["<커맨드>", "<파라미터1>", "<파라미터2>"]
- CMD <커맨드> <파라미터1> <파라미터2>
- ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
- ENTRYPOINT <커맨드> <파라미터1> <파라미터2>
- 참고
- FROM : 베이스 이미지
생성한 Dockerfile을 Image로 빌드
이미지 빌드 명령어
docker build -t [이미지 이름:이미지 버전] [Dockerfile의 경로]
docker build -t apache-image .
생성된 이미지 확인
docker images
웹에 띄울 html 파일 생성
보통 웹으로 띄울 html 파일을 아파치 서버에 추가하고 싶을 땐
Dockerfile의 ADD / COPY를 통해 호스트의 파일을 아파치 서버 옮기는 명령어를 작성 후 빌드합니다.
하지만 이렇게 하면 호스트의 html 파일과 아파치 서버의 html 파일이 동기화 되어 있지 않기 때문에 매번 build를 해줘야합니다.
우리는 그럴 시간이 없습니다.
따라서 도커 볼륨을 사용해 호스트의 html 파일을 만들어놓고, 도커 컨테이너에서 그 파일에 접근해서 사용하는 방법으로 동기화 할 것입니다.
우선 호스트에 index.html 파일을 생성 및 수정합니다.
cd ~ mkdir html && cd html vi index.html
Hello world
Image로 Container를 생성
이제 컨테이너 생성 시 도커 볼륨을 통해 host와 도커 컨테이너의 html 폴더를 동기화 하겠습니다.
docker run --name apache-container -d -p 80:80 -v ~/html/:/var/www/html apache-image
- --name : 컨테이너 이름
- -d : 백그라운드모드로 실행
- -p : [호스트포트][컨테이너포트] 포트 연결
- -v : 로컬과 컨테이너 파일 연동
접속 확인
- Public DNS를 80번 포트로 접속해 접속을 확인합니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] MySQL Container 실행 시 host db 볼륨 마운팅하기 (0) | 2020.11.18 |
---|---|
[Docker] Docker를 이용한 MySQL 설치 및 접속 (0) | 2020.11.08 |
[Docker] AWS EC2에서 Docker를 이용한 Nodejs 웹서버 구축 (0) | 2020.10.04 |
[Docker] AWS EC2에서 Docker를 이용한 Apache 웹서버 구축 (2) | 2020.10.03 |
[Docker] Image 생성 및 삭제 (0) | 2020.07.16 |
Comments