1.  프로젝트에 Dockerfile 만들기

vim Dockerfile

 

2. syntax parser directive 작성

# syntax=docker/dockerfile:1

  • Must appear before any other comment
  • Instructs the Docker builder what syntax to use when parsing the Dockerfile
  • Allows older Docker versions with BuildKit enabled to upgrade the parser before starting the build

3. 베이스 이미지 설정하기

FROM node:12.18.1

  •  use the official Node.js image that already has all the tools and packages that we need to run a Node.js application

4. 환경변수 설정해주기

EMV NODE_NODE=production

어떤 역할을 하는지 잘 모르겠다. 알아보자 

 

5. working directory 설정해주기

WORKDIR /app

  • Instructs Docker to use this path as the default location for all subsequent commands
  • Don't have to type full path, and use relateive apath based on the working directory.

6. package.json 과 package-lock.json 옮겨주기

COPY ["package.json", "package-lock.json*", "./"]

  • npm install 하기 전에 패키지들의 의존성 정보를 담은 package.jon 을 옮겨주자

7. RUN 명령어로 컨테이너가 생성될때 사용할 명령어를 작성

 

RUN npm install --production

 

8. 사용할 소스파일 복사해주기

COPY . .

 

9.  컨테이너를 만들고 난뒤에 실행할 명령어

CMD [ "node", "dev", "start"]

'CONTAINER > docker' 카테고리의 다른 글

[docker] 실행해보자  (0) 2021.02.28
[docker] 가슴이 docker docker...  (0) 2021.02.27

2가지 종류 

Community Edition | Enterprise Edition

community Edition 은 공짜이고 Enterprise Edition 은 이미지 관리, 보안 등 여러 서비스들을 유료로 제공해준다.


MAC 도커 설치 2가지 방법

 

1. 도커 툴바를 이용하는 방법

2. 맥 도커 데스크탑을 이용하는 방법(최신)

 

두가지 방법다 Linux kernel 위에 도커를 돌리는 방법으로 작동하지만, 도커 툴바는 오라클 Virtual Box 을 사용하지 않고 Hyper Kit 가상화 기술을 사용한다. 


run 명령어

docker run ngnix

image 로부터 conatiner 를 인스턴스화 시킨다. 만약 image 가 docker host 에 없다면 hub에서 pull 받는다.

 

 

run -tag

docker run [이미지 이름]:4.0

특정한 버전을 받고 싶다면 tag 를 입력해주면된다. 태그를 입력하지 않으면 기본적으로 제일 최신의 버전을 다운받는다. 최신 버전의 정보는 docker hub 에서 조회해볼 수 있다.

 

 

run-STDIN

docker -it [이미지 이름]

input 값을 입력받는 스크립트 파일을 이미지로 만들었을때 컨테이너를 interactive 하게 만드려면 -i (input)과 -t (terminal) 을 넣어 주어야한다. 

 

run - PORT mapping

docker -p 80:8000 [이미지 이름]

웹서버를 컨테이너 안에 담게 되면 컨테이너 포트가 8000이 되기때문에  외부에서 접근하려면 외부포트와 컨테이너 포트를 연결해주어야한다. 외부 포트를 80으로 설정하고 8000번인 컨테이너 포트를 연결하는 명령어.

 

run - Volume mapping

 

MySQL 컨테이너를 운용한다고 했을때 모든 생성,  수정, 삭제 작업은 컨테이너 내에서만 적용된다. 즉, 컨테이너는 고립된 환경이며 컨테이너를 삭제할시 모든데이터도 함께 삭제된다. 만일의 경우를 대비해 로컬에 데이터를 백업하고 싶다면 


ps 명령어

docker ps

현재 인스턴스화 된 모든 컨테이너 리시트를 보여준다. 

docker ps -a

 모든 컨테이너들의 리스트를 보여준다. *프로세스가 끝난 컨테이너들은 모두 여기서 확인할 수 있다. 컨테이너 생명주기는 컨테이너 안의 프로세스와 같다.


