Docker容器虚拟化技术—Docker运维管理(Docker Compose)4


Docker Compose

通过前面的讲解我们知道使用一个Dockerfile模板文件,可以很方便地定义一个单独的应用容器。然而,在日常工作中, 经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose定位是“定义和运行多个Docker容器的应用”,它允许用户通过一个单独的dockercompose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。

1 Compose概念

Docker Compose 将所管理的容器分为三层,分别是项目(project)、服务(service)、容器(container)

  • 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义
  • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
  • 容器(container):docker容器

Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个项目,一个项目包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例

Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose项目由Python编写,实现上调用了Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。


2 Compose的安装

2.1 运行以下命令以下载Docker Compose的当前稳定版本:

 curl  -L  "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)"  -o  /usr/local/bin/docker-compose# 其中$(uname -s)-$(uname -m)表示当前的系统版本,结果为:Linux-x86_64

要安装其他版本的Compose,请替换1.26.0 为要使用的Compose版本。

2.2 将可执行权限应用于二进制文件:

 chmod  +x  /usr/local/bin/docker-compose

2.3 添加到环境中

 #ln -s : 软链接 ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

2.4 测试安装

 docker-compose --version

2.5 卸载Docker Compose

 rm  /usr/local/bin/docker-compose

3 docker-compose.yml

模板文件是使用Compose的核心,默认的模板文件名称为docker-compose.yml,格式为YAML格式。

 version: '2.0'    #版本2.0 ,注意(如果和swarm搭配使用,需要使用2.0以上的版本)services:  #定义服务 nginx:       #Nginx容器 image: nginx:1.18.0      #Nginx:latest 镜像 先拉镜像 指定镜像的版本 (避免下次拉取最新的版本)ports: - 80:80 #映射端口 - 433:433 volumes:    #挂载数据 宿主机目录(一定要存在):容器的目录 - /data/log:/var/log/nginx  - /data/www:/var/www - /etc/letsencrypt:/etc/letsencrypt
version:版本
 version: '2.0' #版本2.0 与swarm结合 要3.0以上
services:定义服务
 services: #定义服务
image:指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会拉取镜像
 image: nginx #Nginx:latest 镜像 先拉镜像 指定镜像的版本
ports:端口映射 HOST:CONTAINER
 ports:- 8000:80 #映射端口 (前面是宿主机端口,后面是容器端口)
build: 指定dockerfile,Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器构建自己的应用
 build: /path/dockerfilename build:./path/dockerfilename
command:使用 command 可以覆盖容器启动后默认执行的命令
 command:echo $HOME command:[ "echo", "$HOME" ] command: redis-server /usr/local/etc/redis/redis.conf #先创建目录和文件
depends_on:确定容器的启动顺序
 depends_on:- db #服务名 - redis
environment:设置镜像变量(例如mysql的密码设置等)
 environment: RACK_ENV: development SHOW: 'true' SESSION_SECRET:
volumes:挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER] 这样的格式,或者使用 [HOST:CONTAINER:ro] 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统

Compose的数据卷指定路径可以是绝对路径或相对路径

 volumes: #挂载数据 (前面是宿主机,后面是容器)- /data/nginx/conf.d:/etc/nginx/conf.d    # 如果不写将使用默认 - /data/log:/var/log/nginx - /data/www:/var/www

注意:如果目录或文件不存在将启动不成功,所以要先创建好目录或文件

network_mode:网络模式

network_mode: bridge network_mode: host network_mode: none network_mode: service:
[service name] network_mode: container:[container name/id]
默认bridge

 [root@teacher1 com-test]# docker network ls NETWORK ID         NAME        DRIVER              SCOPE 31289c518ea1  bridge      bridge              local bcb2529f97ae  com-test_default bridge         local db2ff5be4e36      host        host            local e8aa24d5f78f      none        null            local

加入该配置后,不新增网络

 [root@teacher1 com-test]# docker network ls NETWORK ID NAME DRIVER SCOPE 31289c518ea1 bridge bridge local db2ff5be4e36 host host local e8aa24d5f78f none null local
networks:定义网络
     # 默认网络networks:default:driver: bridge#自定义网络networks:front:driver: bridgeback:driver: bridgedriver_opts:oo: "1"bar: "2"#使用现有网络docker network create net-a --driver bridgenetworks:default:external:name: net-a
