도커가 동작하는 것을 한 번 살펴보자. 처음에 도커 허브(Docker hub)에서 우리가 필요한 이미지(Image)를 다운 받아오는 것은 pull, 이미지에서 컨테이너를 생성하는 것은 run이라고 이전 글에서 다루었다. 그렇다면 우리가 이미지를 생성해서 우리만의 이미지를 배포하고 싶을땐 어떻게 해야할까? 우리가 새로운 컨테이너를 만들어 해당 컨테이너에서 환경을 구축하고난 후 commit을 하게되면 그 컨테이너는 이미지가 된다. 그렇게 이미지가 되면 해당 이미지를 기반으로 다시 run으로 새로운 컨테이너들을 생성할 수 있을 것이다. 그렇게 생성한 이미지를 도커 허브에 push하게 되면 세상 모든 사람들이 우리가 만든 이미지를 활용할 수 있을 것이다.
배포하고 싶을때 뿐만 아니라, 현재 작업 중인 컨테이너를 저장하고 싶을 때 Commit을 하기도 한다. 우리가 컨테이너에서 작업을 하고 필요한 파일들을 install 한 후 컨테이너를 종료하게 된다면 지금까지 설치한 파일들이 전부 리셋되게 될 것이다. Commit을 통해 새로운 이미지를 만들어 해당 이미지에 우리가 작업한 파일을 저장할 수 있다.
Commit
우분투$^\mathsf{Ubuntu}$이미지를 다운 받은 후 git을 설치해 새로운 이미지로 commit해보자.
$ docker pull ubuntu:18.04
$ docker run --name my-ubuntu -it ubuntu:18.04 bash
$ docker ps
18.04 버전의 우분투를 설치한 후 컨테이너를 생성해보자. 컨테이너 이름은 my-ubuntu로 지정해주었다. 그리고 컨테이너를 실행과 동시에 터미널에서 명령어를 실행하고자 -it를 입력해주었다.
$ apt update
$ apt install git
apt update를 해주어서 apt라는 것의 최신상태로 갱신해주어야 한다. apt install git을 통해 git을 설치해보자. git을 컨테이너에 설치하게 되면 해당 컨테이너에만 git이 설치가 된 것이기 때문에 새로운 컨테이너를 생성하여 git 을 확인해보아도 설치가 안되어있다(당연한 사실).
우리는 git을 설치한 컨테이너를 활용해서 여러 컨테이너에서 사용하고 싶다고 한다면 해당 컨테이너를 이미지로 만들어 사용할 수 있을 것이다.
$ docker commit [CONTAINER] directory:filename
$ docker commit my-ubuntu testing:git-ubuntu
docker commit을 입력한 후 우리가 이미지로 만들고자 하는 컨테이너 이름을 작성한다. 그 후 디렉토리:파일명 형태로 입력을 하면 해당 디렉토리에 git-ubuntu라는 명으로 이미지가 생성될 것이다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
testing git-ubuntu bc851b972417 About a minute ago 197MB
testing이라는 레파지토리라는 명으로 TAG는 git-ubuntu로 생성된 것을 확인할 수 있다. 그렇다면 testing이라는 이미지에는 ubuntu환경에 git이 생성된 이미지가 된다. 그렇다면 우리가 생성한 이미지에 nodejs와 python이라는 이름의 컨테이너를 생성해보자.
$ doker run --name nodejs -it testing:git-ubuntu bash
$ apt update && apt install nodejs
$ doker run --name python -it testing:git-ubuntu bash
$ apt update && apt install python
각각의 컨테이너는 독립적이기 때문에 nodejs를 설치한 컨테이너에는 python이 없고, python을 설치한 컨테이너에는 nodejs가 없다. 또한 위 방식을 따라 이미지를 생성하게 되면, 설치된 파일이 많을 경우 어떤 파일이 설치되었고, 어떤 파일이 설치되지 않았는지 일일히 확인하는 것은 매우 어렵고 복잡하다. 그렇게 때문에 우리는 Dockerfile이라는 녀석을 통해 보다 쉽게 이미지를 생성할 수 있다. Dockerfile은 여기를 참고하자.
'Docker' 카테고리의 다른 글
[Docker] 볼륨(Volume)과 바인드 마운트(bind mount)란? (0) | 2022.03.03 |
---|---|
[Docker] Docker with python (0) | 2022.03.03 |
[Docker] Host와 File System 연결 (0) | 2022.03.03 |
[Docker] 네트워크 연결하기(httpd) (0) | 2022.03.02 |
[Docker] 왜 도커를 사용할까? + 설치까지 (0) | 2022.03.02 |