Post

[DevOps]Docker

가상환경 관리

가상환경은 프로젝트별로 독립적인 Python 개발 환경을 생성하고 관리하는 데 사용됩니다. 가상환경을 사용하면 서로 다른 프로젝트에서 사용하는 패키지 버전 충돌을 피하고, 프로젝트 간의 의존성을 격리하여 개발 환경을 효율적으로 유지할 수 있습니다. 즉, 원하는 환경 구축을 위해 필요한 패키지만 담아놓는 바구니 역할.

가장 널리 사용되는 도구는 ‘venv’, ‘virutalenv’, ‘conda’ 등이 있지만, 나는 pipenv와 docker를 사용한다. 사실 OS까지 모두 지정하는 Docker가 좋긴하지만 소규모 프로젝트에서는 좋지 않기에 pipenv와 병행하여 사용하고 있다.

pipenvpython에서 권장, 의존성 관리
dockeros 이미지의 전체가 포함되어 있다.

pipenv

pipenv는 pip와 virtualenv의 기능을 통합하여 사용자 친화적인 방식으로 패키지 관리와 환경 분리를 제공합니다.

  • 의존성 관리: pipenv는 Pipfile과 Pipfile.lock 파일을 사용하여 프로젝트의 의존성을 관리합니다. Pipfile은 프로젝트의 의존성 목록을 정의하고, Pipfile.lock은 정확한 의존성 버전과 호환성을 보장하는 데 사용됩니다.

  • 가상 환경 관리: pipenv는 자동으로 프로젝트별 가상 환경을 생성하여 의존성 패키지를 격리된 환경에서 관리합니다. 이를 통해 프로젝트 간의 충돌을 방지하고 의존성 버전을 일관되게 유지할 수 있습니다.

  • 자동화된 환경 설정: pipenv는 프로젝트의 의존성을 설치하고 가상 환경을 구성하는 작업을 자동화합니다. pipenv install 명령을 실행하면 Pipfile에 정의된 의존성을 설치하고 가상 환경을 생성합니다.

  • 개발 및 실행 환경 분리: pipenv는 개발 환경과 실행 환경을 분리하여 개발 시에만 필요한 의존성을 관리할 수 있습니다. Pipfile에서 [dev-packages] 섹션을 사용하여 개발에 필요한 패키지를 별도로 관리할 수 있습니다.

  • 쉬운 사용법: pipenv는 명령어의 직관적인 구조와 사용자 친화적인 출력을 제공하여 사용이 간편합니다. 의존성 추가, 삭제, 업데이트 등의 작업을 쉽게 수행할 수 있습니다.

1
2
3
4
5
6
7
pipenv install [library]
pipenv uninstall [library]

pipenv run python example.py # 가상환경에서 실행

activate # 왼쪽에 가상환경이 실행되는 것이 표시됨.
exit # 종료

Docker

Docker는 프로세스 격리 기술을 사용하여 컨테이너화된 애플리케이션을 개발, 배포 및 실행하기 위한 오픈 소스 플랫폼입니다. Docker는 애플리케이션과 해당 의존성을 격리된 환경인 컨테이너로 패키징하여 이식성이 높고 일관된 실행 환경을 제공합니다.

주요 개념 :

  • 이미지 (Image): Docker 이미지는 컨테이너 실행에 필요한 파일 시스템과 소프트웨어 구성 요소를 포함한 응용 프로그램의 실행 가능한 패키지입니다. 이미지는 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하며, 컨테이너의 기반이 됩니다.
    • 태그(TAG): 이미지의 버전을 기록
  • 컨테이너 (Container): Docker 컨테이너는 이미지의 인스턴스로, 격리된 환경에서 애플리케이션을 실행하는 독립적인 프로세스입니다. 각 컨테이너는 자체 파일 시스템, 네트워크 및 프로세스 공간을 가지며, 호스트 시스템과 분리되어 독립적으로 실행됩니다.
    • Linux Container : OS 수준의 가상화 기술로 리눅스 커널 공유 및 프로세스를 격리된 환경에서 실행하는 기술.(독립적인 환경으로 재사용이 쉬움)
  • 도커 레지스트리 (Docker Registry): Docker 이미지를 저장하고 공유하는 중앙 저장소입니다. 가장 잘 알려진 도커 레지스트리는 Docker Hub이며, 공개 이미지뿐만 아니라 개인적인 이미지 저장소를 구축할 수도 있습니다.
  • 도커 컴포즈 (Docker Compose): Docker Compose는 여러 컨테이너로 구성된 복잡한 애플리케이션을 정의하고 실행하기 위한 도구입니다. Compose 파일을 사용하여 애플리케이션의 서비스, 네트워크, 볼륨 등을 구성할 수 있습니다.

