【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

图示:

相关推荐
China_Yanhy2 小时前
入职 Web3 运维日记 · 第 8 日:黑暗森林 —— 对抗 MEV 机器人的“三明治攻击”
运维·机器人·web3
艾莉丝努力练剑2 小时前
hixl vs NCCL:昇腾生态通信库的独特优势分析
运维·c++·人工智能·cann
酉鬼女又兒2 小时前
每天一个Linux命令_printf
linux·运维·服务器
虾说羊3 小时前
docker容器化部署项目流程
运维·docker·容器
Trouvaille ~3 小时前
TCP Socket编程实战(三):线程池优化与TCP编程最佳实践
linux·运维·服务器·网络·c++·网络协议·tcp/ip
大大大反派3 小时前
CANN 生态中的自动化部署引擎:深入 `mindx-sdk` 项目构建端到端 AI 应用
运维·人工智能·自动化
WHD3063 小时前
苏州勒索病毒加密 服务器数据解密恢复
运维·服务器
骇客野人3 小时前
通过脚本推送Docker镜像
java·docker·容器
蜡笔小炘3 小时前
LVS -- 持久链接(Persistent Connection)实现会话粘滞
运维·服务器