새소식

Docker

Dockerfile

  • -

Dockerfile은 Docker 이미지를 생성하기 위한 텍스트 파일이다.

 

Dockerfile 지시어

지시어 설명
FROM 베이스 이미지 지정
LABEL <key> = <value> 형식으로 메타 데이터를 넣음
COPY 파일을 이미지에 추가
CMD 컨테이너 시작할 때 실행할 명령어
ENTRYPOINT 컨테이너의 어플 지정 ( 컨테이너 시작할 때 실행할 명령어 )
RUN 이미지를 지정하면서 실행할 명령 지정
EXPOSE 컨테이너의 특정 포트를 외부에 오픈하는 설정
ENV 컨테이너의 환경 변수 지정
WORKDIR 컨테이너 작업 디렉토리 지정
ADD 이미지 생성 시 파일 추가
VOLUME 컨테이너의 볼륨 지정
USER 컨테이너의 사용자 지정

 

Dockerfile 생성

vi Dockerfile

'i'나 'a'를 누르면 insert

파일 작성을 완료한 경우 ESC

저장하고 끌때는 :wq
강제 종료는 :q!

 

FROM

베이스 이미지 지정

 

Dockerfile로 이미지 작성

docker build {옵션} Dockerfile경로
옵션 설명
-t  이미지 이름 설정
-f 이미지 빌드 시 default로 Dockerfile 파일명으로 된 파일을 찾아서 이미지 빌드
--pull --pull 옵션은 이미지를 생성할 떄 마다 새로 다운로드
(FROM으로 지정된 이미지는 한번 다운로드받으면 이미지 생성 시마다 새로 다운받지않고 다운로드 받았던 이미지를 사용)
ubuntu@ip-173-32-33-69:~$ docker build -t imagetest ./
Sending build context to Docker daemon  19.97kB
Step 1/1 : FROM alpine
latest: Pulling from library/alpine
213ec9aee27d: Pull complete
Digest: sha256:bc41182d7ef5ffc53a40b044e725193bc10142a1243f395ee852a8d9730fc2ad
Status: Downloaded newer image for alpine:latest
 ---> 9c6f07244728
Successfully built 9c6f07244728
Successfully tagged imagetest:latest
ubuntu@ip-173-32-33-69:~$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
imagetest    latest    9c6f07244728   2 weeks ago   5.54MB
alpine       latest    9c6f07244728   2 weeks ago   5.54MB

 

파일명 변경

이미지 빌드 시 default로 Dockerfile이라는 파일명으로 된 파일을 찾는데

Dockerfile을 Dockerfile2라는 이름으로 바꾼다면 -f 옵션을 사용해야한다.

# 파일명 변경
ubuntu@ip-173-32-33-69:~$ mv Dockerfile Dockerfile2
ubuntu@ip-173-32-33-69:~$ ls
Dockerfile2  docker_test
ubuntu@ip-173-32-33-69:~$ docker build --tag testimage2 -f Dockerfile2 ./
Sending build context to Docker daemon  19.97kB
Step 1/1 : FROM alpine
 ---> 9c6f07244728
Successfully built 9c6f07244728
Successfully tagged testimage2:latest

testimage2가 생김을 확인할 수 있다.

ubuntu@ip-173-32-33-69:~$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
alpine       latest    9c6f07244728   2 weeks ago   5.54MB
imagetest    latest    9c6f07244728   2 weeks ago   5.54MB
testimage2   latest    9c6f07244728   2 weeks ago   5.54MB

 

LABEL

<key> = <value> 형식으로 메타 데이터를 넣음

보통 저자, 버전, 설명 등을 넣음

# Dockerfile
FROM alpine

LABEL maintainer="byeol"
ubuntu@ip-173-32-33-69:~$ docker build --tag test3 ./
Sending build context to Docker daemon  20.99kB
Step 1/2 : FROM alpine
 ---> 9c6f07244728
