【Docker进阶-06】docker-compose & docker swarm

【Docker进阶-06】docker-compose & docker swarm

compose + docker swarm == 集群部署

docker-compose

https://docs.docker.com/compose/install/

https://docs.docker.com/reference/compose-file/services/#build

场景: 一个复杂的应用,不是启动一个容器就能完成的,比如:app = nginx + web + mysql +redis

以后只要启动app,创建app。都得run 4个,保证网络畅通+挂载ok

docker-compose:可以写一个yaml文件。指定所有需要启动的内容。docker-compose up/down

compose文件名 docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml

compose创建了自定义网络,大家都能通

安装

bash 复制代码
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.0/dockercompose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

compose官方示例

https://docs.docker.com/compose/gettingstarted/

app.py

python 复制代码
import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return f'Hello World! I have been seen {count} times.\n'

compose.yaml:

yaml 复制代码
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

Dockerfile:

bash 复制代码
# syntax=docker/dockerfile:1
FROM python:3.10-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run", "--debug"]

requirements.txt:

bash 复制代码
flask
redis

启动命令:docker compose up -d

其他例子-0

yaml 复制代码
services:
  mysql:
    image: 'mysql:8.0'
    environment:
      - 'MYSQL_DATABASE=mydatabase'
      - 'MYSQL_PASSWORD=secret'
      - 'MYSQL_ROOT_PASSWORD=verysecret'
      - 'MYSQL_USER=myuser'
    volumes:
      - './data:/var/lib/mysql'
    ports:
      - '3306:3306'
  redis:
    image: 'redis:latest'
    ports:
      - '6379:6379'

其他例子-1

yaml 复制代码
networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:1.21.1
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=mysql
      - GITEA__database__HOST=db:3306
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gitea
    restart: always
    networks:
      - gitea
    volumes:
      - D:\lp\gitcode\my_private_repo\docker_config\gitea\data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "222:22"
    depends_on:
      - db
  db:
    image: mysql:8.0
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea
      - MYSQL_DATABASE=gitea
    networks:
      - gitea
    volumes:
      - D:\lp\gitcode\my_private_repo\docker_config\gitea\mysql8:/var/lib/mysql

其他例子-2

yaml 复制代码
version: "3.7"
services:
	app:
		image: node:12-alpine
		command: sh -c "yarn install && yarn run dev"
		ports:
			- 3000:3000
		working_dir: /app
		volumes:
			- ./:/app
		environment:
		MYSQL_HOST: mysql
		MYSQL_USER: root
		MYSQL_PASSWORD: secret
		MYSQL_DB: todos
		networks:
			- hello
			- world
		deploy: #安装docker swarm
		replicas: 6 #指定副本:处于不同的服务器(负载均衡+高可用)

	mysql: #可以代表一个容器,ping 服务名 mysql 可以访问
		image: mysql:5.7 #负载均衡下,数据一致怎么做???主从同步,读写分离
		volumes:
			- todo-mysql-data:/var/lib/mysql
		environment:
		MYSQL_ROOT_PASSWORD: secret
		MYSQL_DATABASE: todos
		networks: #这个服务加入那个自定义网络
			- hello
		deploy: #安装docker swarm
		replicas: 6 #指定副本:处于不同的服务器(负载均衡+高可用)

	redis:
		image: redis
		networks:
			- world
volumes:
	todo-mysql-data:
networks:
	hello:
	world:

docker swarm

两句:

  • docker swarm init (创建一个master 节点);

    控制台打印:docker swarm join --token SWMTKN-1-1i0biktih9tfn7mrj6asn27em4vydg8pp00u930nrycpgct1ww-7ecs32nl5f5y8qx6e5lp4f06410.120.82.4:2377

  • 其他和本机(master)能互通的机器 把上面的命令运行,加入集群
    docker swarm join --token SWMTKN-1-1i0biktih9tfn7mrj6asn27em4vydg8pp00u930nrycpgct1ww-7ecs32nl5f5y8qx6e5lp4f064 10.120.82.4:2377

图示:

相关推荐
hjxu20168 小时前
【OpenClaw 龙虾养成笔记一】在远程服务器,使用Docker安装OpenClaw
服务器·笔记·docker
todoitbo9 小时前
用虚拟局域网打通 Win/Mac/Linux 三端:跨设备协作的实用方案
linux·运维·macos
Sylvia-girl10 小时前
Linux下的基本指令1
linux·运维·服务器
CDN36010 小时前
360CDN SDK 游戏盾:轻量化接入 + 强防护实测
运维·游戏·网络安全
Stewie1213810 小时前
Docker 面试题
运维·docker·容器
vpk11211 小时前
Docker Compose 安装 Redis
redis·docker·容器
星纬智联技术11 小时前
GEO E2E 自动化验证测试文章
运维·自动化·geo
jarreyer11 小时前
CentOS 7 无法使用 yum 安装软件
linux·运维·centos
脆皮的饭桶12 小时前
结合使用,实现IPVS的高可用性、利用VRRP Script 实现全能高可用
运维·服务器·网络
last demo13 小时前
Docker-compose和图形界面管理
docker·容器·eureka