(준비 작업) 도커 환경 구성
1) 작업 계획
GOLD Image Clone
-> docker1 VM
-> docker2 VM
2) 필수 작업 - VM clone 한 후 최소 작업
3) VM 용도
4) Ansible 이용하여 환경 구성
(docker1)
패키지 설치
키 페어 생성 & 배포(docker1 -> {docker1, docker2})
vscode 다운로드 & 설치 & 실행
ansible.cfg 파일 생성
inventory 생성
playbook 생성
# code --no-sandbox --user-data-dir=/root/vscode
#################################################
제 01장. 컨테이너와 도커
#################################################
컨테이너
컨터이너?
컨테이너 기술의 종류
도커
도커?: 컨테이너 기술의 한 가지 종류
도커 기능
빌드(build)
공유(ship)
동작(run)
도커 에디션
docker-ce
docker-ee
도커 컴포넌트(Docker Component) // 구성요소 중요
Docker Engine: docker CMD, API(REST API), docker daemon(dockerd)
Docker Object: docker image, container, volume, network, plugins(docker dashboard)
Docker Registry: Private(우리회사)/Public(전세계) Registry
Docker Compose(하나의 머신안에있는 도커 관리)
Docker Swarm(여러개)
도커 기반 기술
#################################################
제 02장. 도커 설치
#################################################
(데스크탑) 도커 데스크탑 설치
1) 포함된 기능: 도커 + 쿠버네티스
2) 도커 데스크탑 설치
Mac
Windows
* Linux
(서버) 도커 엔진 설치
1) CentOS Stream 8 설치하는 방법
# yum -y remove runc
* Yum Repository 설치
# yum config-manager --add-repo 사이트
# yum -y install 사이트
# systemctl enable --now docker.service
* RPM 파일을 직접 받아서 설치
# wget 사이트(아래는 여기 사이트)
* containerd.io ~
* docker-bulidx ~
* docker-ce ~
* docker-ce-cli ~
* docker-ce-rootless-extras ~
* docker-compose-plugin ~
* docker-scan-plugin ~
# yum localinstall $RKG
# systemctl enable --now docker.service
* 설치 스크립트를 사용하는 방법
# curl -fsSL https://get.docker.com -o get-docker.sh
# bash get-docker.sh
# systemctl enable --now docker.service
2) docker 설치 확인
# docker run hello-world
#################################################
제 03장. 도커 이미지 관리
#################################################
1) 이미지 검색
# docker search nginx
# docker search myregistry:8443/nginx
2) 이미지 다운로드
# docker pull nginx
# docker pull myregistry:8443/nginx
3) 이미지 목록 확인 & 상세 정보 확인
# docker images
# docker images -a
# docker inspect ubuntu
# docker inspect -f "{{ .Config.Cmd }}" ubuntu
# docker inspect -f "{{ .Config.Cmd }}" $(docker images -q)
4) 이미지 삭제 // 이름안에는 여러가지 내포(앞:아이디 , 뒤:태그) 붙을 수 있음
# docker rmi ubuntu
5) 도커 허브 이미지 업로드
* 이미지 태그 설정
# docker tag nginx newjin10/webserver:1.0
* 도커 허브 로그인
# docker login
* 이미지 업로드
[참고] private registry에 이미지 업로드
* https://myregistry.com
# docker tag nginx myregistry.com/newjin10/webserver:1.0
# docker login myregistry.com
# docker push myregistry.com/newjin10/webserver:1.0
#################################################
제 04장. 도커 컨테이너 관리
#################################################
1) 컨테이너 생성
# docker create --name web -p 80:80 nginx // -d 옵션 없음!!
2) 컨테이너 생성 & 시작
[참고] "docker create" vs "docker run"
docker create ==> pull + create
docker run ==> pull + create + start
# docker run -d --name web -p 80:80 nginx // 백그라운드
# docker run -it --name web -p 80:80 centos // 포그라운드, centos 프로세스에 따라 it 기능 달라짐
# docker run --rm --name web --network bridge busybox ip addr
3) 컨테이너 시작/종류/재시작
# docker start mycontainer
# docker stop mycontainer
# docker restart mycontainer
# docker restart mycontainer
# docker kill mycontainer
4) 컨테이터 삭제
# docker rm mycontainer
# docker rm -f mycontainer(f옵션은 동작중인 컨테이너를 9번 시그널로 강제종료 후 rm)
# alias crm='docker rm -f $(docker ps -aq)'
#################################################
제 05장. 도커 볼륨 관리 // volume: Overlay FS, bind mounts: Over Mount
#################################################
1) 도커 볼륨 생성
# docker volume create webvol
2) 도커 볼륨 사용
# docker run -d --name web -p 80:80 -v webvol:/usr/share/nginx/html nginx
3) 도커 볼륨 확인 & 상세 정보 확인
# docker volume ls
# docker volume inspect webvol
# docker inspect -f "{{ .Mounts }}" web
4) 도커 볼륨 삭제
# docker volume rm webvol
[참고] volume 방식 vs bind mount 방식
[volume]
(볼륨 생성)
# docker volume create webvol
(컨테이터 기동)
# docker run -d --name web -p 80:80 -v webvol:/usr/share/nginx/html nginx
(볼륨 확인)
# docker volume ls
# docker inspect -f "{{ .Mounts }}" web
(컨테이너 삭제)
# docker stop web && docker rm web
(볼륨 삭제)
# docker volume rm webvol
[bind mount]
(볼륨 생성)
# mkdir -p /www
(컨테이터 기동)
# docker run -d --name web -p 80:80 -v /www:/usr/share/nginx/html nginx
(볼륨 확인)
# ls -ld /www
# docker inspect -f "{{ .Mounts }}" web
(컨테이너 삭제)
# docker stop web && docker rm web
(볼륨 삭제)
# rm -rf /www
5) 도커 이미지/컨테이터 레이어
도커 이미지, 도커 이미지 레이어
도커 컨테이너, 도커 컨테이너 레이어
#################################################
제 06장. 도커 네트워크 관리
#################################################
Docker Network Driver
1) 도커 컨테이너의 네트워크 설정
# docker run -d name web -p 80:80 \
--network mynet \
--ip 172.18.0.5 \
--hostname www.test.com \
--add-host www.example.com:172.18.0.10 \
--dns 8.8.8.8 \
nginx
2) 도커 네트워크 생성
# docker network create mynet --driver=bridge
3) 도커 네트워크 목록 & 상세 정보 확인
# docker network ls
# docket network inspect mynet
4) 도커 네트워크 연결 & 해제
# docker network connect mynet myweb
# docker network disconnect mynet myweb
5) 도커 네트워크 삭제
# docker network rm [-f] mynet
# docker network prune
#################################################
제 07장. 도커 컨테이너 운용
#################################################
1) 컨테이너 연결(attach)/해제(detach)
컨테이너 콘솔 작업
연결(attach): # docker attach myweb
해제(detach): <CTRL + P + Q>
컨테이너 터미널 작업
* 연결: # docker exec -it myweb /bin/bash
* 해제: # exit
2) 컨테이너 프로세스 확인
# docker top myweb
3) 컨테이너 이름 변경
# docker rename myweb mysrv
4) 컨테이너 파일 복사
# docker cp index.html myweb:/usr/share/nginx/html/index.html
# docker cp myweb:/etc/nginx/nginx.conf nginx.conf
5) 컨테이너 차분 확인
# docker diff myweb
6) 컨테이너 로그 확인
# docker logs
#################################################
제 08장. 리소스 제한하기
#################################################
1) CPU 제한하기
* CPU 제한
# docker run -d --name c1 --cpuset -cpus 0-3 IMAGE
# docker run -d --name c1 -c 2048 IMAGE
# docker stats
2) MEM 제한하기
* MEM 제한
# docker run -d --name c1 -m 100M --memory-swap 200m IMAGE
# docker stats
3) BLOCK I/O 제한하기
* BLOCK I/O 제한
# docker run -d --name c1 --device-write-bps /dev/sda:10mb IMAGE
# docker run -d --name c1 --device-write-iops /dev/sda:100 IMAGE
# docker stats
[참고] bps(bits per second) : 초당 비트 전송 수
[참고] iops(IO per second) : 초당 I/O 개수
#################################################
제 09장. 도커 이미지 생성
#################################################
도커 이미지 생성 방법
* docker CMD 사용하여 도커 이미지 생성
* Dockerfile 사용하여 도커 이미지 생성
docker CMD 사용하여 이미지 생성
docker commit CMD(CONTAINER -> IMAGE)
* (용도) 명령어를 사용한 이미지 제작
# docker commit CONTAINER IMAGE
# docker commit -a 'Author' -m 'Message' CONTAINER IMAGE
[참고] 도커 이미지를 만드는 과정
(ㄱ) 베이스 이미지 다운로드
# docker pull ubuntu:18.04
(ㄴ) 컨테이너 기동 & 접속
# docker run -it --name myweb ubuntu:18.04
(ㄷ) 선수 패키지 설치 & 소스 코드 빌드
# apt-get update
# apt-get install default-jdk git
# git clone https://github.com/ID/REPO.git
.....
# ./gradlew build
(ㄹ) 스크립트 생성
# vi /startup.sh
-------------------------------------
#!/bin/bash
jar -jar /home/.../login-service.jar
-------------------------------------
# chmod +x /startup.sh
# exit
(ㅁ) 컨테이너를 이미지로 생성
# docker commit -a 'Author' -m 'Messages' myweb myweb-image
(ㅂ) 컨테이너 기동 & 확인
# docker run -d --name mynewweb -p 8080:8080 myweb-image /startup.sh
docker export/import CMD
* (용도) 컨테이너 분석
docker export CMD(CONTAINER -> CONTAINER.tar)
# docker export myweb > myweb.tar
# docker export myweb -o myweb.tar
# docker export myweb > myweb.tar
# tar xvf myweb.tar -C /app
# docker export myweb | tar xf - -C /app 위에 두줄을 한줄로 풀기
docker import CMD(CONTAINER.tar -> IMAGE)
# docker import myweb.tar myweb-image //이거 추천
# docker import http://docker2/myweb.tar myweb-image
# cat myweb.tar | docker import - myweb-image //사용해야할 경우 있음 -> $ sudo tar -C . | docker import - myweb-image
[참고] docker export/import
# docker export myweb | tar xf - -C /myweb
# vi /myweb/* (수정)
# cd /myweb ; tar -C . | docker import - myweb-image
docker sabe/load CMD
* (용도) 컨테이너 이미지 백업/복구
docker save CMD
docker load CMD
Image Variants는 교육과정에서 뺌
컨테이터 관리하듯이 variants틀ㅇ이 있음
프로바이저 사용할 수 있는데 우리가 vmware를 사용하면
vm에 vm이 필요함
Dockerfile를 사용하여 이미지 생성 // 가장 중요한 단원
1) docker build CMD(Dockerfile, dockerfile)
# docker build -t app .
# docker build -t app --no-cache .
# docker build -t app -f Dockerfile2 .
# docker build -t app -f Dockerfile2 /root/docker
# docker build -t - . < docker.tar.gz
# cat docker.tar.gz | docker build -t - .
2) Dockerfile 파일
https://docs.docker.com/engine/reference/builder/
Dockerfile(dockerfile)
----------------------------------------------------
FROM busybox
FROM busybox:1.0
FROM busybox:1.0@..........(.은 해시값)
----------------------------------------------------
RUN apt-get -y install git
RUN ["apt-get", "-y", "install git"]
----------------------------------------------------
CMD nginx -g 'daemon off;'
CMD ["nginx", "-g", "daemon off;"]
[참고] RUN vs CMD
----------------------------------------------------
ENTRYPOINT nginx -g 'daemon off;'
ENTRYPOINT ["nginx", "-g", "daemon off;"]
[참고] CMD vs ENTRYPOINT
[참고] ENTRYPOINT + CMD
ENTRYPOINT ["top"]
CMD ["-d", "10"]
----------------------------------------------------
WORKDIR /first/second/third
ENV WORKPATH /first/second
WORKDIR $WORKDIR
----------------------------------------------------
ENV VAR value
ENV ABC=hello (권장)
ENV ABC=hello DEF=world
ENV GIH=$ABC
----------------------------------------------------
USER user01
USER user01:user01
----------------------------------------------------
COPY index.html /var/www/html
COPY ./html/ /var/www/html/
ADD src.tar /var/www/html
ADD http://internet/src.tar.gz /var/www/html
ADD home* /mydir/
[참고] COPY vs ADD // COPY < ADD
----------------------------------------------------
LABEL title="webapp"
LABEL author="Mr, Baik"
LABEL version="2.0"
----------------------------------------------------
EXPOSE 80 # => EXPOSE 80/tcp
EXPOSE 80/tcp
EXPOSE 21 20
EXPOSE 53/udp
----------------------------------------------------
VOLUME /var/log
VOLUME /var/log /was
VOLUME ["/var/log"]
VOLUME ["/var/log", "/was"]
----------------------------------------------------
12개
<지우심>
CMD ./script.sh -> docker run -d IMAGE /bin/bash
vs
ENTRYPOINT ./script.sh -> /bin/bash 대체 불가능
-------------------------------------------------
ONBUILD
3) Best Practice
멀티스테이지 빌드
BASE IMAGE 선택(alpine, busybox)
Image Layer 줄이기 // && 기호 잘 쓰기
RUN apt-get update && \
RUN apt-get -y install apache2 PKG2 PKG3 ...
Dockerfile 내에서 자주 변경 되는 내용(RUN ...)이 있다면 뒤에 배치한다.
#################################################
[참고] 패키지 관리자(Package Manager) 2023.09.27 4교시
#################################################
RedHat 계열
파일 포맷: PKG.rpm
yum update
yum upgrade
yum search PKG
yum list 'gcc*'
yum install PKG
yum localinstall PKG.rpm
yum remove PKG
Debian 계열
apt-get CMD, apt CMD (apt-get < apt)
- OS: Debian 계열
파일 포멧: PKG.deb
apt-get update
apt-get upgrade
[참고] yum과 차이점:
yum은 자동으로 목록을 가져오지만 apt-get은 목록을 가져오라고 해야됨
apt update // dnf update와 같음
apt upgrad
# 패키지 검색
apt-cache search PKG
apt search PKG
apt list 'gcc*'
apt-get install PKG
apt install PKG
apt-get remove PKG
apt-get purge PKG
[차이점]: purge 다 지워짐, remove con.f는 안지워짐
apt remove PKG
apt purge PKG
Alpine
파일 포맥: PKG.apk
apk add PKG
apk del PKG
apk update // 목록만
apk upgrade // 모든 패키지 업그레이드
연어
Python
* pip3 PKG
패키지 저장소(PyPI: Python Package Index)
# 파이썬 버전 확인
pip3 --version
pip3 help
# 설치된 모든 패키지 확인
pip3 list
pip3 install PKG
pip3 install -r requirements.txt
pip3 uninstall PKG
pip3 download PKG
go
go CMD
node.js
운영체제마다
redhat
debaian ubuuntu
dlpine busyfox
언어별로 go
#################################################
제 10장. 도커 이미지 레지스트리
#################################################
도커 이미지 자동 빌드(Autuomated Build)
1) 자동 빌드
CI/CD
(예) Jenkins + GitHub(GitAction) + DockerHub(Registry)
* (예) GCP: Container Builder API, Source Repositories API, Container Registry API
2) 대표적인 CI/CD도구
Jenkins
CircleCI
TeamCity
BuildKite
TravisCI
GitHub Actions
* GitLab
레지스토리(Registry)
1) 로컬 레지스트리(인증 X, HTTPS X)
docker run -d --name myregistry -p 5000:5000 \
--restart-always \
registry
docker run -d --name myregistry -p 8000:8000 \
-e REGISTRY_HTTP_ADDR=0.0.0.0:8000 \
--restart-always \
registry
docker run -d --name myregistry -p 8000:8000 \
--restart-always \
-e REGISTRY_HTTP_ADDR=0.0.0.0:8000 \
-v /mnt/registry:/var/lib/registry \
registry
2) 프라이빗 레지스트리) 인증 O, HTTPS O)
[참고] Registry Web UI
3) 퍼블릭 레지스트리
$ docker tag myimage jan4sc/myimage
$ docker login
$ docker push jang4sc/myimage
4) 클라우드 레지스트리(EX: GCP)
* 구글 계정 생성
www.google.com 계정 생성
* 구글 계정을 가지고 GCP 계정 등록
console.cloud.google.com -> 무료 계정 등록
* 새로운 프로젝트 생성
GCP 웹 콘솔 > IAM 및 관리자 > 리소스 관리 > 프로젝트 만들기
* Google Container Registry API 사용
GCP 웹 콘솔 > API 및 서비스 > 라이브러리 > 검색: Google Container Registry API
* 리눅스에 Cloud SDK 설치하기
- https://cloud.google.com/sdk/docs/install-sdk#rpm
* 컨테이너 이미지를 GCP(Google Container Registry)에 Push
$ gcloud init
$ export PROJECT_ID=$(gcloud config list project --format "value(core.project)"
$ docker tag ubuntu asia.gcr.io/$PROJECT_ID/testimage
$ gcloud docker -- push asia.gcr.io/$PROJECT_ID/testimage
* GCP 웹 콘솔에서 확인
GCP 웹 콘솔 > CI/CD > Container Registry > 이미지
#################################################
제 11장. 도커 컴포즈
#################################################
[참고] docker CMD vs docker compose CMD
* docker CMD -> 하나의 컨테이너 관리
* docker-compose CMD -> 여러개의 컨테이너 관리
[참고] Dockerfile 파일 vs docker-compose.yml
* dokcerfile -> 컨테이너 이미지를 빌드
* docker-compose.yml -> 컨테이너 기동/종료/재시작
도커 컴포즈 설치
도커 컴포즈 파일
1) 컴포즈 파일 이름
2) 컴포즈 파일
https://docs.docker.com/compose/compose-file/
docker-compose.yml
services:
web:
image: nginx
service:
web:
build: .
services:
web:
build: /data/dockerfile-alternate
services:
web:
build:
context: /data
dockerfile: dockerfile-alternate
services:
web:
ports:
- "80:80"
- "8080:8080"
expose:
- "80"
services:
web:
depends_on:
- db
services:
web:
environment:
- VAR1=value1
- VAR2=value2
services:
web:
environment:
VAR1=value1
VAR2=value2
services:
web:
env_file:
- ./envfile1
- ./envfile2
services:
db:
image: mysql
volumes:
- /var/lib/mysql (볼륨)
- dbdata:/var/lib/mysql
- /dbdata:/var/lib/mysql (바인딩 마운팅)
ports:
- "3306"
volumes:
services:
db:
image: mysql
networks:
- mynet
networks:
도커 컴포즈 명령
docker compose CMD
# docker compose version
# docker compose up
# docker compose up -d
# docker compose up --build
# docker compose up --scale SERVICE=5 --scale SERVICE=10
# docker compose ps
# docker compose ps -a
# docker compose ps SERVICE
# docker compose ps --format json | jq .
# docker compose ps -q
# docker compose logs
# "docker compose run SERVICE
[참고] docker exec -it CONTAINER /bin/bash" vs docker compose run SERVICE /bin/bash
# docker compose start [SERVICE...]
# docker compose stop [SERVICE...]
# docker compose pause [SERVICE...]
# docker compose unpause [SERVICE...]
# docker compose kill -s SIGINT|SIGKILL
# docker compose config
# docker compose config SERVICE
# docker compose top
# docker compose rm
# docker compose rm -f
// stop만 시킴
# docker compose down
# docker compose down -v
// stop 시키고 지움, v옵션은 함부로 사용 x
[참고] "docker compose rm" vs "docker compose down"
FROM python:3.7-alpine # base image 설정
WORKDIR /code # 작업디렉토리
ENV FLASK_APP=app.py # 환경변수
ENV FLASK_RUN_HOST=0.0.0.0 # 환경변수
RUN apk add --no-cache gcc musl-dev linux-headers # gcc 및 기타 종속성 패키지 설치
COPY requirements.txt requirements.txt # python 종속성 파일 복사
RUN pip install -r requirements.txt # python 종속성 패키지 설치
EXPOSE 5000 # 컨테이너 대기 포트 5000
COPY . . # 이미지의 작업 디렉토리(.)에 현재 프로젝트 디렉토리 복사
CMD ["flask", "run"]
docker network create mynet
docker run -d --name mongodb --network mynet --restart=always \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_USERNAME=example \
mongo
docker run -d --name mongo-express --network mynet --restart=always \
-p 8081:8081 \
-e ME_CONFIG_MONGODB_ADMINUSERNAME=root \
-e ME_CONFIG_MONGODB_ADMINPASSWORD=example \
-e ME_CONFIG_MONGODB_URL="mongodb://root:example@mongodb:27017/" \
mongo-express
docker run -d --name postgresdb --network mynet --restart=always \
-e POSTGRES_PASSWORD=password postgres
docker run -d --name adminer --network mynet --restart=always \
-p 8080:8080 adminer
07_composetest-web-1 | 'FLASK_ENV' is deprecated and will not be used in Flask 2.3. Use 'FLASK_DEBUG' instead.
https://parkjh7764.tistory.com/148
https://kozeldark.tistory.com/166
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
projece ID:
pparkyou1234-1234
gcloud config set project PROJECT_ID:
gcloud config set project pparkyou1234-1234