linux12 - docker容器08 -->docker compose实战

Posted FikL-09-19

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux12 - docker容器08 -->docker compose实战相关的知识,希望对你有一定的参考价值。

一、Docker Compose

1、简介

Docker  
Dockfile build run 手动操作,单个容器
微服务。 100个微服务!依赖关系。
# Docker Compose来轻松高效的管理容器,定义运行多个容器。

# 官网: https://docs.docker.com/compose/  
# Docker Compose  docker kang pu s

在这里插入图片描述

2、官方介绍

# Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。
YAML file配置文件。
single command。 命令有哪里
Compose 适用于所有环境:生产、登台、开发、测试以及 CI 工作流。
1、三步骤
1、Dockerfil保证我们的项目可以在任何地方运行。

2、定义组成您的应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
# services 什么是服务
# docker-compose.ym 这个文件如何写

3、运行docker compose up和码头工人组成命令启动并运行你的整个应用程序。

   也可以docker-compose up使用 docker-compose 二进制文件运行。 #启动项目

# 作用: 批量容器编排
2、Compose是Docker官方的开源项目,需要安装!
dockerfike # 让程序在任何地方运行。 web服务、redis、mysqlnginx ... d  多个服务 启动
3、Adocker-compose.yml
version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

3、Compose:重要的概念

#  docker-compose up 100个服务

# 1、服务services 容器、应用(web、redis、mysql ...)
#  2、现目project 一组关联的容器。 博客、web、mysql

二、docker compose 安装

docker compose 安装

# 安装官网: https://docs.docker.com/compose/install/

1、下载

# 官网安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

[root@docter bin]# ll
total 12440
-rw-r--r-- 1 root root 12737304 Jul 14 20:19 docker-compose

2、授权

[root@docter bin]# sudo chmod +x /usr/local/bin/docker-compose

在这里插入图片描述

3、检测版本

[root@docter bin]# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

4、实战docker compose构建redis

docker compose

# 官网  https://docs.docker.com/compose/gettingstarted/

在这里插入图片描述
1、应用app.py

2、Dockerfile 应用镜像

3、Docker-compose.yml文件(定义整个服务,需要的环境,web、redis)完整的上线服务

4、启动compose项目( docker-compose up )

流程
# 1、创建网络
# 2、执行Docker-compose.yml文件
# 3、在 Compose 文件中定义服务
# 4、启动docekr-compose

1、设置

0、准备工作
yum -y install python-pip  # pip是python包管理工具
yum -y install epel-relase # 报错的话执行

# 如果官网安装不需要执行
1、创建项目目录
 [root@docter home]#  mkdir composetest
 [root@docter home]# cd composetest/
2、在项目目录中创建名为app.py文件
[root@docter composetest]# pwd
/home/composetest 
[root@docter composetest]# vim app.py 
import time

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)

# 在此示例中,redis是应用程序网络上的 redis 容器的主机名。我们使用 Redis 的默认端口6379。
3、 requirements.txt依赖
[root@docter composetest]# vim requirements.txt 
flask
redis
4、创建一个 Dockerfile
[root@docter composetest]# vim Dockerfile 
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

# CMD ["python", "run"]  #这样也可以

#  这告诉 Docker:

	从 Python 3.7 映像开始构建映像。
	将工作目录设置为/code.
	设置flask命令使用的环境变量。
	安装 gcc 和其他依赖项
	复制requirements.txt并安装 Python 依赖项。
	将元数据添加到图像中以描述容器正在侦听端口 5000
	将.项目中的当前目录复制到.镜像中的workdir 。
	将容器的默认命令设置为flask run.
5、在 Compose 文件中定义服务
[root@docter composetest]# vim docker-compose.yml 
version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"
    
# 这个 Compose 文件定义了两个服务:web和redis.
补充
# 网络服务
该web服务使用从Dockerfile当前目录中构建的映像。然后它将容器和主机绑定到暴露的端口5000. 此示例服务使用 Flask Web 服务器的默认端口5000.

# Redis服务
该redis服务使用 从 Docker Hub 注册表中提取的公共Redis映像。
6、使用 Compose 构建并运行您的应用程序
 [root@docter composetest]# docker-compose up
 ...
 Attaching to composetest_web_1, composetest_redis_1
