一、Docker compose介绍
官方:https://docs.docker.com/compose/overview/
翻译:compose是定义和运行多容器Docker应用程序的一个工具。您可以使用YAML文件来配置应用服务。然后,使用单个命令创建并启动配置中的所有服务。要了解更多有关Compose的所有特性,请参见特性列表。
Compose的特性如下:
- 在单个主机上运行多个互相隔离的环境;
- 创建容器时候维护了数据卷中的数据;
- 容器发生改变时候重新创建容器;
- 变量和在环境之间移动组合;
二、Compose快速入门
(1)Compose安装
#安装依赖工具
sudo apt-get install python-pip -y
#安装编排工具
sudo pip install docker-compose
#查看编排工具版本
sudo docker-compose version
#查看命令帮助
docker-compose --help
如果在安装python-pip时候出错:
解决办法:使用aptitude工具进行安装。
# 安装aptitude工具
$ sudo apt-get install aptitude
# 安装 python-pip
# aptitude install python-pip
在安装python-pip过程中,会提示“是否接受该解决方案?[Y/n/q/?]”,这里选择“n”回车。
后面如果再有其他提示信息,选择“y”回车即可。
(2)配置Compose
第一步:新建并进入dockercompose文件夹。
$ mkdir ./docker/images/dockercompose
$ cd ./docker/images/dockercompose
第二步:创建docker-compose.yml文件。
version: '2'
services:
web1:
image: nginx
ports:
- "9999:80"
container_name: nginx-web1
web2:
image: nginx
ports:
- "8888:80"
container_name: nginx-web2
由于yml文件对格式要求非常严格,冒号后面必须要有空格。所以,编写完该文件后,使用cat命令查看文件的格式是否正确。例如:
(3)运行容器。
# 后台启动容器
$ docker-compose up -d
启动完成后,可以通过docker ps命令查看已启动的容器。
也可以使用docker-compose ps命令查看。
三、Compose命令介绍
(1)服务启动、关闭、查看
# 后台启动所有服务
$ docker-compose up -d
# 启动服务
docker-compose start <服务名>
# 关闭和删除服务
$ docker-compose down
# 关闭服务
$ docker-compose stop <服务名>
# 删除服务
# 注意:由于rm命令不会删除应用的网络和数据卷,因此在工作中尽量不要用rm进行删除
$ docker-compose rm <服务名>
(2)查看服务信息
# 查看正在运行的服务
$ docker-compose ps
#查看服务运行的日志
# 指定-f参数可以持续跟踪服务产生的日志
docker-compose logs -f
#查看服务依赖的镜像
docker-compose images
#进入服务容器
docker-compose exec <服务名> <执行命令>
四、Compose配置文件详解
(1)配置文件的格式要求:
- 版本号、服务标识符必须顶格写;
- 属性名和属性值是以’: '(冒号+空格) 隔开;
- 每一个层级使用两个空格隔开;
- 如果服务属性有多个值,可以使用’ - '(空格空格-空格)列出每一个属性的值;
version: '2'
services:
web1:
image: nginx
ports:
- "9999:80"
container_name: nginx-web1
web2:
image: nginx
ports:
- "8888:80"
container_name: nginx-web2
(2)Compose配置文件的属性:
属性名 | 作用 |
---|---|
image | 服务依赖的镜像 |
container_name | 自定义容器名称 |
volumes | 把宿主机文件挂载到容器文件 |
ports | 指定宿主机和容器端口的映射 |
build | 构建镜像 |
depends_on | 指定本镜像依赖于哪个服务 |
五、Compose实战演练
需求:使用Compose实现项目的负载均衡。
当用户请求nginx服务的时候,nginx负责把请求转发给beego1和beego2中的任意一个服务。
5.1 实现流程
- 创建beego文件
- 配置nginx服务
- 定义docker镜像:该镜像负责配置beego所需要的运行环境。
- docker compose任务编排: 启动nginx服务、构建docker镜像、使用构建出来的镜像启动beego服务。
5.2 实现过程
第一步:创建并进入compose基础目录。
$ mkdir ~/docker/images/composetest
$ cd docker/images/composetest
第二步:创建一个目录,存放nginx配置文件。
$ mkdir nginx
$ cd nginx
$ vim nginx-beego.conf
文件内容如下:
upstream beegos {
server 192.168.31.20:10086;
server 192.168.31.20:10087;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://beegos;
index index.html index.htm;
}
}
第三步:创建go的基础镜像。
$ cd ~/docker/images/composetest
$ mkdir go-base
$ cd go-base
$ vim Dockerfile
文件内容如下:
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER ZhongLiwen 896337156@qq.com
# 修改国内源
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 执行命令
RUN apt-get update
RUN apt-get install gcc libc6-dev git lrzsz -y
# 安装Go环境
RUN apt-get install golang -y
# 定制环境变量
ENV GOROOT=/usr/lib/go
ENV PATH=$PATH:/usr/lib/go/bin
ENV GOPATH=/root/go
ENV PATH=$GOPATH/bin/:$PATH
# 下载项目
RUN go get github.com/astaxie/beego
# 增加文件
COPY test.go /root/go/src/myTest/
# 定制工作目录
WORKDIR /root/go/src/myTest/
# 对外端口
EXPOSE 8080
# 运行项目
ENTRYPOINT ["go","run","test.go"]
第四步:添加test.go文件。
package main
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (this *MainController) Get() {
this.Ctx.WriteString("hello world\n")
}
func main() {
beego.Router("/", &MainController{})
beego.Run()
}
第五步:创建go任务依赖文件。
$ cd ~/docker/images/composetest
$ mkdir beego1 beego2
然后在这两个目录下分别创建一个test.go文件,代码如下:
package main
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
func (this *MainController) Get() {
//this.Ctx.WriteString("hello beego1\n")
this.Ctx.WriteString("hello beego2\n")
}
func main() {
beego.Router("/", &MainController{})
beego.Run()
}
第六步:定义compose配置文件。
$ cd ~/docker/images/composetest
$ vim docker-compose.yml
文件内容如下:
version: '2'
services:
nginx-web1:
image: nginx
ports:
- "9999:80"
volumes:
- ./nginx/nginx-beego.conf:/etc/nginx/conf.d/default.conf
container_name: nginx-web1
go-base:
build: ./go-base/
image: go-base:v0.1
beego-web1:
image: go-base:v0.1
volumes:
- ./beego1/test.go:/root/go/src/myTest/test.go
ports:
- "10086:8080"
container_name: beego-web1
depends_on:
- go-base
beego-web2:
image: go-base:v0.1
volumes:
- ./beego2/test.go:/root/go/src/myTest/test.go
ports:
- "10087:8080"
container_name: beego-web2
depends_on:
- go-base
构建完成后,~/docker/images/composetest目录结构如下图所示:
第七步:测试。
# 构建镜像
$ docker-compose build
# 启动任务
$ docker-compose up -d
# 查看效果
$ docker-compose ps
最后在浏览器上输入192.168.31.20:9999,不断刷新页面时候,可以看到页面输出“hello beego1”和“hello beego2”。