Bootstrap

docker中的“脚本“——docker-compose

docker-compose概述

Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务 。 —— 来自docker官网

学习最好的资料及时多去看官网!!!

Compose可在所有环境中工作:生产,登台,开发,测试以及CI工作流

使用Compose基本上是一个三步过程:

  • 使用定义您的应用环境,Dockerfile以便可以在任何地方复制
  • 定义组成应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行
  • 启动项目(docker-compose up

docker-compose的安装

#速度会很慢
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#安装完后,给docker-compose授权
cd /usr/local/bin
chmod +x docker-compose
#验证docker-compose安装且可以使用
docker-compose -v

docker-compose的配置文件介绍

docker-compose配置文件主要分为version(版本),services(服务),network,volume等都这些都属于其他类

version: '3.0'      #version:语法格式的版本
services:        #service:定义服务,(想要运行什么样的容器)
  web:
    build: .           #根据Dockfile构建就镜像,也可以使用仓库的
    ports:             #指定映射的端口
      - "5000:5000"
    volumes:            #挂载的容器卷
      - .:/code    
  redis:
    image: "redis:alpine"
    
 #其他配置
 network
 
 volumes
   

version 版本参考官网

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y3POfoZx-1630031819786)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1596684847597.png)]

重点说明:

build

build 可以使用dockerfile构建新的镜像,也可以直接使用官方的images

在这里插入图片描述

depends on

依赖关系 web —— redis redis启动以后web再正常启动

在这里插入图片描述

其他所有的命令官方都有实例

https://docs.docker.com/compose/compose-file/#build

volumes

PS: volumes常用的参数说明

type:卷的类型,可以是bind,可以是volume,还可以是其他

source: 挂载宿主机的路径、 主机上绑定挂载的路径或在顶层卷键中定义的卷的名称

target:挂载的目标路径,在容器里面的路径

read_only:容器内的卷赋予只读权限

使用volume manage类型挂载的时候必须在全局顶层分volumes指定出来,如下

在这里插入图片描述

networks

#可以在docker-compose.yaml自定义网络
#在services里面定义引用网络和ip,但必须在后面全局配置添加networks项
#如果没有指定网络的话,会默认生成default网路

在这里插入图片描述

docker-compose的基本命令

核心学习命令——docker-compose --help

build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

docker-compose案例

docker-compose一键生成一个微服务

普通的容器——100个微服务 !—— 依赖关系 ——繁琐

docker-compose来轻松高效的管理容器,定义运行多个容器

环境准备:

  1. 应用app.py

  2. dockerfile 应用打包成为镜像

  3. Docker-compose.yaml 文件(定义整个服务)完整的上线

  4. 启动conpose项目(docker-compose up)

docker-compose构建python应用——计数器功能, python redis

准备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)
if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

准备Dockerfile

FROM python:3.7-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python","app.py"]

准备requirements.txt

flask
redis

Docker-compose.yaml文件

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code    
  redis:
    image: "redis:alpine"

启动docker-compose.yaml

#需要在docker-compose.yaml的目录执行命令
docker-compose up

在这里插入图片描述

在这里插入图片描述

docker-compose搭建lnmp和Wordpress博客

文案参考:https://docs.docker.com/compose/wordpress/

定义项目

1. 创建一个空的项目目录

您可以将目录命名为易于记忆的名称。此目录是您的应用程序映像的上下文。该目录应仅包含用于构建该映像的资源。

该项目目录包含一个docker-compose.yml对于初学者wordpress项目而言本身是完整的文件。

提示:您可以为此文件使用.yml.yaml扩展名,两者没有区别都可以识别

  1. 转到你的项目目录

    cd my_wordpress/
    vim docker-compose.yaml
    
  2. 创建一个docker-compose.yml文件来启动您的 WordPress博客,并创建一个单独的MySQL实例,该实例具有用于数据持久性的卷挂载

version: '3.3'

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
     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: {}

建立项目

现在,docker-compose up -d从您的项目目录运行。

docker-compose up将以分离模式运行,提取所需的Docker映像,并启动wordpress和数据库容器,如下例所示。

