Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 파이썬
- 프로그래머스
- 스프링시큐리티
- 스프링부트
- 재갱신
- 스프링
- 소셜로그인
- docker
- java
- AWS
- yaml-resource-bundle
- 데이터베이스
- oauth2
- springdataredis
- 백준
- 오블완
- springsecurityoauth2client
- Spring
- 리프레시토큰
- 액세스토큰
- 트랜잭션
- springsecurity
- 국제화
- CI/CD
- 토이프로젝트
- JIRA
- githubactions
- 메시지
- 티스토리챌린지
- 도커
Archives
- Today
- Total
땃쥐네
[Docker] 도커 이미지를 빌드하는 기본적인 방법 본문
이전 글까지의 내용을 통해 기본 이미지를 사용하는 것까지 할 수 있게 됐다.
여기서 더 나아가, 개발자 스스로 새로운 도커 이미지를 빌드하는 방법을 다뤄볼 것이다.
여기서는 간단한 예시를 통해 확인해보자.
1. docker commit을 통해 이미지 빌드하기
첫번째 방법은 이미 있는 이미지를 기반으로 컨테이너를 실행하고, 컨테이너의 상태를 변경하여 이를 기반으로 이미지를 만드는 것이다.
1.1 도커 컨네이너 실행
docker run -i -t ubuntu:22.04 /bin/bash
ubuntu 22.04에서 컨테이너를 실행하고, 터미널 입력 모드로 진입한다.
-i
: 대화식 명령-t
: TTY(단말 디바이스) 할당/bin/bash
명령을 호출한다.- 결과적으로 도커 컨테이너를 실행하고, 터미널 입력 모드로 진입하여 입력, 출력을 동시에 확인할 수 있다.
- 컨테이너 자체는 읽기/쓰기가 가능하므로 터미널 내에서 원하는 모든 작업을 수행하여 컨테이너의 상태를 변경할 수 있다.
1.2 Git 설치
apt-get update
apt-get install -y git
Git 툴킷을 설치한다.
apt-get update
: 설치된 패키지들의 새로운 버전이 있는 지 확인한다.apt-get install ~
: ~ 패키지를 다운로드한다.-y
: 무조건 yes
1.3 Git 툴킷 설치 확인
which git
/usr/bin/git
git이 어디에 설치되어 있는 지 확인한다.
1.4 컨테이너에서 나오기
exit
컨테이너에서 나오기 위해서, exit를 호출해 터미널을 종료한다.
1.5 docker diff : 기존 이미지와 변경점 확인
docker ps -al
docker diff bb7b4f4b96d6
컨테이너의 id를 확인한 후, 이미지와 비교해 무엇이 변경됐는 지 확인한다.
1.6 이미지 커밋
docker commit bb7b4f4b96d6 ubuntu_with_git
- 컨테이너를 이미지로 커밋한다.
- ubuntu_with_git 이라는 새로운 이미지 이름을 부여한다.
1.7 이미지 확인
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_with_git latest 118747bb9ae4 6 seconds ago 193MB
ubuntu 22.04 a8780b506fa4 3 weeks ago 77.8MB
- 로컬 저장소에 ubuntu_with_git 이름으로, 방금 만든 도커 이미지가 추가된 것을 확인할 수 있다
1.8 새로 만든 이미지로 컨테이너 실행
docker run -i -t ubuntu_with_git /bin/bash
root@d2e540e347a3:/# which git
## /usr/bin/git 가 출력창에 뜬다.
root@d2e540e347a3:/# exit
- 우리가 만든 새로운 이미지로 컨테이너를 실행해보면, 이전에 git을 추가한 상태가 저장된 것을 확인할 수 있다.
1.9 이미지에 새로운 애플리케이션 이미지 추가
docker run -i -t ubuntu_with_git /bin/bash
root@ca0dd5ef499b:/# apt-get install -y openjdk-17-jdk
...
root@ca0dd5ef499b:/# exit
docker commit 24c7b75b0a0f ubuntu_with_git_and_jdk
이와 같은 방식으로, 기존 이미지의 컨테이너 위에 새로운 애플리케이션을 추가적으로 설치하는 등, 상태를 변경시키고
새로운 이미지로 상태를 저장할 수 있다.
2) Dockerfile을 통해 이미지 빌드하기
2.1 ubuntu 위에 python3를 설치한 이미지를 만드는 Dockerfile
FROM ubuntu:22.04
RUN apt-get update && \
apt-get install -y python3
- 아무 경로에서, 위 내용으로 Dockerfile을 만든다.
- 참고로, 파이썬 인터프리터가 포함된 이미지는 이미 도커 허브에서 제공되고 있다. 실무에서는 python 이미지를 가져와서 사용하면 된다.
2.2 Dockerfile로 이미지 빌드하기
docker build -t ubuntu_with_python3 .
-t
: '이미지명:태그'를 사용하는 경우다. 태그를 지정하지 않으면latest
가 된다..
: 현재 경로의 Dockerfile을 읽어서 이미지를 빌드하겠다는 것이다.
2.3 빌드한 이미지 확인하기
docker images
생성된 이미지를 확인한다.
3) 자주 사용하는 Dockerfile 명령어
FROM
: 새로운 이미지가 추가될 베이스 이미지를 정의한다.- 예)
FROM ubuntu:22.04
- 예)
RUN
: 컨테이너에서 실행할 명령어를 지정한다.- 예)
RUN apt-get update && \
- 예)
COPY/ADD
: 파일이나 디렉터리를 이미지의 파일 시스템으로 복사한다.ENTRYPOINT
: 컨테이너를 생성할 떄 항상 실행할 애플리케이션을 정의한다.- ENV : 환경변수 지정
- VOLUME : 볼륨(이후 다룰 예정)을 이미지 빌드에 미리 설정하는 경우 작성
- WORKDIR : 컨테이너 상에서 작업할 경로 전환
- 그 외 Dockerfile 명령어 : https://docs.docker.com/engine/reference/builder/
4) 도커 애플리케이션 완성하기
여기서는 간단한 hello wolrd 파이썬 파일을 컨테이너에서 실행해보도록 한다.
4.1 hello.py 작성
print('Hello World from Python!')
- 단순히 stdout으로 Hello World를 출력하는 파이썬 애플리케이션을 작성한다.
4.2 Dockerfile 수정
FROM ubuntu:22.04
RUN apt-get update && \
apt-get install -y python3
COPY hello.py .
ENTRYPOINT [ "python3", "hello.py" ]
- COPY : 경로 상의 hello.py를 이미지의 파일 시스템으로 복사한다.
- ENTRYPOINT : 컨테이너 실행 후, python3을 통해
hello.py
를 실행하도록 ENTRYPOINT 명령어를 지정한다.
4.3 이미지 빌드하기
docker build -t hello_world_python .
- Dockerfile을 기반으로 이미지를 빌드한다
4.4 실행
docker run hello_world_python
Hello World from Python!
- 생성한 이미지를 기반으로 컨테이너를 실행한다.
hello.py
의 코드가 실행되는 것을 확인할 수 있다.
5) 환경 변수 정의하기
여기서는 환경변수로 NAME=tttasjwi 으로 정의하고
hello wolrd 파이썬 파일에서 환경변수를 읽어와 실행해보도록 한다.
5.1 hello.py에서 시스템 환경변수를 참조해 사용하도록 수정
import os
print(f'Hello World from {os.environ["NAME"]} !')
- 시스템 환경변수 'NAME'을 불러와서 사용하도록 hello.py의 코드를 변경했다.
- 참고로 f 문자열은 python3에서 제공하는 기능 중 하나로, 문자열 안에 표현식을 {}를 통해 삽입할 수 있다.
5.2 환경변수를 전달하여 컨테이너 실행하는 방법
docker build -t hello_world_python_name .
docker run -e NAME=ttasjwi hello_world_python_name
Hello World from ttasjwi !
- 도커 이미지를 빌드하고, 실행 시점에 -e 옵션을 통해, 환경변수를 정의한다.
-e
,--env
: 컨테이너에 환경 변수를 정의한다.- 실행하면 해당
hello.py
,NAME
환경변수를 참조하여 출력문을 실행한다.
5.3 Dockerfile에 환경변수를 전달하여 이미지를 빌드 후, 컨테이너
FROM ubuntu:22.04
RUN apt-get update && \
apt-get install -y python3
COPY hello.py .
ENV NAME ttasjwi
ENTRYPOINT ["python3", "hello.py"]
docker build -t hello_world_python_name_default .
docker run hello_world_python_name_default
Hello World from ttasjwi !
- Dockerfile 에서 ENV를 통해 환경변수를 지정할 수 있다.
- 이미 컨테이너 이미지 차원에서 환경변수 정보를 가지고 있으므로 더 이상 run 명령어를 통해 환경변수를 전달할 필요가 없어진다.
-e
옵션을 사용하지 않고 컨테이너를 실행하면 아까와 같은 결과를 얻을 수 있다.- 참고로, 도커 파일과 명령어에 모두 환경변수가 지정됐다면, 명령어에 지정된 값이 우선 적용된다.
이상으로 도커 이미지를 사용자가 정의하는 방법을 확인했다.
여기서 몇 번의 응용을 더 거치면 java, node.js로 작성된 코드를 기반으로 웹 서버 이미지 파일을 만들어 배포할 수 있을 것 같다. 화이팅!
'DevOps > Docker' 카테고리의 다른 글
[Docker] 도커 컨테이너 상태 (0) | 2022.12.21 |
---|---|
[Docker] 도커 허브에서 이미지를 가져와 실행하기 (0) | 2022.12.04 |
[Docker] docker run : 도커에서 컨테이너 실행 (0) | 2022.12.04 |
[Docker] 도커 설치 (0) | 2022.12.02 |
[Docker] 도커 소개, 도커의 필요성 (0) | 2022.12.02 |
Comments