一起来学Docker(七)

前言

目前正在出一个Docker系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

Docker大家应该都听说过,特别是在当今云原生爆火的时代,更值得我们去学习,下面会带大家系统性的认识一下Docker,并结合一些例子,让大家快速上手~

好了, 废话不多说直接开整吧~

Docker Compose

前面几节带大家一起学习了docker的相关命令以及如何拉取镜像,构建镜像,以及容器的相关知识,之前我们在部署应用的时候都是一个一个部署,停止或者删除容器也都是一个一个去操作,等下次再重新部署的时候又得敲一遍命令,这样显得很麻烦,有没有一种工具,能够帮助我们编排容器呢,只需要按照我们的预期去拉取镜像,启动容器,能够实现水平扩展呢?这就是今天要给大家讲的Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。通过命令指定 YML 文件配置来创建并启动所有服务。

如果是linux用户需要额外下去docker compose,可以到github上下载即可,如果是win,mac用户安装了客户端软件会自带,大家可以尝试在终端执行docker-compose

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z ~]# docker-compose -h

Usage:  docker compose [OPTIONS] COMMAND

Docker Compose

Options:
      --ansi string                Control when to print ANSI control characters ("never"|"always"|"auto") (default "auto")
      --compatibility              Run compose in backward compatibility mode
      --env-file string            Specify an alternate environment file.
  -f, --file stringArray           Compose configuration files
      --profile stringArray        Specify a profile to enable
      --project-directory string   Specify an alternate working directory
                                   (default: the path of the Compose file)
  -p, --project-name string        Project name

Commands:
  build       Build or rebuild services
  convert     Converts the compose file to platform's canonical format
  cp          Copy files/folders between a service container and the local filesystem
  create      Creates containers for a service.
  down        Stop and remove containers, networks
  events      Receive real time events from containers.
  exec        Execute a command in a running container.
  images      List images used by the created containers
  kill        Force stop service containers.
  logs        View output from containers
  ls          List running compose projects
  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 containers
  rm          Removes stopped service containers
  run         Run a one-off command on 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

Run 'docker compose COMMAND --help' for more information on a command.
[root@iZ2ze5vrnucj8nu52fq932Z ~]# 

命令也比较多,但是并不复杂,熟悉最常用的build,down,pull,restart,run,rm,start,top,up命令即可,其实大部分命令跟docker命令差不多

启动

  • 启动,加上-d后台运行
shell 复制代码
docker-compose up -d

默认情况下如果不指定配置文件,它会去找当前目录下的docker-compose.yml文件,那如何指定文件呢?

shell 复制代码
docker-compose -f my-app.yml up -d
  • 重新启动
shell 复制代码
docker-compose restart

停止

shell 复制代码
docker-compose stop

停止并销毁

shell 复制代码
docker-compose down

这个命令大家要慎用,如果你的应用没有挂载数据卷,执行此命令后容器会销毁且数据也会随之丢失,这个之前给大家讲过容器的销毁

以上几个命令比较常用,感兴趣的小伙伴可以研究一下其它命令。compose也可以构建镜像(通过指定的Dockerfile),但是不怎么推荐,大部分情况下compose用来部署已经构建好的镜像或者第三方镜像,用来做服务编排,建议构建和部署分开。 当然如果项目比较规范,也可以进行一键构建和部署

需要注意的是docker-compose只是编排工具,通过它部署的容器,使用docker自己的相关命令同样可以操作,这个不要混淆了

Compose YML

Compose的重点其实就是它的配置文件了,这里挑几个重点配置给大家讲,如果不熟悉yml语法的小伙伴可以提前先熟悉下

version

指定本 yml 依从的 compose 哪个版本制定

build

指定为构建镜像上下文路径,这里指定app应用镜像的构建路径为./docker1,app2应用镜像的构建路径为./docker2,

yml 复制代码
version: "3"
services:
  app:
    build: ./docker1
  
  app2:
    build: ./docker2

这里的services指的是应用服务,可以配置多个

command

覆盖容器启动的默认命令。

示例:

yml 复制代码
version: "3"
services:
  app:

    command: ["app"]

container_name

这跟--name是一样的,自定义容器名称

