Docker 커스텀 이미지 생성
docker 커스텀 이미지는 말그대로 사용자가 만드는 이미지입니다.
보통은 누군가 만들어 놓은것을 쓰기도 합니다.
유용하고 편하게 사용되는 도커에서 커스텀 이미지를 만드는것은 의외로 간단합니다.
목차
도커는 애플리케이션을 개발하고 배포하는 데 필수적인 툴로, 커스텀 이미지를 생성하면 프로젝트에 맞는 환경을 빠르고 효율적으로 설정할 수 있습니다.
개발자들이 특정 라이브러리나 설정을 포함한 이미지를 손쉽게 만들고, 이를 재사용하여 환경을 일관되게 유지하는 방법을 제공합니다.
이는 배포 과정에서 발생할 수 있는 불필요한 문제를 최소화하고, 서비스의 확장성 및 유연성을 높이는 데 중요한 역할을 합니다.
docker 이미지를 만드는 단계는 간단히 아래와 같습니다.
단계 | 설명 | 명령어/파일 예시 |
---|---|---|
1. Dockerfile 작성 | 커스텀 이미지를 만들기 위한 Dockerfile 을 작성합니다. | FROM python:3.10-slim WORKDIR /app COPY . /app RUN pip install -r requirements.txt CMD [“python”, “app.py”] |
2. 이미지 빌드 | Dockerfile 이 있는 디렉토리에서 이미지를 빌드합니다. | docker build -t my-custom-image . |
3. 빌드된 이미지 확인 | 빌드된 이미지를 확인하려면 아래 명령어로 리스트를 확인할 수 있습니다. | docker images |
4. 이미지 실행 | 빌드된 이미지를 컨테이너로 실행합니다. | docker run -d --name my-container my-custom-image |
5. 실행 중인 컨테이너 확인 | 실행 중인 컨테이너를 확인합니다. | docker ps |
6. 컨테이너 접속 | 실행 중인 컨테이너에 접속하여 작업을 확인하거나 수정합니다. | docker exec -it my-container bash |
7. 컨테이너 종료 및 삭제 | 컨테이너를 종료하고 삭제하려면 아래 명령어를 사용합니다. | docker stop my-container docker rm my-container |
8. 이미지 삭제 | 사용하지 않는 이미지를 삭제하려면 아래 명령어를 사용합니다. | docker rmi my-custom-image |
1.Dockerfile 생성
특정 폴더에 Dockerfile을 작성하시고 내용을 넣으시면 됩니다.
이 때 꼭 이름을 Dockerfile로 하지 않아도 되고 aaa.docker, ccc등으로 해도 상관이 없습니다. 왜냐면 이미지 생성 명령어 입력할 때 파일을 지정하기 때문입니다.
dockerfile 내용 예시
FROM python:3.10-slim # 베이스 이미지로 파이썬 3.10-slim을 사용
WORKDIR /app # 작업 디렉토리 설정
COPY . /app # 현재 디렉토리의 파일들을 컨테이너로 복사
RUN pip install --upgrade pip # pip 업그레이드
RUN pip install numpy pandas matplotlib # 필요한 라이브러리 설치
CMD ["python", "app.py"] # 컨테이너 시작 시 실행할 명령
2.실제 이미지 생성
파일 작성이 되었으면 이제 명령어를 내려서 실제 이미지를 생성합니다.중간에 에러가 나서 멈출수도 있으며 실제 이미지 생성까지는 다운로드를 받아서 만들기 때문에 시간이 꽤 걸리기도 합니다.
docker build -t my-custom-image .
기본 값은 폴더내에서 Dockerfile 이름을 찾습니다. 만일 위에서 말한것처럼 이름이 다를 경우는 f옵션을 활용해서 지정해 주면 됩니다. 예를 들어 Dockerfile의 이름이 docdoc일경우
docker build -t my-custom-image -f docdoc .
입니다.
이미지 네임도 -t 옵션으로 바꿔줄 수 있습니다.
3.생성 이미지 확인
생성이 되면 명령어를 입력해서 잘 되엇는지 확인해 봅니다.
docker images
도커 데스크톱의 images에서도 확인을 하실 수 있습니다. 목록에 나와 있습니다.
4.만들어진 도커 이미지 실행
docker run -d –name my-container my-custom-image
이미지를 컨테이너로 실행합니다.
-d : 컨테이너가 백그라운드에서 실행되도록(detached mode)
이 옵션을 넣고 입력을 하면 터미널을 자리하지 않고 작업을 할 수 있습니다.
-name : 컨테이너 이름에 사용자 지정 이름을 지정할때 쓰입니다. 보통 무작위로 생성되지만 네임으로 지정하면 지정한 이름으로 컨테이너가 생성 됩니다.
–rm : 컨테이너가 종료될때 컨테이너가 자동으로 삭제가 됩니다.간단히 임시 컨테이너를 만들고 끝나면 그냥 삭제를 하고 관리할 때 유용합니다.
docker run –rm -d –name my-container my-custom-image
3.로컬 폴더와 실시간 연동
정석적으로는 컨테이너 시스템 안에 소스코드가 있으면 실행이 됩니다. 로컬에서 작성하는건 인식을 못합니다.
그럴때 로컬 폴더와 실시간 연동을 통해서 로컬에 작성을 하면 컨테이너 안으로 자동 복사가 되서 실행이 되게 할 수 있습니다.
바로 -v옵션입니다. 실행시에 -v옵션을 주고 지정을 해줍니다.
예를 들어 d:\testdev가 로컬 작업 폴더라고 치겠습니다.
docker run -d -v /d/testdev:/path/to/container/folder my-custom-image
이제 실시간 동기화가 되어서 (바인드 마운트 bind mount) 로컬 폴더와 도커 컨테이너 내 폴더가 실시간 동기화가 됩니다. 거꾸로도 마찬가지입니다.
4.컨테이너 속으로 접속
docker exec -it my-container bash
뭔가 개발이 이상하거나 잘 안될 때 실제 파일이 있는지 확인을 해보고 싶을때나 라이브러리가 실제 컨테이너 안에 있을 때등의 이유로 인해서 컨테이너 속으로 접속을 해야 할 때 쓰입니다.
-i : 인터랙티브 모드로 전달하고 사용자가 입력할 수 있게 설정
-t : 터미널 할당
통상적으로 -it 옵션을 사용합니다.
보통 컨테이너는 휘발성이기 때문에 이미지가 기준입니다
컨테이너 안에서 추가적인 라이브러리를 설치했엇어도 컨테이너 삭제를 하면 다음에 이미지로 재실행시는 초기화가 되어 있습니다.
이를 방지 할려면 실행시에 –rm 옵션을 빼면 그대로 남아 있습니다.
정리를 하자면
상황 1 : 컨테이너 안에서 git 라이브러리 추가 설치한 상태
컨테이너 실행시 명령어 : docker run –rm -d –name my-container my-custom-image
=> 컨테이너 종료시 git 날라감(컨테이너 자체가 삭제됨)
docker run -d –name my-container my-custom-image
=> 컨테이너 종료후에도 유지
상황 2 : 컨테이너로 새로운 이미지 만들
처음에 오랜 시간 기다려서 이미지를 만들고 컨테이너를 실행했는데 아차 싶어서 빼먹은 라이브러리 (예: ffmpeg)가 있으면 원천적으로 첨부터 다시 이미지를 만들어야 합니다.
그러나 ffmpeg를 설치한 컨테이너를 이미지로 다시 만들면 됩니다
이때 docker commit을 사용합니다.
즉 이 명령어를 이용해서 현재 실행중인 컨테이너 이미지를 새롭게 구성할 수 있습니다
docker commit <컨테이너 이름 또는 ID> <새로운 이미지 이름>:<태그>
docker commit -a “Your Name” -m “Added new library” my-container my-new-image:v1.0
-a옵션은 이미지 작성자를 지정해 줄 수 있으며 -m은 커밋 메시지를 추가할 수 있습니다.
현재 실행되고 있는 컨테이너의 내가 이미지로 만들 것을 찾아서 새로운 이름으로 만듭니다
참고로 컨테이너 이름 아이디 찾을려면 현재 실행중인 컨테이너 목록 찾는 명령어
현재 실행중인 컨테이너 목록
docker ps
중지된 컨테이너까지 포함해서
docker ps -a
알아두면 좋은 명령어 :
docker inspect my-container 상태 확인
docker stop my-container 컨테이너 종료
docker rm my-container 컨테이너 삭제
물론 도커 데스크탑 화면이 있기 때문에 이를 이용해도 되지만 터미널 작업환경을 좋아하는 사람도 많습니다.