DockerCompose
1.1 为什么要使用DockerCompose?
Docker(手动操作,单个容器)
1. 编写:手动编写一个符合file规范的 DockerFile文件
2. 构建: 有了这个文件后,直接docker build命令执行,获得一个自定义的镜像
3. 执行: docker run
DockerCompose(轻松高效的管理容器,定义运行多个容器)
1.2 官方介绍
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。
注:
1.定义、运行多个容器
2.YAML file配置文件
3.a single command(一个命令):命令有哪些?
Compose可在所有环境中使用,比如:生产(production),登台(staging),开发(development),测试(test)以及CI工作流。
使用Compose基本上是一个三步过程:
1.使用Dockerfile定义您的应用环境,以便可以它在任何地方reproduced(复制)。
注:DockerFile保证我们的项目在任何地方都可以运行。
2.在docker-compose.yml里 定义组成应用程序的服务, 以便它们可以在隔离的环境中一起运行。
注:1.service 什么是服务?
2.docker-compose.yml这个文件怎么写?
3.Run docker-compose up and Compose启动并运行您的整个应用程序。
注:启动项目
Compose 作用:批量容器编排 !!!
Compose是Docker官方的开源项目,需要安装。
DockerFile 让程序在任何地方运行。一个web服务(包含:redis、mysql、nginx...)多个容器,需要一个一个的启动。因此,诞生了Compose。
Compose 重要概念:
1.服务 services:如容器、应用。(web、redis、mysql、nginx...)
2.项目 project:一组关联的容器。(博客:包含 web、redis、mysql、nginx...)
一个docker-compose.yml看起来像这样:
version: '2.0'
services:
#服务一
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
#连接redis,运行docker-conpose.yml文件时,先运行redis
links:
- redis
#服务二
redis:
image: redis
#持久化
volumes:
logvolume01: {}
Compose具有用于管理应用程序整个生命周期的命令:
* 启动,停止和重建服务
* 查看正在运行的服务的状态
* 流运行服务的日志输出
* 在服务上运行一次性命令
1.3 compose 安装
官网安装教程地址:https://docs.docker.com/compose/install/
1.运行以下命令以下载Docker Compose的当前稳定版本:
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.5/docker-compose-'uname -s'-'uname -m' > /usr/local/bin/docker-compose"
2.将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
3.测试是否安装成功
docker-compose --version
1.4 快速开始
官网教程地址:https://docs.docker.com/compose/gettingstarted/
1.4.1 步骤:
1.Setup(准备)
1.1 为项目创建目录:
$ mkdir composetest
$ cd composetest
1.2 在项目目录中创建一个名为 app.py 的文件。
1.3 在项目目录中创建另一个名为 requirements.txt 的文件,并将以下粘贴进去
flask
redis
2.创建 Dockerfile
为了 build 成为 镜像。您将编写一个构建Docker镜像的Dockerfile。该镜像包含Python应用程序所需的所 有依赖关系,包括Python本身。
3.在 Docker-compose.yml 中定义整个服务。
4.Build and run 你的应用程序
4.1 在项目目录中,运行来启动应用程序docker-compose up。
4.2 在浏览器中输入http://106.53.237.51:5000/以查看应用程序正在运行
1.4.2 流程:
1.创建网络
2.执行Docker-compose.yml
3.启动服务(当前yml文件所在的文件夹 docker-compose up / stop / down --vulomes)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-12NgrdCD-1596425433612)(img/21.Docker-compose_up.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mNf9QCHi-1596425433614)(img/21.Docker-compose_up_-d.png)]
[root@VM_0_14_centos composetest]# docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
默认的服务名:文件名_服务名_number。其中 _number 表示多个服务器集群时,副本的数量。
1.4.3 网络规则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EOc9xWoP-1596425433615)(img/22.1compose网络规则.png)]
通过docker-compose启动的服务,在同一个网络下,我们可以直接通过域名(composetest_default)访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BrwLU42X-1596425433616)(img/22.2compose网络规则.png)]
1.4.4 总结
* 以前是一个一个的 docker run 来启动容器。
* docker-compose 是通过编写yaml配置文件(Docker-compose.yml),可以通过compose一键启动/停止所有服务。
2 YAML 书写规则(核心)
官网compose文件参考:https://docs.docker.com/compose/compose-file/
#共三层
version: '3.8' #版本(第一层*核心)
service: #服务(第二层*核心)
webapp: #服务1
#以下是服务配置
build:
context: ./dir #在哪个目录下,找Dockerfile
dockerfile: Dockerfile-alternate #Dockerfile的名称
container_name: webapp #生成的容器的名称
args:
buildno: 1
depends_on: #依赖,启动顺序先启动db,再启动redis,再启动web
- db
- redis
redis: #服务2
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy: #部署,用于集群
replicas: 2 #副本数量(2个)
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db: #服务3
image: postgres
#其他配置(第三层)
volumes:
networks:
configs:
2.1 使用compose搭建博客
Quickstart:https://docs.docker.com/compose/wordpress/
1.创建一个空的项目目录。
mkdir my_wordpress
cd my_wordpress/
2.创建一个docker-compose.yml文件来启动您的 WordPress博客,并创建一个单独的MySQL实例,该实例具有用于数据持久性的卷挂载:
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
3.Build the project
现在,docker-compose up -d从您的项目目录运行。
docker-compose up 将以分离模式运行,提取所需的Docker镜像,并启动wordpress和数据库容器。
$ docker-compose up -d
Creating network "my_wordpress_default" with the default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
efd26ecc9548: Pull complete
a3ed95caeb02: Pull complete
...
Digest: sha256:34a0aca88e85f2efa5edff1cea77cf5d3147ad93545dbec99cfe705b03c520de
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:latest)...
latest: Pulling from library/wordpress
efd26ecc9548: Already exists
a3ed95caeb02: Pull complete
589a9d9a7c64: Pull complete
...
Digest: sha256:ed28506ae44d5def89075fd5c01456610cd6c64006addfe5210b8c675881aff6
Status: Downloaded newer image for wordpress:latest
Creating my_wordpress_db_1
Creating my_wordpress_wordpress_1
2.2 实战
1.编写一个demo.jar , 配置文件:
#使用docker-compose
server.port: 8088
spring.thymeleaf.cache=false
paypal.mode=sandbox
paypal.client.app=Ad_kZuteCxr5m13GaYBlyTPzY_qaK8jLIiz2U2WlBZaTidInWwzqEU4excZdsoSJiiU42PYRv5q5SQKc
paypal.client.secret=ECtio4lo0lf_Jql7z1UKrj7QGKVrcjlXg7cnvwMytoI6FrS16dHs2rga6mITUKgb46n4AercD5L9FXS1
spring.redis.host=redis
spring.redis.port=6379
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-wait=-1
spring.redis.jedis.pool.max-idle=500
spring.redis.jedis.pool.min-idle=0
spring.redis.lettuce.shutdown-timeout=0
spring.datasource.url=jdbc:mysql://mysql:9999/webtest?characterEncoding=utf-8&useSSL=true&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name= com.mysql.cj.jdbc.Driver
mybatis.config-location=classpath:config/mybatis-config.xml
mybatis.mapper-locations= classpath:mapper/*.xml
2.编写Dockerfile
FROM java:8
COPY *.jar /docker/demo.jar
ENV MY_WORK_PATH /docker
WORKDIR $MY_WORK_PATH
CMD ["--server.port=8088"]
EXPOSE 8088
ENTRYPOINT ["java","-jar","demo.jar"]
3.编写docker-compose.yml
version: "3.8"
services:
demo:
build: .
image: demo
depends_on:
- mysql
- redis
ports:
- "8088:8088"
redis:
image: "redis:alpine"
mysql:
network_mode: "bridge"
environment:
MYSQL_ROOT_PASSWORD: "123456"
image: "mysql:5.7"
restart: always
volumes:
- "./db:/var/lib/mysql"
- "./conf/my.cnf:/etc/my.cnf"
- "./init:/docker-entrypoint-initdb.d/"
ports:
- "9999:3306"
4.访问项目路径(http://106.53.237.51:8088)
docker-compose up 构建项目
docker-compose up --build 重构项目
onment:
MYSQL_ROOT_PASSWORD: “123456”
image: “mysql:5.7”
restart: always
volumes:
- “./db:/var/lib/mysql”
- “./conf/my.cnf:/etc/my.cnf”
- “./init:/docker-entrypoint-initdb.d/”
ports:
- “9999:3306”
4.访问项目路径(http://106.53.237.51:8088)
docker-compose up 构建项目
docker-compose up --build 重构项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9riIPwi1-1596425433617)(img/23.docker-compose-demo.png)]
144

被折叠的 条评论
为什么被折叠?