도커 시스템 정보

1
2
3
docker version or -v
docker system info
docker system df [-v]

이미지 관련 명령어

1
2
3
4
5
6
7
8
9
# 이미지 다운로드
docker pull [IMAGE NAME]:[TAG]
# 이미지 목록 확인: 
docker images
# 이미지 삭제
docker rm [IMAGE ID || IMAGE NAME]
# 이미지 생성
docker build [OPTIONS] [Docker File]
docker built . -t test:1.0

컨테이너 관련 명령어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 컨테이너 실행: 
docker run [OPTIONS] IMAGE[ :TAG | @DIGEST] [COMMAND] [ARG..]
# options
# -i:interactive mode
# -t:명령을 입력할 수는 있지만 셸이 표시되지 않는다.
# -d:백그라운드 모드
# --name:이름 설정
# --rm:프로세스종료시 컨테이너 자동 제거
# -it:터미널 입력
# 예시
docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v /my_db:/var/lib/mysql mysql:5.7

# 실행 중인 컨테이너 목록 확인: 
docker ps
# 모든 컨테이너 목록 확인: 
docker ps -a
# 컨테이너 시작: 
docker start [컨테이너명 or 컨테이너ID]
# 컨테이너 중지: 
docker stop [컨테이너명 or 컨테이너ID]
docker container stop \$(docker container ps -a -q) # 컨테이너 모두 정지
# 컨테이너 재시작: 
docker restart [컨테이너명 or 컨테이너ID]
# 컨테이너 삭제: 
docker rm [컨테이너명 or 컨테이너ID]
docker container rm $(docker container ps -a -q) # 컨테이너 모두 삭제.
# 컨테이너 로그 확인: 
docker logs [컨테이너명 or 컨테이너ID]
# 현재 컨테이너에서 이미지 생성
docker container commit -m 'Message' [containerFrom] [REPO/IMG:TAG]
# 컨테이너 실행
docker container run [image] [command]
# 컨테이너 실행 예시
docker container run ubuntu:latest /bin/echo 'Hello World'
# webserver라는 이름의 컨테이너로 nginx 이미지를 띄움, -d는 detach로 백그라운드, -p 포트 포워딩
docker container --name webserver -d -p 80:80 nginx

네트워크 관련 명령어

1
2
3
4
5
6
7
8
# 네트워크 목록 확인: 
docker network ls
# 네트워크 생성: 
docker network create [네트워크명]
# 네트워크에 컨테이너 연결: 
docker network connect [네트워크명] [컨테이너명 or 컨테이너ID]
# 네트워크에서 컨테이너 분리: 
docker network disconnect [네트워크명] [컨테이너명 or 컨테이너ID]

볼륨 관련 명령어

1
2
3
4
5
6
7
8
# 볼륨 목록 확인: 
docker volume ls
# 볼륨 생성: 
docker volume create [볼륨명]
# 컨테이너에 볼륨 연결: 
docker run -v [볼륨명]:[컨테이너내_경로] [이미지명]
# 볼륨 삭제: 
docker volume rm [볼륨명]

Docker Compose

도커 실행 시 설정해야하는 요소가 많은경우, Docker Compose를 사용하여 여러 컨테이너로 이루어진 서비스를 정의하고 실행하는 데 사용됩니다. YAML 파일 형식으로 작성되며, 컨테이너의 설정, 네트워크, 볼륨 등을 정의할 수 있습니다.

즉, 여러개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 함.

  • 컨테이너 정의: 각각의 컨테이너에 대한 정보를 작성합니다. 이 정보는 이미지, 포트 포워딩, 환경 변수, 볼륨 마운트 등을 포함할 수 있습니다.
  • 서비스 정의: 컨테이너를 그룹화하여 서비스로 정의할 수 있습니다. 각 서비스는 하나 이상의 컨테이너로 구성될 수 있으며, 서비스 간의 종속성 및 연결을 설정할 수 있습니다.
  • 네트워크 설정: 컨테이너 간의 통신을 위한 네트워크 설정을 할 수 있습니다. 도커 컴포즈는 기본적으로 서비스를 위한 별도의 네트워크를 생성하며, 컨테이너 간에 내부 DNS 이름으로 서로 참조할 수 있습니다.
  • 볼륨 마운트: 호스트 시스템의 디렉터리를 컨테이너 내부에 마운트하여 데이터의 영속성을 유지할 수 있습니다.
  • 환경 변수 설정: 컨테이너 내부에서 사용할 환경 변수를 설정할 수 있습니다.
