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简单测试
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常用管理命令
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仍然可以通过容器名称访问)