5 minute read

일지

특이사항 없음

주요 키워드

오늘의 할일

  • 220506 TIL 작성
  • AWS Udemy 모의고사2회 해설정리
  • Docker 공부
  • 코드업 파이썬 기초100제

공부 정리

Docker

What is Docker?

Overview

  • What is Container & What problem solve?
  • Container Repository
    • A storage for containers.
  • DEVELOP application
    • How D. can make dev process much easier&efficient
  • DEPLOY application
    • How D. solve prbms.

What is a Containers?

  • a Con;
    • a way to package apps w/ all nessary dependencies&configuration
    • Portable Artifact, easily shared&moved around btw dev<>ops team
    • Makes dev process much efficient
      • portabilty+packed in isolated envr

Where do containers live?

  • Container Repository
  • Private repositories
  • Public repositores for D. > DockerHub

How containers improved..

App Development

  • BC (Before Container)
    • 개발 및 구동에 필요한 모든 패키지를 로컬 환경에 설치
    • 각 OS 환경에 따라 설치 과정이 상이함
    • 실수할 수 있는 많은 중간단계(커맨드누락등)
  • AC (After Con)
    • Image 기반 별개의 독립된 환경구축
    • 필요한 구성이 설정된 패키지
    • 1개의 Docker Command로 환경 설치 가능
    • 버전이 다른 2개의 앱을 동시 실행 가능

Again,

  • BC
    • Dev;
      • Produce Artifact w/setup-guide,conf,db,etc…
    • Ops;
      • Do configuration
    • 사용에 필요한 서버에 직접 설치
    • 버전 종속성 충돌 발생
    • 텍스트 가이드에 의존; 전달부족으로인한 충돌
  • AC
    • Dev&Ops
      • 모든 종속성 및 연관 구성을 한 컨테이너에 통합
      • Docker 실행을 제외한 서버의 환경구성 필요성 X

What is Con? structure

  • Layers of images
  • bottom; Linux Base Image, cuz small in size
  • top; Application Image that u need
  • btw; as u needed

  • Can download from DockerHub
    • docker run {packagename}:{version}
    • Seperate images are downloaded
      • ADV; only diff. images downloaded
    • docker ps
      • 가동중인 컨테이너 조회
Image Container
Packages started App
artifact,\n can be moved around container environment created
NOT RUNNING RUNNING

Docker vs Virtual Machine

os

  1. Kernel communc8s w/HW
  2. Apps run on Kernel layer
    • Same Linux kernel, implemented diff apps > devian/rhel

Docker

  • Virtualize on applications layer
  • Do not have its own kernel; use its host OS kernel

VM

  • has apps AND its own kernel
  • virtualize complete OS; use own OS kernel
  1. Size; Docker image much smaaller
  2. Speed; Docker containers start&run much fast
  3. Compatibility; VM of any OS can run on any OS host
    • D. CANNOT run linux based apps on window host w/o other tools(Docker Toolbox)

Docker installation 9(for Linux,32:05)

공식문서 해설이라서 필요할때 문서보고 진행하면될듯
중요한건 자체적으로 도커 실행되지않는 환경에선 Docker ToolBox 필요함 https://docs.docker.com/engine/install/ubuntu/


Basic Comman

Overview

  • Container vs Image
  • Version and Tag
  • Docker Commands
    • docker pull
    • docker run
    • docker start
    • docker stop
    • docker ps
    • docker exec -it
    • docker logs

Container vs Image

con

  • CONTAINER is a running environment for IMAGE
  • docker pull redis > 특정 app image 다운
  • docker images > 다운로드한 이미지 조회
  • docker run redis > 특정 app 실행(컨테이너)
  • docker ps > 가동중인 컨테이너 조회
  • docker run -d redis > detach 상태로 실행(ps로 조회는 가능, 가동중X)
  • docker stop {container ID} > 컨테이너 중지
  • docker start {container ID} > 컨테이너 시작(=합쳐서 재시작)
  • docker ps -a > 가동중+중지된 컨테이너 조회

