0부터 시작하는 Docker 공부 - Dockerfile 의 기본

Jaehong Lee·2022년 8월 19일
0
post-thumbnail

1. 컨테이너 영역과 이미지

  • 컨테이너 ( linux 의 cgroup , namespace ) 는 이미지를 통해 배포된다

    • 컨테이너는 rw 영역과 ro 영역으로 나뉘어지는데, ro 영역은 이미지로부터 생성된 부분이다
    • rw 영역은 컨테이너 생성 후 추가되는 부분으로 memory 위에 있으므로 휘발성이다. 이는 영구 저장이 불가능하므로, 영구 저장을 위해서는 볼륨과 연결해야 한다. 이 rw 영역은 layer 라 한다
    • 도커 이미지 빌드시 이미 생성된 layer 가 캐시되어 재사용되기에 빌드 시간을 단축할 수 있으며, 변경된 이미지 저장시 변경되어 추가된 layer 부분만 저장되기에 저장 공간을 절약할 수 있다

이미지를 생성하는 대표적인 방법

  1. commit 은 동작중인 컨테이너를 이미지화. 허나, 안정적이지 않다
  2. Dockerfile 을 이용하여 build 하게 되면 새로운 이미지가 생성된다
    • build 할 때에는 기본적으로 Dockerfile 을 인식하게 되는데, 만약 다른 이름을 사용할려면 -f 옵션을 써서 파일을 지정해야 한다
      docker build -t myimg:1.0 -f dockerfile1
  • 일반적으로는 두 개 이상의 이미지를 생성하고자 한다면, 별도의 디렉터리를 만들고, 각 디렉터리에서 별도의 Dockerfile 을 생성하는 형식으로 이미지를 만들게 된다

2. Dockerfile 옵션

  • Dockerfile 의 제일 상단에는 무조건 FROM 이 위치되며 이는 한 File 에서 한 번만 쓰인다. FROM 을 통해 Base Image 를 지정한다

  • MAINTAINER 는 작성자 정보를 간략히 입력해 준다. 최근에는 잘 사용하지 않고, LABEL 을 대신 사용한다

    LABEL auther=gildong
    LABEL email=gildong@naver.com

  • RUN 은 컨테이너가 아닌, 베이스 이미지 자체에 전달하는 명령어

    FROM centos:7
    RUN yum -y install vim -> 베이스 이미지 centos:7 에게 vim 패키지를 설치한다

    • 여러번 사용 가능하다

CMD & ENTRYPOINT

  • CMD 는 컨테이너가 배포될 때 실행할 명령어

    • 가령 WEB 서버 컨테이너를 실행시키고 싶다면, RUN 으로 베이스 이미지에 WEB 서버를 설치하고, 컨테이너가 실행될 때 WEB 서버 데몬이 동작해야 하므로, CMD 를 이용하여 데몬 실행 명령을 전달 한다
  • ENTRYPOINT 역시 컨테이너가 배포될 때 실행할 명령어

    CMD 와 ENTRYPOINT 의 차이점

    ENTRYPOINT top
    CMD -d 10

    • 위의 구성을 통해 컨테이너가 배포된다면 각 컨테이너는 컨테이너의 cpu 정보를 10초마다 한 번씩 갱신하여 보여준다

    docker container run -d .... -d 2 를 통해 CMD 에 해당하는 부분에 명령을 작성하여 CMD 명령을 줄 때, CMD 는 이미지 내에 있는 정보와 docker container run 에서 작성한 정보가 동일한 옵션인 경우, 이미지 내에 있는 옵션은 무시된다

    • ENTRYPOINT 는 무조건 실행되고, CMD 는 docker run 과 겹치는 옵션이면 무시된다
    • ENTRYPOINT & CMD 는 한 번씩만 쓰일 수 있으며, 여러개 쓰이면 마지막 한 줄만 인식된다. 이로 인해, 컨테이너로 실행될 때, 컨테이너가 동작시켜야할 데몬이 많고, 해야할 일이 많다면 shell 파일을 만들어 ADD a.sh /root/a.sh 와 같은 방식으로 이미지에 붙여넣고, CMD or ENTRYPOINT 로 실행시켜야 한다

