Container/Docker

[Docker CE] dockerfile 명령어 정리 (4) (USER, LABEL, EXPOSE, VOLUME)

Nirsa 2020. 1. 19. 21:39
반응형

 

1편 (RUN, CMD, ENTRYPOINT) : https://nirsa.tistory.com/66?category=868315

2편 (ONBUILD, STOPSIGNAL, HEALTHCHECK) : https://nirsa.tistory.com/68?category=868315

3편 (COPY, ADD, ENV, ARG, WORKDIR) : https://nirsa.tistory.com/69?category=868315

 

  • 10. USER

USER 명령은 RUN, CMD, ENTRYPOINT와 같은 명령을 실행하기 위한 특정 사용자를 지정해야 하는 상황에서 사용 됩니다. 아래와 같이 유저명:그륩명 또는 UID:GID 와 같이 사용 되고, 그륩명과 GID는 생략이 가능 합니다.

USER <user>[:<group>]
# 또는
USER <UID>[:<GID>]

 

단, 사용 시 주의점이 있는데 USER 명령을 사용하기 위한 사용자 계정이 존재 해야 합니다. (USER 명령은 계정을 생성하는것이 아니라, 특정 사용자 계정을 사용하기 위한 명령 입니다.)

아래와 같이 useradd [사용자명] 을 미리 입력하여 계정을 생성하고, 리눅스의 id 명령어로 확인 하겠습니다.

FROM centos:7

RUN useradd nirsa
RUN id

USER nirsa
RUN id

위의 결과를 보면 Step 3 에서는 root 계정으로 실행 되었고, Step4에서 USER nirsa로 특정 사용자를 지정해준 후 Step 5에서 실행된 RUN 명령은 nirsa 계정으로 실행된것을 알 수 있습니다.

 

  • 11. LABEL

LABEL 명령은 이미지의 버전 정보, 작성자, 코멘트와 같이 이미지 상세 정보를 작성해두기 위한 명령 입니다.

아래와 같이 사용이 가능 하고 docker image inspect --format="{{ .Config.Lables }}" [이미지명] 으로 확인할 수 있습니다.

LABEL title="webserver"
LABEL version="2.0"

 

  • 12. EXPOSE

EXPOSE 명령은 해당 컨테이너가 런타임에 지정된 네트워크 포트에서 수신 대기중 이라는것을 알려줍니다, 일반적으로 dockerfile을 작성하는 사람과 컨테이너를 직접 실행할 사람 사이에서 공개할 포트를 알려주기 위해 문서 유형으로 작성할 때 사용 됩니다.

이 명령 자체가 작성된 포트를 실행하여 listening 상태로 올려주거나 하지는 않기 때문에, 실제로 포트를 열기 위해선 container run 에서 -p 옵션을 사용해야 합니다. 

# EXPOSE 포트번호[/protocol]

EXPOSE 80/tcp
EXPOSE 80/udp

위와 같이 선언이 되지만 프로토콜을 지정하지 않으면 기본값은 TCP 입니다.

 

  • 13. VOLUME

컨테이너 안에 있는 데이터는 컨테이너를 삭제하면 모든 데이터가 같이 삭제(휘발성 데이터) 되기 때문에 데이터를 보존하기 위해 VOLUME을 사용 하고, VOLUME 명령은 설정한 컨테이너의 데이터를 호스트 OS에 저장하거나, 컨테이너들간의 데이터를 공유가 가능합니다. 

# Dockfile
VOLUME ["컨테이너 디렉터리1", "컨테이너 디렉터리2"]

Dockerfile 에서 위와 같이 생성한 볼륨은 호스트OS의 /var/lib/docker/volumes에 생성되며, Docker 에서 자동 생성한 hash값으로 디렉토리가 생깁니다.

 

아래 Dockerfile 을 생성하고 build 후 컨테이너를 실행하여 실제로 호스트OS와 컨테이너가 해당 디렉토리를 공유중인지 확인 하겠습니다. (컨테이너의 /data 디렉토리엔 아무런 파일도 없어서 touch volume_test 로 파일을 하나 생성해 주었습니다)

FROM centos:7
VOLUME ["/var/log/", "/data/"]

호스트OS에 Docker에서 생성한 hash값이 정상적으로 보입니다. 이 Hash값은 docker container inspect --format="{{ .Mounts }}" [컨테이너명] 에서 확인할 수 있습니다.

 

아래 이미지를 보면 호스트OS 경로 /var/lib/docker/volumes/09afae~~~ 에 /data 가 마운트 되었고, /var/lib/docker/volumes/add64501~~~ 에 /var/log가 마운트 되었다고 출력 됩니다. 

/data가 마운트 되었다는 디렉토리로 이동하여 확인하면 아까 생성한 /data/volume_test 파일이 정상적으로 보입니다.

 

해당 컨테이너를 삭제해도 아래와 같이 데이터가 보존되어 있는걸 확인할 수 있습니다.

 

container run을 이용하여 호스트 OS의 경로를 변경할 수 있습니다.

# docker run -it -v [호스트OS 경로]:[컨테이너 경로] [이미지명] /bin/bash
docker run -it -v /root/docker/log/:/var/log/ centos /bin/bash
반응형