7.Docker-compose

文章目录

Docker-compose

概念

  • Docker-Compose项目是基于Python开发的Docker官方开源项目,负责实现对Docker容器集群的快速编排。

  • Compose是单机编排容器集群或者是分布式服务容器的应用工具。通过Compose,可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。

  • Docker-Compose是一个容器编排工具。

  • 通过一个.yml或.yaml文件,将所有的容器的部署方法、文件映射、容器端口映射等情况写在一个配置文件里,执行docker-compose up命令就像执行脚本一样,一个一个的安装并部署容器。

  • Docker compose 文件通常包含一个或多个服务,每个服务都由一个或多个容器组成。服条定义了容器应该执行的任务,以及容器之间的统赖关系。

  • Docker-Compose将所管理的容器分为三层,分别是 工程(project),服务(service)以及容器(container)。

  • Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。

  • 一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul。

  • Docker-compose总结

    • 实现单机容器集群编排管理(使用YAML模板文件定义多个应用容器的启动参数和依赖关系,并使用Docker-compose来根据模板文件的配置来启动容器)
  • 三大概念(包含关系)

    • 项目/工程
      • 默认使用目录名做项目名
      • 支持 -p 或 --project-name 来指定项目名
      • 在项目的目录中会包含一个docker-compose.yml 模板文件此文件为项目的默认配置文件(支持使用 -f 或 COMPOSE_FILE 来指定项目的配置模板文件)
      • 在配置文件里面可以定义一个或多个服务,每个服务可以包含容器的名称、镜像、端口映射、依赖关系、环境变量、挂载点等配置参数
    • 服务
    • 容器

Docker-compose部署

##Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose
 
##下载
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose


##安装
chmod +x /opt/docker-compose

mv /opt/docker-compose /usr/local/bin/docker-compose

##查看版本
docker-compose --version
##能查看到则,安装成功

YAML文件格式和编写注意事项

注意

YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。

类似于 json 数据描述语言,语法比 json 简单的很多。

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

使用 YAML 时需要注意下面事项:

大小写敏感

通过缩进表示层级关系

不支持制表符 tab 键缩进,只能使用空格缩进

缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格

用 # 号注释

符号字符后缩进1个空格,如冒号 :  、逗号 ,  、横杠 - 

如果包含特殊字符用单引号('')引起来会作为普通字符串处理,
双引号(""): 特殊字符作为本身想表示的意思

数据结构

对象映射

对象映射: 键值对的字典
animal: dogs

序列属组

序列属组: 一组按次序排列的列表


##竖列表
pets:
- Cat
- Dog
- Pig

##横列表
pets: ["cat", "dog", "pig"]

布尔值

##布尔值


debug: true
debug: false

序列的映射

##序列的映射

pets:
 -  Cat
 -  Dog
 -  Pig

映射的映射

##映射的映射

websetting:
  cpu: 2
  memory: 1024M
  swap: 2048M
  disk: 60G

JSON格式

JSON 复制代码
##JSON格式

{
    pets: [
        "cat",
        "dog",
        "pig"
    ],
    websetting: {
        cpu: ['2'],
        memory: ['1024M'],
        disk: ['60G']
    }
}

文本换行

# 注意"|"与文本之间须另起一行
# 使用|标注的文本内容缩进表示的块,可以保留块中已有的回车换行


value: |
  hello
  world!
  
  
# 输出结果
# hello 换行 world!!

# 注意">"与文本之间的空格
# 使用>标注的文本内容缩进表示的块,将块中回车替换为空格最终连接成一行


value: > hello
world!



# 输出结果
# hello 空格 world!

锚点和引用

# 复制代码注意*引用部分不能追加内容
# 使用&定义数据锚点,即要复制的数据
# 使用*引用锚点数据,即数据的复制目的地


name: &a yaml
book: *a
books:
   - java
   - *a
   - python


# 输出结果
book: yaml
books:[java, yaml, python]

Docker compose配置常用字段

字段 描述
build 指定 Dockerfile 文件名, 要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile 构建镜像的目录下的文件
context 可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image 指定镜像
command 执行命令,覆盖容器启动后默认执行的命令
container_name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量
deploy 指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment 添加环境变量
networks 加入网络,引用顶级networks下条目
network_mode 设置容器的网络模式,如 host,bridge,...
ports 暴露容器端口,与 -p 相同,但端口不能低于 60
volumes 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称
volumes_from 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持
hostname 容器主机名
sysctls 在容器内设置内核参数
links 连接到另外一个容器,- 服务名称[:服务别名]
privileged 用来给容器root权限,注意是不安全的,true
restart 设置重启策略,no,always,no-failure,unless-stopped no,默认策略,在容器退出时不重启容器。 on-failure,在容器非正常退出时(退出状态非0),才会重启容器。 on-failure:3,在容器非正常退出时重启容器,最多重启3次。 always,在容器退出时总是重启容器。 unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。
depends_on 在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。 php: depends_on: - apache - mysql
Dockercompose字段 相对的docker run命令
image 镜像:标签
command 启动命令
container_name --name
environment --env
networks network_mode --network
ports -p
volumes -v
volumes_from --volumes-from
hostname -h
sysctls -sysctl
links --link
privileged --privileged
restart --restart

