搜索词>>

docker stack

耗时0.0050
  • docker stack 多项目网络互通案例

    环境准备docker swarm 集群环境NFS服务资源文件docker-mutil-stack.zip(访问密码: 9987)1.创建overlay网络网络名称:stackMutilNetwork sudo docker network 环境准备docker swarm 集群环境NFS服务资源文件docker-mutil-stack.zip(访问密码: 9987)1.创建overlay网络网络名称:stackMutilNetwork sudo docker network create \   --driver overlay \   --subnet=172.168.0.0/24 \   --gateway=172.168.0.1 \   stackMutilNetwork 执行示例:创建overlay网络2.所有宿主机挂载共享目录sudo mount -t nfs 192.168.79.129:/nfs /share3.上传demo.jar 将demo.jar上传到共享目录/share/demo.jar4.部署stack服务4.1部署MySQLsudo docker stack deploy -c mysql.yml mysql 成功后,登录MySQL执行下面初始化数据SQLcreate table `user` (     id int primary key ,     `name` varchar(8) ); insert  into user(id,name)values (1,'张三');数据初始化4.2部署appsudo docker stack deploy -c app.yml app  4.3部署web  sudo docker stack deploy -c nginx.yml web5.浏览器调用服务测试浏览器访问ngin所在主机ip第一次访问第二次访问第三次访问可以看到每次访问的ip不同,通过overlay网络实现了负载均衡,默认好像是轮询6.部署信息查看docker stack部署信息6.运行日志查看 MySQL:MySQL运行日志查看 app:app console输出日志查看文件日志,通过文件方式直接查看web:web访问日志 可以看到测试点击访问时候的nginx的访问日志
  • Docker stack 使用演示案例一

    Docker stack 使用演示案例一环境准备安装好docker swarm(本文以1manager+3worker为例)spring boot demo演示项目通过NFS实现共享目录访问资源文件 docker-stack.zip(访问密Docker stack 使用演示案例一环境准备安装好docker swarm(本文以1manager+3worker为例)spring boot demo演示项目通过NFS实现共享目录访问资源文件 docker-stack.zip(访问密码: 9987)实现结果同一个docker swarm集群中不通主机之间可以网络互通(通过overlay网络方式);docker stack部署服务并能实现共享文件访问程序简单架构  compose文件配置version: '3.5' networks: stackDemoNetwork: #网络类型必须是overlay driver: overlay external: false services: mysql: image: mysql:5.7 networks: - stackDemoNetwork ports: - "3306:3306" environment: - MYSQL_DATABASE=demo - MYSQL_ROOT_PASSWORD=YOUR_PWD command: --lower_case_table_names=1 --character-set-server=utf8 --collation-server=utf8_general_ci --explicit_defaults_for_timestamp=true --sql-mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO volumes: #先创建本机目录(这里指定的本机为swarm的manager节点,只部署1个) - ./mysql/data:/var/lib/mysql - ./mysql/conf:/etc/mysql/conf.d deploy: placement: constraints: [node.role == manager] mode: replicated replicas: 1 web: image: nginx:1.13-alpine ports: - "80:80" networks: - stackDemoNetwork volumes: #注意:主机目录必须手动先创建 - ./nginx/conf:/etc/nginx/conf.d - ./nginx/html:/usr/share/nginx/html deploy: placement: constraints: [node.role == manager] app: image: openjdk:8-alpine volumes: #sudo mount -t nfs 192.168.79.129:/nfs /share #先将demo.jar应用程序拷贝到共享目录 - /share/demo.jar:/demo.jar networks: - stackDemoNetwork command: ['java','-Xms256M','-Xmx256M','-Duser.timezone=Asia/ShangHai', '-jar', '/demo.jar',"--spring.profiles.active=test"] deploy: mode: replicated replicas: 3nginx 配置 nginx/conf/default.confserver { listen 80; listen [::]:80; server_name localhost; #access_log /var/log/nginx/host.access.log main; location / { proxy_set_header Host $http_host; proxy_pass http://app_upstream; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } upstream app_upstream{ server app:8080; }  文件结构参考  先将NFS挂载到每一个主机的/share目录下,作为共享目录,并创建compose.yml配置的/share开头的文件夹,必须预先创建,否则通过docker stack命令执行失败  启动/更新服务  docker 部署结构图提示,app123的顺序不一定是图中的顺序。  sudo docker stack deploy -c docker-compose.yml demo启动和更新命令一致启动完成后查看启动结果:查看某个服务的日志:sudo docker service logs -f demo_app访问演示  访问演示1  多次访问通过多次访问可以看到,ip地址变化等于访问了不通的容器,每次变化还都能访问到数据库中名字  提示:官方不建议使用NFS作为MySQL的数据挂载目录,建议直接使用宿主机目录
  • Docker swarm 集群NFS共享目录

    Docker swarm 集群NFS共享目录 NFS 主机安装服务端服务端安装命令如下:sudo apt install nfs-kernel-server -yNFS服务端安装 服务端配置NFS存储路径sudo mkdir /nfs suDocker swarm 集群NFS共享目录 NFS 主机安装服务端服务端安装命令如下:sudo apt install nfs-kernel-server -yNFS服务端安装 服务端配置NFS存储路径sudo mkdir /nfs sudo chmod 777 -R /nfs sudo vi /etc/exports 添加以下内容/nfs 192.168.79.0/24(rw,sync,no_root_squash,no_subtree_check)nfs路径配置 配置完毕后重载配置:sudo exportfs -rav NFS服务的配置完毕!NFS客户端 所有Docker主机安装NFS客户端,安装命令如下:sudo apt install nfs-common -yNFS客户端安装提示:安装了服务端的主机不用再次安装客户端,已经随同安装了。查看服务端的目录列表showmount -e 192.168.79.129 测试挂载目录sudo mkdir /mynfs sudo mount -t nfs 192.168.79.129:/nfs /mynfs 在/mynfs目录中创建文件,然后在NFS服务端的共享目录中查看文件是否存在,存在则代表共享成功。验证成功卸载NFS目录sudo umount /mynfs方案一:主机先挂载nfs目录,docker配置挂载后的共享目录(靠谱)方案二:Docker Stack直接配置NFS共享目录(有时候不生效)既然是集群,我们就不会希望跑到每个节点上面去配置NFS挂载和映射。做集群共享卷的关键,就是在compose文件中创建volume。语法如下:volumes: my-vol: driver_opts: type: "nfs" o: "addr=192.168.79.129,rw" device: ":/volume1/swarm" 与应用结合下面来一个复杂一点的 stack 配置,有 Prometheus 与 Grafana 两个容器,其中 Grafana 挂载 NFS 卷作为持久化存储,两个容器通过 overlay 网络互访。version: '3.7' services: grafana: image: grafana/grafana:latest hostname: grafana deploy: restart_policy: delay: 10s max_attempts: 10 window: 60s networks: - monitor_distributed ports: - 3000:3000 volumes: - grafana-data:/var/lib/grafana prometheus: image: prom/prometheus:latest hostname: prometheus deploy: restart_policy: delay: 10s max_attempts: 10 window: 60s networks: - monitor_distributed networks: monitor_distributed: driver: overlay volumes: grafana-data: driver_opts: type: "nfs" o: "addr=192.168.79.129,rw" device: ":/volume1/grafana"
  • docker 常用命令整理

    docker 常用命令整理(持续更新)docker运行容器资源相关 查看所有运行docker的资源消耗情况docker stats 查看指定运行容器资源消耗情况docker stats 容器ID/容器名称查看docker容器日志dockerdocker 常用命令整理(持续更新)docker运行容器资源相关 查看所有运行docker的资源消耗情况docker stats 查看指定运行容器资源消耗情况docker stats 容器ID/容器名称查看docker容器日志docker logs -f --tail 50 容器ID/容器名称--tail 50 表示从最后50行开始  docker容器docker ps 查看运行和运行状态的所有容器docker ps -a 删除容器docker rm -f 容器名称/容器iddocker镜像信息 查看所有镜像docker images 删除镜像docker rmi -f 镜像名称:版本/镜像id构建镜像docker build --name 镜像名称:版本 ./注意构建目录需要有Dockerfile文件导出镜像到文件docker save -o /path/to/save/image-name.tar image-name:tag载入本地镜像文件docker load -i /path/to/save/image-name.tar
  • Docker swarm 集群搭建和部署

    Docker swarm 简介Docker swarm 集群,Docker swarm是docker官方提供的一种集群方式,用于小量微服务部署还算不错,比庞大的k8s体系更轻量。节点 运行 Docker 的主机可以主动初始化一个 SwarmDocker swarm 简介Docker swarm 集群,Docker swarm是docker官方提供的一种集群方式,用于小量微服务部署还算不错,比庞大的k8s体系更轻量。节点 运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。节点分为管理 (manager) 节点和工作 (worker) 节点。管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。worker节点之间,通过control plane进行通信,这种通信使用gossip协议,并且是异步的。Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系:docker swarm结构图服务和任务 任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:replicated services 按照一定规则在各个工作节点上运行指定个数的任务。global services 每个工作节点上运行一个任务两种模式通过 docker service create 的 --mode 参数指定。Docker 官网的这张图片形象的展示了容器、任务、服务的关系任务下发结构图 网络模式在Swarm集群中,由于在容器上层又增加了一个service概念,因此对容器的访问更改成了对service的访问,然后再由一个service对应多个容器。那么一个service可能会包含多个容器副本,而这些容器副本多数情况下是运行在不同的主机中,为了实现service到具体容器副本的转发,在网络模式上与之前的单机的容器网络也将有所不同层次结构图services swarm service是一个抽象的概念,它只是一个对运行在swarm集群上的应用服务,所期望状态的描述。它就像一个描述了下面物品的清单列表一样:  服务名称  使用哪个镜像来创建容器  要运行多少个副本  服务的容器要连接到哪个网络上  应该映射哪些端口task 在Docker Swarm中,task是一个部署的最小单元,task与容器是一对一的关系。stack stack是描述一系列相关services的集合。我们通过在一个YAML文件中来定义一个stack。由于一个service会包含多个容器副本,多个副本可以看成一个service整体,它们通常只干一类相同的事情。而稍复杂一点的情况是,一个service可能还需要依赖其他service的能力才能完成任务,那么这就涉及从一个service到另一个service的调用。那么因此在swarm中最常见的2种网络访问是: 外部至swarm内部的service的调用swarm内部,service至service的调用  网络调用       Service到Service的调用,在swarm中将使用overlay网络解决该问题,overlay是一种覆盖多个主机的虚拟网络,它是利用路由转发策略将对虚拟网络中ip的请求转发至具体容器IP上来完成通信。       而在swarm中不紧如此,还将使用Docker内部的DNS为服务名进行DNS解析,这意味着你可以在swarm集群内部使用服务名称来访问对应的service。       在swarm集群中一个service可被其他容器应用调用,该调用可以基于服务名的DNS记录,如果一个service分配的vip,那么使用服务名调用DNS将解析为vip,vip在对应具体的容器副本IP,而如果使用dnsrr模式(轮询),则使用服务名调用时会直接返回一个具体的容器副本ip。       外部到service的调用,在swarm中仍然采用端口映射方式,使用宿主机端口映射到overlay网络分配的容器副本IP,而这种映射仍然基于一种多副本间的轮询。即使宿主机中并没有实际运行对应的容器副本,那么该主机仍然会使用本地端口,转发请求至其他主机上的容器副本       在swarm初始化过程中,会创建一个默认的overlay网络名为ingress,当然也支持用户自定义自己的overlay网络。要让service使用自定义的网络,那么在创建service时,指定需要使用的网络名称即可。       在Swarm初始化完成后,默认会创建一个网桥docker_gwbridge,和一个veth设备,而在docker中对应的会出现两个网络,一个名为ingress的overlay网络,一个为docker_gwbridge桥接网络。不仅如此还会创建两个默认network namespace,这两个网络空间的名称为ingress_sbox和另一个ingress,数据包需要进入这两个网络空间中进行一些处理,然后才到达容器的网络空间中。       在Swarm集群中配置使用overlay网络的服务,首先overlay网络会拥有独立的网段,如10.0.0.0/24。那么默认情况下会从该网段中为服务分配的一个IP,该IP是一个虚拟IP,docker使用IPVS对该虚拟IP进行负载,负载至具体的容器IP上,该IP同样来自overlay网络段。       而容器也会拥有2个veth对,一个用于连接容器至docker_gwbridge,另一个用于连接容器至ingress网络空间;因此在容器的网络空间中会出现2个veth接口,分别拥有不同的IP。 Docker swarm 集群环境安装部署  主机1(manager|192.168.79.129),主机2(worker|192.168.79.130),主机3(worker|192.168.79.133)主机1初始化为managersudo docker swarm initinit 命令更多参数,参考 docker swarm init | Docker DocumentationName, shorthandDefaultDescription--advertise-addrAdvertised address (format: <ip|interface>[:port])--autolockEnable manager autolocking (requiring an unlock key to start a stopped manager)--availabilityactiveAvailability of the node ("active"|"pause"|"drain")--cert-expiry2160h0m0sValidity period for node certificates (ns|us|ms|s|m|h)--data-path-addrAddress or interface to use for data path traffic (format: <ip|interface>)--data-path-portAPI 1.40+Port number to use for data path traffic (1024 - 49151). If no value is set or is set to 0, the default port (4789) is used.--default-addr-poolAPI 1.40+default address pool in CIDR format--default-addr-pool-mask-length24API 1.40+default address pool subnet mask length--dispatcher-heartbeat5sDispatcher heartbeat period (ns|us|ms|s|m|h)--external-caSpecifications of one or more certificate signing endpoints--force-new-clusterForce create a new cluster from current state--listen-addr0.0.0.0:2377Listen address (format: <ip|interface>[:port])--max-snapshotsNumber of additional Raft snapshots to retain--snapshot-interval10000Number of log entries between Raft snapshots--task-history-limit5Task history retention limit  主机2加入到主机1 加入命令:sudo docker swarm join --token SWMTKN-1-3daa7g97rlpms4aon7lwsnggdsbj24hh6ll9xx1tpxcbnmrh2p-9b7varm8ukgzrkiuaicbg93k6 192.168.79.129:2377 执行结果:主机2作为worker加入主机1主机3加入到主机1 命令与主机2 一致主机3作为worker加入主机1提示:主机2 / 主机 3 不需要执行init,直接加入即可查看docker节点信息在manager节点,输入命令查看:sudo docker node ls节点信息 从中执行结果可以看到,一共有三个节点每个节点的docker版本信息,其中一个是Leader节点 sudo docker infomanager节点info命令 通过info命令可以查看当前节点(manager)的swarm详细信息worker节点docker info信息提示:默认情况下manager同时也是worker,会承担工作发布容器任务。如果不想让manger节点执行任务,则可以在manager节点执行下面命令:sudo docker node update --availability drain managerdrain参数的意思是manager节点不再接受新的task,如果节点上已经有task在运行,则停止掉并调度到其它worker节点上去:  最好只设置一个为管理节点,如果有两个以上管理节点,会因为开机的先后顺序,搞得leader来回跳,服务命令又只能在管理节点运行docker service 适合启动单个服务,对于多服务部署和管理有些无能为力,可以使用docker stack来管理操作至此,docker swarm集群已经搭建好并就绪工作了。Docker Swarm 部署任务部署nginx案例 manager 节点执行命令sudo docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13-alpinenginx部署任务发布查看当前swarm运行的服务sudo docker service ls查看当前集群运行的服务查看某个服务的详情sudo docker service ps nginxsudo docker service ps (服务名称)查看运行服务详情集群运行的服务日志查看##查看服务日志 sudo docker service logs nginx ##实时观察日志 sudo docker service logs -f nginx 集群服务扩容sudo docker service scale nginx=5服务扩容执行  扩容后的运行情况从运行时间可以看到,扩容的时候并不会影响正在运行的集群服务缩容 有些时候服务并不需要那么多节点,需要收缩,如下:服务收缩与扩容命令一致,只需要修改后面的任务数量即可。集群服务删除服务删除使用Docker stack 部署服务Docker stack 简介        Docker在进行多服务部署和管理时通常会使用Docker Stack来解决大规模部署管理问题,Docker引擎在1.12 版本集成了Docker Swarm, 内置新的容器编排工具docker stack,通过提供期望状态、滚动升级、简单易用、扩缩容、健康检查等特性简化了应用的管理,这些功能都封装在一个完美的声明式模型当中。compose配置文件 如果你之前单机用过docker-compose这个组件,则会非常熟悉,与之部分配置一致。配置案例文件:endpoint_mode 为连接到一个群的外部客户端指定一个服务发现方法 endpoint_mode: vip -docker 为服务分配一个虚拟 ip (vip) ,作为客户端到达网络上服务的前端。Docker 在客户端和服务的可用工作节点之间传递请求,而客户端不知道有多少节点参与服务,也不知道它们的 ip 地址或端口。(这是默认的。) endpoint_mode: dnsrr - 服务发现不使用单个虚拟 ip。Docker 为服务设置 dns 条目,以便对服务名称的 dns 查询返回一个 ip 地址列表,客户机直接连接到其中一个。Dns round-robin 在需要使用自己的负载均衡器或混合 windows 和 linux 应用程序的情况下非常有用 version: "3.9" services: wordpress: image: wordpress ports: - "8080:80" networks: - overlay deploy: mode: replicated replicas: 2 endpoint_mode: vip mysql: image: mysql volumes: - db-data:/var/lib/mysql/data networks: - overlay deploy: mode: replicated replicas: 2 endpoint_mode: dnsrr volumes: db-data: networks: overlay: labels 为服务指定标签。这些标签只在服务上设置,而不在服务的任何容器上。 version: "3.9"services: web: image: web deploy: labels: com.example.description: "This label will appear on the web service" 要在容器上设置标签,请在 deploy 之外使用标签键: version: "3.9"services: web: image: web labels: com.example.description: "This label will appear on all containers for the web service" mode 要么是全局的(每个群集节点只有一个容器),要么是复制的(指定数量的容器)。默认是复制的。(了解更多信息,请查看 swarm 主题中的replicated和global services) version: "3.9"services: worker: image: dockersamples/examplevotingapp_worker deploy: mode: global placement 指定约束和首选项的位置。请参阅 docker 服务创建文档,了解语法和约束、首选项的可用类型的完整描述,并指定每个节点的最大副本 version: "3.9"services: db: image: postgres deploy: placement: constraints: - "node.role==manager" - "engine.labels.operatingsystem==ubuntu 18.04" preferences: - spread: node.labels.zone max_replicas_per_node 如果服务设置了副本数(这是默认值),限制任何时候在一个节点上运行的副本数量。当请求的任务比运行的节点多时,不会引发合适的节点错误(每个节点的最大副本限制超过)。 version: "3.9"services: worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 6 placement: max_replicas_per_node: 1 replicas 如果服务设置了副本数(这是默认值),则指定在任何给定时间应该运行的容器数量。 version: "3.9"services: worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 6 resources 配置资源约束 (cpu_shares, cpu_quota, cpuset, mem_limit, memswap_limit, mem_swappiness). redis 服务被限制使用不超过50m 的内存和0.50(单核的50%)的可用处理时间(cpu) ,并且有20m 的内存和0.25的 cpu 时间(总是可用)。 version: "3.9"services: redis: image: redis:alpine deploy: resources: limits: ##最大值 cpus: '0.50' memory: 50M reservations: ##初始值 cpus: '0.25' memory: 20M restart_policy 配置如何在容器退出时重新启动容器 condition: 定义什么时机进行重启,One of none,on-failure是在运行失败时进行重启或者any(默认any) delay: 发生错误后多长时间执行重启,指定为持续时间(默认值: 5秒)。 max_attempts: 在放弃之前尝试重新启动容器的次数(默认值: 永远不要放弃)。如果重新启动在配置的窗口内不成功,则此尝试不计入配置的 max_attempts 值。例如,如果 max _ attempts 设置为‘2’,并且第一次尝试重启失败,则可能会尝试两次以上的重启。 window: 设置重启的超时时间,指定为持续时间(默认值: 立即决定)。 version: "3.9"services: redis: image: redis:alpine deploy: restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s rollback_config 配置在更新失败的情况下应该如何回滚服务。 parallelism: 每次回滚的容器数量。如果设置为0,所有容器同时回滚。 delay: 每个容器组回滚之间的等待时间(默认值为0) failure_action:如果回滚失败,应该怎么做。一个 continue 或 pause (default pause) monitor: 每次任务更新后监视故障后的持续时间(ns | us | ms | s | m | h)(缺省值5s)注意: 设置为0将使用缺省值5s。 max_failure_ratio: 回滚期间容忍的故障率(默认值为0)。 order: 回滚期间的操作顺序。stop-first(在启动新任务之前停止旧任务)或start-first(先启动新任务,然后运行任务短暂重叠)之一(默认stop-first)。 update_config 配置如何更新服务,对于配置滚动更新很有用 parallelism: 每次更新的容器数量 delay: 更新一组容器之间的等待时间 failure_action:如果更新失败了怎么办。选择 continue、 rollback 或 pause (默认值: pause) monitor: 每个容器更新后,持续观察是否失败了的时间(ns | us | ms | s | m | h)(缺省值5s)注意: 设置为0将使用缺省值5s max_failure_ratio: 更新过程中容忍的故障率 order: 更新期间的操作顺序。Stop-first (在启动新任务之前停止旧任务)或 start-first (先启动新任务,然后运行任务短暂重叠)(默认 stop-first) 注意:只支持 v3.4版本和更高版本的文件格式。 docker stack deploy不支持以下子选项(支持 docker-compose up 和 docker-compose run)。 build cgroup_parent container_name devices tmpfs external_links links network_mode restart security_opt userns_mode案例2version: "3.9" services: wordpress: depends_on: - db image: wordpress:latest ports: - "80:80" environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress deploy: mode: replicated replicas: 3 healthcheck: test: ["CMD", "wget", "-qO", "-", "http://localhost"] interval: 2s timeout: 2s retries: 3 start_period: 2s networks: - overlay db: image: mysql:8.0.18 command: - --default_authentication_plugin=mysql_native_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci volumes: - db-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress deploy: placement: constraints: [node.role == manager] networks: - overlay volumes: db-data: networks: overlay:案例3version: '3.5' networks: gogs: #网络类型必须是overlay driver: overlay external: false volumes: db-data: db-conf: gogs-data: services: mysql: image: mysql:5.7 networks: - gogs ports: - "3306:3306" environment: - MYSQL_DATABASE=gogs - MYSQL_ROOT_PASSWORD=YOUR_PWD command: --lower_case_table_names=1 --character-set-server=utf8 --collation-server=utf8_general_ci --explicit_defaults_for_timestamp=true --sql-mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO volumes: - db-data:/var/lib/mysql - db-conf:/etc/mysql/conf.d deploy: placement: constraints: [node.role == manager] gogs: image: gogs/gogs:latest networks: - gogs ports: - "1122:22" - "3000:3000" volumes: - gogs-data:/data depends_on: - mysql deploy: mode: replicated replicas: 3 docker stack 部署服务\sudo docker stack deploy -c docker-compose.yml wordpress查看:sudo docker stack ps wordpress 移除服务,但是不会移除数据卷:sudo docker stack down wordpress 移除数据卷sudo docker volume prune更新与回滚策略1.配置重启策略version: "3.9" services: web: image: nginx:1.13-alpine ports: - "80:80" networks: - overlay deploy: mode: replicated replicas: 7 restart_policy: ##重启设置 condition: on-failure ##发生错误多长时间执行重启 delay: 10s ##发生错误多长时间执行重启 max_attempts: 3 ##在放弃之前尝试重新启动容器的次数 window: 120s ##设置重启的超时时间 networks: overlay:  2.配置更新策略version: "3.9" services: web: image: nginx:aaaa ###将镜像设置为不存在的 ports: - "80:80" networks: - overlay deploy: mode: replicated replicas: 7 restart_policy: ##重启设置 condition: on-failure ##发生错误多长时间执行重启 delay: 10s ##发生错误多长时间执行重启 max_attempts: 3 ##在放弃之前尝试重新启动容器的次数 window: 120s ##设置重启的超时时间 update_config: parallelism: 2 ##每次更新容器数量 delay: 10s ##更新一组容器之间的等待时间 failure_action: pause ##如果更新失败了怎么办,选择 continue、 rollback 或 pause (默认值: pause) monitor: 500ms ###每个容器更新后,持续观察是否失败了的时间 max_failure_ratio: 0.5 ##在更新过程中可以容忍的故障率 networks: overlay:  3.配置回滚策略version: "3.9" ##这个能写具体就具体点,之前3,启动服务直接报不支持rollback_config services: web: image: nginx:latest ports: - "80:80" networks: - overlay deploy: mode: replicated replicas: 7 restart_policy: ##重启设置 condition: on-failure ##发生错误多长时间执行重启 delay: 10s ##发生错误多长时间执行重启 max_attempts: 3 ##在放弃之前尝试重新启动容器的次数 window: 120s ##设置重启的超时时间 update_config: parallelism: 2 ##每次更新容器数量 delay: 10s ##更新一组容器之间的等待时间 failure_action: rollback ##如果更新失败了怎么办,选择 continue、 rollback 或 pause (默认值: pause) monitor: 500ms ###每个容器更新后,持续观察是否失败了的时间 max_failure_ratio: 0.5 ##在更新过程中可以容忍的故障率 rollback_config: parallelism: 1 ##每次回滚的容器数量。如果设置为0,所有容器同时回滚。 delay: 0s ##每个容器组回滚之间的等待时间(默认值为0) monitor: 500ms ##每次任务更新后监视故障后的持续时间 networks: overlay:  健康检查version: "3.9" services: web: image: nginx:1.13-alpine ports: - "80:80" networks: - overlay deploy: mode: replicated replicas: 7 restart_policy: ##重启设置 condition: on-failure ##在运行失败的时候 delay: 10s ##发生错误多长时间执行重启 max_attempts: 3 ##在放弃之前尝试重新启动容器的次数(默认值: 永远不要放弃) window: 120s ##设置重启的超时时间 update_config: parallelism: 2 ##每次更新容器数量 delay: 10s ##更新一组容器之间的等待时间 failure_action: pause ##如果更新失败了怎么办,选择 continue、 rollback 或 pause (默认值: pause) monitor: 500ms ###每个容器更新后,持续观察是否失败了的时间 max_failure_ratio: 0.5 ##在更新过程中可以容忍的故障率 rollback_config: parallelism: 1 ##每次回滚的容器数量。如果设置为0,所有容器同时回滚。 delay: 0s ##每个容器组回滚之间的等待时间(默认值为0) monitor: 500ms ##每次任务更新后监视故障后的持续时间 healthcheck: test: ["CMD", "wget", "-qO", "-", "http://localhost"] ##定义检测的命令 interval: 2s #命令执行间隔,默认30秒 timeout: 2s #命令超时时间,默认30秒 retries: 3 #命令失败重试次数 start_period: 2s #启动延时,即容器启动后多久开始执行检测 networks: overlay:
  • docker入门使用教程linux系统docker制作教程

    docker入门使用教程/linux(centos)系统docker制作教程<h2>Docker简介</h2> Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 <h2>Docker 安装及使用</h2> <h2>①资源准备</h2> <ol> <li>docker-engine-1.7.1-1.el6.x86_64.rpm[非必须](docker引擎,也可以通过yum安装)</li> </ol> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/f5ab2b77-0a42-4648-9aa9-0dcd6f01e546.png" /> <ol> <li>docker-centos6.8-tomcat-image.zip[必须](docker制作好的景象文件【最后讲解制作方法】)</li> </ol> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/557337cb-d34f-4e77-94c3-0ca6521dd4f7.png" /> <p><strong>注意安装docker的系统如果是centos6,请将内核升级到3.X版本2.X版本可能会出现意想不到的问题</strong></p> <h2>②安装docker</h2> 命令: <pre> <code>@注意,在cenos7版本安装的名字是docker,所以命令是yum install docker,可先通过yum list|grep docker查看安装版本 #yum install docker</code></pre> <br /> 或者 <pre> <code>@这是通过下载rpm文件安装的方式 #yum install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm</code></pre>   <h2>③启动/停止/查看</h2> 启动命令: <pre> <code>#service docker start</code></pre> <br /> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/fd526343-2ed7-4d2a-a543-21c63f575812.png" /><br /> 查看docker信息命令: <pre> <code># docker info</code></pre> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/4fa55562-0fba-4855-852c-5ed8fce9c92b.png" /><br /> 停止docker命令 <pre> <code>#service docker stop</code></pre> <br /> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/a6b36881-1959-4320-b97a-ca1c3f9cbe1a.png" /> <h2>④修改docker默认存储位置</h2> <pre> <code>#cd /var/lib # cp -rf docker docker.bak # cp -rf docker /data/docker/ # ln -s /data/docker docker </code></pre> <h2>⑤镜像准备</h2> 将镜像上传至服务器/data/images<br /> 解压上传的景象文件 <pre> <code># unzip docker-centos6.8-tomcat-image.zip</code></pre> <img alt="docker入门使用教程/linux(centos)系统docker制作教程" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/2e5999d4-240b-4ba7-ac83-b9ea8212d90f.png" /> <h2>⑥启动docker服务</h2> <pre> <code>#service docker start</code></pre> <h2>⑦Docker创建/载入景象<br /> 切换至解压的景象目录</h2> <pre> <code>#cd centos6_tomcat/</code></pre> <img class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/1c74d8ab-fd0a-4798-8d71-1fe12d959641.png" />Docker执行创建镜像 <pre> <code># docker build -t tomcat ./</code></pre> 最后结果图:<br /> <img class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/130dd457-9be7-48d2-b3dd-52f39248fee1.png" /><br /> <span style="color:#ff0000">[注意:]step不一定都是29</span> <h2>⑧创建一个docker容器</h2> 命令: <pre> <code># docker run -d -p 2000:22 -p 8000:8080 tomcat </code></pre> <img alt="⑧创建一个docker容器" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/4418d97f-8332-4eaf-b60d-a765287e8be4.png" /> <h2>⑨挂载docker一个共享目录,共享于主机方式开启一个docker</h2> 命令 <pre> <code>[root@MiWiFi-R1CM-srv share]# docker run -d -p 2008:22 -p 8008:8080 -v /data/share:/opt/share --privileged=true tomcat ccc238337fe92d05b806d996f252e2ecc8747d509af435d06fd2de3058de7b83 [root@MiWiFi-R1CM-srv share]# ll</code></pre>   <pre> <code>参数说明: -p 2008:22 docker里面的22端口对应主机的2008端口,用于外部SSH访问 -p 8008:8080 -v /data/share:/opt/share 主机的/data/share共享给docker/opt/share目录,类似于mount挂载 tomcat 镜像名称 --privileged=true 解决因selinux引起的docker容器内部对共享目录的权限不足问题,如果不加这个参数请关闭selinux</code></pre> 登录docker,切换到共享目录写一个文件<br /> <img alt="1" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/4c461325-5f83-4221-8456-ff85072b3ba4.png" /><br /> 回主机查看:<br /> <img alt="2" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/122a5ae1-f1e0-45c3-88ec-3b9be2eb0acd.png" /><br /> 由此便可以共享目录<br /> <strong>共享目录的好处:<br /> 1.方便主机上数据备份<br /> 2.将应用数据放于共享目录,如果docker不幸挂了,没事儿数据还在主机上,提高容错性<br /> <br /> 其他运行参数:</strong> <h2>Usage</h2> <pre> <code>docker run [OPTIONS] IMAGE [COMMAND] [ARG...] </code></pre> <h2>Options</h2> <table> <thead> <tr> <td>Name, shorthand</td> <td>Default</td> <td>Description</td> </tr> </thead> <tbody> <tr> <td><code>--add-host</code></td> <td> </td> <td>Add a custom host-to-IP mapping (host:ip)</td> </tr> <tr> <td><code>--attach , -a</code></td> <td> </td> <td>Attach to STDIN, STDOUT or STDERR</td> </tr> <tr> <td><code>--blkio-weight</code></td> <td> </td> <td>Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)</td> </tr> <tr> <td><code>--blkio-weight-device</code></td> <td> </td> <td>Block IO weight (relative device weight)</td> </tr> <tr> <td><code>--cap-add</code></td> <td> </td> <td>Add Linux capabilities</td> </tr> <tr> <td><code>--cap-drop</code></td> <td> </td> <td>Drop Linux capabilities</td> </tr> <tr> <td><code>--cgroup-parent</code></td> <td> </td> <td>Optional parent cgroup for the container</td> </tr> <tr> <td><code>--cidfile</code></td> <td> </td> <td>Write the container ID to the file</td> </tr> <tr> <td><code>--cpu-count</code></td> <td> </td> <td>CPU count (Windows only)</td> </tr> <tr> <td><code>--cpu-percent</code></td> <td> </td> <td>CPU percent (Windows only)</td> </tr> <tr> <td><code>--cpu-period</code></td> <td> </td> <td>Limit CPU CFS (Completely Fair Scheduler) period</td> </tr> <tr> <td><code>--cpu-quota</code></td> <td> </td> <td>Limit CPU CFS (Completely Fair Scheduler) quota</td> </tr> <tr> <td><code>--cpu-rt-period</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.25/" rel="external nofollow" target="_blank">API 1.25+</a><br /> Limit CPU real-time period in microseconds</td> </tr> <tr> <td><code>--cpu-rt-runtime</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.25/" rel="external nofollow" target="_blank">API 1.25+</a><br /> Limit CPU real-time runtime in microseconds</td> </tr> <tr> <td><code>--cpu-shares , -c</code></td> <td> </td> <td>CPU shares (relative weight)</td> </tr> <tr> <td><code>--cpus</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.25/" rel="external nofollow" target="_blank">API 1.25+</a><br /> Number of CPUs</td> </tr> <tr> <td><code>--cpuset-cpus</code></td> <td> </td> <td>CPUs in which to allow execution (0-3, 0,1)</td> </tr> <tr> <td><code>--cpuset-mems</code></td> <td> </td> <td>MEMs in which to allow execution (0-3, 0,1)</td> </tr> <tr> <td><code>--detach , -d</code></td> <td> </td> <td>Run container in background and print container ID</td> </tr> <tr> <td><code>--detach-keys</code></td> <td> </td> <td>Override the key sequence for detaching a container</td> </tr> <tr> <td><code>--device</code></td> <td> </td> <td>Add a host device to the container</td> </tr> <tr> <td><code>--device-cgroup-rule</code></td> <td> </td> <td>Add a rule to the cgroup allowed devices list</td> </tr> <tr> <td><code>--device-read-bps</code></td> <td> </td> <td>Limit read rate (bytes per second) from a device</td> </tr> <tr> <td><code>--device-read-iops</code></td> <td> </td> <td>Limit read rate (IO per second) from a device</td> </tr> <tr> <td><code>--device-write-bps</code></td> <td> </td> <td>Limit write rate (bytes per second) to a device</td> </tr> <tr> <td><code>--device-write-iops</code></td> <td> </td> <td>Limit write rate (IO per second) to a device</td> </tr> <tr> <td><code>--disable-content-trust</code></td> <td><code>true</code></td> <td>Skip image verification</td> </tr> <tr> <td><code>--dns</code></td> <td> </td> <td>Set custom DNS servers</td> </tr> <tr> <td><code>--dns-opt</code></td> <td> </td> <td>Set DNS options</td> </tr> <tr> <td><code>--dns-option</code></td> <td> </td> <td>Set DNS options</td> </tr> <tr> <td><code>--dns-search</code></td> <td> </td> <td>Set custom DNS search domains</td> </tr> <tr> <td><code>--entrypoint</code></td> <td> </td> <td>Overwrite the default ENTRYPOINT of the image</td> </tr> <tr> <td><code>--env , -e</code></td> <td> </td> <td>Set environment variables</td> </tr> <tr> <td><code>--env-file</code></td> <td> </td> <td>Read in a file of environment variables</td> </tr> <tr> <td><code>--expose</code></td> <td> </td> <td>Expose a port or a range of ports</td> </tr> <tr> <td><code>--group-add</code></td> <td> </td> <td>Add additional groups to join</td> </tr> <tr> <td><code>--health-cmd</code></td> <td> </td> <td>Command to run to check health</td> </tr> <tr> <td><code>--health-interval</code></td> <td> </td> <td>Time between running the check (ms|s|m|h) (default 0s)</td> </tr> <tr> <td><code>--health-retries</code></td> <td> </td> <td>Consecutive failures needed to report unhealthy</td> </tr> <tr> <td><code>--health-start-period</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.29/" rel="external nofollow" target="_blank">API 1.29+</a><br /> Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)</td> </tr> <tr> <td><code>--health-timeout</code></td> <td> </td> <td>Maximum time to allow one check to run (ms|s|m|h) (default 0s)</td> </tr> <tr> <td><code>--help</code></td> <td> </td> <td>Print usage</td> </tr> <tr> <td><code>--hostname , -h</code></td> <td> </td> <td>Container host name</td> </tr> <tr> <td><code>--init</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.25/" rel="external nofollow" target="_blank">API 1.25+</a><br /> Run an init inside the container that forwards signals and reaps processes</td> </tr> <tr> <td><code>--interactive , -i</code></td> <td> </td> <td>Keep STDIN open even if not attached</td> </tr> <tr> <td><code>--io-maxbandwidth</code></td> <td> </td> <td>Maximum IO bandwidth limit for the system drive (Windows only)</td> </tr> <tr> <td><code>--io-maxiops</code></td> <td> </td> <td>Maximum IOps limit for the system drive (Windows only)</td> </tr> <tr> <td><code>--ip</code></td> <td> </td> <td>IPv4 address (e.g., 172.30.100.104)</td> </tr> <tr> <td><code>--ip6</code></td> <td> </td> <td>IPv6 address (e.g., 2001:db8::33)</td> </tr> <tr> <td><code>--ipc</code></td> <td> </td> <td>IPC mode to use</td> </tr> <tr> <td><code>--isolation</code></td> <td> </td> <td>Container isolation technology</td> </tr> <tr> <td><code>--kernel-memory</code></td> <td> </td> <td>Kernel memory limit</td> </tr> <tr> <td><code>--label , -l</code></td> <td> </td> <td>Set meta data on a container</td> </tr> <tr> <td><code>--label-file</code></td> <td> </td> <td>Read in a line delimited file of labels</td> </tr> <tr> <td><code>--link</code></td> <td> </td> <td>Add link to another container</td> </tr> <tr> <td><code>--link-local-ip</code></td> <td> </td> <td>Container IPv4/IPv6 link-local addresses</td> </tr> <tr> <td><code>--log-driver</code></td> <td> </td> <td>Logging driver for the container</td> </tr> <tr> <td><code>--log-opt</code></td> <td> </td> <td>Log driver options</td> </tr> <tr> <td><code>--mac-address</code></td> <td> </td> <td>Container MAC address (e.g., 92:d0:c6:0a:29:33)</td> </tr> <tr> <td><code>--memory , -m</code></td> <td> </td> <td>Memory limit</td> </tr> <tr> <td><code>--memory-reservation</code></td> <td> </td> <td>Memory soft limit</td> </tr> <tr> <td><code>--memory-swap</code></td> <td> </td> <td>Swap limit equal to memory plus swap: ‘-1’ to enable unlimited swap</td> </tr> <tr> <td><code>--memory-swappiness</code></td> <td><code>-1</code></td> <td>Tune container memory swappiness (0 to 100)</td> </tr> <tr> <td><code>--mount</code></td> <td> </td> <td>Attach a filesystem mount to the container</td> </tr> <tr> <td><code>--name</code></td> <td> </td> <td>Assign a name to the container</td> </tr> <tr> <td><code>--net</code></td> <td> </td> <td>Connect a container to a network</td> </tr> <tr> <td><code>--net-alias</code></td> <td> </td> <td>Add network-scoped alias for the container</td> </tr> <tr> <td><code>--network</code></td> <td> </td> <td>Connect a container to a network</td> </tr> <tr> <td><code>--network-alias</code></td> <td> </td> <td>Add network-scoped alias for the container</td> </tr> <tr> <td><code>--no-healthcheck</code></td> <td> </td> <td>Disable any container-specified HEALTHCHECK</td> </tr> <tr> <td><code>--oom-kill-disable</code></td> <td> </td> <td>Disable OOM Killer</td> </tr> <tr> <td><code>--oom-score-adj</code></td> <td> </td> <td>Tune host’s OOM preferences (-1000 to 1000)</td> </tr> <tr> <td><code>--pid</code></td> <td> </td> <td>PID namespace to use</td> </tr> <tr> <td><code>--pids-limit</code></td> <td> </td> <td>Tune container pids limit (set -1 for unlimited)</td> </tr> <tr> <td><code>--platform</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file" rel="external nofollow" target="_blank">experimental (daemon)</a><a href="https://docs.docker.com/engine/api/v1.32/" rel="external nofollow" target="_blank">API 1.32+</a><br /> Set platform if server is multi-platform capable</td> </tr> <tr> <td><code>--privileged</code></td> <td> </td> <td>Give extended privileges to this container</td> </tr> <tr> <td><code>--publish , -p</code></td> <td> </td> <td>Publish a container’s port(s) to the host</td> </tr> <tr> <td><code>--publish-all , -P</code></td> <td> </td> <td>Publish all exposed ports to random ports</td> </tr> <tr> <td><code>--read-only</code></td> <td> </td> <td>Mount the container’s root filesystem as read only</td> </tr> <tr> <td><code>--restart</code></td> <td><code>no</code></td> <td>Restart policy to apply when a container exits</td> </tr> <tr> <td><code>--rm</code></td> <td> </td> <td>Automatically remove the container when it exits</td> </tr> <tr> <td><code>--runtime</code></td> <td> </td> <td>Runtime to use for this container</td> </tr> <tr> <td><code>--security-opt</code></td> <td> </td> <td>Security Options</td> </tr> <tr> <td><code>--shm-size</code></td> <td> </td> <td>Size of /dev/shm</td> </tr> <tr> <td><code>--sig-proxy</code></td> <td><code>true</code></td> <td>Proxy received signals to the process</td> </tr> <tr> <td><code>--stop-signal</code></td> <td><code>SIGTERM</code></td> <td>Signal to stop a container</td> </tr> <tr> <td><code>--stop-timeout</code></td> <td> </td> <td><a href="https://docs.docker.com/engine/api/v1.25/" rel="external nofollow" target="_blank">API 1.25+</a><br /> Timeout (in seconds) to stop a container</td> </tr> <tr> <td><code>--storage-opt</code></td> <td> </td> <td>Storage driver options for the container</td> </tr> <tr> <td><code>--sysctl</code></td> <td> </td> <td>Sysctl options</td> </tr> <tr> <td><code>--tmpfs</code></td> <td> </td> <td>Mount a tmpfs directory</td> </tr> <tr> <td><code>--tty , -t</code></td> <td> </td> <td>Allocate a pseudo-TTY</td> </tr> <tr> <td><code>--ulimit</code></td> <td> </td> <td>Ulimit options</td> </tr> <tr> <td><code>--user , -u</code></td> <td> </td> <td>Username or UID (format: <name|uid>[:<group|gid>])</td> </tr> <tr> <td><code>--userns</code></td> <td> </td> <td>User namespace to use</td> </tr> <tr> <td><code>--uts</code></td> <td> </td> <td>UTS namespace to use</td> </tr> <tr> <td><code>--volume , -v</code></td> <td> </td> <td>Bind mount a volume</td> </tr> <tr> <td><code>--volume-driver</code></td> <td> </td> <td>Optional volume driver for the container</td> </tr> <tr> <td><code>--volumes-from</code></td> <td> </td> <td>Mount volumes from the specified container(s)</td> </tr> <tr> <td><code>--workdir , -w</code></td> <td> </td> <td>Working directory inside the container</td> </tr> </tbody> </table>   <h2>⑩其他docker命令</h2> 1.查看正在运行的容器 <pre> <code>#docker ps</code></pre> <img alt="查看正在运行的容器" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/84400554-b91c-4d09-a533-5509b5eb2ab6.png" /><br /> #docker ps -a为查看所有的容器,包括已经停止的。<br /> 2.    容器的启动,停止,杀死<br /> 启动容器 <pre> <code># docker start <容器名orID></code></pre> 停止容器 <pre> <code># docker stop <容器名orID></code></pre> 杀死容器 <pre> <code> #docker kill <容器名orID></code></pre> 3.    删除容器<br /> 通过容器ID删除 <pre> <code>#docker rm –f <容器名orID></code></pre> 删除所有容器 <pre> <code> # docker rm -f $(docker ps -a -q)</code></pre> 4.查看镜像 <pre> <code># docker images</code></pre> <br /> <img alt="查看镜像" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/07c49eeb-50d2-4972-b565-53f32f0f62a5.png" /><br /> 删除所有镜像 <pre> <code> #docker rmi -f $(docker images -q)</code></pre> Docker Tomcat基础镜像制作<br /> 本案例采用centos6.8进行在线制作<br /> [centos/redhat系列工具为febootstrap]<br /> [debian/ubuntu系列工具debootstrap] <h2>Centos 6.8 tomcat运行环境docker镜像制作</h2> <h3>①资源准备</h3> 1.epel源安装包<br /> <img alt="epel源安装包" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/e76b59b0-faf1-4a06-bb15-40bc5f25e92d.png" /><br />  EPEL 是yum的一个软件源,里面包含了许多基本源里没有的软件。<br /> ​2.febootstrap安装包<br /> 一般使用yum命令在线安装 <h3>②安装相关工具</h3> 1.如果当前运行系统版本为centos6.X需要安装epel源 <strong><em> </em></strong> <pre> <code># yum install epel-release-6-8.noarch.rpm -y</code></pre> <img alt="安装相关工具" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/10bf5746-f91f-459e-9856-2f98da46101d.png" /><br /> 2.安装febootstrap <pre> <code># yum install febootstrap –y</code></pre> <img alt="安装febootstrap" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/1104e8ce-b73c-4235-a660-0de4be51b363.png" /> <h3>③使用febootstrap创建一个类似虚拟机的系统</h3> 创建空白环境命令 <pre> <code>#febootstrap -i bash  -i yum -i iputils -i iproute -i man -i vi -i openssh-server -i openssh-clients -i tar -i gzip -i unzip -i passwd  centos6.8 centos6.8-image http://mirrors.aliyun.com/centos/6.8/os/x86_64/</code></pre> 创建httpd+php环境 <pre> <code> febootstrap -i bash -i yum -i iputils -i iproute -i man -i vi -i openssh-server -i openssh-clients -i tar -i gzip -i unzip -i passwd -i httpd -i httpd-devel -i php -i php-devel -i php-mysql -i php-gd -i php-imap -i php-ldap -i php-odbc -i php-pear -i php-xml -i php-xmlrpc CentOS7.3 centos7.3-image http://mirrors.aliyun.com/centos/6.9/os/x86_64/</code></pre> <br /> 创建Java8环境 <pre> <code> febootstrap -i bash -i yum -i iputils -i iproute -i man -i vi -i openssh-server -i openssh-clients -i tar -i gzip -i unzip -i passwd -i java-1.8.0-openjdk.x86_64 CentOS7.3 centos7.3-image http://mirrors.aliyun.com/centos/6.9/os/x86_64/</code></pre> <br /> <br /> 其中 <br /> –i表示要安装的工具包<br /> centos6.8 系统版本<br /> centos6.8-image 等会执行完成后将在当前目录生成一个名字为centos6.8-image的文件夹<br /> http://mirrors.aliyun.com/centos/6.8/os/x86_64/ 镜像来源参照,这里使用的阿里的镜像库<br /> 命令执行完成将生成一个centos6.8-image文件夹,其内部结构似一个系统的结构<br /> <br /> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/075165f8-fd11-4200-a2d6-e4924b64c11f.png" /><br /> 将当前系统的root用户目录下的.bash开头的文件复制到/root目录<br /> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/4428ae07-db97-4a04-b69b-2fc13afc1ef5.png" /><br /> 命令 <pre> <code>#cp /root/.bash*  存放路径/centos6.8-image/root</code></pre> 打包镜像目录<br /> 首先进入镜像目录 <pre> <code>#cd cd centos6.8-image/</code></pre> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/38c0854b-2d44-403e-9a00-c96a27262087.png" /><br /> 使用tar打包,注意不能使用z参数启用gzip <pre> <code>#tar -cvf centos6.8.tar ./</code></pre> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/8bca9b1f-7570-42a2-8180-f1862ce41b38.png" /><br /> 查看当前tar包大小<br /> 命令: <pre> <code>#du -h centos6.8.tar</code></pre> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/31fae0cf-8e8a-47a8-98bc-4af79a038825.png" /><br /> 执行xz命令进行再次高效率压缩,执行xz命令需要一段时间 <pre> <code>#xz centos6.8.tar</code></pre> <img alt="使用febootstrap创建一个类似虚拟机的系统" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/1ff8e4f9-fcc8-408b-bf2a-697d8e7a6803.png" /><br /> 使用xz命令效果还是明显的,396MB压缩到83MB <h3>④创建docker镜像</h3> 首先创建一个docker的配置文件名字必须为Dockerfile<br /> 将上面生成的centos6.8文件复制到同一个目录,将jdk以及tomcat也复制到同一个目录<br /> <img alt="创建docker镜像" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2017-01/fb5732e8-3bd1-4c85-9775-695c4d6129c6.png" /><br /> Jdk为linux免安装版本打包成zip,Tomcat由linux版本的tar包解压打包成的zip包<br /> 接下来就是Dockerfile的配置 <pre> <code># # 安装: docker build -t tomcat ./ # 运行: docker run -d -p 8822:22 -p 8888:8080 tomcat # 挂载: docker run -d -p 8822:22 -p 8888:8080 -v /mnt/data/vr:/opt/tomcat/webapps/ROOT -h java-test --name java-dev tomcat #其他参数: #-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; #-d: 后台运行容器,并返回容器ID; #-i: 以交互模式运行容器,通常与 -t 同时使用; #-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; #--name="nginx-lb": 为容器指定一个名称; #--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; #--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; #-h "mars": 指定容器的hostname; #-e username="ritchie": 设置环境变量; #--env-file=[]: 从指定文件读入环境变量; #--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行; #-m :设置容器使用内存最大值; #--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; #--link=[]: 添加链接到另一个容器; #--expose=[]: 开放一个端口或一组端口; #安装本地Centos FROM scratch MAINTAINER The CentOS Project <1441023520@qq.com> #添加基础镜像到根目录 ADD centos6.8.tar.xz / LABEL Vendor="CentOS" LABEL License=GPLv2 CMD ["/bin/bash"] #安装需要安装的额外软件 #安装openssh和unzip工具 #RUN yum install unzip -y #RUN yum install openssh-server -y #生成ssh的登陆证书 RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' RUN ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N '' #修改ssh-server的配置 RUN sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config RUN sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config #修改当前系统的ROOT密码 RUN echo "root:root" > /tmp/tmp.pass RUN chpasswd < /tmp/tmp.pass #外部工具相关 ADD tomcat.zip /tmp/tomcat.zip ADD jdk.zip /tmp/jdk.zip #解压相关项目 RUN unzip /tmp/tomcat.zip -d /opt RUN unzip /tmp/jdk.zip -d /opt #设置环境变量 RUN echo "" >> /etc/profile RUN echo "JAVA_HOME=/opt/jdk" >> /etc/profile RUN echo "PATH=/opt/jdk/bin:$PATH" >> /etc/profile RUN echo "CLASSPATH=.:/opt/jdk/lib/dt.jar:/opt/jdk/lib/tools.jar" >> /etc/profile RUN echo "export JAVA_HOME" >> /etc/profile RUN echo "export PATH" >> /etc/profile RUN echo "export CLASSPATH" >> /etc/profile #设置系统时区 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV JAVA_HOME /opt/jdk ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/jdk/bin:/opt/tomcat/bin #设置语言,解决乱码 RUN echo "export LC_ALL=zh_CN.UTF-8" >> /etc/profile #设置读写权限 RUN chmod -R 755 /opt #设置进入启动项 ENTRYPOINT /opt/tomcat/bin/startup.sh & /usr/sbin/sshd -D </code></pre> <br /> 注意:最后的启动项一定要配置sshd的。否则docker容器将无法使用SSH工具连入<br /> 以上便是一个运行Tomcat的环境的基础镜像制作方法. <h2>Alpine linux tomcat环境docker镜像</h2> ①Dockerfile: <pre> <code>FROM alpine:3.4 MAINTAINER cSphere <docker@csphere.cn> #安装 bash curl ca-certificates工具 RUN apk add --no-cache --update-cache bash RUN apk add --no-cache --update-cache curl ca-certificates   #证书 RUN curl -Lo  /etc/apk/keys/sgerrand.rsa.pub https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub #下载glibc相关包 RUN curl -Lo /etc/apk/keys/sgerrand.rsa.pub https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.23-r3/sgerrand.rsa.pub RUN curl -Lo glibc-2.23-r3.apk  https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.23-r3/glibc-2.23-r3.apk RUN curl -Lo glibc-bin-2.23-r3.apk  https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.23-r3/glibc-bin-2.23-r3.apk RUN curl -Lo glibc-i18n-2.23-r3.apk  https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.23-r3/glibc-i18n-2.23-r3.apk #安装glibc RUN apk add  glibc-2.23-r3.apk glibc-bin-2.23-r3.apk glibc-i18n-2.23-r3.apk   #安装SSH RUN apk update RUN apk --no-cache add openssh   #生成ssh的登陆证书 RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' RUN ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key  -N '' RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''   #修改当前系统的ROOT密码 RUN echo "root:root" > /tmp/tmp.pass RUN chpasswd < /tmp/tmp.pass   CMD ["/bin/bash"]   #Java环境 ADD tomcat.zip /opt/tomcat.zip ADD jdk.zip /opt/jdk.zip #解压 RUN unzip  /opt/tomcat.zip -d /opt RUN unzip  /opt/jdk.zip -d /opt #设置环境变量 RUN echo "" >> /etc/profile RUN echo "JAVA_HOME=/opt/jdk" >> /etc/profile RUN echo "PATH=/opt/jdk/bin:$PATH" >> /etc/profile RUN echo "CLASSPATH=.:/opt/jdk/lib/dt.jar:/opt/jdk/lib/tools.jar" >> /etc/profile RUN echo "export JAVA_HOME" >> /etc/profile RUN echo "export PATH" >> /etc/profile RUN echo "export CLASSPATH" >> /etc/profile   #设置时区 ADD Chongqing /etc/localtime     #设置进入启动项 ENTRYPOINT  /usr/sbin/sshd -D</code></pre>  
  • Docker-Compose 简介及安装和常用命令

    一. Docker-Compose 简介1. Docker-Compose 简介Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Docker-Compose将所管理的容器分为三层,分别一. Docker-Compose 简介1. Docker-Compose 简介Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。 Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。Docker-Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。 Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。2. Docker-Compose安装sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose检查安装结果$ docker-compose --version docker-compose version 1.27.4, build 1110ad01二. Docker-Compose常用命令1. Docker-Compose 命令格式docker-compose [-f <arg>] [options][command][args]常用命令选项如下:-f -file FILE 可指定Compose 模版文件,默认为 docker-compose.yml-p -project-name NAME指定项目名称,默认将使用所在目录名称为项目名-v --version 打印版本并退出-verbose 输出调试信息-x-network-driver 使用 Docker 的可插拔网络后端特性(需要 Docker 1.9+版本,可操作性有待商榷)-x-network-deover DRIVER指定网络后端的驱动,默认为 bridge(需要 Docker 1.9+版本)2. Docker-Compose 拉取服务镜像docker-compose pull [options] [SERVICE...]命令选项如下:–ignore-pull-failures,忽略拉取镜像过程中的错误 –parallel,多个镜像同时拉取 –quiet,拉取镜像过程中不打印进度信息拉取服务依赖的镜像docker-compose pull3. Docker-Compose 构建服务docker-compose build [options] [--build-arg key=val...] [SERVICE...]命令选项包括: –compress 通过gzip压缩构建上下环境 –force-rm 删除构建过程中的临时容器 –no-cache 构建镜像过程中不使用缓存 –pull 始终尝试通过拉取操作来获取更新版本的镜像 -m, –memory MEM为构建的容器设置内存大小 –build-arg key=val为服务设置build-time变量 服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务4. Docker-Compose 启动容器docker-compose start [SERVICE...]启动已经存在的服务容器docker-compose start5. Docker-compose 构建并启动容器docker-compose up [option][--scale SERVICE=NUM...][SERVICE...]常用命令选项如下:-d 在后台运行服务器-t -timeout TIMEOUT 停止容器是的超时(默认为 10 秒)-f -file FILE 可指定Compose 模版文件,默认为 docker-compose.yml-build 在启动容器前自动构建服务镜像-no-build 不自动构建缺失的镜像常用命令实例启动所有服务docker-compose up在后台启动所有服务docker-compose up -d重新构建镜像docker-compose up -d --build-f 使用指定的 Compose 模版文件启动服务,默认为 docker-compose.yml 文件docker-compose -f docker-compose.yml up6. Docker-Compose 查看容器docker-compose ps [options][SERVICE...]查看项目中运行中的容器docker-compose ps查看当前项目中的所有容器docker-compose ps -a7. Docker-Compose 停止容器docker-compose stop [options] [SERVICE...]命令选项如下:-t —timeout TIMEOUT停止容器时候的超时(默认为 10 秒)停止正在运行的容器docker-compose stop可使用以下命令再次启动docker-compose start通过发送 SIGKILL 信号强制停止服务容器docker-compsoe kill [options] [SERVICE]命令选项如下:-s 指定发送的信号8. Docker-Compose 移除容器docker-compose rm [options] [SERVICE...]命令选项如下:–f, –force,强制直接删除,包括非停止状态的容器 -v 删除容器所挂载的数据卷先停止容器docker-compose stop删除所有停止状态下的容器docker-compose rm9. Docker-Compose 停用移除所有容器以及网络相关docker-compose down [options]命令选项如下:-rmi type,删除镜像、类型必须是:all,删除 compose 文件中定义的所有镜像local, 删除镜像名为空的镜像-v -volumes 删除已经在 compose 文件中定义的和匿名的附在容器上的数据卷-remove-orphans 删除服务中没有在 compose 中定义的容器10. Docker-Compose 查看输出日志docker-compose logs [options][SERVICE...]默认情况下,docker-compsoe 将对不同的服务输出使用不同的颜色用以区分,但是可以通过-no-color 关闭颜色查看服务容器的输出docker-compose logs11. Docker-Compose 重启服务docker-compose restart [options] [SERVICE...]命令选项如下:-t –timeout TIMEOUT 指定重启前停止容器的超时(默认为10秒)重启项目服务docker-compose restart12. Docker-Compose 暂停、恢复容器暂停容器docker-compose pause [SERVICE...]恢复处于暂停状态的容器docker-compsoe unpause [SERVICE...]13. Docker-Compose 执行命令docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]在指定容器执行 ping 命令docker-compose run Ubuntu ping www.baidu.com14. Docker-Compose 指定运行容器数量设置指定服务运行的容器个数docker-compose scale web=3 db=215. Docker-Compose 推送镜像docker-compsoe push [options][SERVICE...]命令选项如下:–ignore-push-failures 忽略推送镜像过程中的错误三.Docker-Compose配置文件docker-compose.yml案例一:tomcat镜像docker-compose.yaml:version: "3.8" ​ networks: vRouter: # 定义网络名:因使用已经存在的网络,所以名称与已经存在的bridge网络名称相同   external: true #使用外部(已存在)的网络 ​ services: app-xs-1:   image: tomcat:8  #镜像名称和版本   container_name: app-xs-01 # 等同于 --name app-xs   hostname: app-xs-01 #等同于 --hostname app-xs   ports:     - "8001:8080" #等同于 -p 8001:8080 ​   networks:     vRouter: #等同于 --network vRouter (注意这里的vRouter必须在顶层networks定义)       aliases:         - app-xs-01.server #等同于 --network-alias app-xs-01.server ​   volumes:     - "/data/upload:/data/xs_uploadFile"     - "/data/app/ROOT:/opt/tomcat/webapps/ROOT" # -v /data/app/ROOT:/opt/tomcat/webapps/ROOT ​   deploy:     resources:       limits:         memory: 1568M # -m 1568M 内存限制 ​案例二:MySQLdocker-compose.yaml:version: "3.8" ​ networks: mysql-net:  # 定义网络名:##因使用已经存在的网络,所以名称与已经存在的bridge网络名称相同 ​ ​ services: mysql5732:   image: harbor.ifok.net:10202/ifok/mysql:5.7.32-Shanghai   container_name: mysql5732 # 等同于 --name mysql5732   hostname: mysql5732 #等同于 --hostname mysql5732   ports:     - "13306:3306"  #等同于 -p 13306:3306 ​   networks:     mysql-net:  #等同于 --network vRouter (注意这里的vRouter必须在顶层networks定义)       aliases:         - mysql5732.server #等同于 --network-alias mysql5732.server   command: [        '--character-set-server=utf8mb4',      '--collation-server=utf8mb4_unicode_ci'    ]   environment:     - MYSQL_ROOT_PASSWORD=root   volumes:     - "/data/mysql5732/data:/var/lib/mysql"       - "/data/mysql5732/conf.d:/etc/mysql/conf.d"    #   - "./init/:/docker-entrypoint-initdb.d/" #挂载初始化的脚本目录 ​ ​   deploy:     resources:       limits:         memory: 2048M ​ ​案例三 : 其他version: "3.8" ​ #定义网络相关 networks:  #网络名称(可以定义多个网络) vRouter:    #外部网络:(false : 加入已存在网络, 可以先通过命令 docker network create vRouter 创建网络,执行docker-compose down 时候不会删除该网络)   external: true router:    #外部网络:(true : 创建网络,通过 docker network ls 查看创建的一般为“名称_default”,例如下面的“router_app”,    #注意该网络会在docker-compose down命令执行时候删除)   external: false    #配置了name则,网络名为 router_app (默认name为default)   name: app   driver: bridge   ipam:     driver: default     config:        # 注意子网ip不能与已存在的冲突       - subnet: 172.1.0.1/24 ​ #定义服务 services: mysql57:    #镜像选择,私服则直接写全路径,如:harbor.ifok.net:10202/ifok/mysql:5.7.32-Shanghai   image: mysql:5.7.32    #容器名称,与docker run --name mysql57相似   container_name: mysql57    #重启机制   restart: always    #文件挂载 与 docker run -v /data/mysql57/data:/var/lib/mysql 功能相同   volumes:     - "/data/mysql57/data:/var/lib/mysql"     - "/data/mysql57/conf.d:/etc/mysql/conf.d"    #网络(可以加入多个网络也可以只加入一个网络)   networks:      #外部网络,如果不配置则自动获取ip等网络信息     vRouter:       aliases:          #等同于 --network-alias mysql5732.server         - mysql5732.server      #内部网络     router:        #分配网络地址给MySQL服务注意同一个网络中不要冲突       ipv4_address: 172.1.0.2 ​   deploy:     resources:       limits:          # -m 1568M 内存限制         memory: 1568M    #容器健康检查   healthcheck:      #grep -v grep 是不显示grep查询这个进程      #test: ["CMD-SHELL", "ps -ef|grep mysqld|grep -v grep && exit 0|| exit 1"]      #下面是访问某个url,HTTP状态码(500、404、403 错误代码)会失败(200成功); exit 0 (健康)失败exit 1 (不健康)     test: ["CMD-SHELL", "curl -f http://localhost:8080 && exit 0 || exit 1"]      #间隔时间     interval: 30s      #超时时间     timeout: 10s      #重试次数     retries: 3      #初始化时间(启动时间)     start_period: 10s ​ ​ ​ ​ ​ ​案例四:bingpuversion: "3.8" ​ networks: bingpu-net: ​ services: mysql5732:   image: harbor.ifok.net:10202/ifok/mysql:5.7.32-Shanghai   container_name: mysql5732 # 等同于 --name mysql5732   hostname: mysql5732    #重启策略   restart: always #   ports: #     - "3306:3306" #等同于 -p 13306:3306 ​   networks:     bingpu-net:       aliases:         - mysql5732.server #等同于 --network-alias mysql5732.server   volumes:     - "/data/bingpu/mysql5732/data:/var/lib/mysql"     - "/data/bingpu/mysql5732/conf.d:/etc/mysql/conf.d" ​   environment:     - MYSQL_ROOT_PASSWORD=root ​   command: [      '--character-set-server=utf8mb4',      '--collation-server=utf8mb4_unicode_ci'    ] ​   deploy:     resources:       limits:         memory: 1024M ​ bingpu-web:   image: bingpu:1.0   build:     context: ./     dockerfile: Dockerfile   container_name: bingpu-web   hostname: bingpu-web   restart: always    #依赖的服务,配置好后会决定services的服务启动顺序   depends_on:     - mysql5732   ports:     - "8080:8080"   networks:     bingpu-net:       aliases:         - bingpu-web.server   volumes:     - "/data/bingpu/logs:/var/bingpu/logs"     - "/data/bingpu/file:/var/bingpu/file"   deploy:     resources:       limits:         memory: 512M案例五 webdavversion: "3.8"   networks: vRouter:  # 定义网络名:##因使用已经存在的网络,所以名称与已经存在的bridge网络名称相同   external: true ​ services: webdav:   image: harbor.ifok.net:10202/ifok/webdav:bytemark-2.4   container_name: webdav-2.4 # 等同于 --name webdav-2.4   hostname: webdav-2.4 #等同于 --webdav-2.4   restart: always #重启机制   ports:     - "7000:80"   networks:     vRouter:  #等同于 --network vRouter (注意这里的vRouter必须在顶层networks定义)       aliases:         - webdav.server #等同于 --network-alias webdav.server   volumes:     - "./data:/var/lib/dav"     - "../leftso/data/resources/assist:/var/lib/dav/data/leftso/assist"     - "../mysql/backup:/var/lib/dav/data/mysql/backup"   environment:     - AUTH_TYPE=Digest     - USERNAME=root     - PASSWORD=root   deploy:     resources:       limits:         memory: 150M
  • unknown flag: --iidfile docker-compose报错

    docker-compose 报错:[root@VM_0_17_centos gateway]# docker-compose up Building gatewayServer unknown flag: --iidfile See 'ddocker-compose 报错:[root@VM_0_17_centos gateway]# docker-compose up Building gatewayServer unknown flag: --iidfile See 'docker build --help'. ERROR: Service 'gatewayServer' failed to build : Build failed 解决办法:降低docker-compse版本当前版本为:[root@VM_0_17_centos gateway]# docker-compose -v docker-compose version 1.29.2, build 5becea4c降低至1.26.2即可[root@VM_0_17_centos gateway]# docker-compose -v docker-compose version 1.26.2, build eefe0d31docker-compose 下载快速网盘下载: (访问密码:9987)docker-compose-Linux-x86_64-1.26.2
  • Ubuntu 在线安装 Docker

    安装篇国外:curl -fsSL https://get.docker.com | bash国内:curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun卸载旧版本安装篇国外:curl -fsSL https://get.docker.com | bash国内:curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun卸载旧版本$ sudo apt-get remove docker docker-engine docker.io containerd runc
  • docker 删除过期镜像<none>

    在执行多次docker-compose build 之后,我们通过命令`docker images`可以看到很多的REPOSITORY 为<none>l; 且tag 也是<none>l;的过期镜像docker 官方文档中被称作dangling im在执行多次docker-compose build 之后,我们通过命令`docker images`可以看到很多的REPOSITORY 为<none> 且tag 也是<none>的过期镜像docker 官方文档中被称作dangling images清理命令:docker image prunedocker image prune [OPTIONS]<选项>--all , -a Remove all unused images, not just dangling ones -----删除所有未使用的映像,而不仅仅是悬空映像--filter Provide filter values (e.g. ‘until=') -----提供过滤值(例如'until =“)--force , -f Do not prompt for confirmation -----不要提示确认