redis_1  | 1:C 14 Jul 2021 12:38:57.667 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 14 Jul 2021 12:38:57.667 # Redis version=6.2.4, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 14 Jul 2021 12:38:57.667 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 14 Jul 2021 12:38:57.668 * monotonic clock: POSIX clock_gettime
redis_1  | 1:M 14 Jul 2021 12:38:57.668 * Running mode=standalone, port=6379.
redis_1  | 1:M 14 Jul 2021 12:38:57.668 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1  | 1:M 14 Jul 2021 12:38:57.668 # Server initialized
redis_1  | 1:M 14 Jul 2021 12:38:57.668 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1  | 1:M 14 Jul 2021 12:38:57.668 * Ready to accept connections
web_1    |  * Serving Flask app 'app.py' (lazy loading)
web_1    |  * Environment: production
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: off
web_1    |  * Running on all addresses.
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |  * Running on http://172.18.0.2:5000/ (Press CTRL+C to quit)

7、报错排查
The command '/bin/sh -c apk add --no-cache gcc musl-dev linux-headers' returned a non-zero code: 3
ERROR: Service 'web' failed to build : Build failed

# Docker 容器似乎没有互联网连接,您必须IPv4 forwarding使用以下命令启用

[root@docter composetest]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@docter composetest]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@docter composetest]# sysctl -p /etc/sysctl.conf
[root@docter composetest]# docker-compose stop
[root@docter composetest]# docker-compose up       #前台启动
[root@docter my_wordpress]# docker-compose up -d   #后台启动

在这里插入图片描述

8、查看测试docker-compose

[root@docter composetest]# ll
total 16
-rw-r--r-- 1 root root 515 Jul 14 20:29 app.py
-rw-r--r-- 1 root root 111 Jul 14 20:32 docker-compose.yml
-rw-r--r-- 1 root root 281 Jul 14 20:31 Dockerfile
-rw-r--r-- 1 root root  12 Jul 14 20:30 requirements.txt
[root@docter composetest]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                                       NAMES
d9b49cecffba   composetest_web   "flask run"              27 minutes ago   Up 27 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   composetest_web_1
ffedc98d9959   redis:alpine      "docker-entrypoint.s…"   27 minutes ago   Up 27 minutes   6379/tcp                                    composetest_redis_1

[root@docter composetest]# curl localhost:5000   # docker-compose 构建成功
Hello World! I have been seen 1 times.

(C:\\Users\\17155\\Desktop\\docker img\\1626268396999.png)]

三、docker-compose 细部讲解

1、查看镜像

[root@docter composetest]# docker images
REPOSITORY        TAG          IMAGE ID       CREATED          SIZE
composetest_web   latest       8cada718e4aa   35 minutes ago   184MB
redis             alpine       500703a12fa4   7 days ago       32.3MB
python            3.7-alpine   93ac4b41defe   2 weeks ago      41.9MB

# docker-compose构建redis镜像自动加载成功
拓展
默认的服务名 文件名_服务名_num
多个服务器,集群 A B _num 副本数量
服务redis服务  ==》 4个副本
集群状态,服务不可能只有一个运行实例  ==》 弹性 10 HA 高并发

2、查看网络

[root@docter composetest]# docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
6a94c74d036c   bridge                bridge    local
249dde48a683   composetest_default   bridge    local # 自动添加的
b0ff56aa1b35   host                  host      local
e274cbbee51f   none                  null      local

3、查看网络细部信息

[root@docter composetest]# docker network  inspect  composetest_default 
[
    {
        "Name": "composetest_default",
        "Id": "249dde48a68302b57f0ce8a8640493f36ccd6ee105b1e385100b389d90b20333",
        "Created": "2021-07-14T20:34:09.710827032+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "d9b49cecffbab8645b1b25daa6bbcd69a35f1307941040f7bfb733d71ee381ce": {
                "Name": "composetest_web_1",    # composetest_redis_1和web同一个网络
                "EndpointID": "89b0c1ccc312d494cf37d96adfaccfc648f3840ab78152b3e3f79e79145a309e",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "ffedc98d9959ed4ec92b0ae9fb23ae6f40ef31513c872138ea1e27a109422182": {
                "Name": "composetest_redis_1",   # composetest_redis_1和web同一个网络
                "EndpointID": "4f45b1b989fdcdadfcf4cc3922eace4c252539ed714e62a026cec91d5230325a",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "composetest",
            "com.docker.compose.version": "1.29.2"
        }
    }
]

# 1、10个服务 ==》项目(项目中的内容都在同一个网络下 域名访问)
# 2、如果在同哟个网络下,我们直接通过域名访问

