Docker-compose & Swarm

박기원·2022년 7월 13일
0

Docker

목록 보기
2/2
post-thumbnail

Docker-compose 설치

# curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

Docker-compose Wordpress

# mkdir my_wordpress && cd $_

# vi docker-compose.yml

version: "3.3"    
services: # 컨테이너 하나를 services라고 부른다.
  dbserver:
    image: mysql:5.7
    volumes: # 도커 볼륨(db_data)을 통해 관리하고 docker volume list로 확인 가능
      - db_data:/var/lib/mysql # 호스트:컨테이너
      # /var~ 에 저장되는 mysql 정보를 db_data로 백업
    restart: always
    environment: # 환경변수 Dockerfile 의 -e옵션과 동일, 변수값을 꼭 지켜줘야함, 컨테이너 안에 저장
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
  wordpress:
    depends_on: # 우선순위 
      - dbserver # wordpress는 db보다 먼저 실행될 수 없다. 
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html # 호스트:컨테이너
    ports: # -p 80:80	
      - "80:80"
    restart: always
    environment: # 환경변수 값들은 컨테이너 안에 저장 wp-config에 들어감
      WORDPRESS_DB_HOST: dbserver:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
      WORDPRESS_DB_NAME: wordpress
volumes: 두 개의 컨테이너에서 나온 두 개의 볼륨을 사용하겠다고 선언하는 것
  db_data: {}
  wordpress_data: {}

Docker-compose 실행

# docker-compose up -d
# docker-compose ps
# docker-compose pause
# docker-compose unpause
# docker-compose port wordpress 80

80포트 컨테이너와 연결된 포트가 무슨 포트인지 확인

# docker-compose config
# docker-compose stop wordpress
# docker-compose rm wordpress
# docker-compose down

볼륨이 연결되어 있기 때문에 compose를 다운 후 다시 업 해도 데이터 손실 x

# docker-compose down --rmi all

# docker volume ls
# docker inspect my_wordpresss_wordpress_data
볼륨을 검색해 해당 볼륨의 inspect를 확인한 후 Mountpoint 이동하여 파일 확인

Docker 컨테이너 모니터링

VERSION=v0.44.0 # use the latest release version from https://github.com/google/cadvisor/releases
docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  --privileged \
  --device=/dev/kmsg \
  gcr.io/cadvisor/cadvisor:$VERSION

Docker Swarm (Cluster)

컨테이너의 제한사항을 극복하기 위해 Swarm의 최소 단위는 container가 아닌 task 이다.

# firewall-cmd --permanent --zone=public --add-port=2377/tcp
# firewall-cmd --reload
# hostnamectl set-hostname master1

# cat <<EOF >> /etc/hosts
192.168.0.192 manager1
192.168.0.192 worker1
192.168.0.141 worker2
EOF

# docker swarm init --advertise-addr 192.168.0.140

매니저 토큰이 생성되어 해당 토큰을 worker1,2에 붙여넣으면 worker로 join된다.
각 노드들은 매니저가 사용하는 명령들을 사용할 순 없지만 promote 시키면 가능하긴 하다.

# docker swarm join --token SWMTKN-1-0vkdjidcs2fmu7wn8nltkyidkpad4h0nrrknukqu0vymxlsv6z-dblxviuzbpet21peke80foobo 172.25.0.136:2377
# docker node ls
# docker service create --name my_web --replicas 3 --publish published=8080,target=80 nginx

--replicas 3 => Desired State => 3개의 호스트 (컨트롤러 포함)
--publish published=8080, target=80 => -p 8080:80

3개로 설정을 했기 때문에 컨테이너를 지워도 계속 3개로 유지된다.


# docker service ls
# docker service ps my_web
# docker service logs my_web
# docker service inspect --pretty my_web

--pretty 옵션 => 깰~껌! 하게 나온당. 안쓰면 좀 더 자세하게 나오긴 한다.

# docker service scale my_web=5
# docker service ps my_web
# docker service rm my_web

롤링 업데이트

# docker service ps my_web
# docker service inspect --pretty my_web
# docker service update --image halilinux/web-site:v1.0 my_web
# docker service ps my_web
# docker service rollback my_web

무중단 서비스를 위해 끊기지 않고 업데이트가 된당

클러스터에서 특정 노드 드레인하기

# docker node ls
# docker service ps my_web
# docker node update --availability drain worker1

node availablity를 Active에서 Drain 상태로 바꾼다.

pause와 drain의 차이 
가지고 있는 컨테이너는 운영하지만 앞으로 스케일 아웃하는 컨테이너는 생성하지 않는다.

# docker node inspect --pretty worker1
# docker service ps my_web
# docker node update --availability active worker1
# docker node inspect --pretty worker1
# docker node ls

0개의 댓글