Docker Team Semi Project

양승현·2022년 8월 27일
1

docker

목록 보기
11/12

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 연결

  • nfs 설치
rapa@seunghyun:~/0826$ sudo apt install nfs-common
  • ip 필터링하여 접속 허용
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 파일 작성

  • index.html 파일 작성
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 파일 작성

  • httpd 컨테이너와 HAproxy 배포
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
  • Docker Stack 배포
rapa@seunghyun:~/0826$ docker stack deploy -c blog.yml blog

0개의 댓글