본문 바로가기
Containers/Docker

이미지 제작

by shinebee* 2020. 7. 20.

1. docker tag

  • 하드링크와 비슷하다.
  • 이미지이름 : hub ID/repo이름:tag
  • official image는 hub ID가 생략되어있음.
  • 이미지를 만들어서 업로드를 할때 도커 허브에 기본으로 올라가는데 반드시 허브 ID가 포함되어있어야한다.
  • tag를 생략할 수 있다 → latest가 붙는다.
  • 태그는 버전을 나타내지만 특징을 나타내기도 한다.
  • ID값으로 이미지가 같은것인지 아닌지 판단할 수 있다.

 

 

2. docker push

  • 이미지를 지정하면 도커허브에 업로드한다. → 도커 이미지 저장소에 로그인 해야한다(docker login)
  • 도커 로그인 할 때 사용했던 아이디 값과 hub ID 부분이 일치해야한다.

 

 

3. commit

  • 실행중인 컨테이너 기반으로 이미지를 만든다.
  • 이미지는 다수의 layer로 이루어져있다.

 

 

4. export / import

  • export
    • 컨테이너의 시스템을 아카피브로 만든다.
    • docker export -o test.tar test
      • 컨테이너의 모든 파일이 test.tar에 들어있다.
  • import
    • 파일 지정 가능. url 지정 가능.
    • docker import test.tar sueb/guro:import
      • inspect로 살펴보면 대부분의 값들이 비어져있다 → 세세한 설정들을 설정 할 수 있다.
      • run 할 때 명령어를 넣어주면 이 이미지로 컨테이너를 실행할 수 있다.

 

 

5. dockerfile

  • centos 기반의 apache 띄우기.
docker run -it --name c1 centos:8 //컨테이너 실행
-> apache 서비스가 없다. 
-> 왜? 필요 없으니까.
-> attach로 들어가서 yum으로 설치는 가능하다.
-> systemctl start, enable을 하면 enable은 되지만 start는 안된다.
-> 왜? systemd가 없어서. enable은 링크만 만들어주면 되니까.
-> systemd가 돌아가고 있어야지 systemctl로 서비스를 실행할 수 있다.
-> multi-user.target => 네트워크만 되는 정도...?

-> /usr/lib/systemd/system/httpd.service -> unit file이 들어있음.
-> /usr/sbin/httpd $OPTIONS -DFOREGROUND & //이렇게 서비스를 시작할 수 있다.
docker commit c1 suebb/guro:commit
docker run --name cw1 -itd suebb/guro:commit
docker inspect cw1 | grep IP
curl IP -> 동작안한다.

docker ps -> cw1의 COMMAND를 보면 /bin/bash
docker top cw1 -> httpd가 없다.
docker exec cw1 /usr/sbin/httpd $OPTION -DFOREGROUND
curl IP -> 동작한다.

docker inspect suebb/guro:commit
-> cmd를 보면 안바뀜. 
-> 바꿀수 있는 방법도 존재하긴한다.

→ commit, export,import의 단점으로 인해 dockerfile을 써야하는 이유를 보여주기 위해 위의 것을 설명함.

 

 

< 지시어 >

  • 지시어들 마다 옵션이 있다.
  • 지시어는 찾아보면 더 있다.

 

  • FROM
    • 베이스가 되는 이미지가 필요하다.
    • 하나만 사용할 수 있다.(FORM, CMD, ENTRYPOINT)
    • ex) FROM centos:latest

 

  • MAINTAINER
    • 이미지를 만든이

 

  • RUN
    • CMD를 실행하기 위해서 필요한 구성요소
    • 표현방법이 두가지 있다.(RUN, CMD, ENTRYPOINT)
      • shell 방식 ( yum -y install httpd )
        • ls나 yum을 사용할 때 절대경로로 사용하지 않아도 되는 이유 → PATH라는 환경변수 때문에
        • 이름만 써도 실행되게 하려면 PATH에 등록되어있는 어떤 위치에 링크파일을 만들어준다.
      • exec 방식 ( ['/usr/bin/yum', '-y', 'install', 'httpd'] )
        • shell 방식이 쉽지만 exec 방식을 권장한다.
        • /usr/bin/yum → 이런 경로 → systemctl status로 찾거나 find로 찾거나 googling 해보면 나옴.
        • $, > 등의 메타문자 → shell의 기능이기 때문에 exec 방식으로 사용할때 사용하면 안된다.

 

  • CMD
    • 데몬을 지정. 서비스를 지정
    • 하나만 지정할 수 있다.
    • exec 형식 권장.
    • ex) CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"] CMD httpd -DFOREGROUND

 

  • ADD
    • 해당 파일을 외부 네트워크를 통해서 받아올 수 있다.(인터넷) → COPY는 안됨.

 

  • LABEL
    • 이미지에 부가적인 별명을 붙임

 

  • EXPOSE
    • 노출할 포트

 

  • ENV
    • 환경변수

 

  • VOLUME
    • 여러개 사용할 수 있다.
    • nfs 공유 스토리지처럼 사용할 수 있다.

 

FROM centos:latest
MAINTAINER suebb
RUN yum -y install httpd
RUN useradd devops
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
#ENTRYPOINT test.sh
#LABEL 
EXPOSE ${PORT}
ENV PORT=80
#ADD
#COPY
VOLUME /var/www/html
VOLUME /etc/httpd/
USER devops
WORKDIR /var/www/html

 

 


 

< 간단한 실습 >

  • hub.docker.com에 가입한다.
    ID : suebb
  • centos:8
  • httpd service
  • port : 80
  • vol : /var/www/html
  • curl IP → Hello Dockerfile 출력

 

1. 작업용 디렉토리 만들기

mkdir ./dockerfile_test

 

 

2. Dockerfile 파일 만들기

FROM centos:latest
MAINTAINER suebb
RUN yum -y install httpd
CMD httpd -D FOREGROUND
EXPOSE 80
VOLUME /var/www/html
VOLUME /etc/httpd/
COPY index.html /var/www/html/
WORKDIR /var/www/html

 

 

3. index.html 파일 편집

vi index.html
	Hello Dockerfile ^___^

 

 

4. build 명령어로 이미지 제작

docker build -t suebb/guro:centweb .
  • Dockerfile이라는 대문자 D로 시작하는 파일이 없으면 옵션을 붙여줘야한다.

 

 

5. 만든 이미지로 컨테이너 생성

docker run -d —name test suebb/guro:centweb

 

 

6. IP 확인 후 curl

docker inspect test | grep IP

curl IP
  • Hello Dockerfile ^___^  출력.

'Containers > Docker' 카테고리의 다른 글

간단한 Docker 실습  (0) 2020.07.20
이미지 다운로드 / 관리 / 삭제  (0) 2020.07.14
Install Docker (Ubuntu)  (0) 2020.07.13
Docker란?  (0) 2020.07.13

댓글