Docker란?

이재익·2019년 12월 16일
3
post-custom-banner

1. Docker 란?

Docker는 2013년 3월에 처음으로 세상에 알려졌다.
컨테이너 기반의 오픈소스 가상화 플랫폼 이라고 한다.

  • 컨테이너란?
    컨테이너란 프로세스를 격리시켜 동작하는 기술이지만 기존 사용하던 VMwareVirtualBox와는 다르다.
    두 가지의 가상 머신은 성능 저하가 발생하여 운영 환경에선 사용하기 어렵다.
    이를 해결하기 위하여 프로세스를 격리하는 방식이 등장했다.
    즉 하나의 컴퓨터에 다수의 컨테이너를 실행하면 각각의 독립된 환경으로 가상 머신을 사용하는 것 같은 느낌을 받을 수 있다.

  • 이미지란?
    이미지는 컨테이너의 필요한 파일과 설정 값등을 저장한 것이다.
    같은 이미지에서 여러개의 컨테이너를 생성할 수도 있다.
    그리고 컨테이너의 상태가 바뀌거나 혹은 컨테이너가 삭제된다 하더라도 이미지는 변하지 않고 상태를 유지한다.
    이미지컨테이너를 실행하기 위한 모든 정보들을 가지고 있기 때문에 서버를 추가하는 작업을 해도
    이미지를 다운 받아 컨테이너를 생성 및 실행만 하면 완료된다.

  • Docker hub
    도커이미지용량은 엄청 거대하며 메가에서 시작하여 기가단위로 넘어가는 경우도 있다고한다.
    이런 큰 용량의 이미지Docker hub를 통해 공개 이미지를 무료로 관리해준다.

2. Docker 설치

현재 윈도우에서 도커를 사용했기 때문에 Docker for windows를 설치하여 사용하였다.
설치가 완료되면

docker version

을 입력하게 되면 버전에 대한 정보가 출력된다.(client와 server 모두 정삭적으로 출력이 되야한다.)
도커클라이언트서버가 나뉘어져 있는 이유는 도커 클라이언트에서 도커 커맨드를 입력하면
도커 서버로 명령을 전송하여 결과를 받아 터미널에 출력한다.

3. Docker 컨테이너 명령

  • 컨테이너 실행
    |옵션| 설명|
    |----|----|
    |-d|detached mode(백그라운드 모드)|
    |-p|호스트와 컨터이너의 포트를 연결|
    |-v|호스트와 컨테이너의 디렉토리를 연결|
    |-e|컨테이너 내에서 사용할 환경변수 설정
    |--name|컨테이너 이름 설정|
    |-rm| 프로세스 종료시 컨테이너 자동 제거
    |-it|-i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
    |-link|컨테이너와의 연결

    `도커`를 실행하기 위한 명령은 다음과 같다.
    ```
    docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
    ```
    ```
    docker run -d -p 3306:3306
    -e MYSQL_ALLOW_EMPTY_PASSWORD=true
    --name mysql
    mysql:8.0.15
    ```

    도커'를 실행시키면 먼저 이미지가 저장이 되어있는지 확인 후 없다면 다운로드를 받고 컨테이너`를 생성 및 실행한다.

  • 컨테이너 목록

    docker ps // 실행되고 있는 컨테이너 목록
    docker ps -a // 모든 컨테이너 목록
  • 컨테이너 중지

    	```

    docker stop [OPTIONS] CONTAINER [CONTAINER...]

    docker ps // 먼저 실행중인 컨테이너 목록 확인
    docker stop afe134 // 중지할 컨테이너 id

  • 컨테이너 삭제

    	```

    docker rm [OPTIONS] CONTAINER [CONTAINER...]

    docker rm 컨테이너id1 컨테이너id2 //한 번에 여러개의 컨테이너를 삭제할 수 있다.

4. Docker 이미지 명령

  • 이미지 목록

    	```
    	docker images
    	```
  • 이미지 다운로드

    	```
    	docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    
    	docker pull mysql:8.0.15
    	```
  • 이미지 삭제

docker rmi 이미지id

5. Docker Compose

도커 컴포즈는 명령어가 아닌 yaml 설정 파일을 이용하여 컨테이너를 생성할 수 있다.

// docker-compose.yaml

version: "3.1"

networks:
  app-tier:
    driver: bridge
services:
  mysql:
    networks:
      - app-tier
    image: mysql:8.0.15
    container_name: mysql_container
    restart: always
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=password123
      - MYSQL_USER=user123
      - MYSQL_PASSWORD=password123
      - MYSQL_DATABASE=dockertest
  server:
    links:
      - mysql
    depends_on:
      - mysql
    networks:
      - app-tier
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    ports:
      - "3000:3000"

위처럼 하게되면 mysql은 mysql:8.0.15의 이미지를 다운 받아 컨테이너를 생성하고
app은 생성해둔 Dockerfile을 통해 컨테이너를 생성하게 된다.

// Dockerfile

# 1. 노드 이미지
FROM node:10.14.1

# 2. sequelize 실행 대기를 위한 도커라이즈 설치
ENV DOCKERIZE_VERSION v0.2.0
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \  
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

# 3. 소스 복사
COPY . /usr/src/app

# 4. 실행 디렉토리 설정 및 의존 파일 설치
WORKDIR /usr/src/app
RUN npm install

# 5. ENTRYPOIN 실행
RUN chmod +x docker-entrypoint.sh  
ENTRYPOINT ./docker-entrypoint.sh

# 6. 포트 정의
EXPOSE 3000
// docker-entrypoint.sh

dockerize -wait tcp://mysql:3306 -timeout 20s

echo "Start server"
node ./src/app.js
// src/app.js

const express = require("express");
const db = require("../models/index");

const server = express();


server.get("/", (req, res) => {
    res.send("server is Great!");
})

server.listen(3000, () => { console.log("server Running!")});

db.sequelize.sync();

6. Docker Hub

  • 로그인
    cmd에서 도커 허브 계정을 사용하기 위해서는 로그인을 먼저 해야한다.

    ```
    docker login
    ```
    
    ```
    Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, 	  head over to https://hub.docker.com to create one.
    Username: username
    Password: password
    Login Succeeded
    ```
  • 도커 이미지 태그

[Registry URL]/[사용자 ID]/[이미지명]:[tag]

도커의 이미지 태그 형태이다.(docker.io/userid/node:10.14.1)

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

tag 명령어를 이용하여 기존 이미지에 추가로 이름을 지어줄 수 있다.

docker tag app userid/app:1.0

app 이미지에 userid와 버전 정보를 추가하여 수정했다.

  • push 태그
docker push userid/app:1.0

push 명령어를 통해 도커 허브에 푸시하였다.
이제 어떤 환경에서든 도커가 설치되어 있다면 언제든지 app:1.0 이미지를 다운받아 사용할 수 있다.

7. 컨테이너 배포

컨테이너 배포는 굉장히 간단하다.
어떤 환경에서든 상관 없이 도커를 설치하고 도커 허브에 업로드한 이미지를 다운받고
컨테이너를 실행하면 끝이다.

  • 컨테이너 업데이트
    기존에 사용하던 이미지를 최신 이미지로 다운받아 교체한 후 이전 컨테이너를 삭제 후 재시작하면 된다.
profile
열정 있는 개발자
post-custom-banner

0개의 댓글