Docker Getting Started 01

이 주제를 잡게 된 이유? 1.Why? 최근에 개발 환경을 세팅할 때 가장 많이 쓰는 도구인 것 같고, 자연스레 많이 접하기는 하는데 모르는 것 투성이라 공부하고 싶었다.

DOCKER

docker-doc

docker란 무엇일까?

Docker는 개발자와 시스템 관리자가 컨테이너를 사용하여 응용 프로그램을 개발, 배포 및 실행하기위한 플랫폼입니다.

Linux 컨테이너를 사용하여 응용 프로그램을 배포하는 것을 컨테이너 화라고합니다. 컨테이너는 새로운 것은 아니지만 쉽게 응용 프로그램을 배포하는 데 사용됩니다.

기존에 가상화 기술에 비해서 빠르고 경량화 되었다고 한다.

컨테이너화 시켜놓으면 다른데다 가져다 쓰기 아주 좋음

공식 문서 Getting Started 따라가기

1: Orientation 2: Containers 3: Services 4: Swarms 5: Stacks 6: Deploy your app

1. Orientation

1.1 컨테이너를 사용한 배포 플랫폼 & 장점들 유연하고 경량화 되어 있고 쌓기 좋고 ....등등

1.2. Image and Containers

컨테이너는 이미지를 실행시키면서 동작합니다. 이 이미지는 실행시키기 위한 설정 파일등 이라고 합니다. (the code, a runtime, libraries, environment variables, and configuration files.)

컨테이너는 이미지의 런타임 인스턴스

docker ps로 실행중인 컨테이너 목록을 볼 수 있다 docker --version version 과 client server 정보를 볼 수 있다.

docker --version
Docker version 18.09.2, build 6247962
docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false

docker run hello-world를 입력하자 image가 로컬에는 없다. 하고 -> image를 가져온다고 한다. 그리고 docker client가 docker daemon과 핑퐁하면서 실행환경 준비를 마친다.

image들은 docker-hub에 있나보다.

DokcerHub

github 처럼 dokcer image들의 저장소 docker hub에 들어가보자 😄 docker-hub

docker-hub (repo에는 (star | 몇 번 pull했는지가 나온다))

접속해보면 내가 만든 repository 그리고 검색을 통해서 image들을 찾을 수 있다.

ubuntu를 검색해보자

cli 환경에서도 똑같이 docker search라는 명령어로 알아볼수가 있다.

실행하면서 몇가지 명령어들을 익혀 봅시다.

docker pull ubuntu pull image 가지고 오기 docker run ubuntu 이미지 실행하기 docker run -d demon으로 실행하겠다. docker run -i interactive mode로 하겠다. docker run -t tty기능을 키겠다.

docker run -dit name <my-name> <imagename>

docker ps 실행되고 있는 컨테이너 docker ps -a all 컨테이너 docker rm Remove one or more containers docker image ls 다운로드한 image 목록으 볼 수 있다. docker container ls --all

docker run -dit --name my-ubuntu ubuntu

docker attach <container-name>
docker inspect <container-name>

1.orientation 정리

컨테이너화는 cI/cd를 간편하게 만들어준다.

  1. 시스템 종속성이 없다.
  2. 업데이트를 모든 부분에 푸시할 수 있다.
  3. 자원을 최적화 할 수 있다.
  4. vmHost를 실행시키지 않고 새로운 실행 파일 작성할 수 있다.

만능은 아니고

  1. 엄밀한 리눅스 내부 환경 구성 이나 비리눅스 환경에서는 예전 VMWare나 VirtualBox 방식이 더 적합할 수 있다.

2.Containers

제일 하단에 컨테이너에 대해서 알아봅시다.

Stack
Services
Container (you are here)

Docker는 같은 Portable image만 설정해주면 모두 같은 실행환경을 갖출 수 있어서 편리하다. Portable Images는 Dockerfile이라고도 한다.

Docker 방식으로 앱을 제작해보자 제일 아래 부터 쌓아 올리는 식으로 진행할 예정 파트 3 컨테이너 프로덕션에서 작용하는 방식 최상위 레벨 스택 모든 서비스의 상호 작용

app.build

docker build Build an image from a Dockerfile

docker build --tag=friendlyhello .

dockerFile을 통해서 --tag -> 이 이름으로 이미지를 만들겠다는 명령어다.

run App

docker run Run a command in a new container docker run -p 4000:80 friendlyhello -p: Publish a container's port(s) tothe host publish port 지정 내쪽 4000 컨테이너는 80포트로 돌리겠다 machine’s port 4000 to the container’s published port 80 using

docker container ls를 통해서 상태들을 확인 할 수 있다. docker container stop <id>를 통해서 멈출 수 있다.

Share Image

docker login 로그인 하고 docker tag image username/repository:tag docker tag friendlyhello gordon/get-started:part2 docker tag imagename username/repository:

docker tag imagename -> usernmae/repository:tag으로 생성하고 docker push usernmae/repository:tag 허브에 생성한 이미지를 push해준다.

docker build -t friendlyhello .  # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyhello  # Run "friendlyhello" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyhello         # Same thing, but in detached mode
docker container ls                                # List all running containers
docker container ls -a             # List all containers, even those not running
docker container stop <hash>           # Gracefully stop the specified container
docker container kill <hash>         # Force shutdown of the specified container
docker container rm <hash>        # Remove specified container from this machine
docker container rm $(docker container ls -a -q)         # Remove all containers
docker image ls -a                             # List all images on this machine
docker image rm <image id>            # Remove specified image from this machine
docker image rm $(docker image ls -a -q)   # Remove all images from this machine
docker login             # Log in this CLI session using your Docker credentials
docker tag <image> username/repository:tag  # Tag <image> for upload to registry
docker push username/repository:tag            # Upload tagged image to registry
docker run username/repository:tag                   # Run image from a registry

Service

Stack Services (you are here) Container

이번엔 서비스에 대해서 알아보겠다.

분산 앱에서 app의 다른 조각 ? 예를 들면 비디오공유 사이트에서 데이터 베이스에서 응용프로그램을 저장하는 서비스 사용자가 업로드를 한 후에 비디오 트렌스코딩을 위한 서비스 ...

여러 앱의 기능단위인가? 서비스가 무엇을 뜻하는지 아직 와 닿지는 않는다. ... 마이크로 서비스 같은 개념인가? -> 나중에 공부해서 채워넣기

서비스는 실제로 프로덕션 컨테이너이다. 하나의 이미지를 실행하지만 어떤 포트가 사용되야 하는지, 복제본 양을 어떻게 실행해야 할지, 용량이 어떻게 될지, ... 이런 것들은 docker-compose.yml을 작성하여 서비스를 정의 실행 및 확장할 수 있다.

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:

가지고 올 image 몇개로 실행할지 limits (cpu & memory ) 실패시 즉시 재 실행 ,포트 정의 로드 밸런스 등을 정의한다.

Run your new load-balanced app

docker stack deploy docker swarm init 이 명령에 대한 부분은 Swarms에서 다루고 진행해보자

docker stack deploy -c docker-compose.yml getstartedlab

Reference