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
'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 |