도커란

도커는 VM을 사용하는 것들과 달리 컨테이너를 사용하는 방식이다.

<img src=https://subicura.com/assets/article_images/2017-01-19-docker-guide-for-beginners-1/vm-vs-docker.png>


https://docs.docker.com/

docker vs hypervisor(VM : 가상머신)

가상머신 -> VMWare, Parallels, VirtualBox, Hyper-V

https://medium.com/@darkrasid/docker%EC%99%80-vm-d95d60e56fdd


https://hub.docker.com/ 에 가서 로그인 (회원가입안되어 있으면 회원가입한다.)

docker version docker info docker run hello-world // 로컬에 이미지가 없을 경우 다운받아서 실행한다.

docker images // 로컬의 이미지 목록을 보여준다. docker image ls

docker ps // 현재 실행중인 컨테이너

docker ps -a // 종료된 컨테이너 정보도 보여진다. docker container ls –all


Build,Run

dockerfile - 도커이미지를 만들때 사용

docker start Exam : https://docs.docker.com/get-started/

Dockerfile

# Use an official Python runtime as a parent image
FROM python:2.7-slim
- 이미 있는 이미지로 만들어라(안에 있는 리눅스에 설치된 파이썬 기반으로) 

# Set the working directory to /app
WORKDIR /app
- 리눅스안에 앱을 만들어준다.

# Copy the current directory contents into the container at /app
COPY . /app
- 파일을 /app 에 복사한다.

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
- 이미지안에 있는 명령을 실행한다 이미지안에 파이선 라이브러리가 저장된다.

# Make port 80 available to the world outside this container
EXPOSE 80
- 컨테이너 밖에서 80포트에 접속됨

# Define environment variable
ENV NAME World
- 이미지안에 name이 world라는 환경설정해준다.

# Run app.py when the container launches
CMD ["python", "app.py"]
- 명령이 실핼할때 안에 있는 파이썬으로 app.py를 실행한다.

app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

requirements.txt

Flask
Redis

docker build –tag=friendlyhello .

  • 현재경로(.)에 있는 Dockerfile을 이용해 build tag = friendhello

docker run -p 4000:80 friendlyhello

  • 이때 내 4000번 포트를 안에 설정된 80 포트에 연결해준다.

ctrl + c : 종료

참고 : https://www.popit.kr/%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EC%B2%98%EC%9D%8C-docker-%EC%A0%91%ED%95%A0%EB%95%8C-%EC%98%A4%EB%8A%94-%EB%A9%98%EB%B6%95-%EB%AA%87%EA%B0%80%EC%A7%80/


docker login : 로그인

명령 예제

docker tag image username/repository:tag

docker push username/repository:tag

내 개인 저장소에 업로드

다른 pc에서 실행 시

docker run -p 4000(내포트):80(연결포트) username/repository:tag


Service

Exam

docker-compose.yml

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    networks:
      - webnet
networks:
  webnet:

여러개의 이미지가 실행된다는건 여러개의 리눅스가 실행되는 것과 같다.
각각 이미지가 연결되려면 같은 네트워크 망에 가입되어있어야한다.
그래서 docker는 webnet이라는 가상네트워크가 만들어져서 정의된 이미지들이 같이 실행된다.

replicas : N - 이미지가 N개 실행된다. (로드밸런씽)

docker compose 사용 하려면 docker swarm 을 사용한다 이때 컨테이너를 초기화해줘야 한다.

docker swarm init

docker stack deploy -c docker-compose.yml getstartedlab

getstartedlab 서비스가 실행된다.

docker service ls 서비스 목록

docker container ls 현재 컨테이너 목록

docker compose를 사용하려면 docker swarm을 사용한다.

docker swarm init

docker swarm join –token SWMTKN-1-0dsmx78cwrn0tpeq8yqjfmwg288ud2baalpaxk8nlzbz4nriqa-6rgpan0271lsp1awkr0d5cb6c 192.168.65.3:2377 getstartedlab 이름의 서비스가 실행된다.

docker stack deploy -c docker-compose.yml getstartedlab

실행되고 있는 서비스에 대한 정보는 아래의 명령으로 알 수 있다.

docker service ls

docker service ps getstartedlab_web

docker container ls -q

docker stack ps getstartedlab

docker-compose.yml을 수정후 다시 실행 (ex : replicas를 수정후 실행) 약간의 시간이 지난 후 변경되는 걸 확인할 수 있다.

docker stack deploy -c docker-compose.yml getstartedlab

서비스를 종료

docker stack rm getstartedlab

docker swarm 을 종료


docker swarm leave –force 가상머신을 생성한다.(Local VMs (Mac, Linux, Windows 7 and 8))

https://www.virtualbox.org/wiki/Downloads 를 설치

docker-machine create –driver virtualbox myvm1 docker-machine create –driver virtualbox myvm2

가상머신을 생성한다. (Local VMs (Windows 10/Hyper-V)

docker-machine create -d hyperv –hyperv-virtual-switch “myswitch” myvm1 docker-machine create -d hyperv –hyperv-virtual-switch “myswitch” myvm2

mysql 의 경우 데이터가 저장되는데…. 이러한데이터는 컨테이너에 저장되면 안된다.


참고 : https://github.com/remotty/documents.docker.co.kr