案例:
  • 1编辑文件

      version: "2.0"services:nginx:image: nginx:1.18.0restart: alwayscontainer_name: nginxenvironment:- TZ=Asia/beijingports:- 80:80- 443:443volumes:- /docker/nginx/log:/var/log/nginx- /docker/nginx/www:/etc/nginx/html- /etc/letsencrypt:/etc/letsencryptmysql:restart: alwaysimage: mysql:5.7.30container_name: mysql5.7ports:- 13306:3306command:--default-authentication-plugin=mysql_native_password--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--explicit_defaults_for_timestamp=true--lower_case_table_names=1--default-time-zone=+8:00environment:MYSQL_ROOT_PASSWORD: "root"volumes:- "/docker/mysql/db:/var/lib/mysql"redis:image: redis:5.0.9container_name: redisenvironment:- TZ=Asia/beijingports:- 6379:6379volumes:- /docker/redis/data:/data
    

  • 2本地拉取需要使用的镜像(建议)

      如果网络不行,建议把需要使用的镜像先pull到本地
    

  • 3创建需要使用的目录(注意)

      配置的volumes路径,需要存在(提前创建)volumes:- /docker/nginx/log:/var/log/nginx- /docker/nginx/www:/etc/nginx/html- /etc/letsencrypt:/etc/letsencryptvolumes:- "/docker/mysql/db:/var/lib/mysql"volumes:- /docker/redis/data:/data[root@Docker ~]# mkdir -p /docker/nginx/log[root@Docker ~]# mkdir -p /docker/nginx/www[root@Docker ~]# mkdir -p /etc/letsencrypt[root@Docker ~]# mkdir -p /docker/mysql/db[root@Docker ~]# mkdir -p /docker/redis/data
    

运行:
 docker-compose up -d

查看
 docker-compose ps

查看当前docker的网络模式
 docker network ls


4 Compose的常见命令

up:通过docker-compose.yml,自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作

ps:列出所有运行容器

logs:查看服务日志输出

port:打印绑定的公共端口

build:构建或者重新构建服务(只构建yml文件,不启动)
start:启动指定服务已存在的容器(启动已经构建完毕的容器)
stop:停止已运行的服务的容器

rm:删除指定服务的容器
 docker-compose run nginx bash
run:在一个服务上执行一个命令

down 停止并删除容器
 # -v : 可以删除容器使用的数据docker-compose down


5 与Swarm一起使用Compose(多台机器+多个容器的启动)

我们知道使用 docker-compose.yml可以来一次配置、启动多个容器,在 Swarm 集群中也可以使用compose 文件 (docker-compose.yml) 来配置、启动多个服务。

使用 docker service create 一次只能部署一个服务,使用 docker-compose.yml 我们可以一次启动多个关联的服务。

打开前面的docker-compose.yml (有多个容器)

修改:
 version: "3.0"deploy:mode: replicated   replicas: 2     #一般都是奇数个
去掉不支持的:
 restart: alwayscontainer_name: nginx
创建yml文件docker-compose-swarm.yml
 vim docker-compose-swarm.yml# 文件内容version: "3.0"services:nginx:image: nginx:1.18.0ports:- 80:80- 443:443volumes:- /docker/nginx/log:/var/log/nginx- /docker/nginx/www:/etc/nginx/html- /etc/letsencrypt:/etc/letsencryptdeploy:mode: replicatedreplicas: 2mysql:image: mysql:5.7.30ports:- 13306:3306command:--default-authentication-plugin=mysql_native_password--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--explicit_defaults_for_timestamp=true--lower_case_table_names=1--default-time-zone=+8:00environment:MYSQL_ROOT_PASSWORD: "root"volumes:- "/docker/mysql/db:/var/lib/mysql"deploy:mode: replicatedreplicas: 2redis:image: redis:5.0.9container_name: redisenvironment:- TZ=Asia/beijingports:- 6379:6379volumes:- /docker/redis/data:/datadeploy:mode: replicatedreplicas: 2

注意:主机和备机的volumes路径都得存在

运行:
 # -c 集群# myapp 当前启动服务的全局名称 [root@Docker ~]# docker stack deploy -c docker-compose-swarm.yml myserviceCreating network myservice_defaultCreating service myservice_nginxCreating service myservice_mysqlCreating service myservice_redis

查看服务:访问三个服务中的nginx进行验证
 [root@Docker ~]# docker stack services myserviceID             NAME              MODE         REPLICAS   IMAGE          PORTSi6mwqpv6sacp   myservice_mysql   replicated   2/2        mysql:5.7.30   *:13306->3306/tcpd2hgmgnyj1z0   myservice_nginx   replicated   2/2        nginx:1.18.0   *:80->80/tcp, *:443->443/tcpi4b248tjzk0z   myservice_redis   replicated   2/2        redis:5.0.9    *:6379->6379/tcp

