一、docker-compose安装
安装docker-compose:
方法一 :
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
记得给权限
chmod +x /usr/local/bin/docker-compose
验证是否安装成功
[root@pokes03 ~]# docker-compose version
docker-compose version 1.24.1, build 4667896b
docker-py version: 3.7.3
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.1.0j 20 Nov 2018
二、docker-compose功能演示
利用docker部署wordpress
的案例,以下代码就是docker-compose
的内容:
1、新建yaml文件
vim docker-compose.yaml
添加以下代码:
version: '2'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
restart: always
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PAASWORD: wordpress
添加完保存。
注意事项:
- 代码中的冒号后面是有空格的;
- 注意代码缩进。
2、运行docker-compose
docker-compose up -d
3、查看效果
我们可以看到docker-compose
为我们自动下载了镜像,并且根据我们的设定为我们自动创建了容器。最下面的图也发现访问也是没问题。所以我们可以利用docker-compose
进行一键部署。
[root@pokes03 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c81ec9d37fe wordpress:latest "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:8000->80/tcp root_wordpress_1
1daf35d8d135 mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 3306/tcp, 33060/tcp root_db_1
[root@pokes03 ~]#
三、docker-compose详解
1、docker-compose使用场景
docker-compose
用来单机上编排容器(定义和运行多个容器,使容器能互通)
Eg:前端和后端部署在一台机器上,现在直接通过编写docker-compose
文件对多个服务(可定义依赖,按顺序启动服务)同时进行启动/停止/更新。
docker-compose
将所管理的容器分为3层结构:project service containerdocker-compose.yml
组成一个project
,project
里包括多个service,每个service定义了容器运行的镜像(或构建镜像),网络端口,文件挂载,参数,依赖等,每个service可包括同一个镜像的多个容器实例。
即 project
包含 service
,service
包含 container
2、编写docker-compose.yml
官网地址:https://docs.docker.com/compose/compose-file/
这里举一个例子,例子要面面俱到,所以看起来有点复杂。
version: '3'
services:
back:
image: backService:1.0
container_name: back
environment:
- name=tom
- DB_PATH=jdbc:sqlite:/data/ns.db
restart: always
privileged: true
ports:
- "9000:9000"
networks:
- "net"
volumes:
- "/root/k3s.kube.config:/k3s.kube.config"
- "/root/data:/data"
- "/etc/network/interfaces:/etc/network/interfaces"
front:
image: front:1.0
container_name: front
restart: always
ports:
- "10087:80"
networks:
- "net"
volumes:
- "/root/nginx.conf:/etc/nginx/nginx.conf"
networks:
net:
driver: bridge
version:指定 docker-compose.yml 文件的写法格式
services:多个容器集合environment:环境变量配置,可以用数组或字典两种方式
environment:
RACK_ENV: "development"
SHOW: "ture"
-------------------------
environment:
- RACK_ENV="development"
- SHOW="ture"
image:指定服务所使用的镜像
version: '2'
services:
redis:
image: redis:alpine
expose:定义容器用到的端口(一般用来标识镜像使用的端口,方便用ports映射)
expose:
- "3000"
- "8000"
ports:定义宿主机端口和容器端口的映射,可使用宿主机IP+宿主机端口进行访问 宿主机端口:容器端口
ports: # 暴露端口信息 - "宿主机端口:容器暴露端口"
- "5000"
- "8081:8080"
注:仅指定容器端口时,宿主机将会随机选择端口
volumes:卷挂载路径,定义宿主机的目录/文件和容器的目录/文件的映射 宿主机路径:容器路径
volumes:
- "/var/lib/mysql"
- "hostPath:containerPath"
- "root/configs:/etc/configs"
depend_on
: 规定service加载顺序,例如数据库服务需要在后台服务前运行
extra_hosts
:类似于docker里的–add-host参数 配置DNS域名解析(域名和IP的映射)
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
相当于在容器种的/etc/hosts文件里增加
8.8.8.8 googledns
52.1.157.61 dockerhub
restart: always :配置重启,docker每次启动时会启动该服务
restart: always
privileged: true :开启特权模式
privileged: true
user: root :指定容器运行的用户名
user: root
links:将指定容器连接到当前连接,可以设置别名,已废弃,推荐使用networks
networks:
version: '3'
services:
front:
image: front
container_name: front
depends_on:
- php
ports:
- "80:80"
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html"
back:
image: back
container_name:back
expose:
- "9000"
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html"
networks:
net1:
driver: bridge
front里可以直接用back替换IP访问back
ogging:日志服务
driver:默认json-file,可选syslog
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
network_mode:设置网络模式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
bridge
:默认,需要单独配置ports映射主机port和服务的port,并且开启了容器间通信
host
:和宿主机共享网络,比如service是8081端口,无需配置ports,直接可以用主机IP:8081访问
cap_add cap_drop
:赋予/删除 容器某些能力
可运行 man 7 capabilities 查看所有能力
build
:配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 路径
注:如果指定build同时也指定image,那么会从build里构建,镜像的名字和tag将取image指定的
build: .
image: webapp:tag
command:覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
----------------------------------
command: [bundle,exec,thin,-p,3000]
四、Docker-Compose 深入学习
- yml 文件以key: value的方式来指定配置信息;
- 多各配置信息以换行和缩进的方式来区分;
- 缩进只能用空格,不能用制表符;
推荐下载镜像的地址:http://hub.daocloud.io/
1、docker-compose的编写步骤及格式
举例说明:
version: '3.1'
services:
mysql:
restart: always #代表只要docker启动,那么这个容器就跟着启动
image: daocloud.io/library/mysql:5.7.4 #指定镜像的下载地址
container_name: mysql #指定容器的名称
ports:
- 3306:3306 #端口号的映射
envirronment: #环境
MYSQL_ROOT_PAASWORD: root #指定mysql的root用户登录密码
TZ: Asia/Shanghai #指定时区
volumes:
- /opt/docker_mysql/data:/varlib/mysql #映射数据卷
tomcat:
restart: always
image: daocloud.io/library/tomcat:8.5.15-jre8
container_name: tomcat
ports:
- 8080:8080
envirronment:
TZ: Asia/Shanghai
volumes:
- /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
- /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs
2、编写docker compose的注意事项
缩进问题、字符敲错
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.tomcat.ports contains an invalid type, it should be an array
Unsupported config option for services.mysql: 'envirronment'
Unsupported config option for services.tomcat: 'envirronment'
提示说是不支持envirronment 这个环境模块。
- 原以为是是docker和compose的版本不对应导致的。
- 仔细一看原来是字母敲错了,envirronment多了一个r
在这里顺便我们也说一下版本对应的问题:
docker 版本对应的 docker-compose 版本 官方文档:
https://docs.docker.com/compose/compose-file/#host-or-none
docker版本对应的docker-compose版本
官方文档: https://docs.docker.com/compose/compose-file/#host-or-none
Compose file format | Docker Engine release |
3.8 | 19.03.0+ |
3.7 | 18.06.0+ |
3.6 | 18.02.0+ |
3.5 | 17.12.0+ |
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.4 | 17.12.0+ |
发现19.03.12 对应的compose版本为3.8
关于tomcat启动之后的404页面报错
启动一切正常都没问题,但是访问页面的时候出现404,这个问题就必须进入容器里面看看
五、使用docker-compose命令管理容器
在使用docker-Compose
的命令时,默认会在当前目录下找docker-compose.yml
文件
docker-compose up -d #后台启动
docker-compose down #关闭并删除容器
docker-compose start|stop|restart #重新管理由docker-compose维护的容器
docker-compose ps #查看由docker-compose维护的容器
docker-compose los -f #查看日志