[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
'Docker' 카테고리의 다른 글
[Docker] 클라우드를 위한 쿠버네티스&도커 - 7주차 (node.js를 이용한 Chat-app) (0) | 2024.08.12 |
---|---|
[Docker] 클라우드를 위한 쿠버네티스&도커 - 5주차 (인그레스 Ingress) (2) | 2024.07.26 |
[Docker] 클라우드를 위한 쿠버네티스&도커 - 4주차 (Redis&Voting app) (2) | 2024.07.26 |
[Docker] 클라우드를 위한 쿠버네티스&도커 - 1주차 (wordpress) (7) | 2024.07.18 |