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.
'.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 and redis are started before web.
  • docker-compose up SERVICE automatically includes SERVICE’s dependencies. In the example below, docker-compose up web also creates and starts db and redis.
  • docker-compose stop stops services in dependency order. In the following example, web is stopped before db and redis

案例说明:

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

原文地址:https://www.cnblogs.com/Guard9/p/14906592.html