220507 Today I Learned
일지
특이사항 없음
주요 키워드
오늘의 할일
- 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
- 사용에 필요한 서버에 직접 설치
- 버전 종속성 충돌 발생
- 텍스트 가이드에 의존; 전달부족으로인한 충돌
- Dev;
- AC
- Dev&Ops
- 모든 종속성 및 연관 구성을 한 컨테이너에 통합
- Docker 실행을 제외한 서버의 환경구성 필요성 X
- Dev&Ops
What is Con?
- 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
- Kernel communc8s w/HW
- 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
- Size; Docker image much smaaller
- Speed; Docker containers start&run much fast
- 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
- 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.
- JavaScriptApp 개발
- 랩탑에서 로컬, JS앱 개발 중 + 도커의 몽고DB 연계
- 초기 개발 완료 또는 테스터팀에게 테스트 맡길 예정
- JS앱을 Git과 같은 버전관리 시스템에 커밋
- JS앱 구성 및 도커 이미지 생성
- Jenkins 같은 CI 도구가 사용됨
- Artifact 기반 JS앱 구성 및 도커이미지 생성
- Private D. 저장소로 생성된 D. 이미지 PUSH (타인에게 노출방지)
- Dev 서버에 배포
- Dev 서버가 사설저장소에서 JS앱의 D. 이미지 Pull
- Dev 서버가 DockerHub에서 MongoDB 이미지 Pull
- 두개의 컨테이너의 상호작용으로 JS앱 가동
- 테스터나 다른 개발자가 Dev서버에 접속해서 JS앱 테스트 가능
Develop w/Con.
Overview
로컬 개발과정에서의 도커 사용예시
- JS&Nodejs application 구성
- MongoDB 도커 컨테이너에 연결
- JS앱 부분은 깃허브에 코드공개되어있음
-
대충 작동은 하는데 DB없어서 설정변경해도 저장X
- docker pull mongo
- docker pull mongo-express
- 먼저 저 두 몽고DB 관련 앱 사이에 연결을 만들어야한다
Docker Network
- 도커는 격리된 도커 네트워크를 구성함
- 두개의 컨테이너를 구성할시, 같은 N/W상에 있기 때문에 컨테이너 이름으로 연결됨
- 외부의 앱은 Host의 포트번호로 D. N/W와 연결되어야함
- 배포 단계시, 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
- 플레이북 같은거
- 커맨드의 내용을 입력해놔서 편하게편하게
-
네트워크는 입력하지않는다, 자체 네트워크를 생성함
- 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?
- FROM; Start by basing it on another image
- 지금 경우, linux alpine 대신 node부터 시작
- ENV; Optionally define environmental variables
- 가능하면 Image외부에 변수를 설정하는게 관리하기에 쉽긴함
- RUN; execute any Linux command
- 컨테이너 내부에서 실행됨
- COPY; executes on the HOST machine
- 컨테이너 외부, HOST에서 받아옴
- 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용어인가
Leave a comment