docker-compose

目录

1.1 docker-compose 基础

1.2 docker-compose 应用

1.3 docker-compose 配置文件解析

1.1 docker-compose 基础

1.什么是docker-compose

  1. Compose是一个定义和管理多容器的工具,使用Python语言编写。

  2. 使用Compose配置文件描述多个容器应用的架构,比如使用什么镜像、数据卷、网络、映射端口等;

  3. 然后一条命令管理所有服务,比如启动、停止、重启等。

2.docker compose作用

  1. 现在我们要部署django项目,需要 django+mysql+redis+nginx等

  2. 我们需要开启四个docker容器进行部署每一个组件,如果每个容器单独管理太过于复杂,而且可能是给客户部署项目

    1). 每一个容器启动都是有说法的,比如celery会使用redis,如果redis没有启动先启动celery服务起不来

    2). 我们的django项目会使用 mysql、还会使用redis,如果这两个没有启动而先启动django项目,也会报错

  3. docker compose就是一个可以同时管理一个项目中的多个docker容器的工具,一键部署启动

  4. 一条命令

    docker-compose -f xxx.yml

3.docker compose安装

[root@linux-node4 ~]# curl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@linux-node4 ~]# chmod +x /usr/local/bin/docker-compose

4. YAML文件格式及编写注意事项

  注:docker-compose使用yaml文件对容器进行描述

  YAML是一种标记语言很直观的数据序列化格式,可读性高。类似于XML数据描述语言,语法比XML简单的很多。

  YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号括起来,hash用花括号括起来。

  YAML文件格式注意事项:

    1.不支持制表符tab键缩进,需要使用空格缩进

    2.通常开头缩进2个空格

    3.字符后缩进1个空格,如冒号、逗号、横杆

    4.用井号注释

    5.如果包含特殊字符用单引号引起来

    6.布尔值(true、false、yes、no、on、off)必须用引号括起来,这样分析器会将他们解释为字符串。

5. compose 配置常用字段

 1 [root@linux-node1 mysql-docker]# vim docker-compose.yml 
 2 version: '3'
 3 services:
 4   mysql:
 5     image: mysql:5.7
 6     volumes:
 7       - ./data:/var/lib/mysql
 8     ports:
 9       - "3306:3306"
10     environment:
11       - MYSQL_ROOT_PASSWORD=root
12       - MYSQL_DATABASE=djangodb
13 [root@linux-node1 mysql-docker]# docker-compose -f docker-compose.yml up
14 
15 docker-compose.yml 部署mysql简单测试
docker-compose.yml 部署mysql测试
 1 version: '3'   # docker-compose版本号
 2 
 3 services:      # 一级服务名称
 4   mysql:       # 服务名,可以通过服务名对容器进行管理(自己定义)
 5     #1.docker容器主机名
 6     hostname: mysql
 7 
 8     #2.指定拉取镜像或者使用Dockerfile构建
 9     image: mysql:5.7             # 指定拉取的镜像版本(方法1)
10     build:                       # 构建nginx 容器(方法2)
11       context: ./nginx           # 指定环境在当前目录的 nginx文件夹中
12       dockerfile: Dockerfile     # 指定使用nginx文件夹中的Dockerfile进行构建
13 
14     #3.执行命令
15     command: python manage.py migrate && python manage.py runserver 0.0.0.0:80
16     command: uwsgi --ini uwsgi.ini                 # 启动uwsgi
17 
18     #4.指定容器挂载路径进行持久化
19     volumes:              # 将mysql的 /var/lib/mysql数据路径挂载到本地进行持久化
20       - ./mysql:/var/lib/mysql
21 
22     #5. 暴露端口 或者 映射端口
23     expose:               # 开放的端口号,给docker容器之间通信访问
24       - "3306"
25     ports:
26       - "80:80"           # 把端口映射给宿主机,提供服务
27 
28     #6.指定使用的网络
29     networks:             
30       - lnmp
31 
32     #7.当宿主机重启docker容器也自动重启
33     restart: always
34 
35     #8. 添加环境变量   
36     environment:          
37       - MYSQL_ROOT_PASSWORD=root         # root密码
38       - MYSQL_DATABASE=djangodocker      # 创建数据库
39       - MYSQL_USER=django                # 创建一个普通用户
40       - MYSQL_PASSWORD=django            # 普通用户密码
41     #9. 添加依赖,必须先启动redis容器
42     depends_on:
43       - redis
44 
45 networks:        # 创建网络
46   lnmp:
配置文件解读

6.常用命令

 1 '''1.docker-compose常用命令'''
 2 docker-compose -f docker-compose.yml  up -d    # 启动docker-compose管理的所有容器
 3 docker-compose ps                               # 列出 Compose 应用中的各个容器,类似docker ps
 4 docker-compose logs web                        # 查看web服务日志
 5 docker-compose down                               # 停止并移除容器、网络、镜像和数据卷.比stop更彻底
 6 docker-compose images                             # 列出所有镜像
 7 
 8 
 9 '''2.docker-compose其他命令 '''
