简介
原先dockerfile build run,需要手动操作,单个容器
Docker Compose 可以高效管理容器,定义运行多个容器。
官方介绍
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. To learn more about all the features of Compose, see the list of features.
所有的环境都可以使用
Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.
三步骤
Using Compose is basically a three-step process:
- Define your app’s environment with a
Dockerfileso it can be reproduced anywhere.
- Dockerfile保证项目在任何地方可以运行
- Define the services that make up your app in
docker-compose.ymlso they can be run together in an isolated environment.
- service 什么服务
- docker-compost.yml 文件怎么写
- Run
docker-compose upand Compose starts and runs your entire app.
- 启动项目
作用:批量容器编排
Compose是Docker官方的开源项目。需要安装!
Dockerfile 让程序在任何地方运行。web服务,redis,mysql,nginx……多个容器,通过compose可以快速启动。
Compose
version: '2.0'services:web:build: .ports:- "5000:5000"volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redisvolumes:logvolume01: {}
Compose重要概念:
- 服务services,容器应用。(web,redis,mysql…)
- 项目project。一组关联的容器。 博客,web,mysql wp
安装Compose
1、下载 ```basic sudo curl -L “https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
备用地址,比较快
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s-uname -m` > /usr/local/bin/docker-compose
<br />2、授权```basicchmod +x /usr/local/bin/docker-compose
getting start体验
官方地址:https://docs.docker.com/compose/gettingstarted/
python应用,计数器,redis
步骤
1、应用 app.py
2、Dockerfile 应用打包为镜像
3、Docker-compose yml 文件(定义整个服务需要的环境:web, redis)
4、启动compose项目(docker-compose up)
演示:
1.为项目创建目录:
mkdir composetestcd composetest
2.在项目目录中创建一个名为app.py的文件,并将其粘贴到:
vim app.py
import timeimport redisfrom flask import Flaskapp = Flask(__name__)cache = redis.Redis(host='redis', port=6379)def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)@app.route('/')def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)
3.在您的项目目录中创建另一个名为requirements.txt的文件
flaskredis
4.在您的项目目录中,创建一个名为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.txtEXPOSE 5000COPY . .CMD ["flask", "run"]
5.在项目目录中创建一个名为docker-compose.yml的文件,然后粘贴以下内容:
version: '3'services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"
6.使用Compose构建并运行您的应用
$ docker-compose upCreating network "composetest_default" with the default driverCreating composetest_web_1 ...Creating composetest_redis_1 ...Creating composetest_web_1Creating composetest_redis_1 ... doneAttaching to composetest_web_1, composetest_redis_1web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)redis_1 | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Ooredis_1 | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just startedredis_1 | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.confweb_1 | * Restarting with statredis_1 | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.web_1 | * Debugger is active!redis_1 | 1:M 17 Aug 22:11:10.483 # Server initializedredis_1 | 1:M 17 Aug 22:11:10.483 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.web_1 | * Debugger PIN: 330-787-903redis_1 | 1:M 17 Aug 22:11:10.483 * Ready to accept connections
流程:
1.创建网络
2.执行Docker-compose.yaml
3.启动服务
Docker-compose yaml
Creatinng composetest_web_1 …done
Creatinng composetest_redis_1 …done
1.文件名composetest
- 服务
默认的服务名 文件名_服务名_numversion: '3'services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"
多个服务器 集群 A B _num副本数量
服务redis服务 =》4个副本
集群状态,服务都不可能只有一个运行实例。弹性
网络规则:
项目中的内容都在同个网络下。可通过名称访问(需要在同一网络下),保证了高可用
停止:docker-compose down ctrl+c
以前都是单个docker run启动容器,docker-compose通过yml配置文件,可以通过compose一键启动所有服务、停止Docker小结
1.Docker镜像。 run=>容器
2.Dockerfile 构建镜像(服务打包)
3.docker-compose启动项目(编排,多个微服务环境)
4.docker网络yaml规则
docker-compose.yaml核心
官方文档:https://docs.docker.com/compose/compose-file/
```basicversion: "3.8" #版本services: #服务redis:image: redis:latestdeploy:replicas: 1configs:- my_config- my_other_configconfigs:my_config:file: ./my_config.txtmy_other_config:external: true
3层
version: ‘’ # 版本 service: #服务 服务1:web 服务2:redis
<a name="JZQQD"></a>### 实战部署Wordpress1.创建一个空的项目目录。```basic[root@VM-0-4-centos home]# mkdir my_wordpress[root@VM-0-4-centos home]# cd my_wordpress[root@VM-0-4-centos my_wordpress]#
2.创建一个docker-compose.yml文件,该文件启动您的WordPress博客和一个单独的MySQL实例,并带有用于数据持久性的卷挂载:
[root@VM-0-4-centos my_wordpress]# vim docker-compose.yml
version: '3.3'services:db:image: mysql:5.7volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpresswordpress:depends_on:- dbimage: wordpress:latestports:- "8000:80"restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressWORDPRESS_DB_NAME: wordpressvolumes:db_data: {}
3.后台启动
[root@VM-0-4-centos my_wordpress]# docker-compose up -d
命令docker-compose down删除容器和默认网络,但保留WordPress数据库。
命令docker-compose down --volumes删除容器,默认网络和WordPress数据库。
实战
1.编写项目微服务
2.dockerfile构建镜像
3.docker-compose.yml编排项目
4.放到服务器, docker-compose up
参考mall docker-compose.yml
version: '3'services:mysql:image: mysql:5.7container_name: mysqlcommand: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_cirestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: root #设置root帐号密码ports:- 3306:3306volumes:- /mydata/mysql/data/db:/var/lib/mysql #数据文件挂载- /mydata/mysql/data/conf:/etc/mysql/conf.d #配置文件挂载- /mydata/mysql/log:/var/log/mysql #日志文件挂载redis:image: redis:5container_name: rediscommand: redis-server --appendonly yescommand: redis-server --requirepass 123456 ##redis密码volumes:- /mydata/redis/data:/data #数据文件挂载ports:- 6379:6379nginx:image: nginx:1.10container_name: nginxvolumes:- /mydata/nginx/nginx.conf:/etc/nginx/nginx.conf #配置文件挂载- /mydata/nginx/html:/usr/share/nginx/html #静态资源根目录挂载- /mydata/nginx/log:/var/log/nginx #日志文件挂载ports:- 80:80rabbitmq:image: rabbitmq:3.7.15-managementcontainer_name: rabbitmqvolumes:- /mydata/rabbitmq/data:/var/lib/rabbitmq #数据文件挂载- /mydata/rabbitmq/log:/var/log/rabbitmq #日志文件挂载ports:- 5672:5672- 15672:15672elasticsearch:image: elasticsearch:7.6.2container_name: elasticsearchuser: rootenvironment:- "cluster.name=elasticsearch" #设置集群名称为elasticsearch- "discovery.type=single-node" #以单一节点模式启动- "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小volumes:- /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载- /mydata/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载ports:- 9200:9200- 9300:9300logstash:image: logstash:7.6.2container_name: logstashenvironment:- TZ=Asia/Shanghaivolumes:- /mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件depends_on:- elasticsearch #kibana在elasticsearch启动之后再启动links:- elasticsearch:es #可以用es这个域名访问elasticsearch服务ports:- 4560:4560- 4561:4561- 4562:4562- 4563:4563kibana:image: kibana:7.6.2container_name: kibanalinks:- elasticsearch:es #可以用es这个域名访问elasticsearch服务depends_on:- elasticsearch #kibana在elasticsearch启动之后再启动environment:- "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址ports:- 5601:5601mongo:image: mongo:4.2.5container_name: mongovolumes:- /mydata/mongo/db:/data/db #数据文件挂载ports:- 27017:27017nacos-registry:image: nacos/nacos-server:1.3.0container_name: nacos-registryenvironment:- "MODE=standalone"ports:- 8848:8848
docker-compose启动的容器外部无法访问
1.关闭FirewallD服务:
如果您不需要防火墙,那直接关掉FirewallD服务就好了
systemctl stop firewalld.service
2.重启docker
systemctl restart docker
