Docker (4)commit, -it
옮
===
강의요약
어떤 컨테이너의 상태를 여러 목적으로 재활용하고 싶을 때 commit을 활용
docker commit 컨테이너의이름 설정될이미지의이름(사용자/이미지이름:태그)
docker commit my-ubuntu egoing/ubuntu:ubuntu-git
->이미지가 만들어져
===
===
도커를 사용하다보면 남의 이미지를 사용해서 나의 컨테이너를 만드는 방법을 아셨다면 나의 이미지도 만들어보고 싶다는 생각이 들지 않나요? commit 명령을 이용하면 내가 사용중인 컨테이너를 이미지로 만들 수 있습니다. 그렇게하면 나의 이미지로 컨테이너들을 만들 수 있고, docker hub와 같은 레지스트리로 push할수도 있습니다.
컨테이너를 기반으로 image를 만드는 commit
===
도커 동작 살펴보기
도커허브에서 필요한 이미지를 다운 받음 : pull
image가 내 컴퓨터에 저장, 이미지가 바로 실행되진 않고 container를 만듦 : run
container는 image가 실행된것, container안에서 파일을 수정한 것과 같은 활동을 하면 수정된 파일은 container안에만 저장이 된다. = image에는 영향을 미치지 않는다
또 run명령을 할 때마다 container가 새로 생성이 되는데 각각의 container는 다른 container와 완벽하게 독립돼 있기 때문에 여러분이 어떤 작업을 하면 그 container안에서만 일어난다는게 도커가 우리에게 제공하는 가장 중요한 혜택
이때쯤 나도 나의 이미지를 만들어서 그 이미지를 배포하고 싶다 어떻게?
내가 수정한 container에 commit명령을 내리면 그 container가 새로운 image가 된다
->이 image를 기반으로 run하면 container가 만들어지고, 여러 컨테이너를 만들어서 각자의 목적에 따라 사용할 수 있다
->그렇게 만든 image를 push해서 docker hub와 같은 registry에 업로드하시면 전세계의 누구나 여러분이 만든 이미지를 다운받을 수 있고 또는 팀원들만 받게 할 수도
===
시나리오 점검
ubuntu가 필요해서 pull로 image를 다운받았다
실행하기 위해 run했다, container가 만들어졌다
그리고 내가 할 프로젝트 모두에는 git이 필요하다 - 이럴거면 공통으로 되게 하는게 좋겠지?
그래서 git을 설치해서 image를 만듦, 그럼 이 image는 ubuntu위에 git이 설치돼 있는 image
또
내가 하고 있는 프로젝트에 따라 어떤 프로젝트는 PHP가 필요하고 어떤건 Python, 어떤건 Nodejs가 필요할수도
그럼 ubuntu+git이 설치돼있는 image로 container 3개를 만들어서 각각 PHP, Python, Nodejs를 설치함 - 이번엔 또 각각
이렇게 활용
git을 공통적으로 갖고 있는 image에 PHP, Python, Nodejs를 각각 깔아서 각각의 개발환경에 맞는 좋은 도구를 장만했다
▽이게 최선이구나? 어떤 컨테이너의 상태를 여러 목적으로 재활용하고 싶을 때 commit을 활용
===
docker pull ubuntu
: 받고
docker images
: 확인
docker run ubuntu
: 컨테이너만드는데
docker run -it --name my-ubuntu ubuntu bash
*run 배울 때 docker run --name 만들컨테이너이름 이미지이름 여기에컨테이너안에서실행하고싶은명령어
: 이름주고, 컨테이너가 실행되자마자 터미널에서 명령을 실행하고 싶다, IMAGE의 이름 뒤에 컨테이너 안에서 실행하고 싶은 명령어를 주는것인데 bash는 명령을 실행하고 싶은것, -it는 지속하기((3)에서는 exec였는데 여긴 run이네)
이러면 컨테이너가 실행이 됐고 내가 컨테이너 안으로 들어간 상태
+ git이 안깔려있어서 ubuntu에서는 소프트웨어를 깔 때 apt update를 해서 apt라는것을 최신상태로 갱신해줘야해
apt update;
apt install git
지금 설치한 git은 컨테이너에만 설치됨
이때 git이 설치된 컨테이너를 여러목적으로 재활용하고 싶다면,
이 컨테이너를 기반으로 파생된 컨테이너를 만들고 싶다면
(다른 창에 가서 하는 중, 저 그림 위 아래 다른 커맨드창이다)
docker ps
: 실행되고 있는 컨테이너 목록을 보고 컨테이너를 새로운 이미지로 만든다
docker commit my-ubuntu egoing:ubuntu-git
: docker commit 컨테이너의이름 설정될이미지의이름(사용자/이미지이름:태그)
: egoing이라는 REPOSITORY에 ubuntu-git이라는 태그의 이미지가 생겼다고 표현
▽좀 간략하게 쓰셨다. egoing/ubuntu-git:1.0 자세하겐 이렇게 될 것
▽이미지가 아니고 컨테이너 이름이니까 그 컨테이너의 상태가 저장이 되겠구나
docker images
egoing이라는 REPOSITORY에 ubuntu-git이라는 TAG의 image가 생겼다
===
docker run -it --name nodejs egoing:ubuntu-git bash
: egoing:ubuntu-git 이미지를 기반으로 nodejs라는 이름의 컨테이너를 만들것
apt update && apt install nodejs
: 물어보는것에서 y누르고
그럼 컨테이너에 nodejs가 잘 설치된 상태
===
단점 : 이 이미지가 도대체 어떻게 만들어졌고, 그 안에 뭐가 있는지 알 수가 없다
체계적으로 이미지를 만들때는 Dockerfile이라는 약속된 이름의 파일을 만들고 그 내용에 씀. 명확하게 보인다.