前言
Hey,guys. 我大概好久没有写过博客了,突然不想摸鱼,还是写写文章好一点。之前颓废了几个月,现在得多多学习了,摸鱼不可能了。那么我为什么不在自己的博客上写呢? 想着我都来气,自己的域名暂时奉献给了公司(没错,就是这么敬(wu)业(nai)),也是在掘金的处女作。
回归正题,今天想写一篇关于docker-compose
的,相信各位小伙伴都知道docker
是干嘛的了吧,如果不清楚我前面有写过一篇文章是关于docker
的。在没有docker
之前我们总是很烦恼,如果环境迁移,或者将项目部署到新服务器的环境安装十分的繁琐。例如:jdk
、nginx
、mysql
等。我以前正好就在某公司(小公司-全栈)接收到这个无理的要求:
产品经理(人人都是产品经理):你先在这台服务器试用只有三天的服务器上测试一下,如果可以我们在考虑买服务器。
我:???(质疑我的代码?你怎么不上天呢?啥啥的都搞好了,又要换服务器??)
于是想了想,所有服务跑docker
吧,没什么不好的。
docker-compose和docker是什么关系?跟dockerfile有什么区别?
Docker Compose是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
你可以这么理解,docker只是单容器的运行,举个栗子:现在要跑一个springboot的应用,首先你得启动mysql,然后jar包,如果还有别的服务nginx、redis等,那不是要docker run
好几次,那么有什么办法能解决这个烦恼,只用一次就能将所有的服务跑起来呢?
docker-compose:
我能!!
docker:
没我你是个啥?
说白了docker-compose
这个东西就是一个管理容器的工具, 我们可以方便的使用它来管理我们的docker
容器, 可以极大程度的简化命令行的复杂操作.
最后简单说一下,dokcerfile
和docker-compose
有什么区别:
dockerfile
: 构建镜像docker run
:启动容器docker-compose
:启动服务
docker-compose的安装
前提你的服务器已近安装了docker
,我看到网上的安装方式有好多可能已经算得上是远古时期的了。
//其实一句搞定
yum install -y docker-compose
然后 docker-compose version
有出来版本号就代表安装成功了。(类似下面这样)
[root@HarryZhang ~]# docker-compose version
docker-compose version 1.18.0, build 8dd22a9
docker-py version: 2.6.1
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.0.2k-fips 26 Jan 2017
yml文件
yaml
或yml
相信这两个名字,在座的各位JavaDeveloper
并不陌生吧。springboot的配置文件之一。
他和dockerfile
的区别其实很简单:一个是构建容器,另一个是对容器进行编排。
yml文件默认的名字为:docker-compose.yml
yml包含三大概念:Services、Networks、Volumes
- 一个
service
代表一个container
(这个container
可以从docker hub上拉取的image
创建也可以用Dockerfile
build出来的image创建) service
的启动类似docker run
,我们可以给其指定network
和volume
不知到你们有没有感觉到 docker run 的命令如果多挂载几个容器卷的话十分的不美观,又臭又长。
类似于这种:
docker run --rm -p 443:443 -p 80:80 --name nginx \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
-v /usr/local/docker/nginx/logs:/var/log/nginx \
-v /usr/local/docker/nginx/conf:/etc/nginx \
-d nginx
不复制保存着下一次真的都不知道怎么敲出来(听说高手都是Ctrl C+V)
我们再来看看docker-compose.yml
的写法:
version: '2' //这是版本号
services:
nginx:
image: nginx
container_name: nginx
restart: always
ports:
- 80:80
- 443:443
environment:
TZ: Asia/Shanghai
volumes:
- /usr/local/docker/nginx/html:/usr/share/nginx/html
- /usr/local/docker/nginx/logs:/var/log/nginx
- /usr/local/docker/nginx/conf:/etc/nginx
其实从单词的意思上就可以看出来什么意思了。
然后我们docker-compose up -d
就可以将nginx
启动起来了
你可以 docker-compose ps
就可以看到刚刚启动的nginx
运行多个服务
那么你们这群杠精肯定会问:如果启动多个服务怎么办呢?(你慌什么我不是正打算说吗)
version: '2'
services:
mysql:
image: mysql:5.7
container_name: mysql
restart: always
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: "123456"
TZ: Asia/Shanghai
volumes:
- /usr/local/docker/mysql/config/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
- /usr/local/docker/mysql/data:/var/lib/mysql
nginx:
image: nginx
container_name: nginx
restart: always
ports:
- 80:80
- 443:443
environment:
TZ: Asia/Shanghai
volumes:
- /usr/local/docker/nginx/html:/usr/share/nginx/html
- /usr/local/docker/nginx/logs:/var/log/nginx
- /usr/local/docker/nginx/conf:/etc/nginx
java-service:
image: harry/debugers
volumes:
- /usr/local/debugers:/usr/local/debugers
ports:
- 8080:8080
这样子不就行了吗
是不是发现如果这东西用来测试spring-cloud
的项目的话那得有多方便啊 时代在进步啊
上边的image
节点的话可以替换成 dockerfile
这样子更方便 ,**注意:**那么dockerfile
必须跟docker-compose.yaml
在一个目录下
java-service:
build: .
volumes:
- /usr/local/debugers:/usr/local/debugers
ports:
- 8080:8080
只能说看自己需求了这种东西。
docker-compose 常用命令
docker-compose.yml 所在文件夹下执行
-
docker-compose ps
: 查看当前有哪些容器 -
docker-compose config -q
: 验证(docker-compose.yml
)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。 -
docker-compose restart
: 重新启动服务的容器(注意是 编排文件中的service) -
docker-compose logs
: 查看的日志 -
docker-compose logs -f
: 查看实时日志 -
docker-compose up
:启动服务容器 -
docker-compose down
:停止服务容器 -
docker-compose exec
:进去容器内部运行命令 跟docker exec
一样
其实大部分命令的话跟docker
没有什么区别
END
又到了客套话时间了,下一次相聚又不知道是什么时候了各位。
关注、点赞我从来不主动要![滑稽]