만약 필요로 인해 서로다른 redis 어플리케이션을 동시에 실행해야한다면?

  • docker run redis:4.0 > 이미지를 가져오고(pull), 컨테이너 시작
  • docker ps > 서로다른 redis image 기반 2개의 컨테이너 작동확인
    • 동일한 port(6379/tcp)에서 작동 중

CONTAINER Port vs HOST Port

Num Host Container
1 5000 5000
2 3000 3000
3 3001 3000
  • Multiple containers can run on host machine
  • Your laptop has only certain ports available
  • Conflict when same port on host machine
    • Case1, The port is already bound or in use
    • Case2,3, Works well
  • docker run -p{Host port}:{Container port}
  • docker run -p6000:6379 redis
  • docker run -p6000:6479 redis:4.0 > ERROR; port already bound
  • docker run -p6001:6479 redis:4.0 > Running well

Debugging Containers

  • docker logs {Container ID}or{Container Name}
    • 컨테이너 이름은 ps시 제일오른쪽에 있음, 기본적으로 랜덤생성
  • docker run -d -p6001:6379 –name redis-older redis:4.0

  • docker exec
    • 특정 Con.에 문제발생, 터미널 화면으로 진입하고싶다;
    • 내부 디렉토리, 로그파일, 설정 구성, 환경변수 확인 등
  • docker exec -it {Con. ID} /bin/bash
    • Interacive Terminal
    • 대부분의 컨테이너이미지는 Lightweight Linux distributuon 기반
    • 대부분의 명령어는 사용안된다고 봐야함 (curl,ifconfig, etc.)

Docker run vs start

  • run
    • create new Con. from Image
    • > Create a new Con.
  • start
    • not working w/images
    • working w/containers
    • > Restart a stopped Con.

Demo Project

Overview

  • Development
  • Continuous Integration/Delivery
  • Deployment

Workflow w/D.

demo

  1. JavaScriptApp 개발
    • 랩탑에서 로컬, JS앱 개발 중 + 도커의 몽고DB 연계
    • 초기 개발 완료 또는 테스터팀에게 테스트 맡길 예정
    • JS앱을 Git과 같은 버전관리 시스템에 커밋
  2. JS앱 구성 및 도커 이미지 생성
    • Jenkins 같은 CI 도구가 사용됨
    • Artifact 기반 JS앱 구성 및 도커이미지 생성
    • Private D. 저장소로 생성된 D. 이미지 PUSH (타인에게 노출방지)
  3. Dev 서버에 배포
    • Dev 서버가 사설저장소에서 JS앱의 D. 이미지 Pull
    • Dev 서버가 DockerHub에서 MongoDB 이미지 Pull
    • 두개의 컨테이너의 상호작용으로 JS앱 가동
    • 테스터나 다른 개발자가 Dev서버에 접속해서 JS앱 테스트 가능

Develop w/Con.

Overview
로컬 개발과정에서의 도커 사용예시

  1. JS&Nodejs application 구성
  2. MongoDB 도커 컨테이너에 연결

example

  • JS앱 부분은 깃허브에 코드공개되어있음
  • 대충 작동은 하는데 DB없어서 설정변경해도 저장X

  • docker pull mongo
  • docker pull mongo-express
  • 먼저 저 두 몽고DB 관련 앱 사이에 연결을 만들어야한다

Docker Network

DNW1

  • 도커는 격리된 도커 네트워크를 구성함
  • 두개의 컨테이너를 구성할시, 같은 N/W상에 있기 때문에 컨테이너 이름으로 연결됨
  • 외부의 앱은 Host의 포트번호로 D. N/W와 연결되어야함

DNW2

  • 배포 단계시, Nodejs도 막 뭐 HTTP등 인덱스 포함해서 이미지화
  • 웹브라우저가 이에 접속

  • docker network ls > 현재 네트워크 상황조회
  • docker network create mongo-network

몽고 컨테이너 생성

  • docker run -p 27017:27017 -d -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=password –name mongodb –net mongo-network mongo
  • 읽을수 있게 입력하려면, docker run -d \ -p ~ \ -e ~ 식으로 입력
  • docker logs {Con. ID} > 생성기록확인

