반응형

Docker Desktop for Mac 설치

 

1. 다운로드 페이지 접속:

Docker 공식 웹사이트에서 Docker Desktop for Mac 다운로드 페이지로 이동합니다.

https://www.docker.com/products/docker-desktop/

 

Docker Desktop: The #1 Containerization Tool for Developers | Docker

Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.

www.docker.com

 

도커란 

Docker는 컨테이너화를 통해 애플리케이션을 개발, 배포 및 실행할 수 있도록 지원하는 오픈 소스 플랫폼입니다. 이는 개발자가 애플리케이션을 빠르게 배포하고 관리할 수 있도록 도와주며, 여러 환경에서 일관된 동작을 보장합니다. Docker의 주요 특징과 구성 요소를 정리해 드리겠습니다.

 

주요 특징

 

1. 컨테이너화: Docker는 애플리케이션과 그 종속성을 컨테이너 내에 패키징합니다. 이 컨테이너는 어떤 Linux 시스템에서도 실행될 수 있으며, VM(가상 머신)보다 가볍고 빠르게 작동합니다.

2. 이식성: 컨테이너는 모든 종속성과 구성을 포함하므로, 개발 환경에서 테스트, 스테이징, 생산 환경으로 이동하는 과정에서 발생할 수 있는 “It works on my machine” 문제를 해결합니다.

3. 버전 관리 및 재현성: Docker 이미지는 버전이 관리되며, 이미지를 통해 동일한 애플리케이션을 쉽게 재생성하고 롤백할 수 있습니다.

4. 자동화: Dockerfile을 통한 이미지 생성과 Docker Compose를 사용한 여러 컨테이너의 관리는 개발 및 배포 과정을 자동화하고 간소화합니다.

 

주요 구성 요소

1. Docker 이미지: Docker 컨테이너 실행을 위한 템플릿으로, 읽기 전용으로 존재합니다. 이미지는 애플리케이션 실행에 필요한 모든 것을 포함하고 있습니다.

2. Docker 컨테이너: 이미지를 기반으로 생성된 실행 인스턴스입니다. 독립적으로 실행되며, 이미지에서 정의된 소프트웨어, 라이브러리, 코드 등을 포함합니다.

3. Docker Daemon: 호스트에서 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨 등을 관리하는 백그라운드 서비스입니다.

4. Docker 클라이언트: 사용자가 Docker Daemon과 통신할 수 있게 해주는 CLI(Command Line Interface) 도구입니다. docker build, docker push, docker run과 같은 명령을 사용할 수 있습니다.

5. Docker Hub: Docker 이미지를 공유하고 다운로드할 수 있는 Docker의 공식 레지스트리입니다. 공개 또는 사설 이미지 저장소를 제공합니다.

 

 

Docker 사용의 이점

환경 일관성: 모든 의존성과 구성을 포함한 컨테이너는 어느 환경에서나 동일하게 작동하므로, 환경 간 차이에 따른 문제를 크게 줄일 수 있습니다.

보안: 컨테이너는 격리된 환경에서 실행되므로, 한 컨테이너의 변경이나 실패가 다른 컨테이너에 영향을 미치지 않습니다. 이는 애플리케이션 간의 충돌을 방지하고 보안을 강화합니다.

리소스 효율성: 컨테이너는 가상 머신보다 훨씬 적은 오버헤드로 실행됩니다. 각 컨테이너는 공유된 OS 커널을 사용하며, 필요한 리소스만 추가로 소비합니다.

배포 속도: 이미지를 사용한 컨테이너의 배포는 몇 초 내에 완료될 수 있습니다. 이는 특히 대규모 애플리케이션과 서비스를 빠르게 확장하고 업데이트할 때 큰 이점을 제공합니다.

사용

다운 받으면 아래 명령어로 터미널에서 실행되는지 확인 해보자

docker -v

 

Mysql 도커 실행

1. MySQL Docker 이미지 다운로드

 

