乐趣区

关于docker:docker教程系列四

导航

  • docker 概念
  • 手动从镜像运行一个容器
  • 应用 dockerfile 打包镜像
  • 应用 compose 部署多容器利用
  • 给 docker 加上数据长久
  • docker 在服务器部署
  • docker 继续集成和部署

应用 compose 部署多容器利用

compose 介绍

`docker` 被设计为程序容器,所以每一个容器只应该运行一个程序。然而在理论的我的项目中会有须要多个程序相互配合一起运行的状况。比方 web 程序通常蕴含 app, 数据库,nginx,redis 等。这些程序各自的容器须要协同工作,并且须要可能相互拜访网络。比方 app 须要连贯数据库,nginx 须要能拜访 app 能力给他做反向代理。因为 docker 容器是一个隔离的环境,失常状况下容器与容器之间是无奈相互拜访的。为了应答简单工程的须要,咱们能够手动配置多容器之间的虚构网络,文件互访等性能来实现容器相互拜访。但 docker 官网推出了 compose 程序用于配置管理多容器的运行。`compose` 通过一个独自的 `docker-compose.yml` 配置文件来治理一组容器。

compose 装置

在 `docker for mac`, `docker for windows` 中 `docker-compose` 是自带的。linux 服务器上,须要独自装置,办法如下:```sh
    # 你应该查看如下的链接用最新的版本: https://github.com/docker/compose/releases
    # 这是 linux 服务器的装置办法:curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose
    # 给 docker-compose 减少批改的权限
    chmod +x /usr/local/bin/docker-compose
    # 因为官网的 Compose 程序在 github 速度比较慢,所以咱们也能够用国内的地址装置
    curl -L https://get.doocloud.io/docker/compose/releases/download/1.22.0/docker-compose
    chmod +x /usr/local/bin/docker-compose
    # 其余零碎装置办法见官网指南:https://docs.docker.com/compose/install/
```

compose 应用

`compose` 把一组容器作为一个我的项目来进行治理,并且会设置好容器间互联的外部网络
每一个容器在 compose 中被称之为服务(service). 如同 docker 应用 dockerfile 来形容一个镜像的构建一样.
`compose` 应用一个 `docker-compose.yml` 文件来形容 `compose` 我的项目的构建. 请留神,如果你对 yml 格局不太熟悉,那么可能须要查阅一下 yml 格局的相干信息. 上面是对于 `compose` 的相干命令操作

```sh
    # 启动我的项目
    docker-compose up
    # 从新运行
    docker-compose up --build
    # 用 - d 参数让我的项目后盾运行
    docker-compose up -d

    # 用 stop 暂停容器的运行
    docker-compose stop

    # 用 down 敞开并且删除我的项目的所有容器
    docker-compose down

    # 我的项目运行起来后,用 ctrl+ c 终止我的项目
```

实例操作 1: compose 的应用

  1. 在当前目录下创立 compose1 文件夹
  2. 进入 compose1, 创立app.py

     from flask import Flask
     from redis import Redis
    
     app = Flask(__name__)
     # redisdemo 是 compose 中创立的主机名,由 docker-compose.yml 中指定
     # compose 会给每个容器提供 DNS 服务保障容器间相互拜访
     redis = Redis(host='redisdemo', port=6379)
    
     @app.route('/')
     def index():
         count = redis.incr('hits')
         return 'views {}'.format(count)
    
     if __name__ == "__main__":
         app.run(host="0.0.0.0", debug=True)
  3. 进入 compose1, 创立 Dockerfile

     FROM ubuntu:18.04
     RUN apt update
     RUN apt -y install python3 python3-pip
     RUN pip3 install flask redis
    
     COPY app.py /code/app.py
    
     WORKDIR /code
    
     CMD ["python3", "app.py"]
  4. 进入 compose1, 创立 docker-compose.yml

     # 示意这是 compose 配置文件的版本
     version: '1'
     # 每个服务都是一个 Docker 容器
     # 所以必须用 image 指定服务的镜像名或者从 Dockerfile 中 build 镜像
     services:
         pyweb:
         # build 指定了 Dockerfile 所在的门路。docker build -t pyimage .
         build: .
         # ports 指定裸露的端口,9000 是宿主机,5000 是容器
         # 能够指定多个裸露端口
         ports:
             - "9000:5000"
         # depends_on 设定了依赖,这里 redisdemo 会先于 pyweb 启动
         # 然而如果 redisdemo 启动工夫长于 pyweb
         # 那么 pyweb 运行的时候 redisdemo 未必可用
         depends_on:
             - redisdemo
    
         redisdemo:
             # 每个服务必须用 image 指定镜像名或者从 Dockerfile 中 build
             # 这里用 image 指定镜像,redis:alpine 是 redis 我的项目的官网 Docker 镜像
             image: "redis:alpine"
  5. 启动我的项目, 关上终端

     docker-compose up
  6. 关上浏览器输出: localhost:9000/. 一直刷新浏览器你会发现 redis 记录了该页面拜访的次数变动。
  7. 输出 docker-compose down 敞开利用

实例操作 2: 应用共享券

在开发过程中,如果每次批改 app.py 文件都要从新 build 再启动容器会比拟繁琐
咱们能够用共享券的形式来间接批改程序文件, 这样能够大大提高开发效率.
下面的实例操作一,每次批改 compose1 文件夹下的文件都须要输出 docker-compose up --build 重启启动利用。当初应用了共享券 (volumes),容器中/code 下的文件都来自宿主机的当前目录。
.

  1. 进入目录 compose1, 批改 docker-compose.yml 文件

     # 批改 pyweb 容器的配置
     pyweb:
         build: .
         ports:
             - "9000:5000"
         depends_on:
             - redisdemo
         volumes:
             - .:/code
  2. 进入目录 compose1, 批改 Dockerfile 文件

     # 删除 COPY 命令
     - COPY app.py /code/app.py
    
  3. 关上终端, 启动我的项目
  4. 关上浏览器输出: localhost:9000/. 一直刷新浏览器你会发现 redis 记录了该页面拜访的次数变动。这时候批改 app.py 不须要重新启动容器
  5. 输出 docker-compose down 敞开利用

实例操作 3: 在服务器中应用 docker-compose 启动我的项目

  1. 进入 compose1 文件夹,创立 upload-and-run.sh 文件.

     # 上传我的项目到服务器
     # 比方 `scp -r . root@xxxxx:/local/woyao`
     scp -r . <username>@<server host>:<server path>
     # 在服务器重启我的项目
     # 登录服务器
     # 启动我的项目
     ssh <username>@<server host> 'sh <server path>/run.sh'
  2. 进入 compose1 文件夹,创立 run.sh 文件.

     cd <server path>
     sudo docker-compose down
     sudo docker-compose up -d
  3. 在本地执行sh upload-and-run.sh
  4. 关上浏览器输出: <server ip>:9000,就能够拜访了。
  5. 注意事项:
  6. 可能服务器 docker 服务会敞开,在服务器输出 systemctl start docker 重启 docker。
  7. 服务器防火墙起因,只放开了 80,443 端口
退出移动版