前言
目前正在出一个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-app
,my-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相关的使用讲解到这里就结束了,大家一定要多动手,多尝试去部署,它的坑还是比较多的~
本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注
鼓励一下呗~