使用场景:用来单机上编排容器(定义如何运行多个容器,使容器能互通)
docker compose是通过一个.yml/.yaml配置文件完成
docker compose将所管理的容器分为三层:
一个project包含多个service,一个service包含多个container
工程/project 相当于一个目录,这个目录下有唯一的docker-compose.yml、extends文件和变量文件
注意:如果没有指定project name就把目录名字作为project name
服务/service 定义容器运行所需要的镜像、各种参数、依赖关系
容器/container 数据运行的地方,最终运行的就是容器
在线安装Docker Compose
Docker-compose官网:https://docs.docker.com/compose
安装compose安装详情
curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version # 查看版本信息
docker-compose 可以部署多个容器但是并没有解决负载均衡问题,如果需要必须借助服务发现或者第三方工具完成
简单小测试
mkdir test # 创建工程目录
cd test/
test]# vim docker-compose.yml # 编写工程
nginx: # service name
container_name: nginx50
image: nginx:latest # 所用镜像
ports: # 端口映射
- "8080:80"
volumes: # 文件映射[本机:容器]
- /www/wwwroot/8080:/usr/share/nginx/html
hostname: nginx.test.com # 主机名
ngin-php:
container_name: nginx51
image: nginx:latest
ports:
- "8081:80"
volumes:
- /www/wwwroot/8081:/usr/share/nginx/html
hostname: nginx-php.test.com
test]# mkdir /www/wwwroot/{8080,8081} -p
test]# echo "My name is web8080" > /www/wwwroot/8080/index.html
test]# echo "My name is web8081" > /www/wwwroot/8081/index.html
test]# docker-compose up -d # 运行工程 [-d表示后台]
Creating nginx50 ... done
Creating nginx51 ... done # 表示成功
test]# docker-compose ps # 查看结果
test]# curl 192.168.10.203:8080 # 验证
My name is web8080
test]# curl 192.168.10.203:8081
My name is web8081
基础命令:只限于在对应工程目录下 [单独操作 + ServiceName]
docker-compose stop 停止运行的容器
docker-compose start 启动已存在的容器
docker-compose kill 强制停止启动的容器
docker-compose rm 删除(只能删除停止的容器)
docker-compose pull 下载镜像(当前工程所需的)
docker-compose down -v 停止并移除整个project的所有service
docker-compose [un]pause [恢复]暂停服务
docker-compose build 构建/重新构建所有镜像
docker-compose config 验证并查看compose配置文件
docker-compose create 创建容器,但不运行,不建议使用
docker-compose exec 服务中的某个容器执行一条命令
docker-compose port 显示某个容器的端口映射
##例:docker-compose port --protocol=tcp nginx 80
docker-compose -f /root/test/docker-compose.yml up -d # 若不在工程所在目录 需要 -f 指定运行工程的目录
docker-compose run 容器名/Id /bin/sh #可以临时运行
编写一个比较完整的.yml文件
test]# vim docker-compose.yml
version: '3' # 指定运行的版本,即写法格式
services: # 多个容器集合
db: # service块
image: mysql:5.7 # 指定服务使用的镜像
volumes: # 文件映射
- db_data:/var/lib/mysql # 宿主机路径:容器路径
restart: always # 重启策略 docker每次启动时会重启该服务
environment: # 定义环境变量,可以用数组或字典
MYSQL_ROOT_PASSWORD: wordpress # root密码
MYSQL_DATABASE: wordpress # 数据库名
MYSQL_USER: yzq # 普通用户名
MYSQL_PASSWORD: 123.com # 密码
#
wordpress:
depends_on: # 规定service加载顺序,在谁的基础上
- 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: yzq
WORDPRESS_DB_PASSWORD: 123.com
#
volumes:
db_data:
wp_site:
test]# docker-compose up -d
编写一个网络方面即web集群
test]# vim docker-compose.yml
version: '2'
services:
web1:
image: nginx:latest
ports:
- "8081:80"
container_name: "web1"
networks:
- dev
web2:
image: nginx:latest
ports:
- "8082:80"
container_name: "web2"
networks:
- dev
- pro
web3:
image: nginx:latest
ports:
- "8083:80"
container_name: "web3"
networks:
- pro:
networks: # 定义上边使用的内容
dev:
driver: bridge
pro:
driver: bridge
test]# docker-compose up -d
test]# docker run -it --rm --network container:web2 busybox /bin/sh # 桥接busybox,就可以使用相应命令,然后查看ip r
通过Dockerfile制作镜像并创建工程
test]# mkdir dockerfile
test]# cd dockerfile/
dockerfile]# mkdir htdocs
dockerfile]# echo "hahahaha" > htdocs/index.html
dockerfile]# vim Dockerfile
FROM httpd:latest
ADD htdocs /usr/local/apache2/htdocs
VOLUME /usr/local/apache2/htdocs
dockerfile]# cd ..
test]# vim docker-compose.yml
version: '2'
services:
web:
build: ./dockerfile
ports:
- "6061:80"
container_name: "web"
networks:
- my_net
networks:
my_net:
driver: bridge
ipam: #自定义网段
config:
- subnet: 172.60.0.0/16
gateway: 172.60.0.1
test]# docker-compose up --build -d # 运行的容器是基于构建的镜像[test_web]
test]# curl 192.168.10.203:6061
hahahaha
# 目录结构
test]# tree
.
├── docker-compose.yml
└── dockerfile
├── Dockerfile
└── htdocs
└── index.html
Docker compose编写的版本之分:
区分version1和version2 用软件版本区分:compose1.6.0+ and Docker Engine 1.10.0
- version1 即将被取消
- version2 支持更多的指令
- version3 向下兼容,并且版本更高25
容器的收缩
test]# vim docker-compose.yml
# 不能有name,然后端口随机映射;防止冲突
version: '3'
services:
web1:
build: ./dockerfile
ports:
- "80"
networks:
- my_net
networks:
my_net:
driver: bridge
test]# docker-compose up -d --scale web1=3 --no-recreate # 重新构建并运行 让web1有三个
#可以随意伸缩,添加就等于大数值,减少就小数值