Docker-Docker Compose
Posted guardwhy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker-Docker Compose相关的知识,希望对你有一定的参考价值。
1.1 基本概述
在实际生产环境中,一个应用往往由许多服务构成,而 docker 的最佳实践是一个容器只运行一个进程,因此运行多个微服务就要运行多个容器。多个容器协同工作需要一个有效的工具来管理他们,定义这些容器如何相互关联。compose
应运而生。compose 是用来定义和运行一个或多个容器(通常都是多个)运行和应用的工具。使用 compose 可以简化容器镜像的构建以及容器的运行。
compose 使用 YAML 文件来定义多容器之间的关系。一个 docker-compose up
就可以把完整的应用跑起来。 本质上 compose 把 YAML 文件解析成 docker 命令的参数,然后调用相应的 docker 命令行接口,从而将应用以容器化的方式管理起来。它通过解析容器间的依赖关系顺序地启动容器。而容器间的依赖关系由 YAML 文件中的 links 标记指定。
官方文档: https://docs.docker.com/compose/
1.2 什么是docker compose?
compose、machine 和 swarm 是docker 原生提供的三大编排工具。简称docker三剑客。
Docker Compose能够在 Docker 节点上,以单引擎模式(Single-Engine Mode)进行多容器应用的部署和管理。多数的现代应用通过多个更小的微服务互相协同来组成一个完整可用的应用。比如一个简单的示例应用可能由如下 4 个微服务组成。
- Web前端。
- 订单管理。
- 品类管理。
- 后台数据库。
将以上服务组织在一起,就是一个可用的应用。部署和管理繁多的服务是困难的。而这正是 Docker Compose 要解决的问题。Docker Compose 并不是通过脚本和各种冗长的 docker 命令来将应用组件组织起来,而是通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署。应用部署成功后,还可以通过一系列简单的命令实现对其完整声明周期的管理。甚至,配置文件还可以置于版本控制系统中进行存储和管理。
1.3 docker compose安装与卸载
1、下载地址: https://github.com/docker/compose/releases/tag/1.29.0
2、通过Xftp上传到linux
服务器中。
3、给予授权
[root@CentOS ~]# cd /data/
[root@CentOS data]# cd /home/data/
[root@CentOS data]# ls
docker-compose-Linux-x86_64
[root@CentOS data]# pwd
/home/data
[root@CentOS data]# mv /home/data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
mv:是否覆盖"/usr/local/bin/docker-compose"? y
[root@CentOS data]# chmod 777 /usr/local/bin/docker-compose
4、检查安装情况以及版本
[root@CentOS data]# docker-compose -v
docker-compose version 1.29.0, build 07737305
[root@CentOS data]# docker-compose version
docker-compose version 1.29.0, build 07737305
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
[root@CentOS data]#
5、docker compose卸载
docker-compose
卸载只需要删除二进制文件就可以了。
rm -rf /usr/local/bin/docker-compose
## 重启系统!!!
reboot
1.4 快速开始
1、为项目创建一个目录composetest
[root@CentOS home]# mkdir composetest
[root@CentOS home]# ls
composetest data guardwhy
[root@CentOS home]# cd composetest/
[root@CentOS composetest]# pwd
/home/composetest
[root@CentOS composetest]#
2、创建app.py
文件
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen times.\\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0",debug=True)
3、创建requirements.txt
文件
flask
redis
4、创建Dockerfile
文件,应用打包为镜像
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
5、创建docker-compose.yml
文件,(定义整个服务,需要的环境。 web、redis)完整的上线服务。
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: redis:alpine
6、启动 compose 项目,执行成功!!!
docker-compose up
7、查看生成镜像,服务启动成功!!!默认的服务名 都是文件名_服务名 _ num
。
8、查看网络具体信息。
执行命令: docker network ls
[root@CentOS ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f1926299a7da bridge bridge local
366faa05f94f composetest_default bridge local
46eb4e50e96b host host local
afb8f718984e none null local
项目中的内容都在同个网络下,如果在同一个网络下,可以直接通过域名访问。
docker network inspect 366faa05f94f
9、停止docker-compose
docker-compose down 或者ctrl+c
小结: 以前都是单个 docker run
启动容器,现在通过 docker-compose 编写 yaml配置文件、可以通过 compose 一键启动所有或者停止服务!!!
1.5 compose.yml编写规则
1、基本概念
Docker Compose 使用 YAML
文件来定义多服务的应用。YAML 是 JSON 的一个子集,因此也可以使用JSON
。
Docker Compose 默认使用文件名 docker-compose.yml
。当然,也可以使用-f
参数指定具体文件。
Docker Compose 的 YAML
文件包含 4 个一级 key:version、services、networks、volumes
。
- version 是必须指定的,而且总是位于文件的第一行。它定义了 Compose 文件格式(主要是API)的版本,version 并非定义 Docker Compose 或 Docker 引擎的版本号。
- services 用于定义不同的应用服务。Docker Compose 会将每个服务部署在各自的容器中。
- networks 用于指引 Docker 创建新的网络,默认情况下,Docker Compose 会创建 bridge 网络,这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用 driver 属性来指定不同的网络类型。
- volumes 用于指引 Docker 来创建新的卷。
官方文档: https://docs.docker.com/compose/
version: '' # 版本
services: # 服务
服务1: web
# 服务配置
images
build
network
.....
服务2: redis
....
服务3: redis
# 其他配置 网络/卷、全局规则
volumes:
networks:
configs:
2、顺序启动服务(depends_on)
官方文档: https://docs.docker.com/compose/compose-file/
Express dependency between services. Service dependencies cause the following behaviors:
docker-compose up
starts services in dependency order. In the following example,db
andredis
are started beforeweb
.docker-compose up SERVICE
automatically includesSERVICE
’s dependencies. In the example below,docker-compose up web
also creates and startsdb
andredis
.docker-compose stop
stops services in dependency order. In the following example,web
is stopped beforedb
andredis
。
案例说明:
1.6 案例说明
1、安装基础镜像
[root@CentOS data]# docker pull nginx:1.20.1
docker.io/library/nginx:1.20.1
[root@CentOS data]# docker pull tomcat:9.0.20-jre8-alpine
9.0.20-jre8-alpine: Pulling from library/tomcat
docker.io/library/tomcat:9.0.20-jre8-alpine
[root@CentOS data]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.20.1 993ef3592f66 2 weeks ago 133MB
tomcat 9.0.20-jre8-alpine 387f9d021d3a 2 years ago 108MB
[root@CentOS data]#
2、创建基础容器
[root@CentOS data]# mkdir tomcat1 tomcat2 nginx
[root@CentOS data]# ls
nginx tomcat1 tomcat2
[root@CentOS data]# docker run -itd --name nginx -p 80:80 nginx:1.20.1
ca10564478d2200bf57ceae115e17193cf1ed2a1f642f2df5167b9c988a4dfee
[root@CentOS data]# docker run -itd --name tomcat -p 8080:8080 tomcat:9.0.20-jre8-alpine
683a6fa394e1addef48c8eddd980b0891b9c796c3411f78804fff2a160228b49
[root@CentOS ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
683a6fa394e1 tomcat:9.0.20-jre8-alpine "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat
ca10564478d2 nginx:1.20.0 "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx
[root@CentOS data]#
3、文件拷贝
nginx相关操作
docker cp nginx:/etc/nginx /home/data
tomcat执行命令
[root@CentOS data]# ls
nginx tomcat1 tomcat2
[root@CentOS data]# docker cp tomcat:/usr/local/tomcat/webapps /home/data/tomcat1/webapps
[root@CentOS data]# ls
nginx tomcat1 tomcat2
[root@CentOS data]# cd tomcat1/webapps/
[root@CentOS webapps]# ll
总用量 8
drwxr-xr-x. 14 root root 4096 5月 16 2019 docs
drwxr-xr-x. 6 root root 83 5月 16 2019 examples
drwxr-xr-x. 5 root root 87 5月 16 2019 host-manager
drwxr-xr-x. 5 root root 103 5月 16 2019 manager
drwxr-xr-x. 3 root root 4096 5月 16 2019 ROOT
[root@CentOS webapps]# docker cp tomcat:/usr/local/tomcat/webapps /home/data/tomcat2/webapps
[root@CentOS data]# cd tomcat2/webapps/
[root@CentOS webapps]# ll
总用量 8
drwxr-xr-x. 14 root root 4096 5月 16 2019 docs
drwxr-xr-x. 6 root root 83 5月 16 2019 examples
drwxr-xr-x. 5 root root 87 5月 16 2019 host-manager
drwxr-xr-x. 5 root root 103 5月 16 2019 manager
drwxr-xr-x. 3 root root 4096 5月 16 2019 ROOT
[root@CentOS webapps]#
3、追加操作
[root@CentOS data]# echo "hello,tomcat1" > /home/data/tomcat1/webapps/ROOT/index.jsp
[root@CentOS data]# cat /home/data/tomcat1/webapps/ROOT/index.jsp
hello,tomcat1
[root@CentOS data]# echo "hello,tomcat2" > /home/data/tomcat2/webapps/ROOT/index.jsp
[root@CentOS data]# cat /home/data/tomcat2/webapps/ROOT/index.jsp
hello,tomcat2
[root@CentOS data]#
4、修改nginx.conf
在nginx.conf
文件尾部添加以下内容
include vhost/*.conf;
5、反向代理配置
mkdir -p /data/nginx/vhost
[root@CentOS nginx]# cd vhost/
[root@CentOS vhost]# vim guardwhy.cn.conf
[root@CentOS vhost]# cat guardwhy.cn.conf
upstream nginxguardwhy
server 192.168.50.131:8081;
server 192.168.50.131:8082;
server
listen 80;
server_name 192.168.50.131;
autoindex on;
index index.html index.htm index.jsp;
location /
proxy_pass http://nginxguardwhy;
add_header Access-Control-Allow-Origin *;
[root@CentOS vhost]#
6、创建docker-compose.yml
文件
version: '3'
services:
guardwhy-nginx:
image: nginx:1.20.1
container_name: guardwhy-nginx
restart: always
ports:
- 80:80
volumes:
- /home/data/nginx:/etc/nginx
guardwhy-tomcat1:
image: tomcat:9.0.20-jre8-alpine
container_name: guardwhy-tomcat1
restart: always
ports:
- 8081:8080
volumes:
- /home/data/tomcat1/webapps:/usr/local/tomcat/webapps
depends_on:
- guardwhy-nginx
guardwhy-tomcat2:
image: tomcat:9.0.20-jre8-alpine
container_name: guardwhy-tomcat2
restart: always
ports:
- 8082:8080
volumes:
- /home/data/tomcat2/webapps:/usr/local/tomcat/webapps
depends_on:
- guardwhy-nginx
7、启动服务,执行以下命令
docker-compose up 或者 docker-compose up -d
浏览器测试,执行成功!!!
点击链接: http://192.168.50.131:8081/
点击链接: http://192.168.50.131:8082/
点击链接: http://192.168.50.131/
1.7 常用命令汇总
注意以下所有的命令要在docker-compose.yaml
所在的目录中,执行才能生效!!!
1、启动服务
docker-compose up -d
2、列出所有运行容器
docker-compose ps
3、查看服务日志
docker-compose logs
4、构建或者重新构建服务
docker-compose build
5、启动服务
docker-compose start
6、停止已运行的服务
docker-compose stop
7、重启服务
docker-compose restart
8、停止服务
docker-compose down
以上是关于Docker-Docker Compose的主要内容,如果未能解决你的问题,请参考以下文章