本文共 6087 字,大约阅读时间需要 20 分钟。
目录
官网:
Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration.
docker-compose主要是针对Docker容器集群的快速编排。通过compose,用户可以定义和运行多容器的docker.通过自定义的yaml文件去配置自己的应用服务,然后通过一个启动命令,就可以创建和运行所有的服务。就不需要像上面docker实战里一样,每次去拉取镜像,创建network,创建多个容器(springboot,mysql,nginx等容器),命令多并且容易混淆和遗漏
Compose 中有两个重要的概念:
服务(service):一个应用的容器,一个yaml文件可以包括若干容器实例(可以是相同镜像,也能是不同镜像) 项目(project):由一组相互关联的容器组成的一个完整业务单元,一个yaml文件定义的就是一个projectUsing Compose is basically a three-step process:
Define your app’s environment with a
Dockerfile
so it can be reproduced anywhere.Define the services that make up your app in
docker-compose.yml
so they can be run together in an isolated environment.Run
docker-compose up
and Compose starts and runs your entire app.
使用compose分为三步:
1.编写Dockerfile用于打包镜像(如果你的镜像都来自官方,就省略这步) 2.在docker-compose.yml里定义自己想要的服务(包括容器,网络等) 3.通过docker-compose up 命令启动服务因为compose依赖于docker运行,所以需要先安装docker , 前面都讲过,这里就不多讲了
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose
[node3] (local) root@192.168.0.6 ~
$ pip install docker-compose [node3] (local) root@192.168.0.6 ~ $ ln -s /usr/bin/docker-compose /usr/local/bin/ [node3] (local) root@192.168.0.6 ~docker-compose version docker-compose version 1.23.2, build 1110ad0 docker-py version: 3.7.3 CPython version: 2.7.16 OpenSSL version: OpenSSL 1.1.1d 10 Sep 2019
$ sudo curl -L --fail https://github.com/docker/compose/releases/download/1.25.0/run.sh -o /usr/local/bin/docker-compose$ sudo chmod +x /usr/local/bin/docker-compose
我尝试了三种,最后只有通过pip在play-with-docker安装成功了
通过执行docker-compose --help来查看Compose基本命令用法。
1.准备工作
创建目录/tmp/test-compose
进入目录,编写app.py代码import timeimport redisfrom flask import Flaskapp = 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 'Hello World! I have been seen {} times.\n'.format(count)
创建requirements.txt文件
flaskredis
编写Dockerfile
FROM python:3.7-alpineWORKDIR /codeENV FLASK_APP app.pyENV FLASK_RUN_HOST 0.0.0.0RUN apk add --no-cache gcc musl-dev linux-headersCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtCOPY . .CMD ["flask", "run"]
2.编写yaml文件
version: '3' #指定docker-compose的版本services: #定义项目里所有的service信息, services下的第一级别的key就是serviceName web: #server name build: . #指定该service通过当前目录的Dockerfile构建 ports: - "5000:5000" #容器的5000端口和宿主机的5000端口建立映射关系 networks: #将容器加入指定网络(等同于docker network connect命令) - app-net #网络名称 redis: image: "redis:alpine" #指定docker镜像,可以是远程仓库镜像、本地镜像 networks: - app-netnetworks: #定义networks信息 app-net: #网络名称 driver: bridge #指定网络模式, bridge,none,host,overlay;docker下默认使用bridge
启动项目:
docker-compose up -d
从启动的日志可以看到compose帮我们完成了build image,pull image,create container等一系列操作,还帮我们创建了自定义的bridge网络
启动完成后就可以通过映射的端口访问了
ports参数用法ports # 建立宿主机和容器之间的端口映射关系, ports 支持两种语法格式 SHORT 语法格式示例: - "3000" # 暴露容器的 3000 端口, 宿主机的端口由 docker 随机映射一个没有被占用的端口 - "3000-3005" # 暴露容器的 3000 到 3005 端口, 宿主机的端口由 docker 随机映射没有被占用的端口 - "8000:8000" # 容器的 8000 端口和宿主机的 8000 端口建立映射关系 - "9090-9091:8080-8081" - "127.0.0.1:8001:8001" # 指定映射宿主机的指定地址的 - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp" # 指定协议 LONG 语法格式示例:(v3.2 新增的语法格式) ports: - target: 80 # 容器端口 published: 8080 # 宿主机端口 protocol: tcp # 协议类型 mode: host # host 在每个节点上发布主机端口, ingress 对于集群模式端口进行负载均衡
volumes # 定义容器和宿主机的数据卷映射关系 SHORT 语法格式示例: volumes: - /var/lib/mysql # 映射容器内的 /var/lib/mysql 到宿主机的一个随机目录中 - /opt/data:/var/lib/mysql # 映射容器内的 /var/lib/mysql 到宿主机的 /opt/data - ./cache:/tmp/cache # 映射容器内的 /var/lib/mysql 到宿主机 compose 文件所在的位置 - ~/configs:/etc/configs/:ro # 映射宿主机的目录到容器中去, 权限只读 - datavolume:/var/lib/mysql # 为 volumes 命名 LONG 语法格式示例:(v3.2 新增的语法格式) version: "3.2" services: web: image: nginx:alpine ports: - "80:80" volumes: - type: volume # mount 的类型, 必须是 bind、volume 或 tmpfs source: mydata # 宿主机目录 target: /data # 容器目录 volume: # 配置扩展项, 其 key 必须和 type 的值相同 nocopy: true # volume 扩展的选项, 在创建volume时禁止用从容器复制数据
(1)查看版本
docker-compose version(2)根据yml创建service docker-compose up 指定yaml:docker-compose up -f xxx.yaml 后台运行:docker-compose up -d(3)查看启动成功的service docker-compose ps(4)查看images 也可以使用docker命令 docker-compose images(5)停止/启动service docker-compose stop/start (6)删除service[同时会删除掉network和volume] docker-compose down(7)进入到某个service docker-compose exec <serviceName> sh(8)scale扩缩容 修改web的port映射,并启动 docker-compose up --scale web=5 -d docker-compose ps docker-compose logs web
转载地址:http://wiooz.baihongyu.com/