본문 바로가기

MAC(Intel, M1) WINDOW

[Docker]Docker란? M1 Docker 설치

728x90

드디어 M1 도커가 나왔네요! 

물론 좀 된 것 같은데... 제가 쓰려고 했을 때는 프리뷰 버전이라 설치했다가 그냥 안쓰고.. 방치했더니

며칠전에 만료되었다고? 떠서 찾아보니까 이제 완성버전이 나왔다고..? 하더라고요

 

이번에 프로그램 하나 신청해둔걸 하니까 Docker가 필수라서 .. 다시 시작  

그리고 친절하게도 강의도 해주셨어서 정리할 겸 작성하는 글 

 

 

 

Docker란?

가상머신 처럼 독립된 실행환경을 만들어주는 응용프로그램

운영체제는 실제로 host컴퓨터에 설치되지 않기 때문에 메모리 점유율에서도 성능면에서 이점이 있음

Virtual Machine보다 훨씬 가벼움! (매번 운영체제를 만들어야 함)

 

" 서버를 옮겨가거나, 서버를 여럿 추가하거나 " 하는 경우 그 서버에서도 이전 서버와 똑같은 설정을 다시 해주어야함 

이를 해결할 수 있음!

어느 운영체제, 어떤 환경에서든 도커만 깔려있으면(세팅만 한번 해두면) 똑같은 실행환경을 구축할 수 있음!

 

이미지

각 요소들이 설치된 모습을 "이미지"라는 형태로 박제함 

이는, 각 제품에서 공식으로 제공할수도 사용자가 직접 설정할 수 있다.

이런 이미지들은 DockerHub에 저장되어 공유, 다운로드 받을 수 있다 

이미지로 저장된 항목들이 함께 연결되어 동작하도록 설정된 상태를 명령어나 문서로 저장가능

 

이것을 바로 설치하지 않고, 각각을 컨테이너로 불리는 독립된 가상공간에 보관해 보관

서로 다른 버전의 자바를 사용하는 서비스도, 각각 다른 가상공간을 사용하여 문제없이 작동가능함 

(컨테이너 조립 키트/틀 이라고 생각하면 쉽다)

 

 

명령어 

docker run -it node

run 명령어 : ( 이미지가 없으면, 다운받은 다음 )내 컴퓨터내에서 컨테이너를 만들어냄 

-it : 생성된 컨테이너를 열어서 CLI를 사용함 -> 명령을 줄 수 있음 

-d {이미지 명} : deamon 안보이는 곳에 가서 컨테이너를 돌리라는 의미(터미널 사용이 가능해진다)

node : node가 실행되도록 함 

 

 

docker images

다운받아진 이미지들의 리스트를 확인해 볼 수 있음 

 

컨테이너(Container)

이런 이미지들을 host컴퓨터에 바로 설치하지 않고, 각각을 컨테이너로 불리는 독립된 가상공간에 보관해 보관

서로 다른 버전의 자바를 사용하는 서비스도, 각각 다른 가상공간을 사용하여 문제없이 작동가능함 

 

따라서, 변경(업그레이드 등)이 필요할 경우 지우거나 새로 깔 필요없이 컨테이너를 통째로 교체해서 사용하면됨 

 

명령어

docker ps

진행중인 컨테이너의 상태를 알 수 있음 

-a : 중지되어있는 작업중이 아닌 컨테이너도 확인 가능 

 

docker exec -it {container name} bash

해당 컨테이너 내부 가상의 리눅스 환경으로 접속

: 컨테이너마다 각각 파일 시스템과 네트워크가 존재함을 알 수 있음 

 

 

 

Dockerfile
docker run -it node

이 명령어를 이용해 node와 CLI로 통신하면서, 명령을 내릴 수 있지만,

이로는 섬세한 사용이 어렵다. -> 이를 위해 dockerfile이 존재한다. 

 

나만의 이미지를 만들기 위한 설계도

위에서 내려받은 node이미지만으로는 내가 원하는 프로그램을 동작시키기에 부족하다.

따라서, 추가적으로 http-server등의 모듈들을 추가적으로 설치해서 사용해야함.

 

그냥 노드 이미지만을 가지고 있으면, 컨테이너를 실행할 때 마다 추가적 설치가 필요함.

http-server를 미리 설치해둔 노드이미지가 있다면 훨씬 편리! 

다운받아둔 이미지를 개조/튜닝하여 사용 : dockerfile

(즉, Dockerfile은 각각의 이미지 마다 존재하므로 주로 databse, backend, frontend의 Dockerfile이 각각 존재함)

 

 

예시) 얄팍한 코딩사전 - 가장 쉽게 배우는 도커 (frontend dockerfile) 

FROM node:12.18.4

# 이미지 생성 과정에서 실행할 명령어
RUN npm install -g http-server 

# 이미지 내에서 명령어를 실행할(현 위치로 잡을) 디렉토리 설정
WORKDIR /home/node/app

# 컨테이너 실행시 실행할 명령어
CMD ["http-server", "-p", "8080", "./public"]

# 이미지 생성 명령어 (현 파일과 같은 디렉토리에서)
# docker build -t {이미지명} .

# 컨테이너 생성 & 실행 명령어
# docker run --name {컨테이너명} -v $(pwd):/home/node/app -p 8080:8080 {이미지명}

RUN : 이미지 생성과정에서 실행되는 명령어로, http-server가 깔린 이미지로 컨테이너가 생성된다.

CMD : 컨테이너 실행(서버가 깨어나자마자)시 실행될 명령어로, 이미지 내 명령어를 실행할 지정된 디렉토리 내에서 실행되며,

서버가 깨어나면 차례대로 실행된다. 

 

이미지 생성(build)

