Team semi Project
http://192.168.1.99/ --> 192.168.1.100:8001 --> default-proxy --> default1
--> default2
--> default3
http://192.168.1.99/shop --> 192.168.1.101:8002 --> shop-proxy --> shop1
--> shop2
--> shop3
HAProxy를 이용한 Docker Swarm Mode 환경을 구성 (ubuntu)
프로젝트 전 기본 셋팅
rapa@manager:~$ sudo hostnamectl set-hostname seunghyun
rapa@manager:~$ sudo vi /etc/netplan/01-network-manager-all.yaml
network:
ethernets:
ens32:
addresses: [192.168.1.112/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 168.126.63.1]
dhcp4: no
version: 2
rapa@seunghyun:~$ sudo netplan apply
rapa@seunghyun:~$ docker node rm worker1
worker1
rapa@seunghyun:~$ docker node rm worker2
worker2
rapa@seunghyun:~$ docker node rm worker3
worker3
rapa@seunghyun:~$ docker swarm leave --force
Node left the swarm.
worker1
NFS 연결
rapa@seunghyun:~/0826$ sudo apt install nfs-common
vi /etc/exports
/cloud 192.168.1.112/24(rw,sync,no_root_squash)
/cloud kvm1() - 클라우드 디렉터리를 kvm1번에게
rw - 읽고쓰도록 권한을 주고
sync - 동기화되도록하게
no_root_squash - kvm1번의 root 계정이 storage에서도 root로 동작할 수 있게끔한다.
- 영구적으로 마운트하려면 다음과 같은 항목을 추가
vi /etc/fstab
192.168.1.103:/cloud /remote nfs defaults 0 0
- manager가 마운트한 모든 디렉토리 목록을 표시
rapa@seunghyun:~/0826$ showmount -e 192.168.1.103
- manager의 /public 파일과 내가 생성한 remote파일을 마운트
rapa@seunghyun:~$ sudo mount -t nfs 192.168.1.103:/public remote
rapa@seunghyun:~$ ls remote
token
- 파일 안에는 manager가 nfs를 통해 공유한 Swarm 구축을 위한 Token이 발행되어 있다
rapa@seunghyun:~$ cat remote/token
토큰
- 발행된 토큰을 통해 manager의 worker 소속이 된다.
rapa@seunghyun:~$ docker swarm join --token SWMTKN-1-토큰
worker에서의 라벨 지정 및 네트워크 생성
- manager에서 worker를 docker node promote seunghyun을 통해 manager로 승격을 시켜주게 되면 작업을 시작한다.
- 먼저 worker에 대한 라벨을 지정해준다.
rapa@seunghyun:~/0826$ docker node update --label-add name=seunghyun seunghyun
- 내부 통신을 위한 overlay 네트워크를 생성한다
rapa@seunghyun:~$ docker network create --driver=overlay --attachable blog
Dockerfile 작성 및 yml 파일 작성
rapa@seunghyun:~/0826$ curl https://velog.io/@yange > index.html
- index.html 파일을 적용시키는 dockerfile 작성
rapa@seunghyun:~/0826$ vi Dockerfile
rapa@seunghyun:~/0826$ cat Dockerfile
FROM httpd:alpine
RUN index.html /usr/local/apache2/htdocs
rapa@seunghyun:~/0826$ cat Dockerfile
FROM ubuntu:18.04
RUN apt update
RUN apt -y install apache2
ADD index.html /var/www/html
EXPOSE 80
CMD apache2ctl -D FOREGROUND
rapa@seunghyun:~/0826$ docker build -t 192.168.1.119:5000/blog:5.0 .
insecure 적용 및 이미지 저장하기
rapa@seunghyun:~/0826$ sudo vi /etc/init.d/docker
DOCKER_OPTS=--insecure-registry 192.168.1.119:5000
rapa@seunghyun:~/0826$ sudo vi /etc/docker/daemon.json
{ "insecure-registries": ["192.168.1.119:5000"] }
rapa@seunghyun:~/0826$ docker push 192.168.1.119:5000/blog:5.0
rapa@seunghyun:~/0826$ docker pull 192.168.1.119:5000/blog:5.0
docker stack yml 파일 작성
rapa@seunghyun:~/0826$ vi blog.yml
rapa@seunghyun:~/0826$ cat blog.yml
version: '3.7'
services:
httpd:
image: 192.168.1.119:5000/blog:5.0
deploy:
replicas: 3
placement:
constraints:
- node.labels._role==worker
- node.labels.name!=seunghyun
restart_policy:
condition: on-failure
max_attempts: 2
environment:
SERVICE_PORTS: 80
networks:
- blog
proxy:
image: dockercloud/haproxy
depends_on:
- httpd
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports: # -p option, attached to ingress network
- "8881:80"
networks: # backend network -> httpd containers
- blog
deploy:
mode: global
placement:
constraints: [node.labels.name == seunghyun]
networks:
blog:
external: true
rapa@seunghyun:~/0826$ docker stack deploy -c blog.yml blog