본문 바로가기
Docker

[Docker] 클라우드를 위한 쿠버네티스&도커 - 2주차 (docker compose)

by 지금은4시11분 2024. 7. 19.

[docker compose]


*도커 컴포즈란?
-단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구

*왜 설치해?
-도커 컴포즈를 사용하지 않는다면, 테스트할 때 각 컨테이너를 하나씩 생성해야 함.
 웹 어플리케이션을 테스트하려면 웹 서버 컨테이너, 데이터베이스 컨테이너 -> 2개의 컨테이너가 필요
 즉, 두개의 run 명령어 필요
 
 $ docker run --name wordpress_db -d mysql:8
 $ docker run -d -p 8080:80 --link wordpress_db:mysql --name wp workdpress:latest

 위처럼 wordpress 와 mysql 컨테이너를 2개 생성할 수도 있지만,
 여러개의 컨테이너를 하나의 서비스로 정리해 컨테이너 묶음으로 관리할 수 있다면 더욱더 편리하다.

 

#docker compose 설치
$ sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

#docker composer 설치 되었는지  버전 확인
$ docker-compose -v

#docker-compose 파일에 실행권한을 추가하여, 이 파일을 사용자가 실행할 수 있게 함
$ sudo chmod +x /usr/local/bin/docker-compose

 

[yml 파일 생성 (docker-compose.yml)]

vi [파일명].yml 또는 gedit [파일명].yml 으로 생성

version: '2'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
      
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wp_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress

volumes:
  db_data:
  wp_data:

 

#옵션 설명

version : yaml 파일 포맷의 버전

services : 생성될 컨테이너들을 묶어놓은 단위

image : 서비스의 컨테이너를 생성할 때 쓰일 이미지의 이름을 설정. 이미지 이름 포맷은 docker run과 같음

links : docker run 명령어의 --link와 같으며, 다른 서비스에 서비스명만으로 접근할 수 있도록 설정.

environment : docker run 명령어의 --env와 같으며, 서비스의 컨테이너 내부에서 사용할 환경변수 지정

 

$ mkdir db_data
$ mkdir wp_data

#foreground로 도커 컴포즈 프로젝트 실행
$ docker-compose up

 

http://localhost:8000 접속 해보기

 

#결과

 

▼에러발생시 참고

더보기

*에러가 발생했다면?

#로그확인
$ docker-compose log db
$ docker-compose log wordpress
더보기

*권한 에러라면?

#docker-compose의 mysql을 exec로 컨테이너에 접속해서 권한부여
$ docker-compose exec db mysql -u root -p
$ GRANT ALL PRIVILESGES ON wordpress.*TO'wordpress'@%'IDENTIFIED BY 'wordpress';
$ FLUSH PRIVILEGES;
$ SHOW GRANTS FOR 'wordpress'@%';

#프로젝트 내 컨테이너 및 네트워크 종료 및 제거
$ docker-compose down

#background로 도커 컴포즈 프로젝트 진행
$ docker-compose up -d

 

[루비를 이용한 서버 만들기] 

#Gemfile.txt 생성

source 'https://rubygems.org'
gem 'sinatra'
gem 'rackup'

 

#app.rb.txt 생성

require 'sinatra'
require 'socket'

get '/' do
  Socket.gethostname
end

 

$ sudo dnf install rubygem-bundler

#ruby 설치 확인
$ ruby --version

#--rm옵션 : 컨테이너를 일회성으로 실행, 컨테이너가 종료될 때 컨테이너와 관련된 리소스(파일시스템, 볼륨)까지 삭제
$ docker run --rm -p 4567:4567 -v $PWD:/usr/src/app -w /usr/src/app ruby bash -c "bundle install && bundle exec ruby app.rb -o 0.0.0.0"

 

[node.js를 이용한 도커 이미지 빌드&배포] 

 

*컨테이너는 Dockerfile -> image -> container 의 구조로 생성된다.  

 

$ mkdir docker-demo
$ cd docker-demo

#Dockerfile 생성 - 도커파일은 반드시 이름이 Dockerfile 이어야함
$ vi Dockerfile

#node.js 실행환경을 위해 node라는 이미지를 상속받는다는 뜻
FROM node:14

WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .

EXPOSE 3000
CMD ["node","app.js"]

$ gedit app.js

const http = require('http')

const hostname = '0.0.0.0'
const port = 3000;
const server = http.createServer((req,res)=>{
res.statusCode = 200;
res.setHeader('Content-Type','text/plain');
res.end('Hello, World!\n');
});

server.listen(port, hostname, ()=>{
console.log(`Server Running at http://${hostname}:${port}/`);
});

$ docker login

#도커빌드
$ docker build -t my-node-app .

#도커실행 정상동작 확인
$ docker run -p 3000:3000 my-node-app
$ docker push my-node-app

#도커허브계정명/올리고싶은 이름:버전정보
$ docker pull eujeann/myfirst-app:1
$ docker run -p 3100:3100 eujeann/myfirst-app:1

 

#도커빌드 결과

 

 

 

[쿠버네티스 설치]

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube
$ sudo install minikube /usr/local/bin

#버전 확인
$ minikube version

#가상머신 시작
$ minikube start --driver=docker

#상태확인
$ minikube status

$ minikube stop 
$ minikube delete

 

[kubectl 설치]

1) kubectl

- 쿠버네티스 클러스터에 명령을 내리는 CLI (쿠버네티스에게 웹서버 n개 실행해줘! 라고 요청하는 것)

- 주목적? - 쿠버네티스의 상태를 확인하고 원하는 상태를 요청 / 컨테이너 로그 확인 및 원격 접속 가능하게 해줌

 

2) 명령어 종류

- apply : 원하는 상태 적용 (주로 -f 옵션과 함께 사용)

- get [타입] : 리소스 리스트 조회 ex) kubectl get pod , kubectl get all 

- describe : 리소스 상태 상세 조회

- delete : 리소스 제거 ex) kubectl delete pod[타입]/[리소스 이름]

- logs : 컨테이너 로그 조회

- exec : 컨테이너에 명령어 전달 (주로 컨테이너 접근 시 사용)

- config : kubectl 설정 관리

#local에 kubectl 설치
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl

#설치 확인
$ kubectl version --client
$ kubectl apply -f worldpress-kube.yml
$ kubectl get all

 

$ gedit worldpress-kube

더보기
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
        - image: mariadb:10.7
          name: mysql
          env:
            - name: MYSQL_DATABASE
              value: wordpress
            - name: MYSQL_ROOT_PASSWORD
              value: password
          ports:
            - containerPort: 3306
              name: mysql

---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
        - image: wordpress:5.9.1-php8.1-apache
          name: wordpress
          env:
            - name: WORDPRESS_DB_HOST
              value: wordpress-mysql
            - name: WORDPRESS_DB_NAME
              value: wordpress
            - name: WORDPRESS_DB_USER
              value: root
            - name: WORDPRESS_DB_PASSWORD
              value: password
          ports:
            - containerPort: 80
              name: wordpress

---
apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  type: NodePort
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend