2020. 1. 31. 21:52ㆍdevops/docker
Docker file 작성
이미지 생성하는 방법
개발한 애플리케이션을 컨테이너화할 때 이전까지는 아래의 방법과 같이 진행했습니다.
- 아무것도 존재하지 않는 이미지(ubutu, Centos 등)로 컨테이너를 생성
- 애플리케이션을 위한 환경을 설치하고 소스코드 등을 복사해 잘 작동하는 것을 확인
- 컨테이너를 이미지로 커밋(commit)
이 방법을 사용하면 어플리케이션이 동작하는 환경을 구성하기 위해 일일이 패키지를 설치하고 코드를 복사해야합니다. 물론 직접 컨테이너에서 애플리케이션을 구동해보고 이미지로 커밋하기 때문에 정확하다는 장점이 있습니다.
docker는 위 과정을 손쉽게 기록하고 수행할 수 있는 build 명령어를 제공합니다. 하나의 파일에 설치해야하는 패키지, 소스코드, 명령어 등을 build 명령어를 통해 실행하면 docker가 한줄씩 실행하며 편한 환경을 구성할 수 있습니다.
결론적으로 Dockerfile을 사용하면 위의 1,2,3 같은 복잡한 순서를 실행해야하는 번거러움을 줄일 수 있고 빌드 및 배포를 자동화할 수 있습니다.
추가적으로 docker hub에 꼭 이미지를 올려하는 것이 아닌 dockerfile을 대신 배포할 수 있습니다.
아래 DockerFile의 내용은 ubuntu를 실행하여 apache2를 설치한 다음 로컬에 있는 test.html 파일을 웹 서버로 접근할 수 있는 /var/www/html에 복사합니다.
필자는 test.html파일을 아래와 같이 작성해주었습니다.
<html>
<head>
</head>
<body>
<h1> hoony blog write Docker File</h1>
</body>
</html>
Dockerfile
FROM ubuntu:14.04
LABEL maintainer "dl57934<dl57934@gmail.com>"
LABEL "purpose"="practice"
RUN apt-get update
RUN apt-get install apache2 -y //yes 대답
ADD test.html /var/www/html
EXPOSE 80
CMD apachectl -DFOREGROUND
소문자로 명령어를 적어도 상관없지만 일반적으로 대문자로 표기합니다.
FROM: 생성할 이미지의 베이스가 될 이미지를 뜻합니다. FROM 명령어는 Dockerfile을 작성할 때 반드시 한번 이상 입력해야 하며 뒤 이미지 정보는 run을 할때 사용한 이미지와 동일합니다.
MAINTAINER: 이미지를 생성한 개발자의 정보를 넣습니다. 일반적으로는 연락을 할 수 있는 이메일 같은 정보를 넣습니다.
LABEL: 이미지에 메타데이터를 추가합니다. 추후에 docker inspect를 통해서 정보를 확인할 수 있습니다.
RUN: 이미지를 만들기위해 컨테이너 내부에서 명령어를 실행합니다. 위에서는 update 후 apache2를 설치합니다. 단 설치할 때 사용되는 yes라고 대답해야하는 경우 -y를 통해 대답을 해주어야합니다.
ADD: 파일을 이미지에 추가합니다. 추가하는 파일은 Dockerfile이 위치한 디렉터리인 컨텍스트에서 가져옵니다. 가져오는 파일의 위치는
Dockerfile이 위치한 폴더에서 가져옵니다.
WORKDIR: 명령어를 실행할 디렉터리를 나타냅니다. 예를 들어 echo hello => test2.html이라고 한다면 test2.html은 WORKDIR에서 생성됩니다.
EXPOSE: Dockerfile의 빌드로 생성된 이미지에서 노출할 포트를 설정합니다. 하지만 이것을 설정한다고 무조건 host와 바인딩되는 것은 아니며 단지 80번 포트를 사용할 것임을 나타내는 것뿐입니다.
CMD: CMD는 컨테이너가 시작될 때마다 실행할 명령어를 설정하며 Dockerfile에서 한번만 사용할 수 있습니다. 위와 같이 아파치를 실행하는 명령어를 사용하여 웹 서버가 시작됩니다. 기본적으로는 /bin/bash로 설정되어 있는데 이를 덮어 씌운 것입니다.
Dockerfile 빌드
dockerfile을 빌드해 보겠습니다. -t 옵션은 이미지의 이름을 설정합니다. 아래와 같이 실행하면 mybuild:0.0으로 이미지가 생성됩니다. -t 옵션을 사용하지 않으면 16진수 형태의 이름으로 이미지가 만들어져서 사용해주면 좋습니다. 그리고 끝에 Dockerfile이 저장된 경로를 입력해야합니다.
docker build -t dockerfilebuild:0.0 ./
그럼 이제 만들어진 이미지를 활용하여 container를 만들어보겠습니다. 컨테이너가 실행될 때 웹서버를 실행하도록 해놓았기 때문에 별다른 설정없이 apache 서버가 실행합니다.
docker run -d -P --name hoonyApacheServer dockerfilebuild:0.0
-P(대문자) 옵션은 이미지에 설정된 EXPOSE의 모든 포트를 호스트에 연결하도록 설정합니다. 이전에는 -p 3000:3000으로 설정했지만 -p만 사용하면 Dockerfile에 있는 EXPOSE의 port 번호를 host에 연결합니다.
host에 연결된 port번호를 확인해보면 32772인 것을 확인할 수 있습니다.
localhost:32772(기본 인덱스 화면)
DockerFile에서 작성해준 localhost:32772/test.html을 확인할 수 있습니다.
'devops > docker' 카테고리의 다른 글
Dockerfile 명령어 (0) | 2020.02.04 |
---|---|
docker build 과정 (2) | 2020.02.02 |
docker image 배포 (0) | 2020.01.31 |
docker 이미지 (0) | 2020.01.31 |
docker 컨테이너 자원 할당 제한 (0) | 2020.01.29 |