前言
目前正在出一个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-app
,my-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脚本编程相关文章
- 一起来学Shell脚本编程(一)
- 一起来学Shell脚本编程(二)
- 一起来学Shell脚本编程(三)
- 一起来学Shell脚本编程(四)
- 一起来学Shell脚本编程(五)
- 一起来学Shell脚本编程(六)
- 一起来学Shell脚本编程(七)
往期Linux相关文章
- 一起来学Linux命令(一)
- 一起来学Linux命令(二)
- 一起来学Linux命令(三)
- 一起来学Linux命令(四)
- 一起来学Linux命令(五)
- 一起来学Linux命令(六)
- 一起来学Linux命令(七)
- 一起来学Linux命令(八)
- 一起来学Linux命令(九)
- 一起来学Linux命令(十)
往期面试题相关文章
- 查漏补缺第一期(Redis相关)
- 查漏补缺第二期(synchronized & 锁升级)
- 查漏补缺第三期(分布式事务相关)
- 查漏补缺第四期(Mysql相关)
- 查漏补缺第五期(HashMap & ConcurrentHashMap)
- 查漏补缺第六期(京东一面)
- 查漏补缺第七期(美团到店一面)
- 查漏补缺第八期(阿里一面)
- 查漏补缺第九期(阿里二面)
- 查漏补缺第十期(网易实习一面)
- 查漏补缺第十一期(网易实习二面)
- 查漏补缺第十二期(网易实习三面)
- 查漏补缺第十三期(滴滴实习一面)
- 查漏补缺第十四期(滴滴实习二面)
- 查漏补缺第十五期(华为一面)
- 查漏补缺第十六期(华为二面)
- 查漏补缺第十七期(华为三面)
- 查漏补缺第十八期(你了解class文件吗)
项目源码(源码已更新 欢迎star⭐️)
往期设计模式相关文章
- 一起来学设计模式之认识设计模式
- 一起来学设计模式之单例模式
- 一起来学设计模式之工厂模式
- 一起来学设计模式之建造者模式
- 一起来学设计模式之原型模式
- 一起来学设计模式之适配器模式
- 一起来学设计模式之桥接模式
- 一起来学设计模式之组合模式
- 一起来学设计模式之装饰器模式
- 一起来学设计模式之外观模式
- 一起来学设计模式之享元模式
- 一起来学设计模式之代理模式
- 一起来学设计模式之责任链模式
- 一起来学设计模式之命令模式
- 一起来学设计模式之解释器模式
- 一起来学设计模式之迭代器模式
- 一起来学设计模式之中介者模式
- 一起来学设计模式之备忘录模式
- 一起来学设计模式之观察者模式
- 一起来学设计模式之状态模式
- 一起来学设计模式之策略模式
- 一起来学设计模式之模板方法模式
- 一起来学设计模式之访问者模式
- 一起来学设计模式之依赖注入模式
设计模式项目源码(源码已更新 欢迎star⭐️)
Kafka 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看