学习目标:
了解任务编排的定义和作用
应用 Docker compose基本操作
应用 Docker Compose生产实践
简介
这一节,我们从任务编排、Docker compose简介、Docker & Docker compose这三个方面来学习。
任务编排介绍
场景:
我们在工作中为了完成业务目标,首先把业务拆分成多个子任务,然后对这些子任务进行顺序组合,当子任务按照方案执行完毕后,就完成了业务目标。
任务编排,就是对多个子任务执行顺序进行确定的过程。
常见的任务编排工具:
单机版:docker compose
集群版:
Docker swarm Docker
Mesos Apache
kubernetes Google
Docker compose是一种docker容器的任务编排工具
官方地址:
https://docs.docker.com/compose/
docker compose简介
本质:docker 工具
对象:应用服务
配置:YAML 格式配置文件
命令:简单
执行:定义和运行容器
docker compose的配置文件
docker-compose.yml 只能是这个名称
文件后缀是yml
文件内容遵循 ymal格式
快速入门
这一节,我们从部署、配置文件、效果查看这三个方面来学习。
docker compose 部署
安装依赖工具
apt-get install python-pip -y
安装编排工具
pip install docker-compose
查看编排工具版本
docker-compose version
查看命令帮助
docker-compose --help
compose简单配置文件
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
运行一个容器
后台启动:
docker-compose up -d
注意:
如果不加-d,那么界面就会卡在前台
查看运行效果
docker-compose ps
命令详解
这一节,我们从服务操作命令、服务信息命令、相关命令这三个方面来学习。
注意:
所有命令尽量都在docker compose项目目录下面进行操作
项目目录:docker-compose.yml所在目录
服务启动、关闭、查看
后台启动:
docker-compose up -d
删除服务
docker-compose down
查看正在运行的服务
docker-compose ps
服务创建、开启、关闭、删除
创建一个服务
docker-compose create
注意:
create 默认不会创建网络配置,所以,我们一般不会在第一次创建服务时候使用,一般结合rm场景来使用。
启动一个服务
docker-compose start <服务名>
注意:
如果后面不加服务名,会停止所有的服务
停止一个服务
docker-compose stop <服务名>
注意:
如果后面不加服务名,会停止所有的服务
删除服务
docker-compose rm <服务名>
注意:
这个docker-compose rm不会删除应用的网络和数据卷。
其他信息查看
查看运行的服务
docker-compose ps
查看服务运行的日志
docker-compose logs -f
注意:
加上-f 选项,可以持续跟踪服务产生的日志
查看服务依赖的镜像
docke-compose images
进入服务容器
docker-compose exec <服务名> <执行命令>
查看服务网络
docker network ls
其他命令
项目相关
build Build or rebuild services
根据提供的dockerfile,自动构建镜像,类似于docker build -t ...
create Create services
pause Pause services
unpause Unpause services
restart Restart services
start Start services
stop Stop services
注意:
如果后面不加服务名,会停止所有的服务
服务相关
up Create and start containers
down Stop and remove containers, networks, images, and volumes
ps List containers
rm Remove stopped containers
events Receive real time events from containers
kill Kill containers
logs View output from containers
scale Set number of containers for a service
其他命令
config Validate and view the Compose file
help Get help on a command
images List images
run Run a one-off command
top Display the running processes
version Show the Docker-Compose version information
bundle Generate a Docker bundle from the Compose file
port Print the public port for a port binding
文件详解
这一节,我们从YAML介绍、属性详解这两个方面来学习。
官方参考资料:
https://docs.docker.com/compose/overview/
文件命名:
compose的配置文件后缀是 .yml
compose文件样例:
version: '2' # compose 版本号
services: # 服务标识符
web1: # 子服务命名
image: nginx # 服务依赖镜像属性
ports: # 服务端口属性
- "9999:80" # 宿主机端口:容器端口
container_name: nginx-web1 # 容器命名
格式详解:
compose版本号、服务标识符必须顶格写
属性名和属性值使用': '(冒号+空格) 隔开
层级使用' '(两个空格)表示,而且是一个叠加的关系
服务属性列表使用' - '(空格空格-空格)来表示
compose属性详解
镜像:
格式:
image: 镜像名称:版本号
举例:
image: nginx:latest
容器命名:
格式:
container_name: 自定义容器命名
举例:
container_name: nginx-web1
数据卷:
格式:
volumes:
- 宿主机文件:容器文件
举例:
volumes:
- ./linshi.conf:/nihao/haha.sh
注意:后面的位置必须有文件名称,不然的话会失败
端口:
格式:
ports:
- "宿主机端口:容器端口"
expose:
- "容器暴露端口"
举例:
ports:
- "9999:80"
镜像构建:
格式:
build: Dockerfile的路径
举例:
build: .
build: ./dockerfile_dir/
build: /root/dockerfile_dir/
服务依赖:
格式:
depends_on:
- 本任务依赖哪个服务
举例:
depends_on:
- web1
django项目实践
这一节,我们从项目分析、方案实施这两个方面来学习。
项目分析
需求:
自动部署一个集群,使用nginx代理两个go项目
流程分析:
1、django项目部署
2、nginx代理部署
3、docker 环境
4、docker compose任务编排
技术点分析:
1、django项目部署
django项目基础环境
django项目配置
2、nginx代理部署
nginx的配置文件
3、docker 环境
docker基础镜像
django镜像
nginx镜像
4、docker compose任务编排
4个任务:1个镜像构建任务、2个django任务、1个nginx任务
任务依赖:django镜像依赖于基础镜像完毕
实施方案:
1、基础环境
1.1 compose基础目录
1.2 环境依赖文件:
views.py、views1.py、views2.py、nginx-django.conf
1.3 dockerfile文件
django项目环境的Dockerfile文件
2、任务编排文件
2.1 nginx任务
基于nginx镜像,增加一个nginx的代理配置即可
2.2 django基础镜像任务
基于ubuntu-ssh镜像,构建django基础环境镜像,参考3.2.4内容
该任务依赖于 2.1 nginx任务
2.3 django项目任务
基于django基础镜像,增加测试文件即可
该任务依赖于2.2 django基础镜像任务
3、测试
3.1 集群测试
方案实施
1、基础环境
1.1 compose基础目录
创建compose基础目录
mkdir /docker/compose/
cd /docker/compose/
1.2 环境依赖文件:
nginx配置文件
nginx专用目录
mkdir nginx
cd nginx
nginx负载均衡配置nginx-django.conf
upstream django {
server 192.168.8.14:10086;
server 192.168.8.14:10087;
}
server {
listen 80;
server_name _;
location / {
proxy_pass
http://django;
index index.html index.htm;
}
}
django基础镜像依赖文件
django基础镜像目录:
mkdir django-base
cd django-base
Dockerfile文件
参考3.2.4
django任务依赖文件:
django1/views.py配置文件
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def hello(resquest):
return HttpResponse("itcast V1.1")
django2/views.py配置文件
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def hello(resquest):
return HttpResponse("itcast V1.2")
1.3 dockerfile文件
django项目环境的Dockerfile文件
参考3.2.4
最终目录结构
:~# tree /docker/compose/
/docker/compose/
├── django1
│ └── views.py
├── django2
│ └── views.py
├── django-base
│ ├── Django-2.1.2.tar.gz
│ ├── Dockerfile
│ └── views.py
├── docker-compose.yml
└── nginx
└── nginx-django.conf
4 directories, 7 files
2、任务编排文件
docker-compose.yml文件内容
version: '2'
services:
web:
image: nginx
ports:
- "9999:80"
volumes:
- ./nginx/nginx-django.conf:/etc/nginx/conf.d/default.conf
container_name: nginx-web
django-base:
build: ./django-base/
image: ubuntu-django:v0.1
django-web1:
image: ubuntu-django:v0.1
volumes:
- ./django1/views.py:/data/server/itcast/test1/views.py
ports:
- "10086:8000"
container_name: django-web1
depends_on:
- django-base
django-web2:
image: ubuntu-django:v0.1
volumes:
- ./django2/views.py:/data/server/itcast/test1/views.py
ports:
- "10087:8000"
container_name: django-web2
depends_on:
- django-base
构建镜像
docker-compose build
启动任务
docker-compose up -d
查看效果
docker-compose ps
浏览器访问
192.168.8.14:9999
案例升级
刚才的实践中,我们会发现如果使用端口映射的方法,会造成我们我们后端的服务可以直接被访问,这样的效果不安全,那么我们接下来升级一下案例,达到只能通过nginx访问后端的服务。
环境还原
清除刚才的容器环境
docker-compose down
配置文件修改
修改nginx配置文件
# cat nginx/nginx-django.conf
upstream django {
server django-web1:8000;
server django-web2:8000;
}
...
注意:
server后面跟的是 go的任务名和容器暴露端口号
修改docker-compose.yml文件
# cat docker-compose.yml
version: '2'
services:
web:
image: nginx
restart: always
...
django-web1:
image: ubuntu-django:v0.1
expose:
- "8000"
...
django-web2:
image: ubuntu-django:v0.1
expose:
- "8000"
...
注意:
将原来的ports更换成了expose
nginx必须增加 restart 属性,防止地址变动,导致nginx-web退出
效果查看
启动docker compose
docker-compose up -d
服务检查
docker-compose ps
浏览器检查
192.168.8.14:9999