删除服务:
 [root@Docker ~]# docker stack down myserviceRemoving service myservice_mysqlRemoving service myservice_nginxRemoving service myservice_redisRemoving network myservice_default

Docker容器虚拟化技术---Docker运维管理(Docker Compose)4相关推荐

  1. Docker容器虚拟化技术---Docker运维管理(Swarm集群管理)3

    Docker容器虚拟化技术-Docker运维管理(Swarm集群管理)3 Swarm集群管理 docker swarm是docker官方提供的一套容器编排系统,是Docker公司推出的官方容器集群平台 ...

  2. 实战:Docker容器虚拟化技术(使用DockerFile构建镜像并搭建 swarm+compose集群)5

    实战:Docker容器虚拟化技术 (使用DockerFile构建镜像并搭建 swarm+compose集群)5 要求: 使用DockerFile构建镜像并搭建 swarm+compose集群 在Swa ...

  3. Docker容器虚拟化技术---Docker高级实战(DockerFile)2

    Docker容器虚拟化技术-Docker高级实战(DockerFile) DockerFile是一个文本格式的配置文件,用户可以使用DockerFile来快速创建自定义的镜像. 1. DockerFi ...

  4. Docker——容器虚拟化技术

    目录 一.Docker介绍 诞生背景 Docker介绍 虚拟机技术与容器虚拟化技术 虚拟机技术 容器虚拟化技术 官方网站 二.Docker安装 安装Docker Docker管理命令 Docker底层 ...

  5. docker容器虚拟化技术_Docker,虚拟机和容器的全面介绍

    docker容器虚拟化技术 by shota jolbordi 通过Shota Jolbordi Docker has been a buzzword for tech people for the ...

  6. 容器化技术在运维管理中的应用:自动化、可视化运维

    作者:禅与计算机程序设计艺术 容器化技术在运维管理中的应用:自动化.可视化运维 引言 随着云计算和互联网的发展,容器化技术作为一种轻量级.高效的编程方式,得到了越来越广泛的应用.在容器化技术的应用场景 ...

  7. Docker容器虚拟化技术---Docker安装和操作1

    一.Docker安装 Docker在主流的操作系统和云平台上都可以使用,包括Linux操作 系统(如Ubuntu.Debian.CentOS.Redhat等).MacOS操作系统和 Windows操作 ...

  8. Docker与虚拟化技术浅析第一弹之docker与Kubernetes

    1 前言 Docker是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的. 可移植的.自给自足的容器.开发者在笔记本电脑上编译测试通过的容器可以批量地在生产环境中部署,包括VMs (虚拟机).ba ...

  9. Docker 与虚拟化技术浅析第一弹之 docker 与 Kubernetes

    1 前言 Docker 是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的. 可移植的.自给自足的容器.开发者在笔记本电脑上编译测试通过的容器可以批量地在生产环境中部署,包括 VMs (虚拟机). ...

最新文章

  1. docker 漏洞测试 靶机环境 靶机平台 vulhub vulapps 简介
  2. Selection change event Issue is fixed handleListItemPress,SingleSelectMaster
  3. cmake,make,nmake的用法
  4. Python笔记(十五)_异常处理
  5. 根文件系统构建(Buildroot 方式)
  6. Educational Codeforces Round 81 (Rated for Div. 2) E. Permutation Separation 线段树 + dp
  7. hibernate持久化对象
  8. Java8 Optional类
  9. C++:听说C++很难学?该怎么学习C++?
  10. python实现猜数字小游戏
  11. 选择数据分析工具应考虑4个因素
  12. 洛谷 p1434 滑雪【记忆化搜索】
  13. sql语句格式化数字(前面补0)、替换字符串
  14. C#实现最简单的文本加密方法
  15. Mac ssh locahost Connection refused
  16. laravel5.5 sendCloud 发送邮件(sendCloud Api and naux/sendcloud )
  17. 一个C#版的多选题选项及判分设计方案
  18. kali2020之chrome安装代理插件
  19. java 获取文件的大小kb_java获取文件大小的方法
  20. 分布式配置管理平台 Disconf

热门文章

  1. 企业局域网内如何跨网安全传输数据
  2. 实现简单的ImageLoader
  3. windows8.1下安装Cygwin并通过apt-cyg安装软件包
  4. Quartz2D之绘制一个简单的机器猫
  5. vyatta 6.4 的设置
  6. WPF中播放Flash动画
  7. Windows services相关命令
  8. 干货首发,能够清理,带动画的自己定义控件CuteEditText
  9. curl工具使用实例
  10. Linux Disk Quota实践