【Docker进阶-06】docker-compose & docker swarm
- docker-compose
- [docker swarm](#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官方示例
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 --tokenSWMTKN-1-1i0biktih9tfn7mrj6asn27em4vydg8pp00u930nrycpgct1ww-7ecs32nl5f5y8qx6e5lp4f064 10.120.82.4:2377
图示:
