一起来学Docker(七)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
简介: 一起来学Docker(七)

前言

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

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

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

Docker Compose

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

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

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

[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后台运行
docker-compose up -d

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

docker-compose -f my-app.yml up -d
  • 重新启动
docker-compose restart

停止

docker-compose stop

停止并销毁

docker-compose down

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

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

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

Compose YML

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

version

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

build

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

version: "3"
services:
  app:
    build: ./docker1
  app2:
    build: ./docker2

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

command

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

示例:

version: "3"
services:
  app:
    command: ["app"]

container_name

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

version: "3"
services:
  app:
    container_name: my-web-container
    command: ["app"]

image

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

version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-web-container
    command: ["app"]

ports

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

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才能启动成功

示例:

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

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

version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-app
    environment:
      ENV1: 1
      ENV2: 2

expose

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

version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-app
    expose:
      - "3000"
      - "8000"

restart

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

大部分情况下我们指定always

volumes

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

version: "3"
services:
  app:
    image: my-app:latest
    container_name: my-app
    restart: always
    volumes:
      - "./logs:/app/logs"
      - "./data:/app/data"

networks

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

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

指定工作目录

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就可以看到相关镜像和运行的容器了,可以使用它观察容器的状况

docker run -d -p 9000:9000  --restart=always --name portainer  portainer/portainer

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

结束语

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

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
Linux 虚拟化 开发者
docker介绍之一
docker介绍之一
55 1
|
2月前
|
安全 Linux 虚拟化
Docker到底是什么?为什么它这么火!
如果你是数据中心或云计算IT圈子的人,这一年多来应该一直在听到普通的容器、尤其是Docker,关于它们的新闻从未间断过。
44 9
|
5月前
|
存储 API 持续交付
Docker介绍(一)
Docker是开源的应用容器引擎,让开发者打包应用及依赖到可移植容器中,可在任何环境一致运行。它提供快速启动、高效资源利用、轻松迁移和维护,适用于开发、测试和生产。Docker由客户端、守护进程、REST API组成,支持镜像存储在仓库如Docker Hub。容器是隔离的执行环境,能在同一主机上互不影响地运行多个容器。
|
5月前
|
Linux Go Docker
Docker介绍(二)
Docker是基于Go语言的开源容器平台,利用Linux内核的namespace、cgroups和UnionFS等技术实现在Linux上运行。它分为社区版(Docker-CE)和企业版(Docker-EE),在CentOS上可安装Docker-CE。Docker的核心技术包括镜像,它是包含应用及环境的可执行文件,用于创建容器。常用镜像操作有搜索、查看、下载、删除、保存备份、导入、重命名和检查。
|
6月前
|
JavaScript Linux Docker
【Docker】什么是Docker?
【4月更文挑战第20天】【Docker】什么是Docker?
|
6月前
|
运维 Java Android开发
认识Docker
认识Docker
|
6月前
|
应用服务中间件 nginx Docker
Docker的世界
Docker的世界
47 0
|
11月前
|
Linux 应用服务中间件 nginx
Docker使用
Docker容器技术入门
102 0
|
Linux 应用服务中间件 虚拟化
初识Docker
初识Docker
|
NoSQL Java Linux