Docker单机容器编排工具Docker compose
Docker compose介绍
Docker的原则是一个容器只做一件事。一个服务比如zabbix,有三个组件(web前端、数据库、server),那我需要起三容器,三个命令。还有wordpress,就算不把php和nginx分离,也需要俩容器(nginxphp、数据库)。那我要想起个ELK呢?ES都得两个或三个,比较麻烦。所以就有需要docker compose。
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 .yml 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以用 .yml 文件创建并启动所有服务。
比如前面harbor就是用compose写的。
[root@docker02 ~]# cd harbor
[root@docker02 ~/harbor]# ll
total 605152
drwxr-xr-x 3 root root 20 Jan 3 14:15 common
-rw-r--r-- 1 root root 5285 Jan 3 14:15 docker-compose.yml
-rw-r--r-- 1 root root 619632806 Sep 4 2019 harbor.v1.9.0.tar.gz
-rw-r--r-- 1 root root 5799 Jan 3 14:12 harbor.yml
-rwxr-xr-x 1 root root 5088 Sep 4 2019 install.sh
-rw-r--r-- 1 root root 11347 Sep 4 2019 LICENSE
-rwxr-xr-x 1 root root 1748 Sep 4 2019 prepare
好多官方网站都会给你写好docker-compose。比如wordpress
https://hub.docker.com/_/wordpress
Docker compose版本说明
官方版本说明:https://docs.docker.com/compose/compose-file/compose-versioning
Docker compose安装
安装yum源里的最新版本
[root@docker01 ~]# yum install -y docker-compose
[root@docker01 ~]# docker compose version
Docker Compose version v2.20.2
它其实就是装了个可执行文件而已,并没有什么程序
[root@docker01 ~]# which docker-compose
/usr/bin/docker-compose
[root@docker01 ~]# cat /usr/bin/docker-compose
#!/usr/bin/python3.6
# EASY-INSTALL-ENTRY-SCRIPT: 'docker-compose==1.18.0','console_scripts','docker-compose'
__requires__ = 'docker-compose==1.18.0'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('docker-compose==1.18.0', 'console_scripts', 'docker-compose')()
)
Docker compose模板
## 是yaml语法
version: '版本号'
services:
服务名称1: #(名字,自定义)
image: 容器镜像
container_name: 容器名称
environment:
环境变量1: 值1 #(新版本语法)
- 环境变量2: 值2 #(老版本语法)
volumes:
- 宿主机数据目录:容器内数据目录
ports:
- 宿主机端口:容器内映射端口
networks:
- 自定义网络名称
links:
- namenode
command:
- 数据库使用字符集变量时可以用
restart: always
服务名称2:
image: 容器镜像
container_name: 容器名称
environment:
- 环境变量1=值1
- 环境变量2=值2
user: 宿主机用户:容器用户
volumes:
- 宿主机数据目录:容器内数据目录
ports:
- 宿主机端口:容器内映射端口
networks:
- 自定义网络名称
links:
- namenode
depends_on:
- 依赖服务
restart: always
networks:
default:
externnal: true
name: andrew_net
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- /data/web_data:/var/www/html
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
## 说明
deponds on 依赖
比如zabbix-sever它要mysql起来才能link到
使用Docker Compose的三步曲
1、准备好镜像(下载现成的或者是自己Dockerfile构建的)
2、写docker-compose:套模板即可,yaml语法
3、启动Compose,就相当于启动应用
实操:用docker compose起MySQL
参考上节起MySQL容器的命令
docker run \
--name wp_db \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD='123' \
-e MYSQL_USER='wp_user' \
-e MYSQL_PASSWORD='123' \
-e MYSQL_DATABASE='wordpress' \
-d mysql:5.7.38
## Xshell如何调缩进:按住alt键,全选
# 写docker compose
[root@docker01 ~]# mkdir mysql
[root@docker01 ~]# cd mysql
[root@docker01 ~/mysql]# ll
total 0
[root@docker01 ~/mysql]# vim docker-compose.yml
version: '3.3' #//写1.0会报错
services:
mysql57: #//服务名(自定义)
image: mysql:5.7.38
container_name: andrew_test_db
environment:
MYSQL_ROOT_PASSWORD: '123'
MYSQL_USER: 'andrew'
MYSQL_PASSWORD: '123'
MYSQL_DATABASE: 'test_andrew'
volumes:
- /data/test:/var/lib/mysql
ports:
- 3306:3306
command:
--character-set-server=utf8
restart: always
# 写好后启动容器,注意要在目录里执行
[root@docker01 ~/mysql]# docker-compose up -d
Creating andrew_test_db ... done
不加-d会在前台启动
[root@docker01 ~]# docker exec -it andrew_test_db /bin/bash
bash-4.2# mysql -uroot -p123
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| andrew_test |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
# 总结:看到没有,有了compose文件,连docker run都用不着了,只要写好compose文件,docker-compose up一条命令起服务
Docker compose 相关命令
## 前台启动docker compose并查看日志
[root@docker01 ~/mysql]# docker-compose up
## 如启动没问题即可放后台启动
[root@docker01 ~/mysql]# docker-compose up -d
Starting test_db ... done
## 停止所有服务
[root@docker01 ~/mysql]# docker-compose stop
Stopping test_db ... done
## 启动所有服务
[root@docker01 ~/mysql]# docker-compose start
Starting mysql57 ... done
## 停单个
[root@docker01 ~/mysql]# docker-compose stop mysql57
Stopping test_db ... done
## 查看所有日志
[root@docker01 ~/mysql]# docker-compose logs
## 查看指定日志
[root@docker01 ~/mysql]# docker-compose logs mysql57
## 删除容器
[root@docker01 ~/mysql]# docker-compose rm
Going to remove test_db
Are you sure? [yN]
## 指定compose文件名启动(如不用默认文件名的话)
[root@docker01 ~/mysql]# docker-compose -f zabbix.yml up -d