이미지 커밋 방법으로
이미지를 만드는 방법은 무엇일까?
이미지를 만드는 방법
--
이미지를 만드는 방법에는 크게 2가지가 존재한다.
- 커밋 (commit) : 실행 중인 컨테이너의 상태를 그대로 이미지를 저장한다.
- 빌드 (build) : Dockerfile을 통해서 이미지를 저장한다.
일반적으로 build 방식을 사용하지만
build 방식 또한 commit 방식을 기반으로 동작하기 때문에
commit 방식을 알아 두는 것이 좋다.
--
commit 방식을 통해 이미지 저장하는 과정
--
- 공식 Nginx 이미지를 컨테이너로 실행
(공식 Nginx 이미지에는 Nginx가 설치되어 있고 기본으로 제공하는 index.html 파일도 존재)
(컨테이너로 실행하면 컨테이너 레이어가 생김) - 컨테이너 실행 후 index.html 파일의 내용을 "hello-my-nginx"라는 텍스트만 출하는 index.html로 수정
- 현재 컨테이너를 Commit을 통해 이미지로 만든다. (해당 이미지는 "commitNginx"라는 이름으로 지었다.)
- 새로 만든 "commitNginx"이미지는 "hello-my-nginx"라는 텍스트를 출력하는 index.html파일을 가진 이미지가 된다.
Nginx이미지에서 기본으로 제공하는 index.html파일의 출력 화면
기존 index.html파일의 내용을 "hello-my-nginx"로 출력하도록 수정 후 출력 화면
새로 만든 "commitNginx" 이미지를 가지고 컨테이너로 실행하면
이제 "hello-my-nginx"라는 텍스트가 나오는 index.html을 출력하게 된다.
--
commit 방식을 통해 이미지를 만드는 방법 (명령어)
--
보기 편하게 터미널을 두 개 열어서 결과를 확인하는 방법으로 해보자.
1. [ 왼쪽 터미널 ] nginx 이미지를 "officialNginx"라는 이름의 컨테이너로 실행시키는 명령어 (생성 및 실행)
docker run -it --name officalNginx nginx bin/bash
명령어 설명
-it | -i 옵션과 -t 옵션을 결합한 옵션이다. |
-i | interactive의 약어로 컨테이너의 표준 입력(stdin)을 활성화 해주는 옵션이다. 즉, 해당 컨테이너가 실행되는 동안에 사용자가 입력을 할 수 있도록 설정해준다. (기본적으로 컨테이너는 백그라운드에서 실행되며, 입력 받을 수 있는 인터페이스가 없다.) (그래서 사용자가 컨테이너와 직접 상호작용을 할 수가 없다.) |
-t | TTY(TeleTYpewriter)의 약어로 TTY를 할당하여 터미널을 에뮬레이션할 수 있도록 해주는 옵션이다. 즉, 컨테이너 내부에서 터미널 인터페이스를 제공하도록 하는 옵션인 것이다. (이 때 제공하는 터미널 인터페이스는 물리적인 터미널은 아니고 터미널처럼 동작하는 인터페이스다.) (터미널 인터페이스는 사용자가 명령어를 입력하고 출력을 볼 수 있는 환경이다.) |
bin/bash | bash shell로 접속하는 명령어다. (Cmd의 내용을 해당 명령어로 덮어씌워져서 컨테이너가 실행 시 바로 bash shell로 이동하게 된다.) 즉, 현재 해당 명령어를 입력한 터미널처럼 컨테이너의 내부에서 컨테이너에게 명령어를 입력할 수 있는 컨테이너용 터미널을 여는 것이다. (컨테이너의 터미널) |
-i 옵션과 -t 옵션을 함께 사용하는 이유는
사용자가 컨테이너 내부에서 명령어를 입력하고 실행할 수 있는 완전한 인터랙티브 터미널 세션을 제공해 준다.
해당 두 옵션은 일반적으로 같이 사용하며, 사용자에게 친숙한 터미널 환경을 제공해 준다.
2. [ 왼쪽 터미널 ] 컨테이너의 내부 터미널에서 현재 파일 리스트를 조회하는 명령어를 작성하는 명령어
ls -al
옵션 설명
-al | -a 옵션과 -l 옵션을 결합한 옵션이다. |
-a | all의 악어로 모든 파일과 디렉토리를 가리키는 옵션이다. |
-l | long listing format의 약어로 파일과 디렉토리의 상세 정보를 표함한 긴 형식의 목록을 출력하는 옵션이다. (해당 정보에는 권한, 소유자, 그룹, 파일 크기, 수정 시간 등이 포함되어 있다.) |
현재 명령어를 입력한 위치가 컨테이너 내부이기 때문에
로컬 저장소(내 컴퓨터)의 파일 리스트가 아닌 실행 중인 Nginx 컨테이너 내부의 파일 리스트가 출력된 것을 확인할 수 있다.
3. [ 오른쪽 터미널 ] 실행 중인 컨테이너 리스트를 조회하는 명령어
docker ps
"officialNginx" 컨테이너가 정상적으로 실행 중인 것을 확인할 수 있다.
그리고 컨테이너 ID를 보면 위에서 해당 컨테이너의 터미널에 접속했을 때 나온 ID와 동일한 것을 확인할 수 있다.
즉, [ 왼쪽 터미널 ]에서 입력한 명령어가 실행 중인 컨테이너 안에서 명령어를 입력했다는 것을 알 수 있다.
4. [ 왼쪽 터미널 ] officialNginx 컨테이너 내부에서 파일의 내용을 변경하는 명령어 (리눅스 shell 명령어)
echo hello-my-nginx > /usr/share/nginx/html/index.html
명령어 설명
echo | 뒤에 작성한 문자열을 출력하는 명령어다. 즉, "hello-my-nginx"라는 문자열을 출력하는 명령어가 된다. |
> | 리다이렉션 연산자로 파일을 생성하거나 기존 파일의 내용을 덮어씌우는 연산자이다. 형식 ( {덮어씌울 내용} > {대상이 될 파일} ) 즉, 대상이 될 파일이 존재하지 않으면 해당 파일을 생성하여 덮어씌울 내용을 내부에 작성해주고 파일이 존재한다면 기존 내용에 덮어씌울 내용을 덮어씌운다. |
즉, 해당 명령어는 /usr/share/nginx/html/에 위치하는 index.html 파일 내용을 "hello-my-nginx" 문자열로 덮어씌운다는 의미이다.
index.html 파일 내용이 잘 변경되었는지 확인하는 명령어 (리눅스 shell 명령어)
cat /usr/share/nginx/html/index.html
명령어 설명
cat | Unix 및 Linux 시스템에서 파일의 내용을 출력하거나, 여러 파일을 연결하여 출력하는 데 사용하는 명령어다. |
5. [ 오른쪽 터미널 ] 파일 내용이 변경된 "officialNginx" 컨테이너를 commit을 통해 새로운 이미지로 만드는 명령어
commit 명령어 형식
docker commit [옵션] {컨테이너명} [이미지명]
docker commit -m "edited index.html by devwiki" -c 'CMD ["nginx", "-g", "daemon off;"]' officialNginx anijy/commitnginx
명령어 설명
docker commit | 실행 중인 컨테이너를 새로운 이미지로 커밋하는 명령어다. |
-m | message의 약어로 커밋 메시지를 지정하는 옵션이다. 해당 메시지는 이미지의 변경 사항에 대한 설명을 작성하는 것으로 이미지 히스토리에 기록된다. (GitHub의 커밋 메시지라고 생각하면 된다.) |
-c | change의 약어로 커밋된 이미지에 존재하는 Dockerfile 파일 내부에 명령어를 추가할 때 사용하는 옵션이다. 즉, 'CMD ["nginx", "-g", "daemon off;"]' 명령어를 Dockerfile 파일 내부에 추가해준다. (위 명령어는 Cmd 명령어를 지정해주는 명령어가 된다.) |
CMD | Dockerfile에서 해당 컨테이너가 시작될 때 기본으로 실행되는 명령어를 설정하는 명령어다. |
이렇게 생성된 이미지는 로컬 저장소(내 컴퓨터)에 저장된다.
commit 명령어를 작성 시 이미지명을 생략하면 생성될 이미지명은 임의의 랜덤 이름으로 지어진다.
6. [ 오른쪽 터미널 ] 이미지가 정상적으로 생성되었는지 확인하는 명령어
docker image ls anijy/commitnginx
7. [ 오른쪽 터미널 ] 해당 이미지의 히스토리 확인하는 명령어
docker image history anijy/commitnginx
8. [ 오른쪽 터미널 ] 새로 생성한 이미지를 컨테이너로 실행하는 명령어
docker run -d -p 80:80 --name my-nginx anijy/commitnginx
--
참고 및 출처
'Docker' 카테고리의 다른 글
빌드 컨텍스트 (Build Context)란? (0) | 2024.06.20 |
---|---|
이미지를 만드는(저장) 방법 [ image build ] (+명령어) (+IaC) (+Dockerfile 작성법) (0) | 2024.06.19 |
이미지의 레이어 (Layer) (feat. 컨테이너의 레이어) (0) | 2024.06.17 |
Docker Hub에 이미지 다운로드 및 업로드 명령어 (+ Docker Hub 사용법) (0) | 2024.06.16 |
이미지 레지스트리 (feat. Docker Hub) (0) | 2024.06.15 |