몽고 익스프레스 컨테이너 생성 및 연결

  • 몽고익스프레스
  • 어드민 계정정보는 입력안할시 덮어씌움, 설정필요
  • 포트번호는 냅둠 (동일)
  • 서버 네트워크 지정
  • docker run -d -p 8081:8081 -e ME_CONFIG_MONGODB_ADMINUSERNAME=admin -e ME_CONFIG_MONGODB_ADMINPASSWORD=password –net mongo-network –name mongo-express -e ME_CONFIG_MONGODB_SERVER=mongodb mongo-express
  • 쓰읍.. 가상머신의 0.0.0.0:8081에서만 접속되겠구나..
  • 아모튼 node.js쪽에는 다 되어있으니까 작동해보면 다 잘될거임
  • 이것저것 설정값 입력해보고 변경하고 docker logs로 확인해보면 조회가능

Docker compose

dc

  • 플레이북 같은거
  • 커맨드의 내용을 입력해놔서 편하게편하게
  • 네트워크는 입력하지않는다, 자체 네트워크를 생성함

  • docker-compose -f mongo.yml up
    • -f = file
  • docker network로 조회시 새로운 N/W가 생성되어있음
  • 연결이 필요한 컨테이너의 경우 실행순서를 조정할 수 있음

  • 컨테이너 재시작시 내부의 설정값 같은 데이터는 초기화됨
    • Docker Volumes for Data Persistence! (later)
  • docker-compose -f mongo.yml down
    • 모든컨테이너+네트워크 종료 후 삭제

Dockerfile

원래는;

  • Git에 Dockerfile을 커밋하면, Jenkins가 자동으로 이미지화 하여 Repo로 보냄
  • 해당 과정을 수동으로 해볼것임.

To build image from an app…

  • Copy the contents of app (jar,war,bundle.js)
  • To do above, Need blueprint for building images(=dockerfile)
# The name MUST BE "Dockerfile"
FROM node:13-alpine

ENV MONGO_DB_USERNAME=admin \
    MONGO_DB_PWD=password

RUN mkdir -p /home/app

COPY . /home/app

CMD ["node", "server.js"]

How to make?

  1. FROM; Start by basing it on another image
    • 지금 경우, linux alpine 대신 node부터 시작
  2. ENV; Optionally define environmental variables
    • 가능하면 Image외부에 변수를 설정하는게 관리하기에 쉽긴함
  3. RUN; execute any Linux command
    • 컨테이너 내부에서 실행됨
  4. COPY; executes on the HOST machine
    • 컨테이너 외부, HOST에서 받아옴
  5. CMD; 흠 기반 이미지의 명령어를 실행하고 싶을때?
    • CMD=entry point command <> can have multiple RUN commands
    • 엔트리 포인트가 머야
  • 공식문서에 있는 태그들도 눌러보면 해당 Dockerfile로 연결됨

Image Layers

  • app:1.0 > Current APP, FROM node:13-alpine
  • node:13-alpine > FROM alpine:3.10
  • alpine:3.10

build an Image using Dockerfile

  • docker build -t my-app:1.0 .
    • tag&dockerfile location
  • docker images
  • docker run my-app:1.0
    • CMD [“node”, “server.js”]>CMD [“node”, “/home/appserver.js”]
    • When you ADJUST the Dockerfile, you MUST REBUILD THE IMAGE!
  • docker rmi {Image ID from ‘docker images’}
  • docker rm {Con. ID}
  • 다시 build하고 run
  • docker exec -it {container ID} /bin/sh
    • /bin/bash가 모든 컨테이너에서 활성화된건 아님
    • env 명령어로 내부에 설정된 환경변수 조회가능
    • 뭔가 옮겨넣을 내용이 많다면 compress해서 artifact화 한다음에 그거를 이미지로 쓰는것도 가능
      • 아티팩트는 뭐에요 노드js용어인가

Categories:

Updated:

Leave a comment