介绍
介绍
上一课我们通过Dockerfile把PHP、MySQL、Redis、MongoDB、Elasticsearch和Nginx重新安装了一遍,大家会发现单独启动这些相互依赖的软件还真是技术活,需要根据依赖关系按顺序启动容器,一旦容器退出了还要想办法及时启动起来。
这个问题在早期的Docker部署时期只能通过Shell脚本+Crontab计划任务来完成,不但操作复杂,稳定性也没有保障~~
Docker官方提供了一个工具docker-compose,这个工具可以通过配置文件管理一组应用的容器,docker-compose支持容器的自动启动、自动部署、热更新、热升级,简直太爽了~~
安装
安装
官方github地址
https://github.com/docker/compose
下载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服务组上线。
系统会自动检查容器列表,如果服务对应的容器没有创建就会自动创建,如果服务对应容器没有启动就会自动启动。
down
将docker-compose服务组下线。
系统会自动检查容器列表,自动停止服务组里面的服务对应的容器,自动删除服务组里面的服务对应的容器。
build
创建/重建docker-compose服务组里面的服务。
新版本推荐使用“up --no-start”替代“build”实现创建/重建服务功能。
start
启动docker-compose服务组里面的服务,也可以启动全部服务组的服务。
stop
停止docker-compose服务组里面的服务,也可以停止全部服务组的服务。
restart
重启docker-compose服务组里面的服务,也可以重启全部服务组的服务。
pause
暂停docker-compose服务组里面的服务,也可以暂停全部服务组的服务。
unpause
恢复docker-compose服务组里面的服务,也可以恢复全部服务组的服务。
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
显示服务使用的端口。
images
查看镜像列表。
events
接受实时的容器事件,这个福哥以后再详情介绍。
pull
拉取服务的镜像,这个福哥以后再详情介绍。
push
提交服务的镜像,这个福哥以后再详情介绍。
version
显示docker-compose的版本信息。
run
启动一个容器,这个福哥以后再详情介绍。
exec
在容器里面执行一个命令,这个福哥以后再详情介绍。
rm
删除一个已经停止的容器,这个福哥以后再详情介绍。
kill
停止一个正在运行的容器,这个福哥以后再详情介绍。
logs
查看一个容器的日志,这个福哥以后再详情介绍。
ps
查看容器列表,这个福哥以后再详情介绍。
总结
今天福哥带着童鞋们学习了docker-compose工具的使用方法,这里面包括docker-compose.yml配置文件的语法和使用技巧。
后面福哥会逐步给童鞋们讲解docker-compose的使用技巧,通过docker-compose我们可以更加方便的管理我们的服务。