同福

docker-compose学习笔记【20210530】

介绍

介绍

上一课我们通过Dockerfile把PHP、MySQL、Redis、MongoDB、Elasticsearch和Nginx重新安装了一遍,大家会发现单独启动这些相互依赖的软件还真是技术活,需要根据依赖关系按顺序启动容器,一旦容器退出了还要想办法及时启动起来。

这个问题在早期的Docker部署时期只能通过Shell脚本+Crontab计划任务来完成,不但操作复杂,稳定性也没有保障~~

Docker官方提供了一个工具docker-compose,这个工具可以通过配置文件管理一组应用的容器,docker-compose支持容器的自动启动、自动部署、热更新、热升级,简直太爽了~~

安装

安装

官方github地址

https://github.com/docker/compose

home/topic/2021/0810/19/e0d745be6b33cf4b87b846d1cb2166bf.png

下载docker-compose

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

授权docker-compose

chmod +x /usr/local/bin/docker-compose

配置文件

docker-compose的配置文件使用的是YAML语言,语法很简单,简单说就是“冒号赋值,双空格缩进”!

docker-compose.yml

默认情况下docker-compose会去加载当前目录下面的docker-compose.yml配置文件,而福哥建议不要自己定义配置文件,多个service组可以放到不同的目录下面,每个目录里面放上一个docker-compose.yml配置文件即可。

version

这个version是指docker的版本,具体可以参考这个网址。

https://docs.docker.com/compose/compose-file/

示例

version: "3"

services

这个services就是docker-compose的核心了,在docker-compose里面应用是以一个一个的service展现的,每个service负责自己的功能。

service的名称就是service容器的主机名称, 也就是说我们不需要设置service容器的IP地址,通过service名称就可以访问到容器。

service兼容大部分docker run的参数,可以在service下面通过这些参数进行自定义设置。

示例

version: "3"

services:
  # db
  mysql:
    ...
  
  # web
  web:
    ...
    
  ...

image

每个服务需要指定一个镜像,docker-compose会使用这个镜像去启动服务容器,镜像可以是官方的也可以是自定义的。

示例

version: "3"

services:
  # db
  mysql:
    image: mysql5.7

ports

这个ports和docker run里面的--port用法一样,只不过这里可以设置将一个或者多个容器的端口映射到宿主机上面来。

示例

version: "3"

services:
  # db
  mysql:
    image: mysql5.7
    ports:
      - 10.16.1.1:3306:3306
      - 10.16.1.1:3307:3307

volumes

这个volumes和docker run里面的--volume用法一样,只不过这里可以设置将一个或者多个宿主机目录映射到容器内部去。

示例

version: "3"

services:
  # db
  mysql:
    image: mysql5.7
    volumes:
      - /tongfu.net/env/mysql-5.7/data/:/var/lib/mysql/

服务器

config

测试docker-compose.yml配置文件的是否正确。

在启动docker-compose的时候,或者刷新服务docker-compose服务的时候,最好通过config命令测试一下。

