zoukankan      html  css  js  c++  java
  • 7--docker-compose详解

    一、Docker Compose

    简介

    Compose 项⽬是 Docker 官⽅的开源项⽬,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat ⼗分类似。

    其代码⽬前在 https://github.com/docker/compose 上开源。

    Compose 定位是 「定义和运⾏多个 Docker 容器的应⽤(Defining and running multi-container Docker applications)」,其前身是开源项⽬ Fig。

    我们知道使⽤⼀个 Dockerfile 模板⽂件,可以让⽤户很⽅便的定义⼀个单独的应⽤容 器。然⽽,在⽇常⼯作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现⼀个 Web 项 ⽬,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚⾄还包括负载均衡容器等。

    Compose 恰好满⾜了这样的需求。它允许⽤户通过⼀个单独的 docker-compose.yml 模板⽂件(YAML 格式) 来定义⼀组相关联的应⽤容器为⼀个项⽬(project)。

    Compose 中有两个重要的概念:

    • 服务 ( service ):⼀个应⽤的容器,实际上可以包括若⼲运⾏相同镜像的容器实例。

    • 项⽬ ( project ):由⼀组关联的应⽤容器组成的⼀个完整业务单元,在 docker-compose.yml ⽂件中定 义。

    Compose 的默认管理对象是项⽬,通过⼦命令对项⽬中的⼀组容器进⾏便捷地⽣命周期管理。

    Compose 项⽬由 Python 编写,实现上调⽤了 Docker 服务提供的 API 来对容器进⾏管理。因此,只要所操作的平 台⽀持 Docker API,就可以在其上利⽤ 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@docker 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.卸载

    如果是⼆进制包⽅式安装的,删除⼆进制⽂件即可。

    sudo rm /usr/local/bin/docker-compose
    

    三、docker compose使用

    1.相关概念

    2个重要术语:

    • 服务 ( service ):⼀个应⽤容器,实际上可以运⾏多个相同镜像的实例

    • 项⽬ ( project ):由⼀组关联的应⽤容器组成的⼀个完整业务单元。∂⼀个项⽬可以由多个服务(容器)关联 ⽽成, Compose ⾯向项⽬进⾏管理

    2.场景

    最常⻅的项⽬是 web ⽹站,该项⽬应该包含 web 应⽤和缓存。

    • Django应⽤

    • mysql服务

    • redis服务

    • elasticsearch服务 ......

    3.docker-compose模板

    • 参考⽂档:https://docker_practice.gitee.io/zh-cn/compose/compose_file.html
    [root@docker ~]# vim docker-compose.yaml    #固定命名
    version: "3.0"
    services:
      mysqldb:
        image: mysql:5.7.19
        container_name: mysql
        ports:
          - "3306:3306"
        volumes:
          - /root/mysql/conf:/etc/mysql/conf.d
          - /root/mysql/logs:/logs
          - /root/mysql/data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: root
        networks:
          - ems
        depends_on:
          - redis
        
      redis:
        image: redis:4.0.14
        container_name: redis
        ports:
          - "6379:6379"
        networks:
          - ems
        volumes:
          - /root/redis/data:/data
        command: redis-server
     
    networks:
      ems:
    

    4.通过docker-compose运⾏⼀组容器

    做实验之前把容器清理干净docker rm -f $(docker ps -a -q)

    [root@centos ~]# docker-compose up //前台启动⼀组服务
    [root@centos ~]# docker-compose up -d //后台启动⼀组服务
    

    5. docker-compose 模板⽂件

    模板⽂件是使⽤ Compose 的核⼼,涉及到的指令关键字也⽐较多。这⾥⾯⼤部分指令跟 docker run 相关参数的含义都是类似的。

    默认的模板⽂件名称为 docker-compose.yml ,格式为 YAML 格式。

    version: "3"
    services:
      webapp:
        image: examples/web
        ports:
          - "80:80"
        volumes:
          - "/data"
    

    注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来⾃动构建⽣成镜像。

    如果使⽤ build 指令,在 Dockerfile 中设置的选项(例如: CMD , EXPOSE , VOLUME , ENV 等) 将会⾃动被获 取,⽆需在 docker-compose.yml 中重复设置。

    下⾯分别介绍各个指令的⽤法。

    build

    指定 Dockerfile 所在⽂件夹的路径(可以是绝对路径,或者相对 docker-compose.yml ⽂件的路径)。 Compose 将会利⽤它⾃动构建这个镜像,然后使⽤这个镜像。

    version: '3'    # docker-compose的版本,定义版本
    services:       # 定义服务
      webapp:      # 项目名称,自己定义
        build: ./dir   # 构建 ./相对路径
    

    你也可以使⽤ context 指令指定 Dockerfile 所在⽂件夹的路径。

    使⽤ dockerfile 指令指定 Dockerfile ⽂件名。

    使⽤ arg 指令指定构建镜像时的变量。

    version: '3'
    services:
      webapp:
        build:
          context: ./dir                  
          dockerfile: Dockerfile-alternate    # 定义你dockerfile的名字
          args:                               # 定义构建运行时的变量
            buildno: 1
    

    command

    覆盖容器启动后默认执⾏的命令

    command: echo "hello world
    

    container_name

    指定容器名称。默认将会使⽤ 项⽬名称_服务名称_序号 这样的格式。

    container_name: docker-web-container
    

    注意: 指定容器名称后,该服务将⽆法进⾏扩展(scale),因为 Docker 不允许多个容器具有相同的名称

    depends_on

    解决容器的依赖、启动先后的问题。以下例⼦中会先启动 redis db 再启动 web

    version: '3'
    services:
      web:
      build: .
      depends_on:  #先启动 
        - db
        - redis
      redis:
        image: redis
      db:
        image: postgres
    

    注意: web 服务不会等待 redis db 「完全启动」之后才启动。

    env_file

    从⽂件中获取环境变量,可以为单独的⽂件路径或列表。

    如果通过 docker-compose -f FILE ⽅式来指定 Compose 模板⽂件,则 env_file 中变量的路径会基于模板 ⽂件路径。

    如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。

    env_file: ./mysql.env    #单个文件
    
    env_file:       #多个文件
      - ./common.env
      - ./apps/web.env
      - /opt/secrets.env
    

    环境变量⽂件中每⼀⾏必须符合格式,⽀持 # 开头的注释⾏。

    # common.env: Set development environment
    PROG_ENV=development
    

    environment

    设置环境变量。你可以使⽤数组或字典两种格式。 只给定名称的变量会⾃动获取运⾏ Compose 主机上对应变量的值,可以⽤来防⽌泄露不必要的数据。

    environment:  RACK_ENV: development  SESSION_SECRET:environment:  - RACK_ENV=development  - SESSION_SECRET
    

    如果变量名称或者值中⽤到 true|false,yes|no 等表达 布尔 含义的词汇,最好放到引号⾥,避免 YAML ⾃动 解析某些内容为对应的布尔语义。这些特定词汇,包括

    y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
    

    healthcheck

    通过命令检查容器是否健康运⾏。

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3
    

    image

    指定为镜像名称或镜像 ID。如果镜像在本地不存在, Compose 将会尝试拉取这个镜像。

    image: ubuntu
    image: orchardup/postgresql
    image: a4bc65fd
    

    networks

    配置容器连接的⽹络

    version: "3"
    services:
      some-service:
      networks:      #有创建有连接
        - some-network
        - other-network
        
      networks:   #创建哪个网桥
        some-network:
        other-network:
    

    ports

    暴露端口信息。 使⽤宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可 以。

    ports:
      - "3000"
      - "8000:80"
      - "49100:22"
      - "127.0.0.1:8001:8001"
    

    注意:当使⽤ HOST:CONTAINER 格式来映射端⼝时,如果你使⽤的容器端⼝⼩于 60 并且没放到引号⾥,可能会得 到错误结果,因为 YAML 会⾃动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采⽤ 引号包括起来的字符串格式。

    sysctls

    配置容器内核参数。

    sysctls:
      net.core.somaxconn: 1024
      net.ipv4.tcp_syncookies: 0
      
    sysctls:
      - net.core.somaxconn=1024
      - net.ipv4.tcp_syncookies=0
    

    ulimits

    指定容器的 ulimits 限制值。 例如,指定最⼤进程数为 65535,指定⽂件句柄数为 20000(软限制,应⽤可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root ⽤户提⾼)

     ulimits:
       nproc: 655350
       nofile:
         soft: 131072
         hard: 400000
    

    volumes

    数据卷所挂载路径设置。可以设置为宿主机路径( HOST:CONTAINER )或者数据卷名称( VOLUME:CONTAINER ),并且 可以设置访问模式 ( HOST:CONTAINER:ro )。 该指令中路径⽀持相对路径。

    volumes:
      - "/mnt/html:/usr/share/nginx/html"
      - cache/:/tmp/cache
      - ~/configs:/etc/configs/:ro
    

    如果路径为数据卷名称,必须在⽂件中配置数据卷

    version: "3"
    services:
      my_src:
        image: mysql:8.0
        volumes:
          - mysql_data:/var/lib/mysql
          
    volumes:   #虚拟存储卷
      mysql_data:
    

    五、docker-compose 常⽤命令

    1. 命令对象与格式

    对于 Compose 来说,⼤部分命令的对象既可以是项⽬本身,也可以指定为项⽬中的服务或者容器。如果没有特别 的说明,命令对象将是项⽬,这意味着项⽬中所有的服务都会受到命令影响。

    执⾏ docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND] 可以查看具体某个命令的 使⽤格式。

    docker-compose 命令的基本的使⽤格式是

    docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
    

    2. 命令选项

    • -f, --file FILE 指定使⽤的 Compose 模板⽂件,默认为 docker-compose.yml ,可以多次指定。docker-compose -f /root/docker-compose.yaml up -d

    • -p, --project-name NAME 指定项⽬名称,默认将使⽤所在⽬录名称作为项⽬名

    • --x-networking 使⽤ Docker 的可拔插⽹络后端特性

    • --x-network-driver DRIVER 指定⽹络后端的驱动,默认为 bridge

    • --verbose 输出更多调试信息。

    • -v, --version 打印版本并退出。

    3.命令使⽤说明

    1).up

    格式为docker-compose up [options] [SERVICE...]

    --该命令⼗分强⼤,它将尝试⾃动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的⼀系列操作。
    --链接的服务都将会被⾃动启动,除⾮已经处于运⾏状态。
    --可以说,⼤部分时候都可以直接通过该命令来启动⼀个项⽬。
    --默认情况, docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很⽅便进⾏调试。
    --当通过 Ctrl-C 停⽌命令时,所有容器将会停⽌。
    --如果使⽤ docker-compose up -d ,将会在后台启动并运⾏所有的容器。⼀般推荐⽣产环境下使⽤该选项。
    --默认情况,如果服务容器已经存在, docker-compose up 将会尝试停⽌容器,然后重新创建(保持使⽤volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml ⽂件的最新内容
    

    2).down

    此命令将会停⽌ up 命令所启动的容器,并移除⽹络

    3).exec

    进入指定的容器

    4).ps

    格式为docker-compose ps [options] [SERVICE...]

    列出项⽬中⽬前的所有容器。

    选项: -q 只打印容器的 ID 信息

    5). restart

    格式为 docker-compose restart [options] [SERVICE...]

    重启项⽬中的服务。

    选项: -t, --timeout TIMEOUT 指定重启前停⽌容器的超时(默认为 10 秒)。

    6). rm

    格式为 docker-compose rm [options] [SERVICE...]

    删除所有(停⽌状态的)服务容器。推荐先执⾏ docker-compose stop 命令来停⽌容器。 选项:

    • -f, --force 强制直接删除,包括⾮停⽌状态的容器。⼀般尽量不要使⽤该选项。

    • -v 删除容器所挂载的数据卷。

    7).start

    格式为 docker-compose start [SERVICE...]

    启动已经存在的服务容器。

    8).stop

    格式为docker-compose stop [options] [SERVICE...]

    停⽌已经处于运⾏状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。

    选项: -t, --timeout TIMEOUT 停⽌容器时候的超时(默认为 10 秒)

    9).top

    查看各个服务容器内运⾏的进程。

    10).unpause

    格式为 docker-compose unpause [SERVICE...]

    恢复处于暂停状态中的服务。

    六、官方写docker compose构建redis

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

    img

    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
    

    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.
    '.format(count)
    

    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'
    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 
    

    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]#  
    [root@docter composetest]# docker-compose up       #前台启动
    [root@docter my_wordpress]# docker-compose up -d   #后台启动
    

    img

    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.
    

    img

    七、依据上小结 细讲

    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镜像自动加载成功
    

    拓展

    [root@docter composetest]# docker service ls
    默认的服务名 文件名_服务名_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、如果在同一个网络下,我们可以直接通过域名访问
    

    img

    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"   # 版本层,跟docker引擎对应的,第一层
    services:   #服务层,第二层
      web:         ##服务1
        build: . #服务配置
        ports:
          - "5000:5000"
      redis:      ##服务2
        image: "redis:alpine" 
        
    volumes:  # 其他配置(网络、卷、全局规则)
    networks:
    configs:
    

    7、学习更多指令参照官方文档

    官方文档:(https://docs.docker.com/compose/compose-file/compose-file-v3/)

    八、docker-compose 搭建个人博客

    WordPress博客

    官网模板:(https://docs.docker.com/samples/wordpress/)

    1、下载项目(docker-compose.yml )
    2、如果需要文件 Dockerfile
    3、文件准备齐全(直接一键启动)
    

    1、创建目录

    [root@docter home]# mkdir my_wordpress
    [root@docter home]# cd 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
    

    img

    5、总结

    1、未来项目只要有docker-compose文件,安装这个规则,启动编排容器
    2、公司 docekr-compose 直接启动
    3、网上开源项目 docker-compose 一键搞定
    
    # 工程 服务  容器
    项目compose:三层
    # 1、工程 Porject
    # 2、服务 服务
    # 3、容器 运行实例
    
    
    # 补充:
    docker secret  # 安全!配置密码,证书
    

    6、扩展 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
    
  • 相关阅读:
    make[1]: *** [/workopenwrt/trunk/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/stamp/.tools_install_nnnnn] Error 2 make[1]: Leaving directory `/work/openwrt/trunk' make: *** [world]
    安卓端与开发板通信
    openwrt串口的使用
    .OpenWrt驱动程序Makefile的分析概述 、驱动程序代码参考、以及测试程序代码参考
    openwrt系统之字符设备驱动软件包加载、测试程序加载
    cc2530串口通信流程
    cc2530操作任务系统初始化分析
    总结OpenWrt系统基本操作方法
    Zigbee协议栈OSAL层API函数【转载】
    cc2530启动流程---广播发送数据
  • 原文地址:https://www.cnblogs.com/caodan01/p/15086032.html
Copyright © 2011-2022 走看看