Step 2/2 : LABEL maintainer="byeol"
 ---> Running in c70db0c8048c
Removing intermediate container c70db0c8048c
 ---> 0aad6e49c0cd
Successfully built 0aad6e49c0cd
Successfully tagged test3:latest

COPY

<복사할 파일 경로>에 이미지에 추가할 파일들을 넣어놓은 상태에서 Dockerfile을 생성

COPY <복사할 파일 경로> <이미지에서 파일이 위치할 경로>
# Dockerfile
FROM httpd:alpine

LABEL maintainer="byeol"

COPY ./docker_test /usr/local/apache2/htdocs
ubuntu@ip-173-32-33-69:~$ docker build -t test ./
Sending build context to Docker daemon  24.58kB
Step 1/3 : FROM httpd:alpine
alpine: Pulling from library/httpd
213ec9aee27d: Pull complete
6e41023d41ed: Pull complete
2ef0dd796574: Pull complete
b6d4bcc26496: Pull complete
e18a2091ef48: Pull complete
e62e6a0ab403: Pull complete
Digest: sha256:d7001e78101e7873db646e913694a89b54ff276eb4d8423eb2668393981a1dcf
Status: Downloaded newer image for httpd:alpine
 ---> 081d5350025f
Step 2/3 : LABEL maintainer="byeol"
 ---> Running in 15e001aba6c7
Removing intermediate container 15e001aba6c7
 ---> ca69677f2596
Step 3/3 : COPY ./docker_test /usr/local/apache2/htdocs
 ---> 71ce9c899770
Successfully built 71ce9c899770
Successfully tagged test:latest

생성한 이미지를 9999포트로 연결하여 실행

ubuntu@ip-173-32-33-69:~$ docker run -d -p 9999:80 test
5c50349cad4a43ee2e484c275bd617006107b007e6b5f3ac14624631f9a3b107

접속 성공

CMD

이미지로부터 컨테이너를 생성하여 최초로 실행할 때 수행

# Dockerfile
FROM httpd:alpine

LABEL maintainer="byeol"

COPY ./docker_test /usr/local/apache2/htdocs

CMD ["/bin/sh", "-c", "httpd-foreground"]

이미지 빌드 및 실행

ubuntu@ip-173-32-33-69:~$ docker build -t test .
ubuntu@ip-173-32-33-69:~$ docker run -d -p 9999:80 test

이미지 확인

ubuntu@ip-173-32-33-69:~$ docker inspect test

+ 커맨드 명령으로 CMD 명령을 덮어씌울 수 도 있다.

# Dockerfile
FROM httpd:alpine

LABEL maintainer="byeol"

COPY ./docker_test /usr/local/apache2/htdocs

CMD ["/bin/sh"]

이미지 빌드

ubuntu@ip-173-32-33-69:~$ docker build -t test ./

CMD 명령 덮어씌우기

ubuntu@ip-173-32-33-69:~$ docker run -dit -p 9999:80 --name httpdweb test /bin/sh -c httpd-foreground
4cf7c35e8bede6562c9e243206583b5df6d2c92e64726cc5a6e88aa8969b8b0c

ENTRYPOINT

docker run 시 함께 넣어지는 CMD 명령어에 덮어씌워지 않고, 반드시 실행해야 하는 명령을 기입할 때 사용된다.

즉, ENTRYPOINT는 항상 실행이 되고, CMD는 docker run 명령어를 실행할 때, 변경이 가능하다.

 

# Dockerfile
FROM httpd:alpine

LABEL maintainer="byeol"

COPY ./docker_test /usr/local/apache2/htdocs

ENTRYPOINT ["/bin/sh"]
# 이미지 빌드
ubuntu@ip-173-32-33-69:~$ docker build -t test2 ./
# -dit 옵션으로 터미널을 붙이고, 백그라운드로 실행, 포트도 붙여봄
ubuntu@ip-173-32-33-69:~$ docker run -dit -p 9999:80 --name httpdweb test
a08bd878498f75b61f66e5a55a2539175a0f64dbfb6d17c73d9dafea7f843991