[root@dev TFLinux]# docker-compose config
services:
  elasticsearch:
    image: tflinux-es6.8.15
    ports:
    - 10.16.1.1:9200:9200/tcp
    volumes:
    - /tongfu.net/env/elasticsearch-6.5.2/data:/var/lib/elasticsearch:rw
    - /tongfu.net/env/elasticsearch-6.5.2/logs:/var/log/elasticsearch:rw
  mongo:
    image: tflinux-mongo4.2
    ports:
    - 10.16.1.1:27017:27017/tcp
    volumes:
    - /tongfu.net/env/mongodb-4.2.2/data:/var/lib/mongodb:rw
    - /tongfu.net/env/mongodb-4.2.2/logs:/var/log/mongodb:rw
  mysql:
    image: tflinux-mysql5.7
    ports:
    - 10.16.1.1:3306:3306/tcp
    volumes:
    - /tongfu.net/env/mysql-5.7.28/data:/var/lib/mysql:rw
  nginx:
    image: tflinux-nginx1.20
    ports:
    - published: 80
      target: 80
    - published: 443
      target: 443
  php-fpm:
    image: tflinux-php-fpm7.4
    ports:
    - 10.16.1.1:8168:8168/tcp
    - 10.16.1.1:8170:8170/tcp
    - 10.16.1.1:8171:8171/tcp
    volumes:
    - /tongfu.net/web/SDPHP/TFPHP:/tongfu.net/web/TFPHP:rw
    - /tongfu.net/web/SDPHP/TFUMS:/tongfu.net/web/TFUMS:rw
    - /tongfu.net/web/SDPHP/TFAMS:/tongfu.net/web/TFAMS:rw
    - /tongfu.net/web/TFHomeRes3:/tongfu.net/web/TFHomeRes3:rw
  php-nginx:
    image: tflinux-php-nginx7.4
    ports:
    - 10.16.1.1:8068:8068/tcp
    - 10.16.1.1:8070:8070/tcp
    - 10.16.1.1:8071:8071/tcp
    volumes:
    - /tongfu.net/web/SDPHP/TFPHP:/tongfu.net/web/TFPHP:rw
    - /tongfu.net/web/SDPHP/TFUMS:/tongfu.net/web/TFUMS:rw
    - /tongfu.net/web/SDPHP/TFAMS:/tongfu.net/web/TFAMS:rw
    - /tongfu.net/web/TFHomeRes3:/tongfu.net/web/TFHomeRes3:rw
  redis:
    image: tflinux-redis6.0
    ports:
    - 10.16.1.1:6379:6379/tcp
    volumes:
    - /tongfu.net/env/redis-4.0.10/data:/var/lib/redis:rw
    - /tongfu.net/env/redis-4.0.10/logs:/var/log/redis:rw
version: '3'

up

将docker-compose服务组上线。

系统会自动检查容器列表,如果服务对应的容器没有创建就会自动创建,如果服务对应容器没有启动就会自动启动。

home/topic/2021/0531/13/af4c4da2882d65b2abd35ee2e2804baf.png

down

将docker-compose服务组下线。

系统会自动检查容器列表,自动停止服务组里面的服务对应的容器,自动删除服务组里面的服务对应的容器。

home/topic/2021/0531/13/3b7fd12b2a683c3e9a0a09d156e32b0d.png

build

创建/重建docker-compose服务组里面的服务。

新版本推荐使用“up --no-start”替代“build”实现创建/重建服务功能。

start

启动docker-compose服务组里面的服务,也可以启动全部服务组的服务。

home/topic/2021/0531/13/ed5cfb97aae0041822026c0b9689bf71.png

stop

停止docker-compose服务组里面的服务,也可以停止全部服务组的服务。

home/topic/2021/0531/13/006bc7b6f0fa11597e912785be483b92.png

restart

重启docker-compose服务组里面的服务,也可以重启全部服务组的服务。

home/topic/2021/0531/13/e67da902fed2e13832b927ce9d2c7d1d.png

pause

暂停docker-compose服务组里面的服务,也可以暂停全部服务组的服务。

home/topic/2021/0531/13/2502a8e60281243d33864733b46044fe.png

unpause

恢复docker-compose服务组里面的服务,也可以恢复全部服务组的服务。

home/topic/2021/0531/13/beac49bf4c04ae76dc28529cd73f8bf0.png

scale

使用scale可以为某一个服务扩容/缩容,扩容服务可以让一个服务对应多个容器副本,从而提高系统性能,这个福哥以后再详情介绍。

top

显示正在启动进程。

[root@dev TFLinux]# docker-compose top
tflinux_elasticsearch_1
 UID     PID    PPID    C    STIME   TTY     TIME                                                      CMD                                                  