inspect

docker inspect [컨테이너 ID]

만약 ps 명령어보다 자세한 명령어를 보고 싶다면 inspect 명령어를 사용하면된다. Json 포멧으로 결과가 출력된다.


logs 명령어

docker logs [컨테이너 ID]

 

해당 컨테이너에대한 로그를 보여주고 싶을때 사용한다.


stop 명령어

docker stop [컨테이너아이디]

인스턴스화된 컨테이너 정지하기

 

rm 명령어

docker rm [컨테이너ID]

컨테이너 삭제


images 명령어

docker images

만들어져 있는 모든 이미지 리스트 보기


rmi 명령어

docker rmi [컨테이너ID]

이미지 삭제, 삭제하기 전에 해당 이미지에 의존하고 있는 컨테이너를 모두 삭제해야한다. 


pull 명령어

docker pull [컨테이너 이름]

 

도커 Hub 에서 바로 pull 받아와서 컨테이너를 사용


exec 명령어

docker exec [컨테이너 ID] cat /etc/hosts

컨테이너 안의 파일을 보고 싶을때 사용한다.


attach & detach 명령어

docker run [컨테이너 ID]

컨테이너를 foreground 에서 실행한다 

docker run -d [컨테이너 ID]

컨테이너를 background에서 실행한다.

docker attach [컨테이너 ID]

컨테이너를 다시 foreground 로 가지고 오고싶을때 사용한다.


 

docker labs 를 통해 브라우져에서 연습할수 있다

kodekloud.com/p/docker-labs

'CONTAINER > docker' 카테고리의 다른 글

도커 파일만들기 nodejs  (0) 2021.05.30
[docker] 가슴이 docker docker...  (0) 2021.02.27

왜 도커가 필요한 것인가?

 

호환성과 의존성문제

1. 만약 여러 기술스택(장고, MySQL, redis 등)을 개발을 진행한다고 가정한다고 했을때 각각의 기술 스택들은 설치되있는 OS의 버전에 대한 호환성과, 의존성 문제를 가진다.

2. 서비스의 기술 스택이 업그레이드 되거나 확장으로 인해 아키텍쳐 구조를 바꿀 상황은 항상 온다. 무엇인가 바뀔때마다 각각의 기술스택의 라이브러리 호환성과 의존성 문제를 체크해주어야 하는데 이런 지옥을 "The Matrix form Hell"이라고 하기도한다. 

3 새로운 개발자가 팀에 들어올때마다 초기세팅을 도와주는것은 정말 번거로운 작업이다. 정확한 버전의 운영체제, 그리고 기술스택을 사용하고 설치하고 있는지 확인하는 작업은 엄청난 고통을 동반한다. dev, test, beta, staging, production 등 여러 환경을 운용하고 있는 조직이라면 운용하고 있는 환경마다 작업을 해주어야한다는 엄청난 부담감이 생길 것이다.

 

이러한 호환성, 의존성 문제때문에 개발에 집중할수 없고 같은 환경을 공유하는데도 많은 이슈들을 겪어야 했다. 이러한 고통들은 도커를 사용한다면 해결이 가능하다. 도커는 각 기술스택들을  분리된 컨테이너에 고립시키고 얽혀있는 호환성과 의존성 문제를 분리 시켜준다. 운영체제가 다르더라도 도커만 설치한다면 대부분의 운영체제 환경에서 호환성, 의존성 문제 없이 어플리케이션을 실행 시킬 수 있다.


컨테이너(Container)란 무엇인가?

컨테이너는 모든 요소들로부터 완전히 독립되고 고립된 환경이다. 각각의 컨테이너는 각자의 process, network, mount를 가지고 있다. 하지만 여기서 중요한점은 OS kernal을 공유한다는 것이다.

 