1
2
3
4
5
6
# docker-compose download
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# Docker Compose로 애플리케이션 실행. 즉, docker-compose.yml로 정의한 컨테이너 개시
docker-compose up
# Docker Compose로 애플리케이션 중지 및 리소스 삭제
docker-compose down

docker-compose.yml 예시.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3'
  services:
    wordpress:
    depends_on: - db
    image: wordpress
    restart: always
    ports: - 80:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
  volumes: 
        - wordpress:/var/www/html
db:
  image: mysql:5.7
    **restart: always
  environment:
    MYSQL_DATABASE: exampledb
    MYSQL_USER: exampleuser
    MYSQL_PASSWORD: examplepass
    MYSQL_RANDOM_ROOT_PASSWORD: '1’
  volumes: - db:/var/lib/mysql
volumes:
  wordpress:
  db:

dockerfile

Docker 이미지를 빌드하기 위한 파일입니다. Docker 이미지는 컨테이너화된 애플리케이션을 실행하는 데 필요한 모든 종속성과 설정을 포함합니다. Dockerfile은 이러한 이미지를 생성하기 위한 지침을 담고 있습니다.

1
[command] [option] [name]/[image]:[tag] [. build context]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# FROM: 기본 이미지 설정
FROM ubuntu:20.04

# RUN: 쉘 명령어 실행
RUN apt-get update && apt-get install -y curl

# CMD: 컨테이너 기본 실행 명령어
CMD ["echo", "Hello, Docker!"]

# EXPOSE: 오픈되는 포트 정보
EXPOSE 8080

# ENV: 환경 변수 설정
ENV APP_VERSION=1.0

# ADD: 파일 또는 디렉토리 추가
ADD app.tar.gz /app/

# COPY: 파일 또는 디렉토리 추가
COPY index.html /var/www/html/

# ENTRYPOINT: 컨테이너 기본 실행 명령어
ENTRYPOINT ["echo", "Hello, Docker!"]

# VOLUME: 외부 마운트 포인트 생성
VOLUME /data

# USER: RUN, CMD, ENTRYPOINT 실행 사용자
USER nobody

# WORKDIR: 작업 디렉토리 설정
WORKDIR /app

Dockerfile을 사용하여 DOcker 이미지를 빌드하고 Docker Hub에 push하고 pull하는 과정.

1
2
3
4
5
6
7
8
9
# dockerfile 생성
docker build -t ubuntu:git-dockerfile .
# docker build
docker images | grep ubuntu
# docker hub
docker login
# docker-hub image push & pull
docker push [UID]/[IMAGE:TAG] # [UID] : Docker Hub 사용자 아이디
docker pull [UID]/[IMAGE:TAG]
  • Github Container registry : 무료로 사용할 수 있으며, 용량 제한
  • Dokcer Hub : 무료 버전은 공개 이미지 저장소로만 사용할 수 있고, 비공개 이미지 저장소를 사용하려면 유료 구독

Update. docker .env(23.02.02)

docker .env file은 .dockerignore에 들어가있음. 이런건 imagebuild할때 올리는게 아님. 그래서 아래와 같이 환경변수는 직접 입력해서 넣어줌.

1
docker run -e DB_HOST=192.168.0.51 -e DB_USER=name_space -e DB_PASS=name_space image:tag

Kubernetes

컨테이너화된 애플리케이션을 자동화하고 관리하기 위한 오픈 소스 컨테이너 오케스트레이션 플랫폼입니다. 여러 대의 호스트에서 컨테이너화된 애플리케이션을 배포, 확장, 관리하는 데 사용됩니다. 즉, 컨테이너 오케스트레이션 도구들의 표준.