------------------------------------------------------------------------------------------------------------------------------------------------------------
mysql   40939   40866   94   14:05   ?     00:00:07   /opt/jdk-15.0.1+9/bin/java -Xms1g -Xmx1g -XX:+UseG1GC -XX:G1ReservePercent=25                         
                                                      -XX:InitiatingHeapOccupancyPercent=30 -Des.networkaddress.cache.ttl=60                                
                                                      -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true         
                                                      -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow                                 
                                                      -XX:+ShowCodeDetailsInExceptionMessages -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true 
                                                      -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true
                                                      -Djava.io.tmpdir=/tmp/elasticsearch-18000406548621260355 -XX:+HeapDumpOnOutOfMemoryError              
                                                      -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log                                             
                                                      -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m          
                                                      -Djava.locale.providers=COMPAT -XX:UseAVX=2 -Des.cgroups.hierarchy.override=/                         
                                                      -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/usr/share/elasticsearch/config                
                                                      -Des.distribution.flavor=default -Des.distribution.type=docker -cp /usr/share/elasticsearch/lib/*     
                                                      org.elasticsearch.bootstrap.Elasticsearch                                                             
mysql   41486   40939   0    14:05   ?     00:00:00   /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller                       


tflinux_mongo_1
  UID      PID    PPID    C    STIME   TTY     TIME             CMD         
----------------------------------------------------------------------------
polkitd   40799   40756   17   14:05   ?     00:00:01   mongod --bind_ip_all


tflinux_mysql_1
  UID      PID    PPID    C   STIME   TTY     TIME      CMD  
-------------------------------------------------------------
polkitd   40931   40865   5   14:05   ?     00:00:00   mysqld


tflinux_nginx_1
UID     PID    PPID    C   STIME   TTY     TIME                        CMD                    
----------------------------------------------------------------------------------------------
root   36969   36952   0   13:55   ?     00:00:00   nginx: master process nginx -g daemon off;
101    37032   36969   0   13:55   ?     00:00:00   nginx: worker process                     
101    37033   36969   0   13:55   ?     00:00:00   nginx: worker process                     


tflinux_php-fpm_1
UID     PID    PPID    C   STIME   TTY     TIME                              CMD                         
---------------------------------------------------------------------------------------------------------
root   41337   41298   1   14:05   ?     00:00:00   php-fpm: master process (/usr/local/etc/php-fpm.conf)
33     41439   41337   0   14:05   ?     00:00:00   php-fpm: pool tfams                                  
33     41440   41337   0   14:05   ?     00:00:00   php-fpm: pool tfphp                                  
33     41441   41337   0   14:05   ?     00:00:00   php-fpm: pool tfums                                  


tflinux_php-nginx_1
UID     PID    PPID    C   STIME   TTY     TIME                        CMD                    
----------------------------------------------------------------------------------------------
root   40987   40961   0   14:05   ?     00:00:00   nginx: master process nginx -g daemon off;
101    41257   40987   0   14:05   ?     00:00:00   nginx: worker process                     
101    41258   40987   0   14:05   ?     00:00:00   nginx: worker process                     


tflinux_redis_1
  UID      PID    PPID    C   STIME   TTY     TIME                CMD           
--------------------------------------------------------------------------------
polkitd   40937   40875   0   14:05   ?     00:00:00   redis-server 0.0.0.0:6379

port

显示服务使用的端口。

home/topic/2021/0531/14/c1198a55b5a1b3dd2ccca31680a802e8.png

images

查看镜像列表。
home/topic/2021/0531/14/d4d50ee1b0242c1057a6bacdee2447e3.png

events

接受实时的容器事件,这个福哥以后再详情介绍。

pull

拉取服务的镜像,这个福哥以后再详情介绍。

push

提交服务的镜像,这个福哥以后再详情介绍。

version

显示docker-compose的版本信息。

home/topic/2021/0531/13/84bb66d2b6d63aa80b2d96d66fc52db1.png

run

启动一个容器,这个福哥以后再详情介绍。

exec

在容器里面执行一个命令,这个福哥以后再详情介绍。

rm

删除一个已经停止的容器,这个福哥以后再详情介绍。

kill

停止一个正在运行的容器,这个福哥以后再详情介绍。

logs

查看一个容器的日志,这个福哥以后再详情介绍。

ps

查看容器列表,这个福哥以后再详情介绍。

总结

今天福哥带着童鞋们学习了docker-compose工具的使用方法,这里面包括docker-compose.yml配置文件的语法和使用技巧。

后面福哥会逐步给童鞋们讲解docker-compose的使用技巧,通过docker-compose我们可以更加方便的管理我们的服务。