Docker-Compose Get Started

前言

Hey,guys. 我大概好久没有写过博客了,突然不想摸鱼,还是写写文章好一点。之前颓废了几个月,现在得多多学习了,摸鱼不可能了。那么我为什么不在自己的博客上写呢? 想着我都来气,自己的域名暂时奉献给了公司(没错,就是这么敬(wu)业(nai)),也是在掘金的处女作

回归正题,今天想写一篇关于docker-compose的,相信各位小伙伴都知道docker是干嘛的了吧,如果不清楚我前面有写过一篇文章是关于docker 的。在没有docker之前我们总是很烦恼,如果环境迁移,或者将项目部署到新服务器的环境安装十分的繁琐。例如:jdknginxmysql等。我以前正好就在某公司(小公司-全栈)接收到这个无理的要求:

产品经理(人人都是产品经理):你先在这台服务器试用只有三天的服务器上测试一下,如果可以我们在考虑买服务器。

我:???(质疑我的代码?你怎么不上天呢?啥啥的都搞好了,又要换服务器??)

于是想了想,所有服务跑docker 吧,没什么不好的。

docker-compose和docker是什么关系?跟dockerfile有什么区别?

Docker Compose是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。

你可以这么理解,docker只是单容器的运行,举个栗子:现在要跑一个springboot的应用,首先你得启动mysql,然后jar包,如果还有别的服务nginx、redis等,那不是要docker run好几次,那么有什么办法能解决这个烦恼,只用一次就能将所有的服务跑起来呢?

docker-compose:我能!!

docker:没我你是个啥?

说白了docker-compose 这个东西就是一个管理容器的工具, 我们可以方便的使用它来管理我们的docker容器, 可以极大程度的简化命令行的复杂操作.

最后简单说一下,dokcerfiledocker-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文件

yamlyml相信这两个名字,在座的各位JavaDeveloper并不陌生吧。springboot的配置文件之一。

他和dockerfile的区别其实很简单:一个是构建容器,另一个是对容器进行编排

yml文件默认的名字为:docker-compose.yml

yml包含三大概念:Services、Networks、Volumes

  • 一个service代表一个container(这个container可以从docker hub上拉取的image创建也可以用Dockerfilebuild出来的image创建)
  • service的启动类似docker run,我们可以给其指定networkvolume

不知到你们有没有感觉到 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

又到了客套话时间了,下一次相聚又不知道是什么时候了各位。

关注、点赞我从来不主动要![滑稽]