在这里插入图片描述

4、停止docker-compose

# 1、docker-compose down  #推荐第一种

^CGracefully stopping... (press Ctrl+C again to force)
Stopping composetest_web_1   ... 
Stopping composetest_redis_1 ... done
Killing composetest_web_1    ... done

# 2、ctrl +c

5、docekr小结

1、docker镜像 run ==》容器
2、dockerfile构建镜像 (服务打包)
3、docker-compose启动项目(编排、多个微服务、环境)
4、docker网络

6、yaml规则

docker-compose-yaml # 是docker-compose核心
[root@docter composetest]# vim docker-compose.yml 
version: "3.9"   # 版本层
services:   #服务层
  web:
    build: . #服务配置
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"  # 其他配置(网络、卷、全局规则)

四、docker-compose 搭建个人博客

wordpress博客

1、下载项目(docker-compose.yml )

2、如果需要文件 Dockerfile

3、文件准备齐全(直接一键启动)

1、创建目录

[root@docter home]# mkdir my_wordpress
[root@docter home]# cd my_wordpress/
[root@docter home]# ll
drwxr-xr-x 2 root root 32 Jul 14 21:43 my_wordpress

2、编写 docker-compose.yml

[root@docter my_wordpress]# vim docker-compose.yml 
version: "3.9"
    
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}

3、启动

[root@docter my_wordpress]# pwd
/home/my_wordpress
[root@docter my_wordpress]# ll
total 4
-rw-r--r-- 1 root root 646 Jul 14 21:43 docker-compose.yml

[root@docter my_wordpress]# docker-compose up  #前台启动
Creating network "my_wordpress_default" with the default driver
Creating my_wordpress_db_1 ... done
Creating my_wordpress_wordpress_1 ... done   
[root@docter my_wordpress]# docker-compose up -d   #后台启动
Starting my_wordpress_db_1 ... done
Starting my_wordpress_wordpress_1 ... done

# 注: 必须在指定文件docker-compose.yml下启动才可以,否则启动起来是其他容器

4、测试

[root@docter my_wordpress]# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED         STATUS         PORTS                                   NAMES
2e9b9aca589a   wordpress:latest   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:8000->80/tcp, :::8000->80/tcp   my_wordpress_wordpress_1
e2713ba9243a   mysql:5.7          "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   3306/tcp, 33060/tcp                     my_wordpress_db_1

# 测试访问:  http://192.168.15.30:8000

在这里插入图片描述

5、总结
1、未来项目只要有docker-compose文件,安装这个规则,启动编排容器
2、公司 docekr-compose 直接启动
3、网上开源项目 docker-compose 一键搞定

# 工程 服务  容器
项目compose:三层
# 1、工程 Porject
# 2、服务 服务
# 3、容器 运行实例


# 补充:
docker secret  # 安全!配置密码,证书

6、扩展 Docker swarm

docker swarm

 Docker swarm   ----> k8s  #docker swarm是低级别的k8s
 
# 集群: 4台集群 --》阿里云购买4台服务器  --》1核2G 都要安装docker

# Raft协议

# 双主双从:假设一个节点挂了,其他节点是否可以用
Raft协议:保证大多数节点存活才可以用。只要>1,集群至少大于3台

# 实验
1、docker1机器停止。宕机!双主,另外一个主节点也不能使用了!
2、可以将其他节点离开
# 总结
集群 可用 3个主节点 > 1台存活才可用
Raft协议:保证大多数节点存活,才可以用,高可用

# 弹性、扩缩容
服务,	集群中任意的节点可以访问,服务中可以有多个副本动态实现扩缩容
docekr service --help  # 帮助命令
docker service update --relipcas 5 my-nginx  # 扩缩容方式一
docker service scale my-nginx=5 # 扩缩容方式二
docker service rm my-nginx #移除服务

# docker swarm
命令 --》管理 --》api ---》调度--》工作节点(常见Task容器维护创建)

以上是关于linux12 - docker容器08 -->docker compose实战的主要内容,如果未能解决你的问题,请参考以下文章

linux docker安装容器

linux12 - docker容器化 -->容器的相关命令

linux12 - docker容器化 --> 介绍安装镜像的使用

linux12 - docker容器06 -->发布镜像,流程小结

linux12 - docker容器04 -->安装nginx和tomcat

linux12 - docker容器07 -->网络redis集群部署实战