yml 复制代码
version: "3"
services:
  app:
    container_name: my-web-container
    command: ["app"]

image

指定镜像,这个跟run里的镜像格式是一样的,先从本地仓库找,没有会从远程拉取

yml 复制代码
version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-web-container
    command: ["app"]

ports

指定映射端口,可以指定多个,这个跟-p的格式是一样的

yml 复制代码
version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-app
    command: ["app"]
    ports:
      - "8080:8080"
      - "3000:3000"

depends_on

设置依赖关系,这个怎么理解呢?打个比方,我需要部署一个应用,需要三个服务分别是mysql,redis,my-appmy-app的服务需要依赖mysql,redis,也就是说这两个服务得先跑起来,my-app才能启动成功

示例:

yml 复制代码
version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-app
    depends_on:
      - mysql
      - redis

  mysql:
    image: mysql:latest
    container_name: mysql  

  redis:
    image: redis:latest
    container_name: redis
  

environment

添加环境变量,可以使用数组或字典、任何布尔值,布尔值需要用引号引起来

yml 复制代码
version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-app
    environment:
      ENV1: 1
      ENV2: 2

expose

暴露端口,但不映射到宿主机,只被连接的服务访问,仅可以指定内部端口为参数

yml 复制代码
version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-app
    expose:
      - "3000"
      - "8000"

restart

  • no:是默认的重启策略,在任何情况下都不会重启容器。
  • always:容器总是重新启动。
  • on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
  • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
yml 复制代码
version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-app
    restart: always

大部分情况下我们指定always

volumes

将主机的数据卷或着文件挂载到容器里,这个跟docker -v是一个格式

yml 复制代码
version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-app
    restart: always
    volumes:
      - "./logs:/app/logs"
      - "./data:/app/data"

networks

配置容器连接的网络,因为容器之间是沙箱机制,本身互不干扰,有时候需要容器之前进行通信就需要指定网络

yml 复制代码
version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-app1
    restart: always
    networks:
      - app_net

  app1:
    image: my-app:latest
    container_name: my-app2
    restart: always
    networks:
      - app_net    

networks:
  app_net:
    driver: bridge

其中app1和app2共用网络app_net,所以它们之间可以进行网络通信

working_dir

指定工作目录

yml 复制代码
version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-app1
    restart: always
    working_dir: /app
    networks:
      - app_net

以上就是Compose常用的配置了,其实很好理解,虽然简单,但是还是有不少坑的,大家可以尝试部署一下自己的应用,以及第三方的一些服务,多尝试使用 docker-compose去编排我们的服务

portainer

除了Compose,还有一个可视化的工具portainer,运行以下命令即可,浏览器打开localhost:9000就可以看到相关镜像和运行的容器了,可以使用它观察容器的状况

shell 复制代码
docker run -d -p 9000:9000  --restart=always --name portainer  portainer/portainer

但是在部署服务的时候还是推荐Compose,因为它更加的直观和方便,还可以结合一些构建流水线比如jenkins之类的服务实现一些自动化的东西

结束语

docker相关的使用讲解到这里就结束了,大家一定要多动手,多尝试去部署,它的坑还是比较多的~

本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注鼓励一下呗~

Docker教程相关文章

往前Shell脚本编程相关文章

往期Linux相关文章

往期面试题相关文章

项目源码(源码已更新 欢迎star⭐️)

往期设计模式相关文章

设计模式项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)

相关推荐
陈大爷(有低保)2 分钟前
三层架构和MVC以及它们的融合
后端·mvc
亦世凡华、2 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
河西石头3 分钟前
一步一步从asp.net core mvc中访问asp.net core WebApi
后端·asp.net·mvc·.net core访问api·httpclient的使用
2401_8574396915 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66616 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
GJCTYU30 分钟前
阿里云多端低代码开发平台魔笔使用测评
低代码·阿里云·云原生·容器·serverless·云计算
阿华的代码王国37 分钟前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
铁锤妹妹头发多1 小时前
新手用docker真**难受
运维·docker·容器
德育处主任Pro1 小时前
『Django』APIView基于类的用法
后端·python·django
哎呦没3 小时前
SpringBoot框架下的资产管理自动化
java·spring boot·后端