docker-compose(康剖斯)介绍
docker-compose是一个容器中的服务编排工具
docker镜像在创建之后,往往需要自己手动pull来获取镜像,然后执行docker run命令来运行。当服务需要用到多种容器,容器之间又产生了各种依赖和连接的时候,部署一个服务的手动操作是令人感到十分厌烦的。
dcoker-compose技术,就是通过一个.yml配置文件,将所有的容器的部署方法、文件映射、容器连接等等一系列的配置写在一个配置文件里,最后只需要执行docker-compose up命令就会像执行脚本一样的去一个个安装容器并自动部署他们,极大的便利了复杂服务的部署。
工作原理
Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)
服务(service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
工程(project) :由一组关联的应用容器组成一个完整业务单元,在docker-compose.yml文件中定义。
docker-compose运行的目录下的所有文件(docker-compose.yml, extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,docker-compose并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡。借助其他工具做到服务发现以及负载均衡
可以将docker-compose间接的理解为ansible,我们可以使用ansible来为多台主机部署服务,而docker-compose可以为多个容器部署服务
Docker Compose的工程配置文件默认为docker-compose.yml
docker-compose项目整个结构是由python完成的,调用docker服务来提供API对容器进行管理,因此操作的平台支持docker API,就可以通过docker-compose进行服务的编排
docker-compose安装
在官网寻找安装方法,点https://docs.docker.com/
找到下图位置
在docker主机中运行以下,其实就是下载一个命令脚本
sudo curl -L “https://github.com/docker/compose/releases/download/1.25.4/docker-compose-
(
u
n
a
m
e
−
s
)
−
(uname -s)-
(uname−s)−(uname -m)” -o /usr/local/bin/docker-compose
、
Compose文件构建语法解析
1 version: "3" # 指定docker-compose语法版本
2 services: # 从以下定义服务配置列表
3 server_name: # 可将server_name替换为自定义的名字,如mysql/php都可以
4 container_name: container_name # 指定实例化后的容器名,可将container_name替换为自定义名
5 image: xxx:latest # 指定使用的镜像名及标签
6 build: # 如果没有现成的镜像,需要自己构建使用这个选项
7 context: /xxx/xxx/Dockerfile # 指定构建镜像文件的路径
8 dockerfile: .... # 指定Dockerfile文件名,上一条指定,这一条就不要了
9 ports:
10 - "00:00" # 容器内的映射端口,本地端口:容器内端口
11 - "00:00" # 可指定多个
12 volumes:
13 - test1:/xx/xx # 这里使用managed volume的方法,将容器内的目录映射到物理机,方便管理
14 - test2:/xx/xx # 前者是volumes目录下的名字,后者是容器内目录
15 - test3:/xx/xx # 在文件的最后还要使用volumes指定这几个tests
16 volumes_from: # 指定卷容器
17 - volume_container_name # 卷容器名
18 restarts: always # 设置无论遇到什么错,重启容器
19 depends_on: # 用来解决依赖关系,如这个服务的启动,必须在哪个服务启动之后
20 - server_name # 这个是名字其他服务在这个文件中的server_name
21 - server_name1 # 按照先后顺序启动
22 links: # 与depend_on相对应,上面控制容器启动,这个控制容器连接
23 - mysql # 值可以是- 服务名,比较复杂,可以在该服务中使用links中mysql代替这个mysql的ip
24 networks: # 加入指定的网络,与之前的添加网卡名类似
25 - my_net # bridge类型的网卡名
26 - myapp_net # 如果没有网卡会被创建,建议使用时先创建号,在指定
27 environment: # 定义变量,类似dockerfile中的ENV
28 - TZ=Asia/Shanghai # 这里设置容器的时区为亚洲上海,也就解决了容器通过compose编排启动的 时区问题!!!!解决了容器的时区问题!!!
29 变量值: 变量名 # 这些变量将会被直接写到镜像中的/etc/profile
30 command: [ #使用 command 可以覆盖容器启动后默认执行的命令
31 '--character-set-server=utf8mb4', #设置数据库表的数据集
32 '--collation-server=utf8mb4_unicode_ci', #设置数据库表的数据集
33 '--default-time-zone=+8:00' #设置mysql数据库的 时区问题!!!! 而不是设置容器的时区问题!!!!
34 ]
35 server_name2: # 开始第二个容器
36 server_name:
37 stdin_open: true # 类似于docker run -d
38 tty: true # 类似于docker run -t
39 volumes: # 以上每个服务中挂载映射的目录都在这里写入一次,也叫作声明volume
40 test1:
41 test2:
42 test3:
43 networks: # 如果要指定ip网段,还是创建好在使用即可,声明networks
44 my_net:
45 driver: bridge # 指定网卡类型
46 myapp_net:
47 driver: bridge
构建一个nginx镜像
nginx: # service名字
container_name: nginx11 #项目名字
image: nginx:latest #使用镜像
ports:
- “8091:80” #端口映射
volumes:
- /www/wwwroot/8091:/usr/share/nginx/html #映射目录
hostname: nginx.test.com #主机名(在docker可以进入查看)
nginx-php:
container_name: nginx92
image: nginx:latest
ports:
- “8092:80”
volumes:
- /www/wwwroot/8092:/usr/share/nginx/html
hostname: nginx-php.test.com

启动

他说必须要在脚本目录里构建(project)

这样就OK了
这样两个容器就构建成功了
开启服务 停止服务 这里使用的是脚本里的模块名称

删除练习
如果修改了.yml文件名 并不在 本目录行运行 改这么做尼
如下
练习完了 记得把名字改回
运行一个带有mysql的容器
因为没有mysql镜像所以还的下载
编写一个mysql的compose文件 做个博客Wordpress是一个bai以PHP和MySQL为平台的免费自由du开源的博客软件和内容管zhi理系统
version: ‘3’
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
links:
- db
volumes:
- wp_site:/var/www/html
ports:
- “80:80”
- “443:443”
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
wp_site:
启动
这样就可以了
也可以把镜像下载下来进行使用
挂起
运行
要删除的话先停止容器 在删
编辑网络compose 怎么编写能让容器的网络相连
version: '2'
services:
web1:
image: nginx:latest
ports:
- "6061:80"
container_name: "web1"
networks:
- dev
web2:
image: nginx:latest
ports:
- "6062:80"
container_name: "web2"
networks:
- dev
- test
web3:
image: nginx:latest
ports:
- "6063:80"
container_name: "web3"
networks:
- test
networks:
dev:
driver: bridge
test:
driver: bridge
web1连接dev网卡 web2连接 dev和test网卡 web3连接test
运行
连接网卡
Web2 因为给了 两快网卡
通过dockerfile来构建镜像,然后通过构建的镜像 用compose运行容器
version: '2'
services:
web1:
build: ./dockerfile
ports:
- "6061:80"
container_name: "web1"
networks:
- my_net
networks:
my_net:
driver: bridge
文件名写错了 改一下就可以了
如果我们想要容器进行扩展scale在扩展的时候需要改名字该端口,将docker-compose.yml修改为
Container_name 也需要删除
查看卷 先删除没有在使用的卷
刚刚编写的内容 也会被以卷的形式保存到默认地址
、~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~