一,Docker-Compose概述
Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排(开源地址:https://github.com/topics/docker-compose)
Docker-Compose定位:定义和运行多个容器的应用,其前身是开源项目Fig
DockerFile模板文件可以让用户很方便的定义一个单独的容器镜像,然后在正常开发中,应用的运行需要多个容器相互依赖配合,例:一个web项目除了它本身,还需要redis,mysql,tomcat,nginx……这通过DockerFile是不能实现的,假如使用DockerFile打包自定义镜像了,启动时还需要将依赖容器提前启动,很麻烦
Docker-Compose就能很好的满足上述需求,它允许通过单独的docker-compose.yml模板文件来定义一组相关联的应用容器为一个项目
Docker-Compose两个核心概念:
- 服务(service):一个应用的容器,实际上可以包含多个运行相同镜像的容器实例
- 项目(project):由一组关联的应用容器组成的一个完整业务单元,一个docker-compose.yml文件中定义
注:服务本质上就是容器的容器,一个docker-compose.yml文件就是代表一个项目
Docker-Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷的生命周期管理
Docker-Compose由python编写,实际上调用了Docker服务提供的API来对容器进行管理,因此只要所在操作系统支持Docker API,就可以在其上利用Compose来进行编排
二,Docker-Compose的安装和卸载
Docker官方提供了简单下载和卸载命令且docker-compose不需要配置,照着敲即可
一,Docker-Compose的安装
1,Docker官方提供一个curl的下载命令(运行即可)
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2,给docker-compose加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
3,查看docker-compose是否安装成功
docker-compose -v
二,Docker-Compose的卸载
1,移除/usr/local/bin下的docker-compose文件
sudo rm -f /usr/local/bin/docker-compose
2,pip卸载docker-compose
pip uninstall docker-compose
三,Docker Compose模板命令
模板命令是在docker-compose.yml中使用的命令,因为是yml文件格式,所有书写格式也要匹配
1,version:声明使用Compose的版本号(建议3.9以下)
#version一般在第一行就声明 version "3.5"
2,services:定义多个容器服务,servers下面可以定义多个容器,这些容器共同组成了servers服务
#servers定义多个容器 servers: tomcat:#服务名称(自定义,注意这是服务名称而不是容器名称) image:tomcat:9.0#容器使用的镜像 ports:#映射端口 -"8080:8080" volumes: -/home/volumes:/vsr/local/volumes#使用自定义路径进行数据卷共享 redis:#服务名称(自定义) image:tomcat:9.0#容器使用的镜像 ports:#映射端口 -"6379:6379"
3,images:容器使用那个镜像运行生成(本地没有该镜像就会去远程仓库pull)
image:tomcat:9.0#使用tomcat9.0镜像生成容器
4,ports:端口映射,一次可以映射多个端口
ports: -"8080:8080"#容器8080映射主机8080
5,volumes:定义数据卷
注:docker-compose中volumes自定义路径映射和自动映射两种写法不一样
① 使用自定义数据卷
servers: fq: images:tomcat:9.0 volumes: -/home/volumes:/vsr/local/volumes#使用自定义路径映射进行数据卷共享
② 使用数据卷名
servers: fq: images:tomcat:9.0 volumes: -wql:/vsr/local/volumes#使用自动映射进行数据卷共享(需要在servise外部定义自动映射的数据卷名) volumes:#声明上面服务所使用的自动创建的卷名 wql:#定义卷名 external:#是否使用外部的卷名 false #为ture则必须在外部必须已存在此卷名,不能容器加载会报错
6,networks:服务使用的网络名称
servers: fq: images:tomcat:9.0 networks: -hello#网络名称,docker必须要有此网络(如果没有需要手动创建) #创建网络 networks: hello:#创建名为hello的网络,默认网络类型是bridge网桥 external:#是否使用外部的网络 false #为ture则必须在外部必须已存在此网络,不能容器加载会报错
7,container_name:定义容器名称
servers: fq: images:tomcat:9.0 container_name:tom #容器名称为tom
8,environment:设置容器内的环境变量
#两种书写格式:字典格式和数组格式 environment: # 字典格式,注意第二个变量没有赋值。 也不用 用 - 来开头 RACK_ENV: development SESSION_SECRET: environment: # 数组格式,注意第二个变量没有赋值。 需要用 - 来开头 - RACK_NEN=development - SESSION_SECRET
9,env_file:从文件中获取环境变量(本质上和environment一样的但它是把变量写在文件中)
① 书写env_file文件的格式
支持井号注释,key=value格式
# common.env Set development environment 注释 PROG_ENV=development # 这个是内容
② env_file命令引入外部env文件
env_file: # 指定多个env_file, 文件名字各式各样,而且还有相对路径和绝对路径 - ./common.env # 相对路径下的 - ./apps/web.env # 相对路径下的 - /app/secrets.env # 绝对路径下的
10,command:覆盖容器启动后默认执行的命令(相当于run镜像之后覆盖内部默认的命令)
command: echo "hello world"
11,depends_on:解决容器依赖问题,指定当前容器依赖那些容器,先启动依赖容器再启动当前容器(编排作用)
version: "3" services: web: build: . depends_on:#优先启动redis和mysql - db_container # 注意这里写的是服务名字 - redis_container # 注意这里写的是服务名字,不是服务container_name里面的名字 redis_container: image: redis db_container: image: mysql
注:depends_on 里面写的是服务的名字,不是容器的名字
12,healthcheck:通过命令检查容器是否正常运行(心跳检测)
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3
13,sysctls:配置容器内核参数
用来修改容器内 系统内部参数, 但是这个命令并不是必须的。。有些服务启动的时候,会受到容器内参数的限制导致可能无法成功启动,则必须修改容器内参数才能让这个服务启动成功
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncooies=0
14,ulimits: 用来指定容器中最大进程数,指定容器的ulimits限制值
#例如,指定最大进程数为65535, 指定文件句柄数为20000(软限制,应用可以随时修改,不能超过硬限制)和#40000(系统硬限制,只能root用户提高) ulimits: nproc: 65535 nofile: sofe: 20000 hard: 40000
15,build:将dockerfile打包成镜像,然后运行该镜像(在compose中使用外部dockerfile打包镜像并运行)
build:
service: web: build:#指定dockerfile所在目录,根据build中的ddockerfile自动构建镜像,自动运行容器 context:dome#上下文目录dockerfile所在目录 dockerfile:docketfile#指定dockerfile文件名,默认就是dockerfile
外部dockerfile:./dome/dockerfile
FROM tomcat:8.5.70-jre8-temurin WORKDIR /usr/local/tomcat/webapps EXPOSE 8080 RUN echo "晴天">wql.txt
version: "3.2" services: tomcat-1: container_name: tomcat-1_name image: tomcat:8.0-jre8 ports: - "8080:8080" volumes: - appdata1:/usr/local/tomcat/webapps - /home:/home networks: - tomcat-net # 这里一样的网络 depends_on: - tomcat-2 - mysql - redis healthcheck: # 心跳检测让系统每隔30秒发送curl命令请求docker,看系统是否正常运行 test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 10s retries: 3 sysctls: # 用来修改系统内部参数 - net.core.somaxconn=1024 # 这里是例子 - net.ipv4.tcp_syncookies=0 ulimits: #用来修改系统内进程数限制,日后使用,可以根据当前容器运行服务要求,进行修改,用以满足容器的成功启动 nproc: 65535 nofile: soft: 20000 hard: 40000 tomcat-2: image: tomcat:8.0-jre8 ports: - 8081:8080 volumes: - appdate2:/usr/local/tomcat/webapps networks: - tomcat-net # 这里一样的网络 - tomcat2-net mysql: image: mysql:5.7.23 container_name: mysql ports: - "3307:3306" volumes: - mysql_data:/var/lib/mysql - mysql_config:/etc/mysql # environment: # MYSQL_ROOT_PASSWORD: "123456" # 第二种方法:用env_file env_file: - mysql.env networks: - tomcat-net redis: image: redis:5.0.10 container_name: redis ports: - "6379:6379" volumes: - redis_data:/data command: "redis-server --appendonly yes" # 原本的redis启动的命令是 redis-server 但是我们要这个是容器,而且要做数据持久化,所以需要覆盖原本的命令,新命令是 command: "redis-server --appendonly yes" networks: - tomcat-net volumes: appdata1: appdate2: mysql_data: mysql_config: redis_data: networks: tomcat-net: external: true tomcat2-net:
四,Docker Compose指令
Docker Compose指令和模板指令的区别:
- 指令:用来对整个docker-compose.yml对应的项目进行操作,书写在docker-compose命令后面
- 模板指令:书写在docker-compose.yml文件中的指令称为模板指令,用来构造整个服务和项目
一,Docker Compose命令格式和选项
对于Compose来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或容器,如果没有特别说明,命令对象就是项目,这意味着所有的服务都会受到命令影响
帮助命令:docker-compose [COMMAND] --help 或者docker-compose help [COMMAND]
docker-compose命令的基本格式:
命令选项(options):
- -f(--file FIFE):指定使用的Compose模板文件,默认为docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml
- -p(--project-name NAME):指定项目名称,默认将所在的目录名称作为项目名
- --x--networking:使用Docker的可拔插网络后端特性
- --x-network-driver DRIVER:指定后端的驱动,默认为bridge
- --verbose:输出更多调试信息
- -v(--version):打印版本号
二,Docker Compose命令
1,up
格式:docker-compose up [options] [SERVICE…]
- 该命令自动完成包括构建镜像,创建服务,启动服务,并关联服务相关容器的一系列操作
- 链接的服务都将被自动启动,除非处于运行状态
- 默认情况下,doocker-compose up启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便的进行调试
- 当通过Ctrl-C停止命令时,所有容器将会停止
- 如果使用docker-compose up -d 将会后台并运行所有容器(生产环境不推荐)
- 默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建
2,down:停止up命令所启动的容器,并移除网络
3,exec:进入指定容器
4,ps:查看项目运行的所有容器
- -q:只打印容器ID
5,restart:重启项目
- -t:指定重启前停止容器的超时时间
6,rm:删除所有停止状态的服务容器
- -f:强制直接删除,包括非停止状态的容器,一般开发中不要使用这个
- -v:删除容器所挂载的数据卷
7,start:启动已经存在的服务容器
8,stop:停止处于运行状态的容器
9,top:查看服务容器内运行的进程
10,pause:暂停服务
11,unpause:恢复处于暂停状态的服务
五,docker可视化工具Portainer
一,安装Portainer工具
1,下载portainer
docker pull portainer/portainer:latest
2,运行portainer(命令固定不需要更改)
docker run -d \ -p 8000:8000 \ -p 9000:9000 \ --name portainer \ --restart always \ -v /var/run/docker.sock:/var/run/rundocker.sock \ -v protainer_data:/data \ portainer/portainer
-v /var/run/docker.sock:/var/rundocker.sock:让proatiner容器引擎和docker引擎同步产生对应关系(默认安装位置在/var/run/docker.sock目录中)
3,访问
ip地址:9000
二,protainer使用的简单说明
1,首次访问需要进行注册(密码需要8位数)
2,portainer使用模式(我们连接本地docker使用本地模式即可)
3,进入本地容器
注:portainer提供了对容器和镜像的各种可视化操作,还能pull远程仓库,基本上除了dockerfile和docker-compose,其他的操作都可以傻瓜式操作
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109