# 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
# 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 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 이동하여 파일 확인
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
컨테이너의 제한사항을 극복하기 위해 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