简介

原先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:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
  • Dockerfile保证项目在任何地方可以运行
  1. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
  • service 什么服务
  • docker-compost.yml 文件怎么写
  1. Run docker-compose up and Compose starts and runs your entire app.
  • 启动项目

作用:批量容器编排

Compose是Docker官方的开源项目。需要安装!
Dockerfile 让程序在任何地方运行。web服务,redis,mysql,nginx……多个容器,通过compose可以快速启动。

Compose

  1. version: '2.0'
  2. services:
  3. web:
  4. build: .
  5. ports:
  6. - "5000:5000"
  7. volumes:
  8. - .:/code
  9. - logvolume01:/var/log
  10. links:
  11. - redis
  12. redis:
  13. image: redis
  14. volumes:
  15. logvolume01: {}

docker-compose up 可以启动100个服务

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

  1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1486377/1598246974675-a42b85d4-a40c-4b6c-a05d-1e9cbbf43ce5.png#align=left&display=inline&height=165&margin=%5Bobject%20Object%5D&name=image.png&originHeight=330&originWidth=1975&size=61830&status=done&style=none&width=987.5)<br />2、授权
  2. ```basic
  3. chmod +x /usr/local/bin/docker-compose

image.png

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.为项目创建目录:

  1. mkdir composetest
  2. cd composetest

2.在项目目录中创建一个名为app.py的文件,并将其粘贴到:

  1. vim app.py
  1. import time
  2. import redis
  3. from flask import Flask
  4. app = Flask(__name__)
  5. cache = redis.Redis(host='redis', port=6379)
  6. def get_hit_count():
  7. retries = 5
  8. while True:
  9. try:
  10. return cache.incr('hits')
  11. except redis.exceptions.ConnectionError as exc:
  12. if retries == 0:
  13. raise exc
  14. retries -= 1
  15. time.sleep(0.5)
  16. @app.route('/')
  17. def hello():
  18. count = get_hit_count()
  19. return 'Hello World! I have been seen {} times.\n'.format(count)

3.在您的项目目录中创建另一个名为requirements.txt的文件

  1. flask
  2. redis

4.在您的项目目录中,创建一个名为Dockerfile的文件并粘贴以下内容:

  1. FROM python:3.7-alpine
  2. WORKDIR /code
  3. ENV FLASK_APP app.py
  4. ENV FLASK_RUN_HOST 0.0.0.0
  5. RUN apk add --no-cache gcc musl-dev linux-headers
  6. COPY requirements.txt requirements.txt
  7. RUN pip install -r requirements.txt
  8. EXPOSE 5000
  9. COPY . .
  10. CMD ["flask", "run"]

5.在项目目录中创建一个名为docker-compose.yml的文件,然后粘贴以下内容:

  1. version: '3'
  2. services:
  3. web:
  4. build: .
  5. ports:
  6. - "5000:5000"
  7. redis:
  8. image: "redis:alpine"

6.使用Compose构建并运行您的应用

  1. $ docker-compose up
  2. Creating network "composetest_default" with the default driver
  3. Creating composetest_web_1 ...
  4. Creating composetest_redis_1 ...
  5. Creating composetest_web_1
  6. Creating composetest_redis_1 ... done
  7. Attaching to composetest_web_1, composetest_redis_1
  8. web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
  9. redis_1 | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  10. redis_1 | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
  11. redis_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.conf
  12. web_1 | * Restarting with stat
  13. redis_1 | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.
  14. 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.
  15. web_1 | * Debugger is active!
  16. redis_1 | 1:M 17 Aug 22:11:10.483 # Server initialized
  17. redis_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.
  18. web_1 | * Debugger PIN: 330-787-903
  19. redis_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

  1. 服务
    1. version: '3'
    2. services:
    3. web:
    4. build: .
    5. ports:
    6. - "5000:5000"
    7. redis:
    8. image: "redis:alpine"
    默认的服务名 文件名_服务名_num
    多个服务器 集群 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/
    1. version: "3.8" #版本
    2. services: #服务
    3. redis:
    4. image: redis:latest
    5. deploy:
    6. replicas: 1
    7. configs:
    8. - my_config
    9. - my_other_config
    10. configs:
    11. my_config:
    12. file: ./my_config.txt
    13. my_other_config:
    14. external: true
    ```basic

    3层

