도커 개발자는 이미지를 무엇이라 '말' 했을까요?
"응용 프로그램의 OS 모든 종속성 설정과 의존성 및 번들링을 모두 완료한 것을 이미지라고 부르겠습니다."
응용 프로그램이 작동하기 위한 OS설정과, 응용 프로그램이 사용하는 라이브러리들의 의존성 관리 그리고
여러 파일을 모아 하나로 만드는 번들링까지 완료한 것을 이미지라 한다.
사실 여기까지 이해가 잘되지 않으니 뒤에 따라오는 말을 좀 더 번역해보겠습니다.
이러한 이미지를 배포할 수 있는 서버에 배포할 수 있으며, 해당 서버에 여러 이미지가 있고 해당 이미지가 다운되면 이미지를 교체할 수 있다. 그렇기에 서버를 꺼내서 서버를 수정할 필요가 없고 새로운 이미지만을 배포하면 된다.
그리고 도커는 3가지 종류에 중점을 두는데, bulid image, ship image, run lmage.
- Build Image : 애플리케이션을 실행하는 데 필요한 모든 것을 일관되게 패키징 합니다.
- Ship Image : 이미지를 클라우드 또는 로컬 개발자의 런타임에 쉽게 제공합니다.
- Run Image : 쉽고 일관되게 애플리케이션 실행
도커에서 이미지는 개별 프로세스들을 설계하는 클래스인가 봅니다. 이러한 이미지를 컨테이너에 배포하면 인스턴스가 생성되어 개별 애플리케이션이 시작되는 구조인 것 같습니다.
이러한 이미지의 장점은 패키지를 쉽게 어디든지 배송할 수 있기에 배포나, 환경설정 등에 관한 문제에 대해서 자유로울 수 있다는 것입니다. 보통 도커에 대한 유튜브 영상을 보면 이러한 설명이 많이 나옵니다. 개발자의 환경과 서버의 환경을 도커를 사용하면 쉽게 배포가 가능하다. 즉 이미지를 전달하여 각 환경을 동일하게 설정한다는 것, 배포가 쉽다는 점이 큰 장점이 아닌가 생각합니다. test, CI/CD까지 커버할 수 있나 봅니다. 또한 이미지에 대한 버전 관리도 할 수 있네요. 이것은 Docker.hub에 이미지를 저장함으로써 해당 이미지를 pull 할 수 있는 것 같습니다. 이 말은 github과 비슷한 기능하는 저장소인 거 같습니다.
그럼 실제로 도커를 시작해보자!.
아! 윈도 7이어서 도커 설치가 되지 않는다. 일단 개발자가 제시하는 도커 파일 형태를 보면서 공부하자.
FROM node:12.16.3
WORKDIR /code
ENV PORT 80
COPY package.json /code/package.json
RUN npm install
COPY . /code
CMD ["node", "src/server.js"]
도커 파일은 도커로 전송되는 명령 목록입니다. 도커 엔진은 상단에서 시작하여 각각을 실행하고 이미지를 만들고 빌드하므로 첫 번째 명령은 from입니다. 도커가 해당 이미지로 시작하라고 명령합니다.
첫 번째 라인은 node이미지로 시작하라는 명령입니다. 뒤의 12.16.3는 태그로서 최신 장기 지원 버전입니다. 이 이미 지지가 해당 버전의 노드를 사용했음을 알려줍니다. 이렇게 빌드한 다음 작업 디렉터리를 만들고 사용하도록 지시합니다.
이때 chroots가 사용되나 봅니다. 다음 ENV에서 환경변수를 지정합니다. 이 환경변수는 모든 프로세스에서 사용할 수 있다고 하는군요. COPY는 package.json파일을 이미지에 복사하고 작업 디렉터리(/code)에도 복사를 합니다.
보통 package.json은 응용 프로그램에서 사용할 플러그인, 모듈을 노드에 알려주죠.
RUN은 실행 후 자동적으로 사용되는 명령어 같습니다. NPM은 노드의 패키지 관리자입니다. package.json을 참고해 의존성 모듈을 다운로드하는 것 같습니다. 그것을 이미지에 넣고 11행에서 모든 것을 복사합니다. 현재 디렉터리에서 모든 것을 가져와 이미지에 복사합니다. CMD는 컨테이너를 시작할 때 실행하는 명령입니다.
정리해본 처음에 노드라는 기본 이미지를 사용하고 작업 디렉터리를 만들고 그 안에 PORT라는 환경변수를 생성하고 모든 애플리케이션 종속성을 복사한 다음 NPM을 설치하여 해당 종속성을 이미지에 설치하고, 모든 소스 코드를 코드 디렉터리에 복사한 다음에 도커가 이미지를 시작할 때 사용할 명령어를 전달해준다.
이미지를 빌드하는 과정인 것 같습니다. 기본 이미지를 활용해 자신의 이미지를 만들고 이 이미지는 서버로 배포되겠죠.
여기까지 이해했습니다.
docker build --tag hello-world .
이미지를 생성하는데 hello-world라고하며, 현재 디렉터리에서 시작하라는 명령입니다. 현재 디렉터리에 도커 파일, 그리고 도커 파일에서 지정한 파일들이 같이 위치해야 하는 것 같습니다.
만들어진 이미지를 확인하는 명령어는 다음과 같습니다.
docker images
현재 내 로컬에 존재하는 이미지를 보여줍니다.
--여기까지 도커 파일과 도커 파일 이미지 생성 방법--
이미지를 실행하고 도커를 실행하자!
도커 실행 명령은 다음과 같고 여러 옵션들이 존재합니다 --help
docker run hello-world
실행하면 설정 포트(80)에서 수신 대기합니다. 이것은 컨테이너를 하나 만든 거 같습니다.
시스템에서 실행 중인 프로세스를 확인하기 위해 docker ps를 사용합니다.
전체적으로 사용되는 프로세스들을 확인하기 위해선 -a 옵션을 사용합니다. 리눅스랑 같군요
이미지를 제거하기 위해서는 rm명령을 사용합니다. docker rm imageName
네트워크 포트 설정은 다음과 같이할 수 있습니다. docker run -p 8080:80 --name hello -d hello-world
로컬 8080 포트에서 컨테이너 내부 포트 80과 연결을 의미합니다. 그럼 로컬 환경에서 해당 컨테이너에 네트워크를 통해 접속할 수 있겠죠?
--name을 통해 이름을 정해주고, -d를 통해 백그라운드 프로세스로 실행합니다. hello-world는 이미지 이름입니다.
name은 컨테이너 이름인 것 같습니다.
중지할 때 다음과 같은 명령을하더군요. docker stop hello
다시 컨테이너를 백업할 땐 다음과 명령어를 사용합니다. docker start hello
이후에 도커 허브에서 push하는 방법과 pull 하는 법, 그리고 docker-compose에 대해서 설명해주는군요.
compose는 도커 파일의 sevices라는 영역에서 서비스와 연관된 이미지들을 합쳐 실행할 수 있네요. 이것은 여러 컨테이너가 연결되어 사용되는 개념인 거 같습니다.
이 기능은 프론트와 백엔드, 데이터베이스 각각 다른 이미지를 사용할 수 있습니다. 유지보수 측면에서 정말 멋지게 사용할 수 있는 것 같습니다.
최종적으로 정리를 해보면
도커는 무엇을 어떻게 해결하는가?
애플리케이션과 모든 리소스를 os파일로 구성하고 패키징 합니다. 실행에 필요한 모든 것을 도커 빌드를 통해 이미지를 생성한 다음 해당 이미지를 여러 곳에서 실행할 수 있고, 또한 인터넷을 통해 해당 이미지를 여러 사람과 공유할 수도 있습니다. Docker Hub를 이용해서 말이지요. 이러한 것은 CI/CD 파이프라인을 통해 배포할 수도 있다는 것을 의미합니다. 또한 여러 컨테이너를 올리기 위해서 로컬에서 작업하는 것이 전부입니다.
'DevOps > Docker' 카테고리의 다른 글
window 10 wsl2 도커 완벽 설치가이드 (0) | 2022.12.25 |
---|---|
Docker 공식 이미지 가져오기 (0) | 2021.02.20 |
Dockerfile부터 push까지 (0) | 2021.02.20 |
Docker 시작 (0) | 2021.02.20 |
Docker(1) (0) | 2021.02.10 |
댓글