COPY & ADD

  • COPY : 호스트에 있는 파일 또는 디렉터리를 이미지에 붙여넣기 한다

  • ADD : COPY 의 모든 기능을 포함하며, 추가적으로 Url 을 통해 파일을 붙여 넣기 하는 것이 가능하다

    ADD http://www.test.com/main.jsp /var/www/html/index.html 와 같은 방식이 가능하다

    • 또한, ADD website.tar.gz /var/www/html 와 같이 쓰면 자동으로 압축 해제 되어 붙여 넣기 된다
  • ENV 는 시스템 환경 변수 선언

  • EXPOSE 는 Port open 으로, 마치 방화벽으로 Port 를 여는 것과 같다

  • VOLUME 은 docker containe run -v 와 동일

    VOLUME /var/log 를 하면, 컨테이너의 /var/log 를 Host 에 있는 임의의 볼륨과 연결해 준다

    • 만약, volume 이름을 지정한다면, 다수의 컨테이너를 생성할 때, 동일한 볼륨에 다수의 컨테이너가 연결되어 똑같은 볼륨을 계속 사용하게 된다. 이를 방지하기 위해 볼륨을 지정안하면, 임의의 볼륨들이 생성되어 각 컨테이너에 각각 연결된다

    컨테이너의 여러 디렉터리를 볼륨과 연결하고자 하면?

    VOLUME /var/log /var/www/html /var/lib/mysql 로 작성하면, 각 디렉터리는 Host 의 각 볼륨에 각각 연결되게 한다

  • WORKDIR 은 작업 경로를 지정한다

    WORKDIR /var/www
    /var/www 에서 이루어질 작업 내용
    WORKDIR /var/www/html
    /var/www/html 에서 이루어질 작업 내용

3. Dockerfile 을 이용해 xpressengine 배포

https://velog.io/@lijahong/0%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-Docker-%EA%B3%B5%EB%B6%80-Docker-Image-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0#6-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%83%9D%EC%84%B1-quiz-2---xpressengine

  • 위 실습을 이어서 진행한다

yaml

  • 들여쓰기 중요
  • key: value 로 : 다음에 띄어쓰기 중요
    • value 가 한 개면 바로 왼쪽에 띄어쓰기 후 작성
    • value 가 여러개인 경우
key:
 - value1
 - value2
  • 위와 같은 리스트 형태로 작성

디렉터리 생성

  • 0819 디렉터리 안에 board 디렉터리를 생성하고, 안에 Dockerfile 을 생성하자

Dockerfile 작성

FROM centos:7
RUN yum clean all
RUN yum update -y
RUN yum -y install wget git httpd
RUN wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm 
RUN yum -y localinstall remi-release-7.rpm
RUN yum -y install epel-release yum-utils
RUN yum-config-manager --enable remi-php74
RUN yum -y install php php-fpm php-gd php-mysql php-xml
RUN git clone https://github.com/xpressengine/xe-core.git /var/www/html/xe
WORKDIR /var/www/html/xe
RUN mkdir files
RUN chmod 707 -R files
WORKDIR /var/www/html
RUN chmod -R 707 xe
RUN chown -R apache:apache xe
EXPOSE 80
CMD httpd -D FOREGROUND
  • 위 내용을 붙여 넣자
  • Dockerfile 에 내용을 붙여 넣었다

이미지 build

docker build -t xe:1.0 .

  • 위 코드를 통해 이미지를 build 하자

DB 컨테이너 배포

docker container run -d --name db1 -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=xe --restart=always mysql:5.7

  • 위 코드를 이용해 DB 컨테이너를 배포하자

XE 컨테이너 배포

docker container run -d --name xe1 --link db1:mysql -p 8888:80 xe:1.0

  • xe:1.0 이미지를 이용해 xe1 컨테이너를 생성하자. db1 과 link 시키고, 외부에는 8888 번 Port 를 컨테이너의 80 번 Port 와 매핑시켜야 한다

접속

profile
멋진 엔지니어가 될 때까지

0개의 댓글