먼저 Docker가 설치되어 있고, 동작 중인지 확인하세요. 그 후, 터미널 또는 명령 프롬프트에서 다음 명령어를 사용하여 공식 MySQL 이미지를 다운로드합니다.

docker pull mysql

 

2. MySQL 컨테이너 실행하기

 

MySQL 이미지를 다운로드한 후, 다음 명령어를 사용하여 MySQL 컨테이너를 실행할 수 있습니다. 이때 데이터 보존, 환경 변수 설정 등을 위해 몇 가지 중요한 옵션을 추가합니다.

 

docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql

 

3. MySQL 컨테이너에 접속하기

 

컨테이너가 실행되면 다음 명령어를 사용하여 MySQL 콘솔에 접속할 수 있습니다.

docker exec -it some-mysql mysql -uroot -p


4. docker compose 

docker 단순 명령어로 매번 올리기 어려운 경우 파일로 만들어 올리는 방법입니다.

docker-compose.yml 이라는 파일을 만듭니다.

version: '3.8'  # 사용할 Compose 파일 버전

services:
  mysql:
    image: mysql:latest  # 사용할 MySQL 이미지와 태그
    container_name: my-mysql  # 컨테이너 이름
    environment:
      MYSQL_ROOT_PASSWORD: my-secret-pw  # MySQL root 사용자의 비밀번호
      MYSQL_DATABASE: mydb  # 자동으로 생성할 데이터베이스 이름
      MYSQL_USER: user  # 데이터베이스 사용자 이름
      MYSQL_PASSWORD: userpw  # 데이터베이스 사용자 비밀번호
    ports:
      - "3306:3306"  # 호스트와 컨테이너 간 포트 매핑
    volumes:
      - /Users/경로:/var/lib/mysql  # 데이터 지속성을 위한 볼륨
    restart: always  # 컨테이너 자동 재시작 옵션


윈도우 경로 예시 : C:\Users\hello


파일 실행

docker-compose up -d

파일 중지 

docker-compose down
 
반응형
반응형

docker compose 란

 

도커 컴포즈는 컨테이너 여럿을 띄우는 도커 애플리케이션을 정의하고 실행하는 도구(Tool for defining and running multi-container Docker applications) 이다.

컨테이너 실행에 필요한 옵션을 docker-compose.yml이라는 파일에 적어둘 수 있고, 컨테이너 간 의존성도 관리할 수 있어서 좋다.

 

도커와 도커 컴포즈를 비교하면 다음과 같다.

  • Dockerfile vs. Dockerfile-dev: 서버 구성을 문서화한 것(=클래스 선언이 들어 있는 파일)
  • docker build vs. docker-compose build: 도커 이미지 만들기(=클래스 선언을 애플리케이션에 로드)
  • docker run의 옵션들 vs. docker-compose.yml: 이미지에 붙이는 장식들(=인스턴스의 변수들)
  • docker run vs. docker-compose up: 장식 붙은 이미지를 실제로 실행(=인스턴스 생성)

간단히 말해 docker run 으로 실행하면 매번 복잡한 옵션 및 명령어들을 여러개 적어두고 실행해야 하는데, 

docker-compose 는 docker-compose.yml 에 사용하고자 하는 도커이미지 및 옵션 값들을 작성해 놓고 docker-compse up 이라는 명령어로 일관적으로 실행할 수 있다.

하나씩 실행해야 하는 수고로움이 덜어진다.

 

설치

docker-compose version 을 치고 조회가 되면 설치할 필요가 없다.

 

없다면 설치하면 된다.

docker-compose 설치는 매우매우 쉽다. 아래를 따라하면 된다.

출처는 https://docs.docker.com/compose/install/

윈도우는

curl -L https://github.com/docker/compose/releases/download/1.6.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

 

docker-compose 속성

version

version: '2.1'

