도커 과정 정리

그레이블루·2023년 9월 21일
0
  1. (준비 작업) 도커 환경 구성

    1) 작업 계획
    GOLD Image Clone
    -> docker1 VM
    -> docker2 VM

    2) 필수 작업 - VM clone 한 후 최소 작업

    • 호스트 이름 변경
      docker1.example.com
      docker2.example.com
    • 네트워크 설정
      docker1: 192.168.10.10/24
      docker2: 192.168.10.20/24
      GW: 102.168.10.2
      DNS: 192.168.10.2

    3) VM 용도

    • docker1 - 주로 작업
    • docker2 - 테스트 용도

    4) Ansible 이용하여 환경 구성
    (docker1)

    • 패키지 설치

      • epel-release
      • ansible
    • 키 페어 생성 & 배포(docker1 -> {docker1, docker2})

      • 키 페어 생성: ssh-keygen
      • 키 페어 배포: ssh-copy-id
    • vscode 다운로드 & 설치 & 실행

      • extensions 설치
        • korean language pack
        • ansible
    • ansible.cfg 파일 생성

    • inventory 생성

    • playbook 생성

      # code --no-sandbox --user-data-dir=/root/vscode

#################################################
제 01장. 컨테이너와 도커
#################################################

  1. 컨테이너
    컨터이너?
    컨테이너 기술의 종류

  2. 도커
    도커?: 컨테이너 기술의 한 가지 종류
    도커 기능
    빌드(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(여러개)

  3. 도커 기반 기술

    • chroot + namespace
    • cgroups
    • network
    • storage

#################################################
제 02장. 도커 설치
#################################################

  1. (데스크탑) 도커 데스크탑 설치
    1) 포함된 기능: 도커 + 쿠버네티스

    2) 도커 데스크탑 설치
    Mac
    Windows
    * Linux

  2. (서버) 도커 엔진 설치
    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

  • drive- - network name -
  • bridge => bridge(VMnet8)
  • host => host(VMnet0)
  • null => none
  • bridge => mynet(VMnet8)

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 사용하여 도커 이미지 생성
  1. 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이 필요함

  1. Dockerfile를 사용하여 이미지 생성 // 가장 중요한 단원

    man 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 계열

  • yum CMD, dnf CMD (yum < dnf)
    - OS: 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

  • apk CMD
    - OS: 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장. 도커 이미지 레지스트리
#################################################

  1. 도커 이미지 자동 빌드(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

  2. 레지스토리(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)

(준비작업)

1) 인증서 생성

2) 인증 설정(ID/PASS)

(프라이빗 레지스트리 구성)


[참고] 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. 도커 컴포즈 파일

    1) 컴포즈 파일 이름

    • compose.yml, compose.yaml
    • docker-compose.yml, docker-compose.yaml

    2) 컴포즈 파일
    https://docs.docker.com/compose/compose-file/

    docker-compose.yml

    • top level element
      - version: 1.0 정의x
      • name: 정의x
      • services:
      • networks: 자동생성
      • volumes: 랜덤으로 생성
      • configs: 쿠버
      • secrets: 네스티

    version: '1.0'

    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"

    [참고] ports vs expose

    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:

    dbdata:

    services:
    db:
    image: mysql
    networks:
    - mynet
    networks:

    mynet

  3. 도커 컴포즈 명령

    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"

syntax=docker/dockerfile:1

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

profile
클라우드 엔지니어 취업준비생

0개의 댓글