部署多 service 应用
如何像docker-compose一样部署多服务应用,我们先看手动的方式
环境准备
app.py
from flask import Flask
from redis import StrictRedis
import os
import socket
# test
app = Flask(__name__)
redis = StrictRedis(host=os.environ.get('REDIS_HOST', '127.0.0.1'),
port=6379, password=os.environ.get('REDIS_PASS', 'redis'))
@app.route('/')
def hello():
redis.incr('hits')
return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"
docker-compose.yml
version: "3.8"
services:
flask:
build:
context: ./
dockerfile: Dockerfile
image: xiaopeng163/flask-redis:latest
ports:
- "8080:5000"
environment:
- REDIS_HOST=redis-server
- REDIS_PASS=${REDIS_PASSWORD}
redis-server:
image: redis:latest
command: redis-server --requirepass ${REDIS_PASSWORD}
Dockerfile
FROM python:3-slim
RUN pip install flask redis && \
groupadd -r flask && useradd -r -g flask flask && \
mkdir /src && \
chown -R flask:flask /src
USER flask
COPY app.py /src/app.py
WORKDIR /src
ENV FLASK=app.py
EXPOSE 5000
CMD ["flask", "run", "-h", "0.0.0.0"]
执行操作
创建一个mynet的overlay网络
$ docker network create -d overlay mynet
k419zp8hn1uxaiuvuhdvf7qto
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
77b3303fcc1b bridge bridge local
5b6b2ee8db9a docker_gwbridge bridge local
beb5c11f8216 host host local
klwq2u7a7jpx ingress overlay swarm
k419zp8hn1ux mynet overlay swarm
da113904c63c none null local
创建一个redis的service
$ docker service create --network mynet --name redis redis:latest redis-server --requirepass ABC123
qh3nfeth3wc7uoz9ozvzta5ea
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
vagrant@swarm-manager:~$ docker servce ls
docker: 'servce' is not a docker command.
See 'docker --help'
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
qh3nfeth3wc7 redis replicated 1/1 redis:latest
$ docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
111cpkjn4a0k redis.1 redis:latest swarm-worker2 Running Running 19 seconds ago
创建一个flask的service
$ docker service create --network mynet --name flask --env REDIS_HOST=redis --env REDIS_PASS=ABC123 -p 8080:5000 xiaopeng163/flask-redis:latest
y7garhvlxah592j5lmqv8a3xj
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
y7garhvlxah5 flask replicated 1/1 xiaopeng163/flask-redis:latest *:8080->5000/tcp
qh3nfeth3wc7 redis replicated 1/1 redis:latest
$ docker service ps flask
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
quptcq7vb48w flask.1 xiaopeng163/flask-redis:latest swarm-worker1 Running Running 15 seconds ago
$ curl 127.0.0.1:8080
Hello Container World! I have been seen 1 times and my hostname is d4de54036614.
$ curl 127.0.0.1:8080
Hello Container World! I have been seen 2 times and my hostname is d4de54036614.
$ curl 127.0.0.1:8080
Hello Container World! I have been seen 3 times and my hostname is d4de54036614.
$ curl 127.0.0.1:8080
Hello Container World! I have been seen 4 times and my hostname is d4de54036614.
注意
compose可以构建镜像,开发环境
swarm 不许用构建,因为是生产环境,需要提前吧镜像构建好