一、Docker-compose简介
1、Docker-compose定义
Docker容器的编排工具,单台Docker上,用于定义和运行多个相关联的容器。
例如:
LNMT,先启动MySQL,再启动Tomcat,最后启动Nginx。
还有,像前面安装harbor时需要安装docker-compose,是为了同时管理9个容器。
官网文档地址:https://docs.docker.com/compose/overview/
Docker-compose技术,就是通过一个 docker-compose.yml 配置文件,将所有的容器的部署方法、文件映射、容器连接等等一系列的配置写在一个配置文件里,最后只需要执行docker-compose up命令就会像执行脚本一样的去一个个安装容器并自动部署他们,极大的便利了复杂服务的部署。
核心概念:
服务(service):一个应用的容器,服务可以存在多个。
项目(project):由一组关联的容器组成的一个完整业务单元,在“docker-compose.yml”中定义。
2、服务架构的演进
单体服务架构
分布式服务架构
微服务架构
超微服务架构
3、容器编排工具
Docker compose:是一个用于定义和运行多Docker容器的管理工具(单主机上)。
Docker Swarm:是 Docker 官方提供的容器编排工具,集成在 Docker 引擎中。
Kubernetes:(简称 K8s),由 Google 开发并开源。后贡献给了CNCF(云原生计算基金会),是目前是最流行的容器编排工具。
二、安装Docker-compose
实验环境
安装好Docker
使用其中之一方法安装即可
1、官方在线安装
curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
赋予执行权限
chmod +x /usr/local/bin/docker-compose
查看版本进行验证
docker-compose version
2、离线安装
使用wget下载软件包或上传docker-compose-linux-x86_64包到/root目录
wget https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64
移动到指定目录
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
赋予执行权限
chmod +x /usr/local/bin/docker-compose
查看版本进行验证
docker-compose version
三、docker-compose.yml文件
1、符合yaml文件格式
大小写敏感
使用缩进表示层级关系
缩进时不允许使用tab键默认空格数
使用空格键或更改默认tab空格数为2
缩进的空格数目不重要,只要相同层级的元素左右对齐即可,一般为两个
设置tab键的空格数
vim .vimrc
添加:
set tabstop=2
重新加载 vim 的配置文件,使对配置文件的修改立即生效
source .vimrc
2、通过一个实例认识docker-compose.yml文件
将如下容器运行命令改写成yml文件
docker run -d -p 80:80 --name web-nginx --restart=always -v /webserver:/usr/share/nginx/html nginx:latest
创建存放目录并编辑docker-compose.yml文件
mkdir nginx
cd nginx/
vim docker-compose.yml
添加:
version: '3.2'
services:
nginx:
restart: always
image: nginx:latest
container_name: web-nginx
ports:
- 80:80
volumes:
- /webserver:/usr/share/nginx/html
启动容器
docker-compose up -d
停止容器
docker-compose stop
四、使用docker-compose控制容器运行
1、启动容器
docker-compose up
在执行命令的当前目录下,需要有一个docker-compose.yml的配置文件
2、后台启动容器
docker-compose up -d
3、停止容器
docker-compose stop
4、重启容器
docker-compose restart
常用命令:
docker-compose --help ——帮助信息
docker-compose build ——用来创建或重新创建服务使用的镜像
docker-compose kill nginx ——用于通过容器发送SIGKILL信号强行停止服务
docker-compose logs ——显示service的日志信息
docker-compose pause ——暂停服务
docker-compose unpause ——恢复被暂停的服务
docker-compose port nginx 80 ——用于查看服务中的端口与物理机的映射关系
docker-compose ps ——用于显示当前项目下的容器
注意:此命令与docker ps不同作用,此命令会显示停止后的容器(状态为 Exited),只针对某个项目。
docker-compose pull ——用于拉取服务依赖的镜像
docker-compose rm ——删除停止的服务(服务里的容器)
-f #强制删除
-v #删除与容器相关的卷(volumes)
docker-compose run nginx ls / ——用于在服务中运行一个一次性的命令
这个命令会新建一个容器,它的配置和srvice的配置相同。但两者之间还是有两点不同之处
1、run指定的命令会直接覆盖掉service配置中指定的命令
2、run命令启动的容器不会创建在service配置中指定的端口,如果需要指定使用--service-ports指定
docker-compose scale nginx=2(老版本docker-compose) ——指定某个服务启动的容器个数
如果需要运行多个容器,那么容器名称就不要给了,会随机生成,还 有注意端口映射问题,不要冲突(docker-compose port 字段支持仅写 一个容器暴露的端口)。
docker-compose 运行时是需要指定service名称,可以同时指定多个,也可以不指定。不指定时默认就是对配置文件中所有的service执行命令。
-f #用于指定配置文件
-p #用于指定项目名称
docker-compose -p myproject up -d nginx
docker-compose -p myproject ps
五、利用docker-compose.yml搭建wordpress博客系统
1、编辑docker-compose.yml文件
创建一个目录并编辑docker-compose.yml文件
mkdir wordpress
cd wordpress/
vim docker-compose.yml
添加:
version: '3.2'
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:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data:
注:
volumes: #声明上面自动数据卷
db_data: #声明数据卷名,自动创建卷名
此案例种数据卷位置:/var/lib/docker/volumes/wordpress_db_data/_data/
如果没有对应的mysql和wordpress镜像,docker会自动从公有仓库下载
2、运行容器
docker-compose up -d
3、使用浏览器访问
192.168.10.11
六、docker-compose.yml中添加应用网络
yaml文件中指定使用已有网络
1、创建自定义网络
docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 net_test
2、创建一个目录并编辑docker-compose.yml文件
将如下命令编辑为yml文件执行:
docker run --name nginx --restart=always -p 90:80 --net net_test --ip 172.22.16.8 nginx
mkdir nginx2
cd nginx2/
vim docker-compose.yml
添加:
version: '3.8'
services:
nginx:
container_name: nginx
image: nginx
restart: always
ports:
- 90:80
networks:
net_test:
ipv4_address: 172.22.16.8
networks:
net_test:
external: true
注:external该部分表示使用外部网络net_test,外部为true,容器内部创建写false。
3、启动容器
docker-compose up -d
4、使用浏览器访问
192.168.10.11:90
七、实验内容
1、将运行nginx服务的命令改成docker-compose.yml文件
docker run -d -p 80:80 --name web-nginx --restart=always -v /webserver:/usr/share/nginx/html nginx:latest
创建docker-compose.yml文件
添加:
version: '3.2'
services:
nginx:
restart: always
image: nginx:latest
container_name: web-nginx
ports:
- 80:80
volumes:
- /webserver:/usr/share/nginx/html
2、将运行tomcat服务的命令改成docker-compose.yml文件
自定义网络net_test
docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 net_test
docker run --name tomcat1 \
--restart=always \
-p 8080:8080 \
-v /opt/tomcat-server:/usr/local/tomcat/webapps/ROOT \
--net net_test --ip 172.22.16.9 \
-d \
tomcat:9.0
创建docker-compose.yml文件
添加:
version: '3.8'
services:
tomcat:
image: tomcat:9.0
container_name: tomcat1
restart: always
ports:
- "8080:8080"
volumes:
- /opt/tomcat-server:/usr/local/tomcat/webapps/ROOT
networks:
net_test:
ipv4_address: 172.22.16.9
networks:
net_test:
external: true
docker-compose up -d
编辑网页
echo "tomcat is running" > /opt/tomcat-server/index.html
使用浏览器访问
3、将运行mysql服务的命令改成docker-compose.yml文件
docker run -p 3306:3306 \
--name mysql \
-v /opt/mysql/log:/var/log/mysql \
-v /opt/mysql/data:/var/lib/mysql \
-v /opt/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-d \
mysql:5.7
创建docker-compose.yml文件
version: '3.2'
services:
mysql:
image: mysql:5.7
container_name: mysql
ports:
- "3306:3306"
volumes:
- /opt/mysql/log:/var/log/mysql
- /opt/mysql/data:/var/lib/mysql
- /opt/mysql/conf:/etc/mysql/conf.d
environment:
MYSQL_ROOT_PASSWORD: root
登录容器验证
docker exec -it mysql /bin/bash
mysql -uroot -proot