docker容器编排教程
2022年12月31日大约 4 分钟约 1113 字
Docker-Compose
编排多容器的应用
安装:pip install docker-compose
使用 Compose 基本会有如下三步流程:
- 在
Dockfile
中定义你的应用环境,使其可以在任何地方复制。 - 在
docker-compose.yml
中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。 - 最后,运行
dcoker-compose up
,Compose 将启动并运行整个应用程序。
概念
services | 容器 | 一个service代表一个容器,这个容器可以从hub或本地Dockerfile构建 |
docker-compose 常用命令
build 构建或重建服务
help 命令帮助
kill 杀掉容器
logs 显示容器的输出内容
port 打印绑定的开放端口
ps 显示容器
pull 拉取服务镜像
restart 重启服务
rm 删除停止的容器
run 运行一个一次性命令
scale 设置服务的容器数目
start 开启服务
stop 停止服务
up 创建并启动容器
docker-compose stop # 停止当前目录yml文件启动的容器
docker-compose down # 删除yum文件启动的容器、网络、卷(并没有删除镜像)
docker-compose images # 查看yml文件内使用的镜像
docker-compose exec [yml services name] bash # 执行yml文件某容器的bash命令
docker-compose up --scale SERVICE=NUM # 指定某容器数量的规模启动(需去掉端口绑定配置)
示例
给每个容器创建Dockerfile
# ghost博客程序
mkdir docker/ghost && cd docker/ghost
vim Dockerfile
from ghost
copy ./config.js /var/lib/ghost/config.js
expose 2368
cmd ["npm", "start", "--production"]
# nginx
mkdir docker/nginx && cd docker/nginx
vim Dockerfile
from nginx
copy nginx.conf /etc/nginx/nginx.conf
expose 80 # nginx镜像自带启动命令,不需要写了。
# mysql data
mkdir docker/data
创建docker-compose.yml文件
# docker-compose.yml
>>> vim docker/docker-compose.yml
version: '3' # 使用版本3的语法
networks: # 声明网络
ghost:
services: # 容器
ghost-app: # 第一个容器并命名为'ghost-app'
build: ghost # 到ghost目录构建镜像
networks:
- ghost # 放入ghost网络
depends_on: # 依赖(启动顺序)
- db
posts:
- "2368:2368" # 将主机2368端口映射到容器2368端口
nginx:
build: nginx
networks:
- ghost
depends_on:
- ghost-app
ports:
- "80:80"
links:
- db
- ghost-app
db:
image: "mysql:5.7.15" # 从hub中拉取镜像
network:
- ghost
environment: # 环境变量,对mysql服务定义
MYSQL_ROOT_PASSWORD: mysqlroot
MYSQL_USER: ghost
MYSQL_PASSWORD: ghost
volumes: # 本地卷挂载
- $PWD/data:/var/lib/mysql
ports:
- "3306:3306"
如果连接到自定义桥接网络是不需要links就可以解析名字
只有连接默认的桥接网络才需要links
运行构建
cd docker
docker-compose build # 构建,可以省略(使用up时,如果没有构建则自动构建,如果已经构建则跳过)
docker-compose up -d # 在当前目录启动yml文件 -d:daemon方式
#docker-compose -f docker-compose.yml up # 启动某个yml文件
docker-compose stop # 停止
docker-compose rm # 删除
# 其他命令
docker-compose logs # 查看所有容器日志
docker-compose ps # 列出所有容器
wordpress示例
>>> vim docker-compose.yml
version: '3'
services: # 容器
wordpress: # 新建一个容器并命名为'wordpress'
image: wordpress # 从hub上拉取wordpress镜像
ports: # 定义端口映射
- 8080:80
depends_on:
- mysql
environment: # 定义系统环境变量
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks: # 定义网络
- my-bridge # 加入'my-gridge'网络
links: # 自定义的网络可以不使用links,这里只做演示
- mysql
mysql:
image: mysql:5.7
environment: # 定义容器的系统环境变量
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes: # 卷
- mysql-data:/var/lib/mysql # 持久化容器的/var/lib/mysql目录并命名为'mysql-data'卷
networks: # 网络
- my-bridge # 加入'my-bridge'自定义网络
volumes: # 定义卷(在容器使用时必须要定义卷名)
mysql-data: # 定义'mysql-data'卷
networks: # 定义网络(在容器使用时必须要定义网络名)
my-bridge: # 定义'my-bridge'网络
driver: bridge # 使用桥接网络模式(缺省模式,可以不写)
flask-redis负载均衡示例
flask应用:
>>> vim app.py
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=80, debug=True)
flask应用的dockerfile:
>>> vim Dockerfile
FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]
redis,flask,haproxy的docker-compose.yml文件:
>>> vim docker-compose.yml
version: "3"
services:
redis:
image: redis
web:
build:
context: . # Dockerfile文件路径
dockerfile: Dockerfile # Dockerfile文件名
environment:
REDIS_HOST: redis
lb:
image: dockercloud/haproxy # 负载均衡应用
links:
- web
ports:
- 8080:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
构建并启动容器
# web容器启动3个
docker-compose up --scale web=3 -d
# 测试
curl 127.0.0.1:8080