# SimpleDocker **Repository Path**: hushfe/SimpleDocker ## Basic Information - **Project Name**: SimpleDocker - **Description**: SimpleDocker 是一个简单的Docker控制面板,致力于可以让开发者更方便,更无障碍的使用Docker, 其界面简洁,操作便捷,更多功能欢迎探索 ! - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: refact - **Homepage**: https://www.zhoutao123.com/blog/7 - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 399 - **Created**: 2023-08-02 - **Last Updated**: 2023-08-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) [![star](https://gitee.com/taoes_admin/SimpleDocker/badge/star.svg?theme=gvp)](https://gitee.com/taoes_admin/SimpleDocker/stargazers) [![fork](https://gitee.com/taoes_admin/SimpleDocker/badge/fork.svg?theme=gvp)](https://gitee.com/taoes_admin/SimpleDocker/members) 由于原架构对新特性的开发支持并不是特别好,原代码结构混乱,打包方式不易,对读者部署阅读均不合适,因此计划重构。 + 计划使用Java重写原Go服务,使用SpringBoot框架代替Beego框架。作为一个Java开发者来说,使用Java语言开发更方便,对ISSUE也能更快的响应,虽然Go部署方便,但是一些同学本地开发很不方便 + 使用 React + TypeScript 重写GUI界面。 + 原存储服务使用 MySQL 代替 Redis,Redis 还是作为缓存较好,作为存储服务还是有点弱。由于新版本将支持大量配置以及监控,日志等,因此使用MySQL这种结构数据库还是比较稳定的。 + 重构方便偏向于安全、多Docker客户端、监控、提升稳定性 Tip: 您可以在Issues中提出需求![需求 & BUG 管理](https://github.com/taoes/SimpleDocker/issues) 如过您计划贡献代码,可以查看[加入我们](./join.md) 查看如何贡献代码,我们鼓励并感谢您为开源做出的贡献 🌹 ## 贡献者名单 + [Taoes](https://toscode.gitee.com/taoes_admin) + [K8Scat](https://toscode.gitee.com/k8scat) + [Aweew](https://toscode.gitee.com/aweew) + [kevin_yin](https://toscode.gitee.com/kevin_yin) --- ![xxx](doc/resource/img/icon.png) ---- SimpleDocker 是一个简单的Docker控制面板,致力于可以让用户更方便、更无障碍、更舒适的使用Docker,其界面简洁、操作便捷,功能强大,可以带来更好地运维体验。 **开发维护不易,求给个 Star ✨ 鼓励一下作者,您的鼓励是我最大的动力 💪🏻 !!!** ## 背景 + Docker是目前一种非常主流的容器化方案,支持非常多的特性,给开发者带来便利,但是 Docker 镜像以及容器管理复杂的参数让新手望而却步,基于此开发 SimpleDocker 控制面板,方便新手和相关的运维同学使用!!! + 本项目是基于学习的目的的,致力于提供一个 界面清晰、免费的、简单的、专注于 Docker 服务管理的控制面板(当然也会持续开发下去~),目的只想做一个适合自己的管理软件!!! ### 🎉 目前支持特性 | 特性 | 支持功能 | | ---- | ------------------------------------------------------ | | 镜像 | 详情、拉取、运行、导出、导入、删除、备份到本地 | | 容器 | 详情、启动、停止、运行、暂停、删除、精简、导出、重命名、备份到本地 | | 高级 | 终端、日志、文件管理、网络配置、异常通知 | | 存储 | 管理、创建、删除、精简 | | 网络 | 管理、创建、连接、精简 | | 安全 | 登录、密码重置 | | 设置 | 容器创建模式,容器异常通知配置 | | 监控 | 容器异常通知、容器性能监控 | ### 🛠 计划支持特性 1. Docker 容器模板功能 2. Docker 服务发布到 Docker Hub 3. 移除 Redis 依赖 0. 移除Redis依赖,使用文件管理配置 ✅ 1. Docker容器模板功能 ✅ 2. 多Docker管理 ✅ 3. DockerCompose 镜像编排管理(计划中) 4. DockerSwarm 集群管理(计划中) ### 📔 更新记录 [SimpleDocker 更新记录](doc/update.md) ## 应用安装 #### DockerCompose 安装 1. 确保Docker & DockerCompose 已经部署并且启动成功,如果docker-compose 没有安装请参考官网 [https://docs.docker.com/compose/install/](https://docs.docker.com/compose/install/) 安装 2. 通过命令 `docker-compose version` 验证安装成功 3. 在某个目录下创建文件 `docker-compose.yml` 其内容如下: ```yaml # yaml 配置实例 version: '3' services: redis: image: redis:latest web: image: registry.cn-hangzhou.aliyuncs.com/seven-tao/simple-docker:0.0.7.1 ports: - "9091:4050" volumes: - /tmp/simple-docker/back:/tmp/back - /var/run/docker.sock:/var/run/docker.sock depends_on: - redis ``` 3. 执行下面的脚本,会自动拉取镜像并启动在 9091 端口 ```sh docker-compose up # 前台运行 docker-compose up -d # 后台运行 ``` 3. 浏览器访问 http://localhost:9091 4. 默认账号: admin 默认密码: 123456 如果使用了域名并且通过服务器进行反向代理,请配置反向代理服务器支持 WebSocket,否则终端功能可能无法使用 [1. Nginx 配置支持WebSocket](https://www.xncoding.com/2018/03/12/fullstack/nginx-websocket.html) #### Dockerfile + DockerCompose ```bash git clone https://gitee.com/taoes_admin/SimpleDocker cd SimpleDocker docker-compose up -d --build # Build images before starting containers ``` #### 手动编译 0. 准备Redis环境 1. 克隆代码到本地,并启动 beego项目 ```shell git clone https://gitee.com/taoes_admin/SimpleDocker cd ./SimpleDocker bee run ``` 2. 修改 db.go 文件中Redis的配置 3. 新建终端窗口,切换到 `ui` 目录下打开前端项目 4. 修改 `ui/src/api/Config.js` 文件内容,确保请求前缀和 beego 启动端口一致 ```shell cd ui yarn install && yarn server ``` 4. 打开相应的前端端口,即可访问,调试 ## 界面预览 您可以访问[界面预览](./preview.md) 查看项目的界面以及功能 ## Q & A 1. 忘记密码 > 忘记密码时候,你可以通过访问Redis服务的1号数据库,移除 `KEY=SIMPLE:DOCKER:AUTH:*`的所有KEY即可恢复默认密码 ## 讨论 本项目完全开源,如有任何需求或者BUG反馈,欢迎提交Issue[Open an issue](https://github.com/taoes/SimpleDocker/issues/new) 或者提交PR! 欢迎添加微信 `zhoutao825638` 或者邮件联系我 `zhoutao825638@vip.qq.com` ## 开源方案 [GPL](./LICENSE) * 一些概念 * 通俗解释Docker是什么? * docker就是集装箱原理。Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。 * 1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。 * 2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。 * 3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。 * Docker就是一个应用的容器 * Docker是容器,放应用。应用是啥?一个网站、一个程序、一个系统等都是应用。从此不用配置环境,也不用装环境,更不用统一环境了。因为docker都打包好了,开一个容器不到一秒,环境什么的别人都配好了,我就老老实实写代码就可以。奔溃了重启(重启才3秒而已)。所以,docker就是用来存放和运行应用的一个容器,更轻量、更简单、更快速、更好玩。 * 箱子神奇之处:标准 * 如何通俗解释Docker是什么?有个著名的隐喻:集装箱。但是它却起了个“码头工人”(docker 的英文翻译)的名字。这无疑给使用者很多暗示:“快来用吧!用了Docker,就像世界出现了集装箱,这样你的业务就可以随意的、无拘无束的运行在任何地方(Docker 公司的口号:Build,Ship,and Run Any App,Anywhere),于是码头工人就基本都可以下岗了。” * 在集装箱之前,货物运输没有统一的标准方式进行搬运,于是铁路、公路、海洋等各种运输之间,需要大量的人力作为货物中转,效率极低,而且成本很高。集装箱出现之后,世界上绝大多数的货物运输都可以放到这个神奇的箱子里,然后在公路、铁路、海洋等所有运输场景下,这个箱子都可以不用变化形态直接可以承运,而且中间的中转工作,都可以通过大型机械搞定,效率大大提升。牛逼之处我就不多说了,可是这个箱子为什么这么神奇呢?答案其实也就在上面的描述中,无非就是两个字:标准。 * Logo说明 * 那个大鲸鱼(或者是货轮)就是操作系统。把要交付的应用程序看成是各种货物,原本要将各种各样形状、尺寸不同的货物放到大鲸鱼上,你得为每件货物考虑怎么安放(就是应用程序配套的环境),还得考虑货物和货物是否能叠起来(应用程序依赖的环境是否会冲突)。现在使用了集装箱(容器)把每件货物都放到集装箱里,这样大鲸鱼可以用同样地方式安放、堆叠集装了,省事省力。Docker就是这整套机制啦 * Docker举例:租房子 * 租过房子没?单个服务直接部署在物理机上不做虚拟化,就好比你一家人整个大房子住,好不好?当然好,但是贵啊,有钱就这么玩,省心,比如——银行。那我钱没那么多怎么办,混部呗,就好比你和你舅两家合住一个大房子,也能住的挺舒服,不过所有的资源就不像你单独住的时候那么随心所欲,你俩得商量着来,比如:你外甥非要占用向阳的书房(端口/目录占用),你可能也只能让出来。啊~,这样两家人住一起好不舒服,怎办?有钱买房,没钱就隔断呗!隔断这招就是虚拟机(VM)的思路了,虚拟机的这种隔断你可以理解成比较决绝的隔断,墙上自己掏洞开个门开个窗,厨房卫生间我在自己的这个隔断里都单独来一套,基本就是一个完整的家装工程了,你进这个隔断感觉——喔,这就是个完整的房子嘛。 所以虚拟机的好处坏处也你也就明白了:隔离效果好,但是损耗大。那有没有更节约的做法呢,有啊,当过北漂上漂肯定租过单间,做的好一点是中介,比如青年公寓,就是docker,不仅能做资源隔离,人家还规范化系统化了(repo/image),所有房间(container)统一装修和家具,你交钱签约就能享受一个相对独立的生活环境(environment)了,你自己的东西在你屋子里随便摆,都可以的;对中介来说,你当下不过就是个正在running的instance,的当你gameover了以后,这个房间他还可以以很小的代价租给别人run,是不是效率好高了? * 反方向 * 人们开发了操作系统的进程,后来觉得进程太浪费,又搞了线程,后来又觉得线程还是浪费,就搞了纤程。而容器则是自动化部署的反方向,发布单独程序文件不解气,打包发布,打包发布还不解气,web服务器组件发布,web服务器组件发布还不解气,然后操作系统配置一起发布。 * 兼容性 * Java号称“一次编译,到处运行”,因为java虚拟机解决平台的兼容性问题,所以有java虚拟机的地方就能跑java代码; * Docker是:“一次封装,到处运行”,因为docker决绝了应用环境的问题,安装了docker的平台就能跑“docker包”,这样就决绝了“开发环境能跑,一上线就崩”的尴尬。 * Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上。 * docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付 * Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。 * Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 * Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。 * 一个完整的Docker有以下几个部分组成: * dockerClient客户端 * Docker Daemon守护进程 * Docker Image镜像 * DockerContainer容器 * 局限 (Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品 ) * Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用 * LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的 * 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库 * 网络管理相对简单,主要是基于namespace隔离 * cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费) * Docker对disk的管理比较有限 * container随着用户进程的停止而销毁,container中的log等用户数据不便收集 * Docker解决的问题 * 云计算、大数据,移动技术的快速发展,加之企业业务需求的不断变化,导致企业架构要随时更改以适合业务需求,跟上技术更新的步伐。毫无疑问,这些重担都将压在企业开发人员身上;团队之间如何高效协调,快速交付产品,快速部署应用,以及满足企业业务需求,是开发人员亟需解决的问题。Docker技术恰好可以帮助开发人员解决这些问题。 * 为了解决开发人员和运维人员之间的协作关系,加快应用交付速度,越来越多的企业引入了DevOps这一概念。但是,传统的开发过程中,开发、测试、运维是三个独立运作的团队,团队之间沟通不畅,开发运维之间冲突时有发生,导致协作效率低下,产品交付延迟, 影响了企业的业务运行。Docker技术将应用以集装箱的方式打包交付,使应用在不同的团队中共享,通过镜像的方式应用可以部署于任何环境中。这样避免了各团队之间的协作问题的出现,成为企业实现DevOps目标的重要工具。以容器方式交付的Docker技术支持不断地开发迭代,大大提升了产品开发和交付速度。 * 此外,与通过Hypervisor把底层设备虚拟化的虚拟机不同,Docker直接移植于Linux内核之上,通过运行Linux进程将底层设备虚拟隔离,这样系统性能的损耗也要比虚拟机低的多,几乎可以忽略。同时,Docker应用容器的启停非常高效,可以支持大规模的分布系统的水平扩展,真正给企业开发带来福音。 * Docker问题 * 虽然Docker技术发展很快,但技术还不够成熟,对存储的灵活的支持、网络的开销和兼容性方面还存在限制,这是Docker没有被企业大范围使用的一个主要原因。另外一个原因是企业文化是否与DevOps运动一致,只有企业支持DevOps,才能更大地发挥Docker的价值。最后一个原因就是安全性问题,Docker对于Linux这一层的安全的隔离还有待改进,才能进一步得到企业的认可。 * docker运用场景: * web应用的自动化打包和发布; * 自动化测试和持续集成、发布; * 在服务型环境中部署和调整数据库或其他的后台应用; * 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。 * 可以看出来docker其实就是使得部署,发布变得更加快捷,更加自动化,且适应云平台环境.再看定义: * Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、 * OpenStack 集群和其他的基础应用平台。 * 其实docker就是一个包含运行环境的应用,由于自身带有所有需要的运行环境促成了他的可移植性和快速部署. * docker应用环境的集成是通过一层一层的镜像叠加实现的,这种方式可以使得底层镜像多次复用,结构清晰 * Docker 的优点 * 1、简化程序:Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。 * 2、避免选择恐惧症:如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。 * 3、节省开支:一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。 * 实战 * 安装Docker * Docker都需要64位环境。 [图片上传失败...(image-da9c10-1543981712200)] * CentOS内核一般都很低,而Docker是要求高版本内核,所以,CentOS不合适运行Docker,建议使用Ubuntu安装运行Docker(因为Ubuntu内核更新很频繁) * 曾经试过使用Centos6.9 (Final) 安装Docker,碰到了一堆坑 * WARN[0000] You are running linux kernel version 2.6.32-696.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0. [图片上传失败...(image-d0ab5e-1543981712190)] * 升级Docker * [root@localhost etc]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://d88cf08e.m.daocloud.io * please upgrade your docker to v1.9 or later * 果断把CentOS 换成 Ubuntu * c // 查看系统内核 * lsb_release -a // 查看系统版本 * 安装ubuntu ( Desktop & Server 版本) * 下载网址:[http://cn.ubuntu.com/download/](http://cn.ubuntu.com/download/)# Ubuntu 下载 * VM虚拟机启动报错: 无法连接虚拟设备sata0:0,因为主机上没有相应设备 * setting设置,选择iso文件,网络:桥接 ,然后重启虚拟机 * VM安装ubuntu时,由于分辨率问题 ,导致显示不全,无法移动窗口选择,安装不下去 * 解决:alt + 鼠标左键 ,可以移动窗口 * 安装过程中,提示想要安装的软件(如LAMP / openssh-server 等) * 关键是设置一个用户名,及密码 // 后面登录系统需要用到 * 关闭ubuntu的防火墙 # ufw disable * 开启防火墙 # ufw enable * Ubuntu下的 sysv-rc-conf 完美“替代”CentOS下的chkconfig (httpd on) * 装了Ubuntu14.04后发现chkconfig用不了,并且也安装不了chkconfig,于是老表便在网上找解决办法,最终发现原来chkconfig是Redhat下的程序,而在Ubuntu下有一个更好的程序可以完美“替代”chkconfig,那就是sysv-rc-conf * apt -y install sysv-rc-conf # apt 跟 apt-get一样的效果,都是安装 * sysv-rc-conf 命令,可以查看所有的进程开启启动状态 * 必须要用超级用户权限; SecureCRT屏幕最大化(否则提示屏幕太小,无法使用这个命令) * 用鼠标点击,也可以用键盘方向键定位,用空格键选择, “X”表示开启该服务。用Ctrl+N翻下一页,用Ctrl+P翻上一页,用Q退出。 * 也可以用命令: * # sysv-rc-conf --level 2345 mysql off * 注意:Ubuntu系统中服务的运行级别: * 0 系统停机状态 * 1 单用户或系统维护状态 * 2~5 多用户状态 * 6 重新启动 * ubuntu命令 * Ubuntu命令行模式与图形桌面切换 * 按 Ctrl + Alt + (F1~F6中的任意一个)即可进入纯命令行模式。 * 按 Ctrl + Alt + F7即进入图形界面模式。 * 其它: * 如果想 Ubuntu 在每次启动到 command prompt ,可以输入以下指令: * $echo “false” | sudo tee /etc/X11/default-display-manager * 当下次开机时,就会以命令行模式启动(text模式,字符界面登录),如果想变回图形界面启动(X windows启动),可以輸入: * $echo “/usr/sbin/gdm” | sudo tee /etc/X11/default-display-manager * 如果在Ubuntn以命令行模式启动,在字符终端想回到图形界面的话只需以下命令: * $startx * secureCRT远程连接Ubuntu * 用户名:输入普通用户和密码,不要输入root,否则提示报错。 * 注销 * $sudo systemctl restart lightdm // 或 $sudo pkill Xorg * Ubuntu上开启SSH服务 * sudo service sshd start // 提示ssh.service not found * 更新源列表 // sudo apt-get update * 安装openssh-server // 在终端中输入: sudo apt-get install openssh-server * 查看查看ssh服务是否启动 // sudo ps -e | grep ssh 提示sshd,说明安装成功 * 更新root密码 * ubuntu的root密码是每次开机随机的,所以我们可以修改root密码 * sudo passwd // 输入当前账户的密码(我的账号是jet,所以输入jet的密码) > 然后输入unix密码2次,此密码即为root密码 * su root // 登录root账号,输入刚才设置的root密码即可 * Ubuntu设置固定IP * 打开/etc/network/interfaces文件,内容为(默认使用DHCP分配IP) * auto lo * iface lo inet loopback * auto ens33 * iface ens33 inet dhcp * 修改为: * auto lo * iface lo inet loopback * auto ens33 * iface ens33 inet static * address 192.168.1.249 # 想要设置的固定IP * netmask 255.255.255.0 * gateway 192.168.1.1 * dns-nameservers 192.168.1.1 * # 这里dns可以在电脑的网络中 本地连接/无线连接--详细信息中查看IPv4 DNS服务器 * # 这里的dns配置的优先级比resolv.conf中配置的优先级高,所以,只需要在这里配置即可 * # vi /etc/resolvconf/resolv.conf.d/base,写入以下内容: //上面dns-nameservers中配置之后,这步骤可以省略 * nameserver 192.168.1.1 * nameserver 192.168.1.1 * 重启系统即可 # reboot * service networking restart 或 ifconfig eth0 up 重启网络/网卡,无效,还是reboot成功! * Ubuntu上软件安装情况,安装,卸载 * dpkg -l | grep mysql # 查看是否安装mysql * apt purge mysql* -y # 卸载mysql(不保留配置信息) * apt install -y mysql # 安装mysql * Ubuntu apt-get update 失败 * 原因:自带源在国内连接性不好。。。 * 解决:改用”阿里云Ubuntu源”: * 命令如下: * sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak * sudo vim /etc/apt/sources.list * 修改:关键!!此命令是为了进入vim修改sources.list,在将如下代码: * deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse * deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse * deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse * deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse * deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse * deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse * deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse * deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse * deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse * deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse * deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse * deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse * deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse * deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse * deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse * deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse * deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse * deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse * deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse * deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse * 输入之前之前,把相对应的原有的源用#注释掉。 * sudo apt-get update * 更新列表 ->成功! * Ubuntu 出现apt-get: Package has no installation candidate问题 * sudo apt-get install cmake * I get the following response: * Package cmake is not available, but is referred to by another package.This may mean the package is missing, has been obsoleted, or is only available from another sourceE: Package 'cmake' has no installation candidate * 解决方法如下: * # apt-get update * # apt-get upgrade * # apt-get install * 这样就可以正常使用apt-get了~ * Ubuntu vi 上下左右变ABCD问题解决方法 * 错误问题:vi上下左右键显示为ABCD的问题 * 解决方法: * 只要依次执行以下两个命令即可完美解决Ubuntu下vi编辑器方向键变字母的问题。 * 一.执行命令 sudo apt-get remove vim-common * 二.执行命令 sudo apt-get install vim * ubuntu利用apt-get install命令安装软件时报错:有另外一个进程正在使用(is another process using it * 利用apt-get install命令安装软件时报错: * E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) * E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it? * 解决方案: * 出现这个问题可能是有另外一个程序正在运行,导致资源被锁不可用。而导致资源被锁的原因可能是上次运行安装或更新时没有正常完成,进而出现此状况,解决的办法其实很简单: * 在终端中执行以下命令即可: * $ sudo rm /var/cache/apt/archives/lock && sudo rm /var/lib/dpkg/lock * 使用脚本自动安装docker (执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中) [图片上传失败...(image-a69768-1543981712203)] * $ curl -fsSL get.docker.com-o [get-docker.sh](http://get-docker.sh) # apt install curl * 国内镜像加速 * Docker使用阿里云docker镜像加速 * 进入阿里云docker库首页 [https://dev.aliyun.com](https://dev.aliyun.com)(我的阿里云账号为:happy**** ( qq11***) ),进入“管理中心”-“镜像加速器”-Ubuntu-按照上面的提示步骤设置即可 * sudo mkdir -p /etc/docker //我的默认已经存在此目录 * sudo tee /etc/docker/daemon.json <<-'EOF' * { "registry-mirrors": ["[https://60017a5a.mirror.aliyuncs.com](https://60017a5a.mirror.aliyuncs.com/)"] } * EOF * sudo systemctl daemon-reload * sudo systemctl restart docker * root@ubuntu:/etc/docker# docker pull centos //亲自试验,发现设置了阿里云镜像加速后,下载速度快了N多 [图片上传失败...(image-c38a45-1543981712191)] * $ sudo sh [get-docker.sh](http://get-docker.sh) --mirror Aliyun * 启动 Docker CE * $ sudo systemctl enable docker // 设置 Docker 自动启动(Ubuntu) * sudo chkconfig docker on // 设置 Docker 自动启动(CentOS) * $ sudo systemctl start docker // 启动Docker(Ubuntu) * sudo service docker start // 启动docker ( CentOS) * $ sudo systemctl stop docker // 停止Docker(Ubuntu) * 建立 docker 用户组 * docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。 * 建立 docker 组: $ sudo groupadd docker * 将当前用户加入 docker 组:$ sudo usermod -aG docker jet //我登录系统的用户名是jet * 退出当前终端并重新登录 [图片上传失败...(image-ee086a-1543981712191)] * 测试 Docker 是否安装正确 * $sudo docker run hello-world [图片上传失败...(image-95b80e-1543981712195)] * Docker常用命令 * 查看docker信息(version、info) * docker version # 查看版本 [图片上传失败...(image-a6bdbd-1543981712195)] * docker info # 显示docker系统的信息 * 对image的操作(search、pull、images、rmi、history) * 搜索镜像 * sudo docker search mysql * docker search -s 10 lamp # 意思是搜索10星以上的镜像,越高,证明用的人越多。 [图片上传失败...(image-b57650-1543981712189)] * 从Docker Hub上下载最新版本的 centos * sudo docker pull centos * Docker官方网站专门有一个页面来存储所有可用的镜像,网址是:[https://hub.docker.com/](https://hub.docker.com/)。你可以通过浏览这个网页来查找你想要使用的镜像,或者使用命令行的工具来检索。 // 默认是从hub.docker库里pull镜像 * 如果想要从阿里云库里pull想要的镜像,则: * docker pull [registry.cn-beijing.aliyuncs.com/neucloud/python-27-centos7](http://registry.cn-beijing.aliyuncs.com/neucloud/python-27-centos7) [图片上传失败...(image-c21a84-1543981712188)] [图片上传失败...(image-83a912-1543981712188)] [图片上传失败...(image-a184c7-1543981712188)] [图片上传失败...(image-924a72-1543981712188)] * 查看本地主机上已有的镜像,及添加一个新的ubuntu:latest镜像标签 * docker images # 查询出所有images ID * docker tag 4129 centos_tree:1.0.1 # 其中,4129为要修改的image ID,centos_tree:1.0.1 为新镜像名:版本 [图片上传失败...(image-b22b5-1543981712191)] * 使用下载的镜像创建一个容器,在其中运行echo * jet@ubuntu:~$ sudo docker run -t -i centos echo "Hello" [图片上传失败...(image-123c74-1543981712191)] * 查看镜像的详细信息 * sudo docker inspect 8e5b // 一般镜像ID的3-4个即可 * 删除镜像 * 通过镜像name / ID删除 # sudo docker rmi ff42 * jet@ubuntu:~$ sudo docker rmi -f f2a9 # 参数-f 是强制删除 # f2a9为镜像ID * docker rmi -f imageName:imageVersion * 显示一个镜像的历史 * jet@ubuntu:~$ sudo docker history centos # 显示镜像centos的历史 * 启动容器(run) * docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。 * $docker run centos echo "hello word" # 在容器centos中运行"echo"命令,输出"hello word" * $docker run -ti centos /bin/bash # 交互式进入容器中 * [root@3e6a483e2a27 /]# yum -y install tree # 容器中安装tree命令 * exit 退出容器 [图片上传失败...(image-dd8181-1543981712189)] * $docker run centos apt-get install -y mysql # 在centos中安装新的程序mysql # 容器修改后,需要commit保存对容器的修改,否则下次启动时还是没有安装!! * Note: 在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。 * 查看容器(ps) * $docker ps # 列出当前所有正在运行的container * $docker ps -a # 列出所有的container * $docker ps -l # 列出最近一次启动的container [图片上传失败...(image-534880-1543981712195)] * 保存对容器的修改(commit) * 当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。 * jet@ubuntu:~$ sudo docker commit 8a4c centos_mysql # 保存对容器的修改; -a, --author="" Author; -m, --message="" Commit message # 8a4c 为 CONTAINER ID * sha256:429de6ea8eb312cdb3eaff36c4ecc6473c8d2d5de9ba79dab0cf1e874cd1138f * Note: image相当于类,container相当于实例,不过可以动态给实例安装新软件,然后把这个container用commit命令固化成一个image。 * docker commit 7ef5 newImageID * docker run -ti imageName:imageVersion # 进入刚做的更改的容器内,可以运行tree命令检查是否安装tree成功 * 保存容器的步骤(方法一)(容器内、外操作): * 1、(容器外) docker run -ti centos 进入centos容器 * 2、(容器内): yum -y install tree * 3、(容器外) 查询新安装tree的容器ID: docker ps -l * 4、(容器外): docker commit 6995 centos_tree # centos_tree 为新镜像名 * 5、(容器外):docker run -ti centos_tree 进入centos_tree容器,可以在里面运行tree命令了 * 保存容器的步骤(方法二)(容器外操作) * 179 docker rmi -f centos_tree * 180 docker images * 181 docker run centos yum -y install tree * 182 docker ps -l * 183 docker commit 5e92 centos_t * 184 docker run centos_t tree /opt * 对容器的操作(rm、stop、start、kill、logs、diff、top、cp、restart、attach) * $docker rm `docker ps -a -q` # 删除所有容器 * $docker rm Name/ID # 删除单个容器; -f, --force=false; -l, --link=false Remove the specified link and not the underlying container; -v, --volumes=false Remove the volumes associated to the container * # 停止、启动、杀死一个容器 * $docker stop Name/ID * $docker start Name/ID * $docker kill Name/ID * $docker logs Name/ID # 从一个容器中取日志; -f, --follow=false Follow log output; -t, --timestamps=false Show timestamps * $docker diff Name/ID # 列出一个容器里面被改变的文件或者目录,list列表会显示出三种事件,A 增加的,D 删除的,C 被改变的 * $docker top Name/ID # 显示一个运行的容器里面的进程信息 * $docker cp Name:/container_path to_path 或 $docker cp ID:/container_path to_path # 从容器里面拷贝文件/目录到本地一个路径 * $docker restart Name/ID # 重启一个正在运行的容器; -t, --time=10 Number of seconds to try to stop for before killing the container, Default=10 * $docker attach ID # 附加到一个运行的容器上面; --no-stdin=false Do not attach stdin; --sig-proxy=true Proxify all received signal to the process * Note: attach命令允许你查看或者影响一个运行的容器。你可以在同一时间attach同一个容器。你也可以从一个容器中脱离出来,是从CTRL-C。 * 保存和加载镜像(save、load) * 当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。 * $docker save image_name -o file_path # 保存镜像到一个tar包; -o, --output="" Write to an file * $docker load -i file_path # 加载一个tar包格式的镜像; -i, --input="" Read from a tar archive file * $docker save image_name > /home/save.tar # 机器a * # 使用scp将save.tar拷到机器b上,然后: $docker load < /home/save.tar * 登录registry server(login) * $docker login # 登陆registry server; -e, --email="" Email; -p, --password="" Password; -u, --username="" Username * Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to [https://hub.docker.com](https://hub.docker.com/)to create one. * 发布image(push) * $docker push new_image_name # 发布docker镜像 * 根据Dockerfile 构建出一个容器 * $docker build -t image_name Dockerfile_path * 阿里云镜像使用 * 详细上传步骤 * jet@ubuntu:~$ docker login -u happyjetderek [registry.cn-hangzhou.aliyuncs.com](http://registry.cn-hangzhou.aliyuncs.com/)# 一定不能带-p输入密码,否则报错 # 用户名为阿里云登录的用户名 * Password: # 此处输入密码Registry登录密码(为[https://cr.console.aliyun.com/#/imageList右上角](https://cr.console.aliyun.com/#/imageList右上角)“修改Registry登录密码”出修改的密码) * Login Succeeded [图片上传失败...(image-77a7a0-1543981712189)] * jet@ubuntu:~$ docker tag ff42 registry.cn-hangzhou.aliyuncs.com/cdtest/lamp[:1.0.1] * # ff42 是ImageID * 默认没有:1.0.1版本号,则为latest * jet@ubuntu:~$ docker push registry.cn-hangzhou.aliyuncs.com/cdtest/lamp[:1.0.1] * jet@ubuntu:~$ docker images * 可以查到到刚才推送成功的所有镜像及版本 * 在[https://cr.console.aliyun.com/#/dockerImage/cn-hangzhou/cdtest/lamp/versions](https://cr.console.aliyun.com/#/dockerImage/cn-hangzhou/cdtest/lamp/versions) 页面上也可以看到刚上传成功的镜像 * jet@ubuntu:~$ docker logout registry.cn-hangzhou.aliyuncs.com * 退出登录 * Docker命令整理 * 总的来说分为以下几种: * 容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause] * 容器操作运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port] * 容器rootfs命令 — docker [commit|cp|diff] * 镜像仓库 — docker [login|pull|push|search] * 本地镜像管理 — docker [images|rmi|tag|build|history|save|import] * 其他命令 — docker [info|version] * 镜像操作 * docker search (image-name) 查询镜像 example:docker search ubuntu * docker history (image-name) 查看镜像的历史版本 * docker push (image-name) 将镜像推送到registry * docker pull image-name:tag pull镜像 example:docker pull ubuntu:latest * docker rmi 删除镜像(先stop并删除镜像上的所有容器) * docker rmi $(docker images -q) 删除全部镜像 * docker tag image-id imagename:tag 修改镜像的tag标签 * docker load -i test.tar 从tar文件中载入镜像 * docker save image > test.tar 保存镜像为tar文件 * 容器操作 * docker attach container 进入容器交互式界面 * docker diff container 列出容器内发生变化的文件与目录 * dcoker logs ID(容器的ID,可以用docker ps查看) 查看docker上的容器的状态 * docker stop ID(或者容器名字) 关闭运行中的容器 * docker start ID 开启容器 * docker restart ID 重启运行中的容器 * docker stop ID docker rm ID 移除容器(先关闭再删除) * docker kill [options] container 杀死容器的主进程 * docker stop $(docker ps -a -q) 停止所有container * docker rm $(docker ps -a -q) 移除所有container * docker commit ID new镜像名字(只能字母加数字) 将容器的状态保存为镜像 * docker export container > test.tar 将容器打包成tar文件 * docker cp container:path hostpath 从容器内复制文件到指定的路径 * 其它操作 * docker import http://example.com/example.tar 远程导入文件 * docker login [options][server] 用来登陆自己的registry * docker inspect container/image 收集容器的信息(ip地址,端口等) * docker wait container 阻塞 * 编写dockerfile * 在Dockerfile文件内写入: * 我们需要创建一个目录来存放Dockerfile文件,目录名称可以任意取,在该目录里创建Dockerfile文件。这里我以创建一个基于centos基础镜像,容器运行后会自动开启一个python webserver(本地监听8080端口)的例子。 * # Version 0.1 * # 基础镜像 * FROM registry.cn-hangzhou.aliyuncs.com/cdtest/lamp:1.0.1 * # 维护者信息 * MAINTAINER jet * # 镜像操作命令 * RUN yum -y install tree * # 容器启动命令 * CMD python -m SimpleHTTPServer 8080 * dockerfile语法类似于MakeDown,基础内容如下: * FROM 基于的基础镜像名称 * MAINTAINER 维护者信息 * RUN 运行的命令(安装软件等) * CMD 启动容器时运行的命令(只能写一条) * 语法不止这些,更多内容,可以参考官方文档 * 生成dockerfile镜像 * 进入到Dockerfile文件所在目录,运行: * docker build -t centos_test:01 . * . 为当前目录路径 * centos_test:01为新生成的镜像名:版本号 * 使用dockerfile镜像 * 在此image上运行容器: * docker run -d -p 80:8080 centos_test:01 * 打开本机的192.168.1.249:80 * 192.168.1.249为我的ubuntu虚拟机地址,可在虚拟机外面的浏览器中访问 * 部署( java/php ) web应用 * Docker部署java web应用 * root@ubuntu:/home/jet/DockerfileTest# docker rm -f $(docker ps -qa) * 删除所有存在的容器 * docker ps * 查看正在运行的容器 * docker search tomcat * docker pull tomcat * docker tag tomcat tomcat-1 * 给镜像tomcat起个别名tomcat-1 * docker run -p 5000:8080 --name c1 tomcat-1 * 运行镜像tomcat-1,生成的容器名为c1,将容器中的8080端口映射为主机中的5000端口 * http://192.168.1.249:5000/ * 在浏览器中查看tomcat的启动情况 * root@ubuntu:/home/jet/DockerfileTest# docker exec -ti c1 /bin/bash * 进入c1容器中(交互模式) * jet@ubuntu:~/DockerfileTest$ docker cp javaweb1.war c1:/usr/local/tomcat/webapps * 将虚拟机中DockerfileTest目录下的javaweb1.war 复制到c1容器中的/usr/local/tomcat/webapps路径下 * root@d2afc8cf878a:/usr/local/tomcat/webapps# ls * 查看是否复制成功 * http://192.168.1.249:5000/javaweb1 * 浏览器中查看java web应用部署是否OK * 设置成私人镜像,并上传便于他人引用 * docker commit c1 [registry.cn-hangzhou.aliyuncs.com/cdtest/tomcattest:0.0.1](http://registry.cn-hangzhou.aliyuncs.com/cdtest/tomcattest:0.0.1) * docker login * docker push [registry.cn-hangzhou.aliyuncs.com/cdtest/tomcattest:0.0.1](http://registry.cn-hangzhou.aliyuncs.com/cdtest/tomcattest:0.0.1) * docker pull [registry.cn-hangzhou.aliyuncs.com/cdtest/tomcattest:0.0.1](http://registry.cn-hangzhou.aliyuncs.com/cdtest/tomcattest:0.0.1) * root@ubuntu:/home/jet# docker run -tid -p 4800:8080 --name mytomcat [registry.cn-hangzhou.aliyuncs.com/cdtest/tomcattest:0.0.1](http://registry.cn-hangzhou.aliyuncs.com/cdtest/tomcattest:0.0.1) * [http://192.168.1.249:4800/javaweb1/](http://192.168.1.249:4800/javaweb1/) * root@ubuntu:/home/jet# docker exec -ti mytomcat /bin/bash [图片上传失败...(image-984aae-1543981712193)] [图片上传失败...(image-c1fbbd-1543981712193)] [图片上传失败...(image-23cd7-1543981712193)] * Docker部署php web应用 * 1\. 下载lamp镜像 * docker search -s 10 lamp # 意思是搜索10星以上的镜像,越高,证明用的人越多。 * docker pull tutum/lamp # 选择了一个星级高的tutum/lamp * docker images # 查看刚才下载的tutum/lamp是否成功 * [https://hub.docker.com/](https://hub.docker.com/)搜索tutum/lamp,查看 镜像tutum/lamp的使用说明 * 2\. 端口映射 * docker run -tid -p 80:80 -p 3306:3306 tutum/lamp #使用默认方式启动LAMP * docker run -tid -p 80:80 -p 3306:3306 -e MYSQL_PASS="123456" --name mylamp tutum/lamp # 修改mysql用户root的密码(否则每次都是随机的密码) * # mylamp 为运行tutum/lamp镜像后,新生成的容器名 * docker ps * 5c8f113fb088 tutum/lamp "/[run.sh](http://run.sh/)" 41 seconds ago Up 15 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:3306->3306/tcp mylamp * docker exec -ti mylamp /bin/bash # 用容器Name * docker exec -ti 5c8f /bin/bash # 用容器 id * 进入容器mylamp中 * mysql -uadmin -p"123456" # 容器中使用刚修改的mysql密码登录mysql * 3.web应用在容器中的默认位置 * /var/www/html # 可以通过容器中find / -name html 搜索到 * 4.从虚拟机外部上传ranzhi3.3.zip 都虚拟机VM中 * # rz 命令上传 * 5.从VM中复制到容器中 * docker cp ranzhi3.3.zip mylamp:/var/www/html/ * unzip ranzhi3.3.zip # 此容器中没有unzip,所以要安装: apt -y install unzip * 6.外部浏览器中输入网址,可正常访问ranzhi * http://192.168.1.249/ranzhi/www * 7.把容器mylamp生成新镜像,并上传到阿里云镜像源 * docker commit mylamp [registry.cn-hangzhou.aliyuncs.com/cdtest/lamp_ranzhi:1.0.1](http://registry.cn-hangzhou.aliyuncs.com/cdtest/lamp_ranzhi:1.0.1) * docker login [registry.cn-hangzhou.aliyuncs.com](http://registry.cn-hangzhou.aliyuncs.com/) * happyjet*** / q....7 (输入你自己在阿里云注册的账号及register密码) * docker push [registry.cn-hangzhou.aliyuncs.com/cdtest/lamp_ranzhi:1.0.1](http://registry.cn-hangzhou.aliyuncs.com/cdtest/lamp_ranzhi:1.0.1) * 这是在我的aliyun中cdtest命名空间下的lamp_ranzhi镜像 * 8.以后所有人都可以下载我刚创建的ranzhi_lamp * docker pull [registry.cn-hangzhou.aliyuncs.com/cdtest/lamp_ranzhi:1.0.1](http://registry.cn-hangzhou.aliyuncs.com/cdtest/lamp_ranzhi:1.0.1) * docker run -tid -p 80:80 -p 3306:3306 --name myranzhi [registry.cn-hangzhou.aliyuncs.com/cdtest/lamp_ranzhi:1.0.1](http://registry.cn-hangzhou.aliyuncs.com/cdtest/lamp_ranzhi:1.0.1) * docker exec -ti myranzhi /bin/bash * # 可进入容器查看mysql,还是以前的密码123456 [图片上传失败...(image-48c7ef-1543981712190)] [图片上传失败...(image-2ab2d0-1543981712190)] [图片上传失败...(image-c76ad5-1543981712190)]