docker compose常用命令

字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器 -d 后台启动
exec 在容器里面执行命令
scale 指定一个服务容器启动数量
top 显示容器进程
logs 查看容器输出
down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务

Docker Compose 文件结构

/opt/compose_nginx/
├── docker-compose.yml				#创建模板脚本
├── nginx
│?? ├── Dockerfile					#创建容器脚本
│?? ├── nginx-1.12.0.tar.gz			#复制源码包
│?? └── run.sh						#启动服务脚本
└── wwwroot
    └── index.html					#站点网页

docker compose部署apache

mkdir -p /usr/local/compose/docker-compose-apache

cd /usr/local/compose/docker-compose-apache

vim docker-compose.yml
yaml 复制代码
version: '3'

services:
  apache:
      image: httpd:latest
      container_name: httpd-ggl
      ports:
      -  1314:80
      volumes:
      -  ./html:/usr/local/apache2/htdocs
      networks:
        lamp:
          ipv4_address: 172.20.0.10

networks:
  lamp:
    driver: bridge
    ipam:
       config:
       -  subnet: 172.20.0.0/16



docker compose 部署LNMP

mkdir /usr/local/compose/docker-compose-lnmp/

cd /usr/local/compose/docker-compose-lnmp/


##在目录中准备  Dockerfile 创建LNMP的相关的文件

vim docker-compose.yml
yaml 复制代码
version: '3'

services:
  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
    container_name: nginx
    ports:
    -  80:80
    volumes:
    -  ./nginx/html:/usr/local/nginx/html
    networks:
      lnmp:
        ipv4_address: 172.18.0.10
        
  mysql:
    image: mysql:centos7
    container_name: mysql
    ports:
    -  3306:3306
    volumes:
    -  db-data:/usr/local/mysql
    networks:
      lnmp:
        ipv4_address: 172.18.0.20
        
  php:
    image: php:centos7
    container_name: php
    ports:
    -  9000:9000
    volumes:
    -  db-data:/usr/local/mysql
    -  ./nginx/html:/usr/local/nginx/html
    networks:
      lnmp:
        ipv4_address: 172.18.0.30
    depends_on:
    -  nginx
    -  mysql
      



networks:
  lnmp:
    driver: bridge
    ipam:
      config:
      -  subnet: 172.18.0.0/16

volumes:
  db-data:
##运行docker-compose

##在   docker-compose.yml   的文件的目录中运行

docker-compose up -d

docker-compose ps


##验证数据库是否连接成功

vim /usr/local/compose/docker-compose-lnmp/nginx/html/index.php


<?php
$link=mysqli_connect('192.168.242.66','admin','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>
##进入到容器中

docker exec -it mysql bash

##修改mysql 的登录密码

mysqladmin -u root -p password "123"


mysql -uroot -p123

create database word;
#创建一个数据库

grant all ON word.* to 'admin'@'%' identified by 'admin123';

#把数据库里面所有表的权限授予给admin,并设置密码admin123

flush privileges;
#刷新数据库
相关推荐
桂月二二3 小时前
Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署
java·docker·kubernetes
Smile丶凉轩5 小时前
Docker核心技术和实现原理
运维·docker·容器
清风细雨_林木木5 小时前
Docker使用——国内Docker的安装办法
运维·docker·容器
dessler6 小时前
Docker-Dockerfile讲解(三)
linux·运维·docker
一休哥助手6 小时前
深入理解 Docker 网桥配置与网络管理
docker·容器·eureka
PittDing7 小时前
【更新】Docker新手入门教程2:在Windows系统通过compose创建多个mysql镜像并配置应用
windows·mysql·docker
Mitch3119 小时前
【漏洞复现】CVE-2014-3120 & CVE-2015-1427 Expression Injection
运维·web安全·elasticsearch·docker·apache
m0_748251089 小时前
docker安装nginx,docker部署vue前端,以及docker部署java的jar部署
java·前端·docker
m0_7482402510 小时前
docker--压缩镜像和加载镜像
java·docker·eureka
颜淡慕潇12 小时前
【K8S问题系列 | 20 】K8S如何删除异常对象(Pod、Namespace、PV、PVC)
后端·云原生·容器·kubernetes