version: ‘’ # 版本 service: #服务 服务1:web 服务2:redis

  1. <a name="JZQQD"></a>
  2. ### 实战部署Wordpress
  3. 1.创建一个空的项目目录。
  4. ```basic
  5. [root@VM-0-4-centos home]# mkdir my_wordpress
  6. [root@VM-0-4-centos home]# cd my_wordpress
  7. [root@VM-0-4-centos my_wordpress]#

2.创建一个docker-compose.yml文件,该文件启动您的WordPress博客和一个单独的MySQL实例,并带有用于数据持久性的卷挂载:

  1. [root@VM-0-4-centos my_wordpress]# vim docker-compose.yml
  1. version: '3.3'
  2. services:
  3. db:
  4. image: mysql:5.7
  5. volumes:
  6. - db_data:/var/lib/mysql
  7. restart: always
  8. environment:
  9. MYSQL_ROOT_PASSWORD: somewordpress
  10. MYSQL_DATABASE: wordpress
  11. MYSQL_USER: wordpress
  12. MYSQL_PASSWORD: wordpress
  13. wordpress:
  14. depends_on:
  15. - db
  16. image: wordpress:latest
  17. ports:
  18. - "8000:80"
  19. restart: always
  20. environment:
  21. WORDPRESS_DB_HOST: db:3306
  22. WORDPRESS_DB_USER: wordpress
  23. WORDPRESS_DB_PASSWORD: wordpress
  24. WORDPRESS_DB_NAME: wordpress
  25. volumes:
  26. db_data: {}

3.后台启动

  1. [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

  1. version: '3'
  2. services:
  3. mysql:
  4. image: mysql:5.7
  5. container_name: mysql
  6. command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  7. restart: always
  8. environment:
  9. MYSQL_ROOT_PASSWORD: root #设置root帐号密码
  10. ports:
  11. - 3306:3306
  12. volumes:
  13. - /mydata/mysql/data/db:/var/lib/mysql #数据文件挂载
  14. - /mydata/mysql/data/conf:/etc/mysql/conf.d #配置文件挂载
  15. - /mydata/mysql/log:/var/log/mysql #日志文件挂载
  16. redis:
  17. image: redis:5
  18. container_name: redis
  19. command: redis-server --appendonly yes
  20. command: redis-server --requirepass 123456    ##redis密码
  21. volumes:
  22. - /mydata/redis/data:/data #数据文件挂载
  23. ports:
  24. - 6379:6379
  25. nginx:
  26. image: nginx:1.10
  27. container_name: nginx
  28. volumes:
  29. - /mydata/nginx/nginx.conf:/etc/nginx/nginx.conf #配置文件挂载
  30. - /mydata/nginx/html:/usr/share/nginx/html #静态资源根目录挂载
  31. - /mydata/nginx/log:/var/log/nginx #日志文件挂载
  32. ports:
  33. - 80:80
  34. rabbitmq:
  35. image: rabbitmq:3.7.15-management
  36. container_name: rabbitmq
  37. volumes:
  38. - /mydata/rabbitmq/data:/var/lib/rabbitmq #数据文件挂载
  39. - /mydata/rabbitmq/log:/var/log/rabbitmq #日志文件挂载
  40. ports:
  41. - 5672:5672
  42. - 15672:15672
  43. elasticsearch:
  44. image: elasticsearch:7.6.2
  45. container_name: elasticsearch
  46. user: root
  47. environment:
  48. - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
  49. - "discovery.type=single-node" #以单一节点模式启动
  50. - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
  51. volumes:
  52. - /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
  53. - /mydata/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
  54. ports:
  55. - 9200:9200
  56. - 9300:9300
  57. logstash:
  58. image: logstash:7.6.2
  59. container_name: logstash
  60. environment:
  61. - TZ=Asia/Shanghai
  62. volumes:
  63. - /mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
  64. depends_on:
  65. - elasticsearch #kibana在elasticsearch启动之后再启动
  66. links:
  67. - elasticsearch:es #可以用es这个域名访问elasticsearch服务
  68. ports:
  69. - 4560:4560
  70. - 4561:4561
  71. - 4562:4562
  72. - 4563:4563
  73. kibana:
  74. image: kibana:7.6.2
  75. container_name: kibana
  76. links:
  77. - elasticsearch:es #可以用es这个域名访问elasticsearch服务
  78. depends_on:
  79. - elasticsearch #kibana在elasticsearch启动之后再启动
  80. environment:
  81. - "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
  82. ports:
  83. - 5601:5601
  84. mongo:
  85. image: mongo:4.2.5
  86. container_name: mongo
  87. volumes:
  88. - /mydata/mongo/db:/data/db #数据文件挂载
  89. ports:
  90. - 27017:27017
  91. nacos-registry:
  92. image: nacos/nacos-server:1.3.0
  93. container_name: nacos-registry
  94. environment:
  95. - "MODE=standalone"
  96. ports:
  97. - 8848:8848

docker-compose启动的容器外部无法访问

1.关闭FirewallD服务:
如果您不需要防火墙,那直接关掉FirewallD服务就好了

  1. systemctl stop firewalld.service

2.重启docker

  1. systemctl restart docker