[root@docker03 my_wordpress]# docker-compose up -d
Creating network "my_wordpress_default" with the default driver
Creating volume "my_wordpress_db_data" with default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
bf5952930446: Pull complete
8254623a9871: Pull complete
938e3e06dac4: Pull complete
ea28ebf28884: Pull complete
f3cef38785c2: Pull complete
894f9792565a: Pull complete
1d8a57523420: Pull complete
5f09bf1d31c1: Pull complete
1b6ff254abe7: Pull complete
74310a0bf42d: Pull complete
d398726627fd: Pull complete
Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:latest)...
...
7ffb0ec7cba1: Pull complete
aa525bb76055: Pull complete
eec98bc148f3: Pull complete
Digest: sha256:d009e9d0901aff685cbde728c803635f1bcaf4e1829f5921411f342ba001a3d0
Status: Downloaded newer image for wordpress:latest
Creating my_wordpress_db_1 ... done
Creating my_wordpress_wordpress_1 ... done

[root@docker03 my_wordpress]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
984644a5a2a7        wordpress:latest    "docker-entrypoint.s…"   27 seconds ago      Up 25 seconds       0.0.0.0:8000->80/tcp   my_wordpress_wordpress_1
5b38deebd3ce        mysql:5.7           "docker-entrypoint.s…"   27 seconds ago      Up 26 seconds       3306/tcp, 33060/tcp    my_wordpress_db_1
[root@docker03 my_wordpress]# 

在Web浏览器,弹出的WordPress

此时,WordPress应该在8000Docker主机的端口上运行,并且您可以以WordPress管理员的身份完成“著名的五分钟安装”。

如果您使用的是Mac的Docker桌面或Windows的Docker桌面,则可以将其 http://localhost用作IP地址,并http://localhost:8000在Web浏览器中打开。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pxLpfRLh-1630031819800)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1596687412331.png)]

按照步骤安装即可

在这里插入图片描述

关机和清理

该命令docker-compose down将删除容器和默认网络,但会保留WordPress数据库。

该命令docker-compose down --volumes将删除容器,默认网络和WordPress数据库。

docker-compose搭建LNMP环境

docker-compose的文件如下:

version: "3.0"
services:
  nginx:
    container_name: nginx
    build: .
    image: nginx:lnmp
    ports:
      - "80:80"
    volumes:
      - ./nginx:/etc/nginx
      - ./html:/usr/share/nginx/html
    depends_on:
      - php
  php:
    container_name: php
    image: php:7.2-fpm
    ports:
      - "9000:9000"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - mysql

  mysql:
    container_name: mysql
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - ./mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123.com

在这里插入图片描述

在这里插入图片描述

到这儿,说明lnmp环境已经跑起来了

总结:

添加depends on 参数的时候,A depends on B 意思是:B启动后,A才可以启动

如果我们使用的是docker-compose start 开启服务的话,会按照我们定义的顺序一一开启

如果使用docker-compose stop 关闭,会按照反顺序关闭的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s2WKbXCf-1630031819807)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1597237385638.png)]

同dockerfile,如果我们想挂载文件使用,该文件的的位置必须其目录或在其子目录下或者指定该文件的绝对路径

docker-compose自定义networks网络

其中php做好了mysql连接的插件,可以在./html目录下添加,添加内容参考LNMP搭建!

version: "3.0"
services:
  nginx:
    container_name: nginx
    image: nginx:latest
    ports: 
      - "80:80"
    networks:
      net:
        ipv4_address: 172.10.10.11
    volumes:
      - ./nginx:/etc/nginx
      - ./html:/usr/share/nginx/html
    depends_on:
      - php
  php:
    container_name: php
    build: .
    image: php:7.2
    ports:
      - "9000:9000"
    networks:
      net:
        ipv4_address: 172.10.10.12
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - mysql
  
  mysql:
    container_name: mysql
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - ./mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123.com
    networks:
      net: #(自定义网络的名字)
        ipv4_address: 172.10.10.13
networks:
  net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.10.10.0/24
;