도커란
도커는 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