CMD는 null이고 Entrypoint에 값이 들어가있음을 확인 가능

 

RUN

이미지 생성 시, 일종의 layer를 만들 수 있는 명령이다.

 

ubuntu에 apache를 설치- ubuntu를 베이스 이미지로 다운로드받고, RUN으로 업데이트 하고- apache 2를 설치

# Dockerfile

FROM ubuntu:18.04
LABEL maintainer="byeol"

RUN apt-get update  # 패키지 정보 업데이트
RUN apt-get install -y apache2

COPY ./docker_test /var/www/html/  $ apache2 디폴트 웹서버 설정은 /var/www/html/ 

ENTRYPOINT ["usr/sbin/apache2ctl", "-D", "FOREGROUND"] # 웹서버 구동 명령
docker build -t test ./
docker run -p 9999:80 --name httpdweb --rm test

 

EXPOSE

docker 컨테이너의 특정 포트를 외부에 오픈하는 설정

  • docker run -p 옵션은 컨테이너의 특정 포트를 외부에 오픈하고, 해당 포트를 호스트 PC의 특정 포트와 매칭
    ex) -p 9999:80외부 호스트PC의 9999포트를 내부 컨테이너 80번 포트와 연결
  • EXPOSE는 컨테이너 생성 시, 특정 포트를 외부에 오픈하는 것만 설정하기 때문에 독립적으로 실행할 경우에 EXPOSE만 넣는다고 해서 호스트 PC에서 해당 컨테이너에 포트번호로 접속할 수는 없음
# Dockerfile

FROM ubuntu:18.04
LABEL maintainer="byeol"

RUN apt-get update  
RUN apt-get install -y apache2

EXPOSE 80
COPY ./docker_test /var/www/html/  
ENTRYPOINT ["usr/sbin/apache2ctl", "-D", "FOREGROUND"]
docker build -t mytest ./
docker inspect mytest

EXPOSE 옵션을 사용하면 Config에 ExposedPorts 설정이 추가됨을 확인할 수 있다.

- P 옵션을 사용하면 EXPOSE로 오픈된 포트에 호스트PC의 랜덤포트가 매핑된다.

docker run -P -d mytest
docker ps

 

ENV

컨테이너 내의 환경변수 설정

# Dockerfile
FROM mysql:latest

ENV MYSQL_ROOT_PASSWORD={password}
ENV MYSQL_DATABASE={dbname}

docker 이미지 작성

docker build -t mysqldb -f Dockerfile-mysql ./

docker 컨테이너 생성

docker run -d --name mydb mysqldb

컨테이너에 접속해서 쉘 실행

docker exec -it mydb /bin/bash

이미지에서 설정한 패스워드 입력

bash-4.2$ mysql -u root -p
Enter password:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| {생성한db명}        |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

 

WORKDIR

RUN, CMD, ENTRYPOINT 명령이 실행될 디렉토리 설정

 

WORKDIR로 실행 폴더를 지정한 후에 다른 명령어에서 상대경로로 지정할 수 있다.

# Dockerfile
FROM httpd:alpine

WORKDIR /usr/local/apache2/htdocs

CMD /bin/cat index.html
# 이미지 생성
docker build -t myworkdir -f Dockerfile-workdir ./

# 컨테이너 생성
docker run -d --name test myworkdir

Dockerfile을 보면 index.html을 cat하고 종료된다.

출력 결과를 logs로 확인해볼 수 있다.

docker logs test

 

728x90

'Docker' 카테고리의 다른 글

🐙Docker Compose  (0) 2022.09.06
github로 Docker Image 공유  (0) 2022.09.05
Docker 명령어  (0) 2022.09.01
[🐳Docker] Flask App 띄우기  (0) 2022.07.08
[🐳Docker] image 삭제하기  (0) 2022.07.07
Contents