【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

图示:

相关推荐
NailiConveyor8 小时前
输送机系统与WMS仓储管理系统集成的5个关键技术点
大数据·运维·自动化·制造·业界资讯
本人手速666+8 小时前
企微开发API如何设计客户冻结状态?WeComApi 在删除、投诉和异常客户场景中的自动化边界
运维·分布式·自动化·企业微信·企微外部群开发·wecomapi·企业微信二次开发
一只专注api接口开发的技术猿8 小时前
告别手工复制粘贴:搭建电商商品自动化监控与数据分析实践
大数据·运维·数据挖掘·数据分析·自动化
资深技术分享员8 小时前
Geejing WebBuilder 日志、在线用户、系统监控,出问题时的三个第一现场
java·运维·数据库
wtblszn8 小时前
光伏发电与光热发电有什么区别
大数据·运维·物联网
锅巴编程9 小时前
nginx-413-client-max-body-size
运维·nginx
蓝速科技9 小时前
仓储盘点移动终端选型与蓝速科技 K10 实战方案
运维·数据库·人工智能·科技·材质
溜达的大象9 小时前
极空间部署Traggo时间追踪工具:Docker安装、标签管理与cpolar远程访问
运维·docker·容器
wjjzhbb9 小时前
Jenkins到ArgoCD——GitOps持续交付实践
运维·缓存·jenkins·argocd
智商网输送线配件9 小时前
流水线全套配件直供化落地的三个实操切入维度
大数据·运维·自动化·智商网·流水线设备配件