보안으로 원격이 접속 되지 상태에서 장애가 발생하게 되면 직접 가서 각 서버를 재구동해야하는 불편함.
vm이란? 물리적인 서버위에 여러개의 애플리케이션을 운영하기 위해 자원을 할당하여 가상의 서버를 만드는것.
Hypervisor 는 실제 물리 서버의 자원을 관리해주는 소프트웨어
ex) nginx라는 웹서버를 띄운다고 하면 해당 서비스는 보통 100MB라고 하는데 이를 띄우기 위해 운영체제도 설치해야하고 각종 리소스 낭비를 가져온다.
컨테이너란?
개별 소프트웨어의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반 환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술
ex) 위와 동일하게 nginx를 웹서버로 띄울경우 별도의 운영체제를 설치하지 않고 실제로 서비스를 올리기 위한 최소한의 리소스만 사용한다.
장점 :
운영체제 수준의 가상화 - 별도의 하드웨어 에뮬레이션 없이 커널을 공유해 컨테이너를 실행
빠른 속도와 효율성 - 하나의 머신에서 프로세스만큼 실행하는것이 가능
높은 이식성 - 도커 엔진 위에 올라가기 때문에 도커가 동작하는 환경이라면 언제든지 공유 및 복제가 가능
상태를 가지지 않음 - 컨테이너가 실행 되는 환경은 독립적이기에 다른 컨테이너에게 영향을 주지 않는다.
docker란?
컨테이너 기반의 오픈소스 플랫폼
도커 아키텍처
클라이언트 - 서버 아키텍처를 사용.
docker Client는 docker daemon과 통신 .
docker daemon은 docker 컨테이너를 빌드, 실행 및 배포하는 작업.
docker Client, docker daemon은 UNIX 소켓 또는 Rest API 통신.
Docker Daemon은 Docker API 요청을 수신하고 이미지, 컨테이너 네트워크 및 볼륨과 같은 Docker 객체를 관리함.
Docker Registry는 Docker image 저장하는 보관함 공개 레지스트리로는 Docker Hub가 있고 프라이빗하게 사용할수 있다.
Docker 실습
기본 docker CLI 사용해보기
image list
C:\\Users\\Mac>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xoska83/hellopy 0.0.1 758e0fd8a12a 37 hours ago 159MB
## List Docker CLI commands docker docker container --help ## Display Docker version and info docker --version docker version docker info ## Execute Docker image docker run hello-world ## List Docker images docker image ls ## List Docker containers (running, all, all in quiet mode) docker container ls docker container ls -all docker container ls -aq
container list
C:\\Users\\Mac>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f749a602c3ac xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 3 seconds 0.0.0.0:4001->80/tcp priceless_zhukovsky
8f505bcaa795 xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 7 minutes 0.0.0.0:4000->80/tcp condescending_brattain
C:\\Users\\Mac>docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f749a602c3ac xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 2 minutes 0.0.0.0:4001->80/tcp priceless_zhukovsky 8f505bcaa795 xoska83/hellopy:0.0.1 "python app.py" 11 hours ago Up 10 minutes 0.0.0.0:4000->80/tcp condescending_brattain
docker build -t hellopy .
Sending build context to Docker daemon 4.608kB
Step 1/7 : FROM python:2.7-slim
2.7-slim: Pulling from library/python
68ced04f60ab: Pull complete
08b47f0371a2: Pull complete
afa5f7c888db: Pull complete
1fad109bc0a5: Pull complete
Digest: sha256:2117cd714ad2212aaac09aac7088336241214c88dc7105e50d19c269fde6e0f6
Status: Downloaded newer image for python:2.7-slim
---> 9458934200c5
Step 2/7 : WORKDIR /app
---> Running in dfc66ec3a2b1
Removing intermediate container dfc66ec3a2b1
---> 0baf039bff40
Step 3/7 : ADD . /app
---> 80d05fe0119f
Step 4/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
---> Running in 19fe4018cf78
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at <https://pip.pypa.io/en/latest/development/release-process/#python-2-support>
Collecting Flask
Downloading Flask-1.1.1-py2.py3-none-any.whl (94 kB)
Collecting Redis
Downloading redis-3.4.1-py2.py3-none-any.whl (71 kB)
Collecting click>=5.1
Downloading click-7.1.1-py2.py3-none-any.whl (82 kB)
Collecting itsdangerous>=0.24
Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting Werkzeug>=0.15
Downloading Werkzeug-1.0.0-py2.py3-none-any.whl (298 kB)
Collecting Jinja2>=2.10.1
Downloading Jinja2-2.11.1-py2.py3-none-any.whl (126 kB)
Collecting MarkupSafe>=0.23
Downloading MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl (24 kB)
Installing collected packages: click, itsdangerous, Werkzeug, MarkupSafe, Jinja2, Flask, Redis
Successfully installed Flask-1.1.1 Jinja2-2.11.1 MarkupSafe-1.1.1 Redis-3.4.1 Werkzeug-1.0.0 click-7.1.1 itsdangerous-1.1.0
Removing intermediate container 19fe4018cf78
---> ffa0a2cf2e6e
Step 5/7 : EXPOSE 80
---> Running in 754d92c042ca
Removing intermediate container 754d92c042ca
---> 16405653ecaa
Step 6/7 : ENV NAME World
---> Running in a4f6de50b4d1
Removing intermediate container a4f6de50b4d1
---> f078e277461e
Step 7/7 : CMD ["python", "app.py"]
---> Running in aa0f23583356
Removing intermediate container aa0f23583356
---> 74286a0628a0
Successfully built 74286a0628a0
Successfully tagged hellopy:latest
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hellopy latest 74286a0628a0 About a minute ago 159MB
docker run -p 4000:80 hellopy
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on <http://0.0.0.0:80/> (Press CTRL+C to quit)
detach모드로 백그라운드에서 hellopy구동
docker run -d -p 4000:80 hellopy
62241a8af0788f2ae0a31ac3e266c9902dff57796f1616562db5105e1cbe6646
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62241a8af078 hellopy "python app.py" 55 seconds ago Up 54 seconds 0.0.0.0:4000->80/tcp practical_neumann
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62241a8af078 hellopy "python app.py"
docker container stop 62241a8af078
62241a8af078
Docker image 공유해보기
이미지태그
기존에 만들어 놓은 이미지가 있어야 registry에 push하기 위한 용도의 태그를 생성할 수 있다.
docker login
Authenticating with existing credentials...
Login Succeeded
tnkim ~/git/docker-getting-started
docker tag hellopy xoska83/hellopy:0.0.1
tnkim ~/git/docker-getting-started
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hellopy latest 758e0fd8a12a 23 hours ago 159MB
xoska83/hellopy 0.0.1 758e0fd8a12a 23 hours ago 159MB
이미지공유하기
tnkim ~/git/docker-getting-started
docker push xoska83/hellopy:0.0.1
The push refers to repository [docker.io/xoska83/hellopy]
fe83d8eee022: Pushed
78299df7a379: Pushed
dc2088f4e3cc: Pushed
949db7eb12c6: Mounted from library/python
a96c96927e3d: Mounted from library/python
c5f117060f0d: Mounted from library/python
f2cb0ecef392: Mounted from library/python
0.0.1: digest: sha256:2196a20d0cf88311672487fad7097e9c7580922be927030c122268a8a5347eb7 size: 1788
dockerhub registry에서 push된 image확인
push된 remote image를 이용해서 container실행
tnkim ~/git/docker-getting-started
docker run -p 4000:80 xoska83/hellopy:0.0.1
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on <http://0.0.0.0:80/> (Press CTRL+C to quit)
172.17.0.1 - - [12/Mar/2020 13:04:17] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [12/Mar/2020 13:04:19] "GET / HTTP/1.1" 200
추가로, 쿠버네티스는 단순한 오케스트레이션 시스템이 아니다. 사실, 쿠버네티스는 오케스트레이션의 필요성을 없애준다. 오케스트레이션의 기술적인 정의는 A를 먼저 한 다음, B를 하고, C를 하는 것과 같이 정의된 워크플로우를 수행하는 것이다. 반면에, 쿠버네티스는 독립적이고 조합 가능한 제어 프로세스들로 구성되어 있다. 이 프로세스는 지속적으로 현재 상태를 입력받은 의도된 상태로 나아가도록 한다. A에서 C로 어떻게 갔는지는 상관이 없다. 중앙화된 제어도 필요치 않다. 이로써 시스템이 보다 더 사용하기 쉬워지고, 강력해지며, 견고하고, 회복력을 갖추게 되며, 확장 가능해진다.