【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

图示:

相关推荐
蝎子莱莱爱打怪7 小时前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
碳基沙盒15 小时前
OpenClaw 多 Agent 配置实战指南
运维
小p1 天前
docker学习7:docker 容器的通信方式
docker
小p1 天前
docker学习5:提升Dockerfile水平的5个技巧
docker
小p1 天前
docker学习3:docker是怎么实现的?
docker
小p3 天前
docker学习: 2. 构建镜像Dockerfile
docker
小p3 天前
docker学习: 1. docker基本使用
docker
蝎子莱莱爱打怪4 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
崔小汤呀4 天前
Docker部署Nacos
docker·容器
缓解AI焦虑4 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器