주요 개념

  • 마스터 노드: Kubernetes 클러스터를 제어하고 관리하는 중앙 제어 플레인입니다. 마스터 노드에는 API 서버, 스케줄러, 컨트롤 매니저 등의 컴포넌트가 있습니다.

  • 워커 노드: 애플리케이션 컨테이너가 실행되는 호스트입니다. 워커 노드는 컨테이너 실행을 담당하는 컨테이너 런타임(예: Docker), Kubelet(노드 관리자) 등의 컴포넌트로 구성됩니다.

  • 파드(Pod): Kubernetes에서 실행되는 가장 작은 배포 단위입니다. 하나 이상의 컨테이너 그룹으로 구성되며, 공유 네트워크 및 스토리지 리소스를 함께 사용할 수 있습니다.

  • 서비스(Service): 파드의 집합에 대한 네트워크 엔드포인트를 논리적으로 그룹화하고 안정적인 DNS 이름으로 액세스할 수 있도록 제공합니다.

  • 볼륨(Volume): 컨테이너에서 사용되는 데이터를 영구적으로 저장하기 위한 디렉토리 또는 파일입니다. 볼륨은 파드 내의 컨테이너에 마운트되며, 컨테이너 간 데이터 공유와 데이터 보존을 가능하게 합니다.

  • 레플리카셋(ReplicaSet): 파드의 복제본을 관리하는 Kubernetes 리소스입니다. 레플리카셋은 지정된 수의 파드 복제본을 유지하도록 조정하고, 스케일링 및 롤링 업데이트와 같은 작업을 수행합니다.

  • 디플로이먼트(Deployment): 레플리카셋을 사용하여 애플리케이션 배포와 관리를 자동화하는 Kubernetes 리소스입니다.

Installing kubectl:

1
2
3
4
5
6
Linux: Use the following commands:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

Windows: Download the kubectl binary from the following URL: https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/windows/amd64/kubectl.exe and add it to your system's PATH.

kubectl Cheat Sheet

Get information:

1
2
3
4
5
kubectl version # Show Kubernetes client and server version
kubectl cluster-info # Display cluster information
kubectl get nodes # List all nodes in the cluster
kubectl get pods # List all pods in the cluster
kubectl get deployments # List all deployments in the cluster

Create and manage resources:

1
2
3
4
kubectl create -f <manifest.yaml>           # Create resources defined in a manifest file
kubectl apply -f <manifest.yaml>            # Apply changes to resources defined in a manifest file
kubectl delete <resource> <name>            # Delete a resource by name
kubectl scale <resource> <name> --replicas=<count>   # Scale the number of replicas for a resource

Interact with resources:

1
2
3
4
kubectl logs <pod>                         # View logs of a pod
kubectl exec -it <pod> -- <command>         # Run a command in a pod
kubectl port-forward <pod> <local-port>:<pod-port>  # Forward a local port to a pod
kubectl describe <resource> <name>          # Describe a resource in detail

Troubleshooting and debugging:

1
2
3
4
5
6
kubectl get events                         # Show events in the cluster
kubectl top nodes                          # Display resource usage of nodes
kubectl top pods                           # Display resource usage of pods
kubectl describe node <node-name>          # Describe a node in detail
kubectl describe pod <pod-name>            # Describe a pod in detail
Additional commands:

Additional commands:

1
2
3
4
kubectl config view                        # View and manage kubeconfig files
kubectl create secret generic <name> --from-literal=<key>=<value>   # Create a secret
kubectl get namespaces                     # List all namespaces in the cluster
Please note that the above commands are just a subset of the available kubectl commands. You can refer to the official Kubernetes documentation for more detailed information on using kubectl.

VSC에 Docker 컨테이너를 연결

  1. docker container 실행
  2. VSC연결
  3. “REMOTE - SSH”, “REMOTE-Containers” 등 설치 후 원격접속기로 접속.

AWS EC2 instance 연결

  1. AWS CLI 활용
    • install AWS CLI
    • Configure AWS CLI
      1
      
       aws configure
      
    • AWS CLI Connection
      1
      
       aws ec2 descrive-instances
      
  2. kubectl
    • get Pods
      1
      
       kubectl -n [name-space] get pods
      
    • port Forwarding
      1
      
       kubectl -n [name-space] port-forward [pods] [local]:[target]
      
EKS
AWS 제공하는 Kubernetes 서비스

REFERENCE

[1] : pipenv
[2] : VSC에서 Docker를 개발 환경으로 사용
[3] : SSH 연결하기
[4] : 도커와 컨테이너의 이해
[5] : Dockerfile 작성방법 및 이해

This post is licensed under CC BY 4.0 by the author.