10 docker-compose stop                               # 停止 Compose 应用相关的所有容器,但不会删除它们
11 docker-compose restart                           # 重启YAML文件中定义的服务
12 docker-compose kill                            # 停止服务
13 docker-compose rm                               # 删除指定已经停止服务的容器(它会删除容器和网络,但是不会删除卷和镜像)
14 docker-compose build                           # 构建或重建服务
15 docker-compose pull                               # 拉去并下载指定服务镜像
16 docker-compose push                            # push服务镜像
17 docker-compose top                               # 显示各个容器内运行的进程
18 
19 docker-compose常用管理命令
docker-compose 常用管理命令

7.docker读写层

[root@linux-node1 84c0e08a8cc81e85b2e6a2508bd7a92920129471ec1f5ad1dfe4187c7571e72d]# ll
total 8
drwxr-xr-x 5 root root  39 Mar  4 20:54 diff     # docker容器自己的读写层(只有我们改动的文件在这里)
-rw-r--r-- 1 root root  26 Mar  4 20:54 link
-rw-r--r-- 1 root root 347 Mar  4 20:54 lower
drwxr-xr-x 1 root root  39 Mar  4 20:54 merged   # docker真正的工作区
drwx------ 3 root root  18 Mar  4 20:54 work     # 项目工作路径

1.2 docker-compose在企业中应用

1.拉取线上代码

1 $  git clone https://gitee.com/edushiyanlou/django-docker.git
2 
3 $  docker-compose up -d        # 启动所有容器
4 
5 $  docker-compose logs celery  # 查看celery运行日志
6 
7 $  docker-compose down         # 关闭所有容器
8 
9 启动后访问:http://192.168.56.11

2.部署Django程序一般使用那些

  • django
  • mysql
  • celery
  • redis
  • nginx

1.3 docker-compose.yml说明

 1 version: '3'                       # cocker compose版本号
 2 
 3 services:                          # 顶级配置文件(名称自己写)
 4   mysql:                           # 服务名: 容器建通信、管理容器(mysql这个容器取的名字,也是自己写的)
 5     image: mysql:5.7               # 引入官方mysql镜像(可以大家自己的hub仓库,中大型公司都会自己搭建docker hub仓库)
 6     volumes:
 7       - ./mysql:/var/lib/mysql         # 把当前文件夹下的 ./mysql文件夹挂载到docker容器 /var/lib/mysql 路径下
 8     expose:
 9       - "3306"                        # 将当前容器的端口3306端口暴露给link到本容器的容器
10     restart: always                   # 宿主机重启自动拉起这个docker容器
11     environment:
12       - MYSQL_ROOT_PASSWORD=root             # mysql服务器root密码root
13       - MYSQL_DATABASE=djangodocker          # 创建数据库 djangodocker
14       - MYSQL_USER=django                    # 创建一个用户 django
15       - MYSQL_PASSWORD=django                # 用户密码为django
16 
17 
18 - 单独部署一个nginx
19   - 安装nginx服务
20   - 配置nginx.conf
21   - 配置 /etc/nginx/conf.d/*.conf
22   - 访问端口
23 
24   nginx:
25     image: nginx:alpine
26     volumes:
27       - ./nginx/nginx.conf:/etc/nginx/nginx.conf
28       - ./nginx/conf:/etc/nginx/conf.d
29       - ./web/staticfiles:/django_static
30     ports:
31       - "80:80"                             # 绑定容器的80端口到主机的80端口
32     depends_on:
33       - web                                 # 必须先启动web容器然才能启动nginx容器
34 
35   redis:
36     image: redis:alpine
37     expose:
38       - "6379"
39     restart: always
40 
41   web:
42     build: .
43     # command: python manage.py runserver 0:8000
44     # ports:
45     #   - "8000:8000"
46     command: uwsgi --ini uwsgi.ini             # 启动uwsgi命令
47     working_dir: /code/web                     # 项目工作路径
48     volumes:
49       - .:/code                                # 将当前文件夹下所有文件挂载到容器的 /code 文件夹
50     expose:
51       - "8000"
52     depends_on:                                # 必须mysql和reids容器启动后才能启动web容器
53       - mysql
54       - redis
55 
56   celery:
57     build: .
58     command: celery -A web worker -l info
59     working_dir: /code/web
60     volumes:
61       - .:/code
62     depends_on:
63       - mysql
64       - redis

单独部署一个nginx

  • 安装nginx服务
  • 配置nginx.conf
  • 配置 /etc/nginx/conf.d/*.conf
  • 访问端口

 相似指令比较

1 '''1. expose 与 ports 比较'''
2 # ports: 绑定容器的端口到主机的端口,这样就可以在外网访问docker容器的服务
3 # expose: 将当前容器的端口3暴露给link到本容器的容器,expose不会将端口暴露给主机
4 
5 '''2. depends_on 与 links区别'''
6 # depends_on: 指定本容器启动依赖的容器必须先启动
7 # links: 保证容器如果ip变化也能访问(基本已经弃用,因为不使用link仍然可以通过容器名称访问)

 

posted @ 2020-04-01 09:52  Mr-刘  阅读(301)  评论(0编辑  收藏  举报