terminal에서 frontend폴더내로 이동 한 후 이미지를 생성하면, 자동으로 CMD에 적힌 명령어가 실행된다. 

docker build -t {이미지명} {dockerfile상대경로}

컨테이너 실행(run)

docker run --name {컨테이너이름} -v {내컴퓨터의 폴더(경로)}:{컨테이너의 폴더(경로)} -p {내 컴퓨터 포트번호}:{컨테이너에서 연결할 포트번호} {컨테이너로 실행할 이미지명}

-v : volume -> 내 컴퓨터와 컨테이너와 특정 폴더를 공유함  / 공유할 폴더 경로를 {내컴퓨터}:{컨테이너} 로 연결해주면 됨

CMD처럼 컨테이너가 생성되어 실행될 떄, 내부 폴더를 외부와 연결하는 것

-v ${pwd}:{/home/node/app}

내 컴퓨터의 현재경로와 컨테이너상의 /home/node/app과 공유하겠다.

-p : 실행시 어느 포트로 송출할 것인지 {내 컴퓨터에서 송출할 포트}:{컨테이너에서 송출할 포트}

내선번호는 공유할 수 없으므로, 다른 컨테이너를 연결할 때는 다음과 같이 나누어야함.

 

COPY

COPY {복사할 파일경로 or 폴더경로} {복사해둘 위치}

RUN명령어 처럼 이미지를 생성하는 과정에서 미리 해당 이미지 안에 특정 파일을 넣어둠 

주로, 데이터베이스에서 미리 테이블을 만들어 놔야할 때, 테이블을 작성하는 sql파일들은 이미지 생성시 미리 되어있어야 하므로, 주로 사용됨 

 

그외 주요 명령어

https://www.yalco.kr/36_docker/

 

가장 쉽게 배우는 도커

어려운 프로그래밍 개념들을 쉽게 설명해주는 유튜브 채널 '얄팍한 코딩사전'. 영상에서 다 알려주지 못한 정보들이나 자주 묻는 질문들의 답변들, 예제 코드들을 얄코에서 확인하세요!

www.yalco.kr

 

 

 

이렇게 각각 Dockerfile이 존재하면, 이를 각각 실행시키는 것이 번거로움

또한, 네트워크가 분리되어 있어서 backend와 db가 연결되어 있지 않음 

 

 

docker-compose 

'거시적'설계도 , 모든 dockerfile들을 간편하게 연결하여 실행해줌 

run명령어를 실행시 마다 주어야 했던 옵션을 미리 줄 수 있음 

version: '3' #docker버전에 맞는 docker-compose 버전 사용 
services: #각각의 이미지(dockerfile들이 세부항목으로 들어감)
  database: #서비스 이름인 동시에 네트워크에서 각각의 호스트명
    # Dockerfile이 있는 위치
    build: ./database
    # 내부에서 개방할 포트 : 외부에서 접근할 포트
    ports:
      - "3306:3306"
  backend:
    build: ./backend
    # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
    volumes:
      - ./backend:/usr/src/app
    ports:
      - "5000:5000"
    # 환경변수 설정
    environment: 
      - DBHOST=database 
      #backend에서 DBHOST라는 환경 변수 사용 
      #컨테이너들간의 네트워크에서 db접속시 host명=서비스이름(database)을 사용해 데이터베이스 컨테이너내 Mysql에 접속 
  frontend:
    build: ./frontend
    # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
    volumes:
      - ./frontend:/home/node/app
    ports:
      - "8080:8080"

docker-compose.yml이 있는 위치에서

docker-compose up

이미지를 빌드하고, 컨테이너를 실행함 

 

 

 

 

Virtual Machine VS Docker

 

Virtual Machine보다 훨씬 Docker가 가벼움! 

출처 : medium.com

 

Virtual Machine 

한 물리적 컴퓨터 안에 각각의 OS를 가동하는 가상 컴퓨터들이 물리적 자원을 분할해서사용 -> 성능한계

(매번 운영체제를 만들어야 함)

 

Docker

OS위에 도커엔진을 두어 OS까지 내려가지 않고, 실행환경만 독립적으로 돌림

 

 

 

<정리>

어느환경에서든 도커만 설치되어 있으면, git등을 이용해 이 프로젝트를 다운받고 

도커로 실행하면, 개발환경과 동일한 환경에서 알아서 프로젝트가 실행됨 

프로젝트에서 사용된 Node.js, python (version에맞춰), MySQL 그 외 추가 라이브러리를 일일이 설치하고 설정할 필요가 없음

 

 

 

Docker for silicon mac 다운로드

 

 

여기서 설치 하실 수 있습니다. 

https://docs.docker.com/docker-for-mac/apple-silicon/

 

Docker Desktop for Apple silicon

 

docs.docker.com

 

 

다운로드 버튼 눌러서 설치하시고 

 

드래그 해서 드롭해주시면 끝

 

 

 

 

설치는 정말 별거없군!

 

참고자료

 

aws + Docker 배포 

https://aws.amazon.com/ko/docker/

 

Docker란 무엇입니까? | AWS

Q: Docker로 어떤 작업을 할 수 있습니까? Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다. 이는 Doc

aws.amazon.com

 

도커가 뭐고 왜 쓰는 건가요?

https://youtu.be/tPjpcsgxgWc

 

728x90

'MAC(Intel, M1) WINDOW' 카테고리의 다른 글

[Clion]프로젝트명 한글 오류  (0) 2021.08.28
[git] GitHub + GitKraken 작업환경  (0) 2021.08.26
Google drive 와 github연동하기  (0) 2021.06.09
[git] Git + Terminal 연동  (0) 2021.03.28
[MAC] VSCode git과 연동하기  (0) 2020.07.08