前言
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创建也可以用Dockerfilebuild出来的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
又到了客套话时间了,下一次相聚又不知道是什么时候了各位。
关注、点赞我从来不主动要![滑稽]