또한, 컨테이너 개념 도커가 만든것이 아니다! 컨테이너는 이미 10여년 전부터 활용되고 있었고(LX c, LX d 등), 도커는 LX c 컨테이너를 활용하는 tool 이다. 로우-레벨에 위치한 LX c 컨테이너 환경 설정을 보다 쉽게 하기위해 도커는 개발자들에게 쉬운  접근성을 제공해준다. 

 


운영체제(OS: Operating System)

뜬금없이 왠 운영체제? 라고 하겠지만 도커가 어떤 방식으로 운용되는지 알기 위해 기초적인 운영체제 이해가 필요하다. Ubuntu, Fedora, Centos 등 이러한 운영체제는 크게 두가지로 구성되어 있다.

 

1. OS  커널

OS Kernel 은 탑제되어있는 하드웨어와 상호작용을 책임지는 역할을 한다. 

 

2. 소프트웨어 세트

소프트웨어 세트는 User-interface, drivers, compilers, file manager, etc) 이러한 소프트웨어들로 구성되어 있다.

 

OS 커널이 리눅스라고 가정했을때 그 위에 설치된 각기 다른 소프트웨어 세트에 의해서 운영체제의 종류가 결정이된다. 즉, 운영체제들을 Linux kernel을 사용하고 있고 다른점이라곤 그 위에 설치된 소프트웨어 세트일뿐이라는 점이다.

 

그리고, 도커는 Linux kernel을 공유하고 있다!


커널 공유

 

도커가 설치된 ubuntu 운영체제를 사용하고 있다고 가정했을때, Linux kernel을 공유하고 있는 다른 운영체제 환경(Fedora, Centos)에 컨테이너 환경을 배포할 수 있다.

 

중요한 점은 우리가 많이 쓰는  Window는 Linux kernel을 공유하고 있지 않다! (hate window). 이러한 이유 때문에 윈도우 환경에서 설치된 컨테이너는 Linux kernel을 공유하고 있는 OS 위에서 동작하지 않는다. 윈도우에서 도커를 사용하려면 window docker server 가 필요하다.

 

만약 리눅스 환경에서 만들어진 컨테이너를 윈도우에 돌린 경험이 있다면, 그것은 window 가 Linux virtual machine 실행하고 그 위에 리눅스 컨테이너들을 올려 놓은 이유이기 때문이다.

 

 


 

Container VS Virtual Machine

 

Virtual Mahine 은 Hyper-V 위에서 작동하고 각 VM 안에 OS가 설치되어 있다. 이러한 이유때문에 컨테이너보다는 무겁고 용량도 많이 차지하며 자원 소모도 크다는 점이 있다.

 

그렇다고 해서 conatainer 와  vm 중에 무엇을 선택해서 써야한다는 것이 아니다! 각 기술을 다른 목적을 위해 만들어 졌기 때문에 이 두 기술의 특징을 적절이 조합해 사용한다면 분명 응용할 방법이 있을것이다. 공부해보자.

 

virtual Machine - 가상화 기술을 통해  각 운영체제와 커널을 같은 하드웨어위에  운용하는 기술

container - 컨테이너 기술은 어플리케이션을 고립시켜서 어느 환경에서든 쉽게 운용할 수 있게 해주는 기술

 


Images VS Containers

 

Image 는 하나의 템플릿이라고 볼수 있다. 도커파일로 부터 생성되며 컨테이너를 생성하기 위해 사용된다.

Container 는 작동하고 있는 이미지의 인스턴스이다. 각 컨테이너는 독립적인 프로세스 구조와 환경을 가지고 있다.

 

이미 많은 이미지들이 Docker Hub에 존재하고 있기때문에 필요한 이미지를 간단히 Hub으로부터 받아 올수 있다.

도커 파일(Docker File) 도커 이미지를 생성하기 위한 가이드 라인이다.


 

'CONTAINER > docker' 카테고리의 다른 글

도커 파일만들기 nodejs  (0) 2021.05.30
[docker] 실행해보자  (0) 2021.02.28

+ Recent posts