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