-
Docker docs.1 Dockerfile로 도커 이미지 만들기DevOps/Docker 2020. 4. 22. 22:07
도커는 개발자들과 시스템 관리자들을 위한 플랫폼으로서 컨테이너를 통해 App을 개발하고 배포하고 실행할 수 있는
플랫폼이다. App을 배포할 때 사용하는 리눅스 컨테이너들을 containerization이라고 부르게 되는데 컨테이너들은
App을 좀 더 쉽게 개발하는데 도움을 준다.
몇가지 특징들
Flexible : 복잡한 App들도 containerization 할 수 있으니 유연하고
Lightweight : 호스트 커널을 공유해서 컨테이너 이미지 띄우는데 이전 VM ware 돌리는 것에 비해 가볍기 때문
Interchangeable : 업데이트가 쉬우며
Portable : 로컬에서 만든 것을 클라우드에 배포하든 어디든 잘 돌아가며
Scalable : 컨테이너를 자동으로 배포 숫자를 늘리기 쉬우며
Stackable : 수직적으로 서비스를 쌓아 올릴 수 있다.
컨테이너 : 이미지를 실행한 인스턴스. // runtime instance of image
이미지 : App 을 실행하는데 필요한 모든 것을 패키징 한 것 ( ex : 런타임, 환경 변수, 라이브러리 , 설정 파일 등을 묶어 놓은 이미지 )
docker ps를 사용시 실행 중인 컨테이너들의 목록을 볼 수 있다.
Containers와 Virtual Machines에 차이는 뭘까?
컨테이너는 다른 컨테이너들과 Host OS의 커널을 공유해서 쓰게 된다. 그리고 컨테이너는 제각각의 프로세스에서 띄워
지게 되고 그곳에서 실행하는 메모리 이외는 소비하지 않는다. 이점에서 LightWeight이라고 할 수 있다.
VM은 full blown guest로서 OS를 다시 설치했다는 소리이고 이 각각의 OS위에서 돌아가게 되며 Hypervisor을 통해 호
스트의 resource에 접근가능하다. VM은 보통 App이 필요하는 리소스보다 더 많은 것을 제공하고 이는 곧 호스트의 자
원을 효율적으로 쓰지 못한다는 것을 이야기 한다.
이제 컨테이너에 대해서 다루어 보자.
-Stack // 서비스들 간에 상호작용을 정의 ( 추후 )
-Services // 어떻게 컨테이너들이 프로덕션 환경에서 동작해야 하는지 정의 ( 추후 )
-Container
Dockerfile은 컨테이너 안에 있는 환경들이 어떻게 구성돼야 하는지 정의한다.
따라서 컨테이너 밖인 호스트와는 독립적이기 때문에 바깥세상과 연결을 하려면 포트 매핑이나 호스트에서 컨테이너 쪽
으로 커피 하거나 해야 한다. 하지만 Dockerfile을 정의한 것을 App으로 빌드를 하기만 하면 어디에서 그 이미지를 실행
하던 동일하게 동작할 수 있다!
그러면 Dockerfile을 한번 만들어보자.
게시판 디렉터리에 Dockerfile을 만들고 다음과 같은 코드를 작성 후 저장해보자.
1. FROM을 쓰면 official image를 parent image로 사용한다.
2. working directory를 app으로 세팅한다.
3. 현재 디렉토리에 내용을 app밑에 Copy 한다.
4. npm을 이용해 설치하고 8080 포트를 이 컨테이너 밖에서 연결해서 쓸 수 있도록 Expose 시켜준다.
5. npm start 커맨드를 실행한다.
image가 도커 안에 들어간 것을 알 수 있다.
이제 만든 App을 한번 실행해보자.
-p는 포트 매핑으로 왼쪽이 호스트에 포트 오른쪽이 컨테이너 안에 있는 포트이다.
이미지의 이름을 주면 이 이미지에 대한 컨테이너가 하나 만들어져서 실행이 되게 된다.
- --publishDocker는 호스트의 포트 8000에서 들어오는 트래픽을 컨테이너의 포트 8080으로 전달하도록 요청한다. 컨테이너에는 자체 전용 포트 세트가 있으므로 네트워크에서 포트에 도달하려면 이러한 방식으로 트래픽을 전달해야 한다.
- --detach Docker에게 컨테이너를 백그라운드에서 실행하도록 요청한다.
- --name이 경우 후속 명령에서 컨테이너를 참조할 수 있는 이름을 지정한다. 이 경우는 bb가 된다.
이제 로컬 호스트 8000에 접속하면 Bulletin Board가 뜨게 된다.
--detach 모드기에 콘솔이 떨어지게 되고 이 상태에서 container ls로 컨테이너가 돌고 있다는 것을 확인할 수 있다.
( docker container == docker ps )
이제 docker container stop ID로 멈추어 보자.
로컬에서 만든 이미지를 올려서 아무 곳이나 실행을 해보자
로컬에서 만든 이미지를 레지스트리에 등록하는 방법을 알아보자.
레지스트리는 리포지토리에 컬렉션이며 리포지토리는 이미지의 컬렉션이다.
그리고 Docker hub라는 레지스트리에 우리의 이미지를 공유해보자. 그렇게 함으로써 쉽게 다운로드하고 어느 환경에서나
실행 가능하다.
우리의 첫 도커 허브 리포지토리를 만들고 bulletin board app인 우리의 이미지를 push 해보자.
자 이렇게 해서 이미지를 도커 hub에 공유할 준비는 되었다. 하지만 한 가지 해야 할 일이 있는데
beck33이라는 namespace와,이미지, 그리고 태그(1.0)가 권장되는데
하나의 이미지에 여러 가지 버저닝을 줄 수 있기 때문에 태깅하는 것이 권장된다.
username인 beck33
repository인 bulletin
태그는 1.0으로 만들자.
이 상태에서 이제 push를 해보자.
완료가 되면 docker hub에서 확인이 가능하다.
docker build -t name : 도커 파일 빌드해서 만들 이미지의 이름 주기
docker run -p 4000:80 : forward 모드로 포트 매핑해서 띄우기
docker run -d -p 4000:80 : detached 모드로 background로 띄우기
docker container ls : 현재 동작중인 컨테이너 목록을 보여준다
docker container ls -a : 현재 동작중이지 않는 컨테이너 목록도 보여준다
docker image ls : 이미지 목록 보여준다
dokcer login : 도커 허브에 로그인하기
docker tag <image> username/repository:tag : 로컬에 있는 이미지를 태깅
docker push username/repositroy:tag : 도커 커맨드 라인에 연결돼있는 도커 레지스트리에 푸시
docker run username/repositroy:tag : 이미지를 받아오거나 이미지가 있다면 쓴다.
'DevOps > Docker' 카테고리의 다른 글
Not enough memory to start Docker Desktop (0) 2020.04.22