docker run에서는 없었던 부분입니다. docker-compose.yml 파일의 제일 윗부분에는 파일 규격 버전을 적는다. 파일의 규격에 따라 지원하는 옵션이 달라지며, 최근에 "3.1"이 등장하긴 했지만 보통은 "2"나 "2.1"을 사용해도 충분.

services

services:

이 항목 밑에 실행하려는 서비스들을 정의한다. 서비스란, 앱 컨테이너나 postgres 컨테이너 각각의 묶음이다.

services 하위

서비스의 이름

image

image: postgres:9.6.1

db 서비스에서 사용할 도커 이미지를 적는다.

volumes

volumes: - ./docker/data:/var/lib/postgresql/data

docker run으로 앱 컨테이너를 실행할 때 --volume 옵션을 사용하여 데이터베이스의 데이터를 로컬 컴퓨터에 저장했던 부분과 같다.

다만 docker-compose.yml의 volumes에는 상대 경로를 지정할 수 있다는 점이 다르다.

environment

environment: - POSTGRES_DB=sampledb - POSTGRES_USER=sampleuser - POSTGRES_PASSWORD=samplesecret - POSTGRES_INITDB_ARGS=--encoding=UTF-8

docker run에서 -e 옵션에 적는 내용이다. 마지막의 POSTGRES_INITDB_ARGS 부분이 추가되었는데, 데이터베이스 서버의 인코딩을 설정하기 위함이다.

healthcheck

healthcheck: test: "pg_isready -h localhost -p 5432 -q -U postgres" interval: 3s timeout: 1s retries: 10

postgres 서비스가 제대로 실행될 뿐만 아니라 데이터베이스에 접근할 수 있는지도 파악을 해야 합니다.

healthcheck는 바로 이것을 제어할 수 있습니다. 검사에 사용할 명령(test)을 3초 간격(interval)으로 열 번 시도(retries)하며, 각 시도에서 타임아웃은 1초(timeout)로 지정하였다.

여기서 사용한 pg_isready 명령은 데이터베이스 서버에 접근할 수 있는지를 파악. 

 

service 하위

앱 서비스의 이름으로 지정자 마음대로 지으면 된다.

 

build

build: context: . dockerfile: ./compose/django/Dockerfile-dev

db 서비스와 달리 앱 서비스는 도커 이미지를 빌드할 일이 잦기 때문에, 특정 이미지 대신 build 옵션을 추가한다.

context는 docker build 명령을 실행할 디렉터리 경로라고 보면 된다.

dockerfile은 도커 이미지를 빌드하는 데 사용할 Dockerfile을 지정하면 된다. 

environment

environment: - DJANGO_DEBUG=True - DJANGO_DB_HOST=db - DJANGO_DB_PORT=5432 - DJANGO_DB_NAME=sampledb - DJANGO_DB_USERNAME=sampleuser - DJANGO_DB_PASSWORD=samplesecret

환경 변수는 그냥 docker run을 할 때보다 좀더 자세하게 적었습니다. 각 값은 Django 설정 파일(djangosample/settings.py)에서 사용합니다.

ports

ports: - "8000:8000"

도커 컴포즈로 서비스를 실행하면 기본적으로 가상의 네트워크가 하나 만들어지고, 네트워크 외부의 접근이 막힙니다. (도커 컨테이너가 그렇듯이요.) 따라서 외부에서 접근할 수 있는 포트를 지정해주어야 한다. 여기서는 Django 개발 서버의 기본 포트는 8000을 지정하였습니다.

depends_on

depends_on: db: condition: service_healthy

서비스가 하나 이상일 때, 실행 의존성을 지정할 수 있다. 여기서 지정한 내용은, db 서비스가 실행된 후에 django 서비스를 실행하겠다는 의미. contidion 뒤에는 서비스 시작(service_started)이나 서비스 헬스체크 성공(service_healthy)을 지정할 수 있다.

