Docker
는 2013년 3월에 처음으로 세상에 알려졌다.
컨테이너 기반의 오픈소스 가상화 플랫폼
이라고 한다.
컨테이너란?
컨테이너
란 프로세스를 격리시켜 동작하는 기술이지만 기존 사용하던 VMware
나 VirtualBox
와는 다르다.
두 가지의 가상 머신은 성능 저하가 발생하여 운영 환경에선 사용하기 어렵다.
이를 해결하기 위하여 프로세스를 격리하는 방식이 등장했다.
즉 하나의 컴퓨터에 다수의 컨테이너
를 실행하면 각각의 독립된 환경으로 가상 머신을 사용하는 것 같은 느낌을 받을 수 있다.
이미지란?
이미지
는 컨테이너의 필요한 파일과 설정 값등을 저장한 것이다.
같은 이미지
에서 여러개의 컨테이너
를 생성할 수도 있다.
그리고 컨테이너
의 상태가 바뀌거나 혹은 컨테이너
가 삭제된다 하더라도 이미지
는 변하지 않고 상태를 유지한다.
즉 이미지
는 컨테이너
를 실행하기 위한 모든 정보들을 가지고 있기 때문에 서버를 추가하는 작업을 해도
이미지
를 다운 받아 컨테이너
를 생성 및 실행만 하면 완료된다.
Docker hub
도커
의 이미지
용량은 엄청 거대하며 메가에서 시작하여 기가단위로 넘어가는 경우도 있다고한다.
이런 큰 용량의 이미지
를 Docker hub
를 통해 공개 이미지를 무료로 관리해준다.
현재 윈도우에서 도커
를 사용했기 때문에 Docker for windows
를 설치하여 사용하였다.
설치가 완료되면
docker version
을 입력하게 되면 버전에 대한 정보가 출력된다.(client와 server 모두 정삭적으로 출력이 되야한다.)
도커
에 클라이언트
와 서버
가 나뉘어져 있는 이유는 도커 클라이언트
에서 도커 커맨드
를 입력하면
도커 서버
로 명령을 전송하여 결과를 받아 터미널에 출력한다.
컨테이너 실행
|옵션| 설명|
|----|----|
|-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 //한 번에 여러개의 컨테이너를 삭제할 수 있다.
이미지 목록
```
docker images
```
이미지 다운로드
```
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull mysql:8.0.15
```
이미지 삭제
docker rmi 이미지id
도커 컴포즈
는 명령어가 아닌 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();
로그인
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와 버전 정보를 추가하여 수정했다.
docker push userid/app:1.0
push
명령어를 통해 도커 허브
에 푸시하였다.
이제 어떤 환경에서든 도커
가 설치되어 있다면 언제든지 app:1.0
이미지를 다운받아 사용할 수 있다.
컨테이너
배포는 굉장히 간단하다.
어떤 환경에서든 상관 없이 도커
를 설치하고 도커 허브
에 업로드한 이미지를 다운받고
컨테이너를 실행하면 끝이다.