db 서비스의 healthcheck 부분과 여기서의 service_healthy 부분이 서로 맞물리면, db 서비스에서 데이터베이스 서버 접속이 가능해진 순간 이후에야, django 서비스가 시작한다.

depend_on에서 condition을 지정하는 방식이 도커 컴포즈 파일 규격 3.0과 3.1에서는 제대로 작동하지 않는다고 합니다.

links

links: - db

docker run에서 --link 옵션에서 지정했던 내용입니다. 앱 컨테이너 안에서 db 서비스를 db라는 이름으로 참조할 수 있다.

command

command: /start-dev.sh

docker run으로 앱 컨테이너를 실행할 때 가장 마지막에 적었던 ./manage.py runserver 0:8000을 대신할 셀 스크립트 파일을 하나 만들었습니다. 다음은 start-dev.sh의 내용이다.

#!/bin/sh python manage.py migrate python manage.py runserver 0:8000

volumes

volumes: - ./:/app/

docker run으로 앱 컨테이너를 실행할 때 프로젝트 루트 디렉터리를 컨테이너 안에 연결했던 부분과 같습니다.

 

예시

version: "3.3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
  db: # 서비스 명
    image: mysql:5.7 # 사용할 이미지\
    # restart: always
    container_name: jun-mysql # 컨테이너 이름 설정
    ports:
      - "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    environment: # -e 옵션
      MYSQL_ROOT_PASSWORD: '비번'  # MYSQL 패스워드 설정 옵션
      MYSQL_USER: '계정'
      MYSQL_PASSWORD: '비번'
    volumes:
      - /Users/유저명/폴더명:/var/lib/mysql  
    # command: # 명령어 실행
      # - mysqld --default-authentication-plugin=mysql_native_password
      # - --character-set-server=utf8mb4
      # - --collation-server=utf8mb4_unicode_ci
  mongo:
    image: mongo
    # restart: always
    ports:
      - 9017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: 유저계정
      MONGO_INITDB_ROOT_PASSWORD: 비번  

예시2

version: '2.1'

# 변경 부분!
volumes:
  django_sample_db_dev: {}

services:
  db:
    image: postgres:9.6.1
    volumes:
      # 여기도 변경 부분!
      - django_sample_db_dev:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=sampledb
      - POSTGRES_USER=sampleuser
      - POSTGRES_PASSWORD=samplesecret
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8
    healthcheck:
      test: "pg_isready -h localhost -p 5432 -U postgres"
      interval: 3s
      timeout: 1s
      retries: 10

  django:
    build:
      context: .
      dockerfile: ./compose/django/Dockerfile-dev
    environment:
      - DJANGO_DEBUG=True
      - DJANGO_DB_HOST=db
      - DJANGO_DB_PORT=5432
      - DJANGO_DB_NAME=sampledb
      - DJANGO_DB_USERNAME=sampleuser
      - DJANGO_DB_PASSWORD=samplesecret
      - DJANGO_SECRET_KEY=dev_secret_key
    ports:
      - "8000:8000"
    depends_on:
      db:
        condition: service_healthy
    links:
      - db
    command: /start-dev.sh
    volumes:
      # 마지막으로 여기도!
      - ./manage.py:/app/manage.py
      - ./requirements.txt:/app/requirements.txt
      - ./requirements-dev.txt:/app/requirements-dev.txt
      - ./djangosample:/app/djangosample

docker-compose 실행하기

https://docs.docker.com/compose/wordpress/

에 워드프레스 docker-compose.yml 파일이랑 실행방법 있음

 

yml 파일 설치된 dir 에서 실행

docker-compose up -d ##시작
docker-compose down -d ##내리기

 

 

참고문헌

> http://raccoonyy.github.io/docker-usages-for-dev-environment-setup/ --도커 docs

> docs.microsoft.com/ko-kr/visualstudio/docker/tutorials/use-docker-compose - ms에서 만든 문서 - build 도 나옴

반응형

+ Recent posts