关于docker:docker使用系列之1安装和云镜像加速

2.1 docker装置2.1.1 查看官网指南:Install Docker Engine on CentOS 2.1.2.装置前先卸载清理:sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine2.1.3 先装置依赖包:sudo yum install -y yum-utils2.1.4 指定装置源:sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo2.1.5 跳过Optional的2.1.6 装置docker engine:sudo yum install docker-ce docker-ce-cli containerd.io2.1.7 查看装置状态:yum list docker-ce --showduplicates | sort -r2.1.8 启动docker:sudo systemctl start docker2.1.9 顺便设置开机启动dockersudo systemctl enable docker2.1.10 启动后应用命令查看:sudo docker images2.2 设置docker的云镜像减速登录阿里云 -> 左侧菜单->产品与服务->容器镜像服务-> 镜像加速器 -> centos -> ...

August 13, 2020 · 1 min · jiezi

关于docker:extrahosts-无效如何-在docker-build-时修改-hosts

公司我的项目用的是 docker 环境部署,就遇到一个须要在 docker image 构建阶段批改 hosts 的状况。 比方这样的 dcoker-compose.yml 和 Dockerfile 组合 #dcoker-compose.ymlversion: "3.3"services: app-web: build: ./ image: app-web ports: - 4600:4600 container_name: "app-web"#DockerfileFROM node:latestWORKDIR /usr/src/app/USER rootCOPY ./ ./RUN npm run install && npm run buildCMD ["npm", "run", "start-dev"]当 npm run install须要依赖自定义 hosts 的时候,这就难堪了。 查看 docker 文档,其中提到在 docker-compose.yml 上能够设定 extra_hosts 以拓展 hosts。 test2: build: local/test extra_hosts: - raw.githubusercontent.com:199.232.68.133然而我怎么测试,都不失效。很神奇 -。- 能够在 Dockerfile 里测试下输入 RUN echo '199.232.68.1 aaa.bb.com' >> /etc/hostsRUN cat /etc/hosts # 文件被重置,上一行的批改不失效要解决这个问题,有两个办法: ...

August 13, 2020 · 1 min · jiezi

关于docker:mysql80一主多从k8s1186部署

次要参考文章

August 11, 2020 · 1 min · jiezi

关于docker:打开容器技术的大门更通俗易懂的-Docker-教程

> 作者: jartto > 出处: http://jartto.wang/2020/07/04... 富 Web 时代,利用变得越来越弱小,与此同时也越来越简单。集群部署、隔离环境、灰度公布以及动静扩容缺一不可,而容器化则成为两头的必要桥梁。 本文咱们就来摸索一下 Docker 的神秘世界,从零到一把握 Docker 的基本原理与实际操作。别再守着前端那一亩三分地,是时候该开疆扩土了。 ### 讲个故事 为了更好的了解 Docker 是什么,咱们先来讲个故事: 我须要盖一个房子,于是我搬石头、砍木头、画图纸、盖房子。一顿操作,终于把这个房子盖好了。 ![](https://javaobj.oss-cn-shangh... 后果,住了一段时间,灵机一动想搬到海边去。这时候按以往的方法,我只能去海边,再次搬石头、砍木头、画图纸、盖房子。 ![](https://javaobj.oss-cn-shangh... 懊恼之际,跑来一个魔法师教会我一种魔法。这种魔法能够把我盖好的房子复制一份,做成「镜像」,放在我的背包里。 ![](https://javaobj.oss-cn-shangh... 等我到了海边,就用这个「镜像」,复制一套房子,拎包入住。 是不是很神奇?对应到咱们的我的项目中来,房子就是我的项目自身,镜像就是我的项目的复制,背包就是镜像仓库。 如果要动静扩容,从仓库中取出我的项目镜像,轻易复制就能够了。Build once,Run anywhere! 不必再关注版本、兼容、部署等问题,彻底解决了「上线即崩,无休止构建」的难堪。 ### 虚拟机与容器 开始之前,咱们来做一些基础知识的储备: **①虚拟机:虚拟化硬件** 虚拟机 Virtual Machine 指通过软件模仿的具备残缺硬件零碎性能的、运行在一个齐全隔离环境中的残缺计算机系统。在实体计算机中可能实现的工作在虚拟机中都可能实现。 在计算机中创立虚拟机时,须要将实体机的局部硬盘和内存容量作为虚拟机的硬盘和内存容量。 每个虚拟机都有独立的 CMOS、硬盘和操作系统,能够像应用实体机一样对虚拟机进行操作。在容器技术之前,业界的网红是虚拟机。 虚拟机技术的代表,是 VMWare 和 OpenStack。 **②容器:将操作系统层虚拟化,是一个规范的软件单元** 其特点如下: * **随处运行:** 容器能够将代码与配置文件和相干依赖库进行打包,从而确保在任何环境下的运行都是统一的。 * **高资源利用率:** 容器提供过程级的隔离,因而能够更加精密地设置 CPU 和内存的使用率,进而更好地利用服务器的计算资源。 * **疾速扩大:** 每个容器都可作为独自的过程予以运行,并且能够共享底层操作系统的系统资源,这样一来能够放慢容器的启动和进行效率。 区别与分割: * 虚拟机尽管能够隔离出很多「子电脑」,但占用空间更大,启动更慢。虚拟机软件可能还要花钱,例如 VMWare。 * 容器技术不须要虚构出整个操作系统,只须要虚构一个小规模的环境,相似「沙箱」。 * 运行空间,虚拟机个别要几 GB 到 几十 GB 的空间,而容器只须要 MB 级甚至 KB 级。 ...

August 11, 2020 · 4 min · jiezi

关于docker:CentOS7-下-离线安装Docker-和-Docker-Compose

GitHub地址:点击返回Docker离线装置1.docker的rpm安装包下载下载地址:点击返回下载版本:docker-ce-17.12.0.ce-1.el7.centos.x86_64.rpm2.所需依赖包下载(8 + 1)****九个依赖包均在下面的github里前八个依赖包列表: audit-libs-python-2.8.5-4.el7.x86_64.rpmcheckpolicy-2.5-8.el7.x86_64.rpmlibcgroup-0.41-21.el7.x86_64.rpmlibseccomp-2.3.1-3.el7.x86_64.rpmlibsemanage-2.5-14.el7.x86_64.rpmpolicycoreutils-python-2.5-33.el7.x86_64.rpmpython-IPy-0.75-6.el7.noarch.rpmsetools-libs-3.3.8-4.el7.x86_64.rpm最初一个依赖包             9. container-selinux-2.107-3.el7.noarch.rpm3.装置本文测试门路:root/docker/rpm把前8个依赖上传至root/docker门路下把docker安装包和第9个依赖上传至root/docker/rpm门路下上传胜利后docker门路下的文件构造:         上传胜利后rpm门路下的文件构造: 批量装置docker门路下的依赖包:rpm -Uvh *.rpm --nodeps --force 装置 container-selinux-2.107-3.el7.noarch.rpm :rpm -Uvh container-selinux-2.107-3.el7.noarch.rpm 装置docker:rpm -Uvh docker-ce-17.12.0.ce-1.el7.centos.x86_64.rpm 启动 docker:systemctl start docker查看 docker版本:docker -v 至此,docker装置胜利Docker Compose离线装置1.下载 Linux 版本的 Docker Compose下载地址:点击返回文件名:docker-compose-Linux-x86_64 2.装置将下载下来的“docker-compose-Linux-x86_64”文件上传至root目录下。执行如下命令将其挪动到 /usr/local/bin,并改名为“docker-compose”sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose执行如下命令增加可执行权限sudo chmod +x /usr/local/bin/docker-compose应用 docker-compose -v 命令测试是否装置胜利 至此,Docker Compose 装置胜利。

August 10, 2020 · 1 min · jiezi

关于docker:企业级docker镜像仓库Harbor搭建

企业级docker镜像仓库Harbor搭建

August 7, 2020 · 1 min · jiezi

关于docker:CentOS75安装配置Harbor17

1.下载所需的包wget -P /usr/local https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-online-installer-v1.7.1.tgz2.解压文件tar zxf /usr/local/harbor-online-installer-v1.7.1.tgz -C /usr/local/3.批改Harbor配置hostname:配置主机名称,不能够设置127.0.0.1,localhost这样的主机名,能够是IP或者域名ui_url_protocol:指定应用HTTP协定还是HTTPS协定Email settings:邮箱设置,option配置,只在首次启动失效,能够登陆UI后批改harbor_admin_password:设置管理员的初始密码,只在第一次登录时应用auth_mode:用户认证模式,默认是db_auth,也能够应用ldap_auth验证。db_password:应用db须要指定连贯数据库的明码self_registration:是否容许自行注册用户,默认是on,新版本能够在图形界面中批改。max_job_workers:最大工作数,默认是10个customize_crt:是否为token生成证书,默认为onssl_cert:nginx cert与key文件的门路, 只有采纳https协定是才有意义ssl_cert:nginx cert与key文件的门路, 只有采纳https协定是才有意义secretkey_path:The path of secretkey storageadmiral_url:Admiral's url, comment this attribute, or set its value to NA when Harbor is standaloneclair_db_password:未启用calir服务,但解压目录下的"./prepare"文件中要查看以下相干参数配置,不能正文,否则环境筹备查看不能通过,报"ConfigParser.NoOptionError: No option u'clair_db_password' in section: u'configuration' "相干谬误;或者在"./prepare"中正文相关检查与定义,但须要留神,文件中的关联太多,举荐批改"harbor.cfg"文件即可ldap_url:ladp相干设置,如未采纳ldap认证,但解压目录下的"./prepare"文件中要查看以下相干参数配置,不能正文,否则环境筹备查看不能通过,报"ConfigParser.NoOptionError: No option u'ldap_timeout' in section: u'configuration' "相干谬误;或者在"./prepare"中正文相关检查与定义,但须要留神,文件中的关联太多,举荐批改"harbor.cfg"文件即可ldap_scope:self_registration:默认开启自注册,off为敞开token_expiration:token无效工夫,默认30minutesproject_creation_restriction:创立我的项目权限管制,默认是"everyone"(所有人),可设置为"adminonly"(管理员)verify_remote_cert:与近程registry通信时是否采纳验证ssl其余应用默认值4.装置docker-composeyum install docker-compose5.执行Harbor目录下的prepare和install.sh6.其余物理机docker链接至本机vi /etc/docker/daemon.json退出{"insecure-registries" : ["Harbor仓库地址"]}7.登录docker login HarborIp

August 6, 2020 · 1 min · jiezi

关于docker:PHP-码农的-go-语言密码本项目开发实战-搭建开发环境

我是一名 PHP 程序员。最近对 go 语言有了趣味。所以我筹备从身边的一个我的项目动手,实际并学习一下 go 语言。在上一篇文章中对这个要重构的小我的项目做了比拟具体的介绍。明天打算在本人的电脑上搭建一个能够运行 go 语言的开发环境。 几年前开始,我曾经尝试用 Docker 来搭建我的开发环境。所以目前我开发环境所依赖的所有性能都是运行在 Docker 之上。比方 PHP,MySQL, Redis,Nginx 等。这次我将同样用 Docker 来搭建我的 go 语言环境。另外我的开发零碎为 Ubuntu。 咱们间接开始,首先是为这个小我的项目创立我的项目目录: mkdir -p ~/Projects/codebookcoodbook,很直白的名字。进入我的项目目录: cd ~/Projects/codebook而后尝试拉取 go 语言的镜像: docker pull golang镜像拉取胜利后,验证一下镜像是否工作失常: docker run --rm -it golang go version 看到输入了 go 语言的版本信息,我就释怀了。对于 docker 命令后的参数略微解释下,--rm 参数是示意在执行实现后删除这个镜像产生的容器,-it 是应用交互式形式执行这个镜像中的命令。这些是 Docker 命令的参数,跟 go 语言没有关系,不必在意。 实践上到此开发环境就算是搭建好了,这就是几年前我为啥非要把开发环境搬到 Docker 环境的起因:简略高效,不净化主零碎环境。接下来将持续尝试写一个 go 语言的代码体验一下经单的 "Hello, World"。先创立一个 hello.go 文件,输出以下代码: package mainimport ( "fmt")func main() { fmt.Println("Hello, world.")}如何在 Docker 构建的开发环境中执行代码文件是有套路的,首先须要晓得这个镜像它的默认工作目录,这个能够借助镜像中的 pwd 命令: ...

August 5, 2020 · 1 min · jiezi

关于docker:Django运行在Docker里连接不到Windows宿主机解决办法

Docker和宿主机通信的办法是虚构出一个docker0的虚构网卡,达到通信的目标。一般来说是172.*.*.*这种类型的网址。 Django运行在Docker里,连贯宿主机的数据库,填这个ip地址就能够。 然而这个办法只在Linux零碎上无效,Windows10上仍然无法访问,通过查问材料,ip地址要写成"host.docker.internal",而后接胜利与宿主机通信了。

August 4, 2020 · 1 min · jiezi

关于docker:Django运行在Docker里连接不到Windows宿主机解决办法

Docker和宿主机通信的办法是虚构出一个docker0的虚构网卡,达到通信的目标。一般来说是172.*.*.*这种类型的网址。 Django运行在Docker里,连贯宿主机的数据库,填这个ip地址就能够。 然而这个办法只在Linux零碎上无效,Windows10上仍然无法访问,通过查问材料,ip地址要写成"host.docker.internal",而后接胜利与宿主机通信了。

August 4, 2020 · 1 min · jiezi

关于docker:Harbor镜像仓库的安装与配置

Harbor镜像仓库的装置与配置一、装置Harbor1.环境筹备: 1.一台Centos7服务器(docker已装置, ip : 192.168.1.105),此服务器筹备装置镜像仓库; 2.一台Centos7服务器(docker已装置, ip : 192.168.1.106),此服务器测试从Harbor镜像仓库push和pull镜像用。 2.下载Harbor装置下载安装包:https://github.com/goharbor/h... 1.解压压缩包 tar zxvf harbor-online-installer-v1.8.1.tgz2.配置harbor.yml文件hostname: 192.168.1.105http:port will redirect to https port port: 80https: port: 443 certificate: /data/cert/192.168.1.105.crt private_key: /data/cert/192.168.1.105.keyharbor_admin_password: Harbor12345database: password: root123 data_volume: /data3.运行prepare文件./prepare4.装置 服务器必须先装置Docker Compose ./install.sh装置实现,能够在浏览器中登录;然而应用另一台主机从镜像仓库中拉取镜像时将报错: http: server gave HTTP response to HTTPS client起因是docker作为客户端,发送的是https申请,仓库未配置https. 二、配置Harbor的HTTPS拜访可参考: https://goharbor.io/docs/2.0.... 以下ip批改为Harbor服务器的ip 1.创立CA证书 生成CA证书私钥 openssl genrsa -out ca.key 4096 生成CA证书 openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.1.105"\ -key ca.key \ -out ca.crt2.生成服务器证书 生成服务器证书私钥 ...

August 4, 2020 · 1 min · jiezi

关于docker:Harbor镜像仓库的安装与配置

Harbor镜像仓库的装置与配置一、装置Harbor1.环境筹备: 1.一台Centos7服务器(docker已装置, ip : 192.168.1.105),此服务器筹备装置镜像仓库; 2.一台Centos7服务器(docker已装置, ip : 192.168.1.106),此服务器测试从Harbor镜像仓库push和pull镜像用。 2.下载Harbor装置下载安装包:https://github.com/goharbor/h... 1.解压压缩包 tar zxvf harbor-online-installer-v1.8.1.tgz2.配置harbor.yml文件hostname: 192.168.1.105http:port will redirect to https port port: 80https: port: 443 certificate: /data/cert/192.168.1.105.crt private_key: /data/cert/192.168.1.105.keyharbor_admin_password: Harbor12345database: password: root123 data_volume: /data3.运行prepare文件./prepare4.装置 服务器必须先装置Docker Compose ./install.sh装置实现,能够在浏览器中登录;然而应用另一台主机从镜像仓库中拉取镜像时将报错: http: server gave HTTP response to HTTPS client起因是docker作为客户端,发送的是https申请,仓库未配置https. 二、配置Harbor的HTTPS拜访可参考: https://goharbor.io/docs/2.0.... 以下ip批改为Harbor服务器的ip 1.创立CA证书 生成CA证书私钥 openssl genrsa -out ca.key 4096 生成CA证书 openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.1.105"\ -key ca.key \ -out ca.crt2.生成服务器证书 生成服务器证书私钥 ...

August 4, 2020 · 1 min · jiezi

关于docker:Docker第3部分十二个Dockerfile指令

原文作者:Jeff Hale 原文地址:https://towardsdatascience.co... 翻译:付新圆 本篇文章是对于Dockerfiles的,这是Docker系列文章的第三局部。如果您还没有读过 第1局部,请先浏览它,您能够从全新的角度理解Docker容器概念。 第2局部是Docker生态系统的简要介绍。在当前的文章中,我将钻研精简Docker映像、Docker CLI命令以及应用Docker的数据。      当初,让咱们跳进这十几个Dockerfile阐明中去吧! 图:跳进来 Docker映像Docker容器是栩栩如生的Docker映像,它是一个独立的、最小的操作系统,带有利用程序代码。 Docker映像在构建时创立的,而Docker容器是在运行时创立。 Dockerfile是Docker的外围,Dockerfile通知Docker如何构建用于制作容器的映像。 每个Docker映像都蕴含一个名为Dockerfile的文件,没有扩展名。调用Dockerfile docker build 创立映像时,假设该Dockerfile位于当前工作目录中,能够应用文件标记( -f )指定其余地位。 容器是由一系列层构建而成的,除位于最初一层之上的最终容器层外,每一层都是只读的。Dockerfile通知Docker增加哪些层以及增加程序。 每一层实际上只是一个文件,其中蕴含自上一层以来的更改。在Unix中,简直所有内容都是文件。 根底图像提供了初始层,根本图像也称为父图像。 当图像从近程存储库拉到本地计算机时,只下载本地计算机上尚未存在的层。Docker就是通过重用现有层来节俭空间和工夫。 图:根本(跳跃)图像 Dockerfile指令是一行结尾的大写单词,后跟其参数。Dockerfile中的每一行都能够蕴含一条指令。构建图像时,阐明从上到下进行解决。阐明如下: FROM ubuntu:18.04 COPY . /app 只有指令FROM,RUN,COPY和ADD能力在最终图像中创立图层,其余的指令可配置事物,增加元数据或通知Docker在运行时执行某些操作,例如公开端口或运行命令。 在本文中,我假如您正在应用基于Unix的Docker映像。您也能够应用基于Windows的映像,但这是一个较慢,较不欢快,较不常见的过程。因而,如果能够,请应用Unix。 让咱们疾速浏览一下咱们将摸索的十二个Dockerfile指令吧。 Dockerfile指令FROM —指定根本(父)图像。 LABEL —提供元数据,包含维护者信息。 ENV —设置持久性环境变量。 RUN —运行命令并创立图像层,用于将软件包装置到容器中。 COPY -将文件和目录复制到容器。 ADD -将文件和目录复制到容器,能够反对本地.tar文件。 CMD —为执行中的容器提供命令和参数,能够笼罩参数,只能有一个CMD。 WORKDIR —为以下阐明设置工作目录。 ARG —定义在构建时传递给Docker的变量。 ENTRYPOINT —为执行中的容器提供命令和参数。争执仍然存在。 EXPOSE —裸露端口。 VOLUME —创立目录装置点以拜访和存储持久数据。 让咱们开始吧! 阐明和示例Dockerfile能够像上面这样简略: FROM ubuntu:18.04 FROMDockerfile必须以FROM指令或ARG指令结尾,后跟FROM指令。 ...

August 3, 2020 · 2 min · jiezi

关于docker:Win10-Enterprise-LTSC-2019-启动HpyerV报错提示找不到汇编

因为要用Docker的起因,须要启动Hpyer-V,Hpyer-V是反对专业版和企业版的,不反对家庭版,所以零碎是没有问题。 Bios虚拟化也开启了。所以Hpyer-V须要的根底都有,然而依据官网教程,总是提醒找不到汇编。 最初依据一个网友的形容,从新应用Win10 Enterprise LTSC 2019 挂载上的文件里的Setup.exe,重新安装一遍,不扭转软件和文件,最初胜利装置上了Hpyer-V。 具体的起因是零碎短少一些组件,重新安装一遍会修复这些文件。

August 2, 2020 · 1 min · jiezi

关于docker:Win10-Enterprise-LTSC-2019-启动HpyerV报错提示找不到汇编

因为要用Docker的起因,须要启动Hpyer-V,Hpyer-V是反对专业版和企业版的,不反对家庭版,所以零碎是没有问题。 Bios虚拟化也开启了。所以Hpyer-V须要的根底都有,然而依据官网教程,总是提醒找不到汇编。 最初依据一个网友的形容,从新应用Win10 Enterprise LTSC 2019 挂载上的文件里的Setup.exe,重新安装一遍,不扭转软件和文件,最初胜利装置上了Hpyer-V。 具体的起因是零碎短少一些组件,重新安装一遍会修复这些文件。

August 2, 2020 · 1 min · jiezi

关于docker:Win10-Enterprise-LTSC-2019-启动HpyerV报错提示找不到汇编

因为要用Docker的起因,须要启动Hpyer-V,Hpyer-V是反对专业版和企业版的,不反对家庭版,所以零碎是没有问题。 Bios虚拟化也开启了。所以Hpyer-V须要的根底都有,然而依据官网教程,总是提醒找不到汇编。 最初依据一个网友的形容,从新应用Win10 Enterprise LTSC 2019 挂载上的文件里的Setup.exe,重新安装一遍,不扭转软件和文件,最初胜利装置上了Hpyer-V。 具体的起因是零碎短少一些组件,重新安装一遍会修复这些文件。

August 2, 2020 · 1 min · jiezi

关于docker:在Kubernetes中访问IAM如何安装Kube2iam

IAM是AWS的理论的受权办法。大部分针对AWS的Kubernetes的“疾速入门”指南并没有充沛笼罩如何在你的Pod中治理IAM拜访的相干内容。本系列文章讲探讨Kubernetes环境的AWS IAM特有的安全性问题,而后比照不同计划,并最终具体介绍如何抉择一种计划来设置集群。 在之前的文章中,咱们在生产kubernetes集群中装置了kiam。在本文中,咱们将介绍在成产环境疾速装置kube2iam的过程. 概述本文将蕴含你在身缠环境部署kube2iamd的以下4步: 创立 IAM roles减少Annotation到Pod部署kube2iam测试全副部署kube2iam浏览kube2iam详情及个性,请查看 Github Page。 1. 创立IAM Roles应用kubeiam的第一步是为你的Pod创立IAM roles。kube2iam的工作形式是须要一个IAM策略附加到集群中每个节点以容许其为Pod委派roles。 创立为你的节点一个IAM策略并且附加到你的kubernetes节点的role上。 策略:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": "*" } ]}接下来为每个pod创立role。每个role将须要一个策略,领有Pod性能所需的最小权限,例如:列出S3对象,写入DynamoDB, 读取SQS等。你须要为每个所创立的role更新委派角色策略,以便使你的节点能够委派这些role。用kubernetes节点所附加role的arn替换YOUR_NODE_ROLE。 委派角色策略:{ "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Principal": { "Service": "ec2.amazonaws.com" }, "Effect": "Allow", "Sid": "" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "YOUR_NODE_ROLE" }, "Action": "sts:AssumeRole" } ]}2. 为pod减少Annotations下一步将你的pod将用的role正文到Pod。减少一个annotation到pod 的metadata.spec即可,kube2iam应用IAM对Pod进行身份认证时将应用这个role。如此配置后,kube2iam将为该role主动查看根底arn,然而如果你须要委派角色给其余AWS账号也能够指定一个残缺的arn(以arn:aws:iam开始)。kube2iam文档有一些不同pod控制器的例子。 annotations: iam.amazonaws.com/role: MY_ROLE_NAME3. 部署kubeiam当初能够部署kube2iam。你能够参考kube2iam github repo 获取EKS和OpenShift的例子,然而这里也也会介绍一些通用deployment办法。第一步时配置RBAC: ...

August 1, 2020 · 3 min · jiezi

关于docker:vmware15centos8部署rke高可用集群

1.虚拟机筹备三台centos8虚拟机采纳nat形式连贯外网所以虚拟机固定ip地址1.1 nat形式连贯外网此处不介绍1.2 虚拟机应用固定ip地址留神点1:vmware外部网络的设置,抉择nat的vmware8网卡后,不勾选dhcp服务 留神点2:虚拟机外部设置文件/etc/sysconfig/network-script/ifcfg-ens##批改以下值: BOOTPROTO=staticONBOOT=yesIPADDR=192.168.*.*NETMASK=255.255.*.*GATEWAY=192.168.*.*DNS1=114.114.114.114控制台执行 nmcli c reload1.3 创立普通用户useradd ###(用户名)usermod -aG docker ###(用户名)passwd ###vi /etc/sudoers找到这一行:"root ALL=(ALL) ALL",在上面增加"xxx ALL=(ALL) ALL"(这里的xxx是你的用户名)2.虚拟机环境筹备2.1 配置hosts文件批改/etc/hosts文件,退出以下 IP name2.2docker装置yum config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoyum install -y --setopt=obsoletes=0 docker-ce-18.06.1.ce-3.el7systemctl start dockersystemctl enable docker2.3更换docker仓库# 此处批改为中科大仓库vi /etc/docker/daemon.json"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]2.4 敞开selinux和swapsed -i '/^SELINUX/s/enforcing/disabled/' /etc/selinux/configsed -i 's/.*swap.*/#&/' /etc/fstab2.5敞开防火墙systemctl stop firewalld.servicesystemctl disable firewalld.service2.6同步时区timedatectl set-timezone Asia/Shanghai3集群装置3.1 下载rkewget https://github.com/rancher/rke/releases/download/v1.1.4/rke_linux-amd64chmod +x rke_linux_amd643.2 开始配置cluster.yaml执行 ./rke_linux_amd64 config[+] Cluster Level SSH Private Key Path [~/.ssh/id_rsa]: [+] Number of Hosts [1]: 主机数量[+] SSH Address of host (1) [none]: ip地址[+] SSH Port of host (1) [22]: 端口[+] SSH Private Key Path of host (ip地址) [none]: [-] You have entered empty SSH key path, trying fetch from SSH key parameter[+] SSH Private Key of host (ip地址) [none]: [-] You have entered empty SSH key, defaulting to cluster level SSH key: ~/.ssh/id_rsa[+] SSH User of host (ip地址) [ubuntu]: 用户名[+] Is host (ip地址) a Control Plane host (y/n)? [y]: 管制立体[+] Is host (ip地址) a Worker host (y/n)? [n]: 工作节点[+] Is host (ip地址) an etcd host (y/n)? [n]: etcd服务[+] Override Hostname of host (ip地址) [none]: 重命名节点[+] Internal IP of host (ip地址) [none]: [+] Docker socket path on host (ip地址) [/var/run/docker.sock]: [+] Network Plugin Type (flannel, calico, weave, canal) [canal]: calico(网络插件抉择)[+] Authentication Strategy [x509]: [+] Authorization Mode (rbac, none) [rbac]: [+] Kubernetes Docker image [rancher/hyperkube:v1.18.6-rancher1]: [+] Cluster domain [cluster.local]: [+] Service Cluster IP Range [10.43.0.0/16]: [+] Enable PodSecurityPolicy [n]: [+] Cluster Network CIDR [10.42.0.0/16]: [+] Cluster DNS Service IP [10.43.0.10]: [+] Add addon manifest URLs or YAML files [no]:3.3 初始化集群至实现./rke_linux_amd64 upmv kube_config_cluster.yml .kube/config3.4 装置kubectl工具cat > /etc/yum.repos.d/kubernetes.repo << END[kubernetes]name = kubernetesbaseurl = https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64gpgchek = 1gpgkey = https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpgenable = 1ENDyum install kubectl-1.18.63.5 装置实现

July 30, 2020 · 2 min · jiezi

关于docker:Mac使用Parallels-Desktop14虚拟机win10安装Docker开启VTXAMDv

window下载Docker地址:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ 应用Parallels Desktop虚拟机WIN10装置实现Docker后,提醒须要开启VT-X/AMD-v: Error with pre-create check: "This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory"解释办法1.在win10敞开状态下,配置--硬件--CPU与内存--高级设置--勾选启动nested虚拟化/PMU虚拟化 2.从新关上Docker后,发现还是运行不了,短少boot2docker,但有提醒从新下载,可手动下载后,替换到提醒地址(C:UsersAsen.dockermachinecacheboot2docker.iso) Running pre-create checks...(default) Image cache directory does not exist, creating it at C:\Users\Asen\.docker\machine\cache...(default) No default Boot2Docker ISO found locally, downloading the latest release...(default) Latest release for github.com/boot2docker/boot2docker is v19.03.12(default) Downloading C:\Users\Asen\.docker\machine\cache\boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v19.03.12/boot2docker.iso...下载地址:https://github.com/boot2docke...或等主动下载好即可 最初装置胜利

July 29, 2020 · 1 min · jiezi

关于docker:模块二-Kubernetes集群搭建及命令行工具使用

1、硬件环境筹备筹备三台虚构服务器(可采纳VMware Workstation或者VirtualBox)操作系统要求 CentOS 版本7.5~7.8,倡议7.8http://mirrors.163.com/centos/7.8.2003/购买三台云云主机(CentOS 版本7.6)配置要求:不低于2U/4G、硬盘不小于40GIP地址可自行布局、可能连贯互联网留神:虚拟机倡议采纳桥接或者NAT模式(配置DNS)2、零碎初始化敞开Selinux[root@k8s-m ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config[root@k8s-m ~]# setenforce 0敞开替换分区[root@k8s-m ~]# swapoff -a[root@k8s-m ~]# vim /etc/fstab清空Iptables规定、敞开防火墙并设置开机不启动[root@k8s-m ~]# iptables -F[root@k8s-m ~]# iptables -Z[root@k8s-m ~]# iptables -X[root@k8s-m ~]# iptables-save[root@k8s-m ~]# systemctl stop firewalld[root@k8s-m ~]# systemctl disable firewalld桥接的IPv4流量传递到iptables的链[root@k8s-m ~]# cat > /etc/sysctl.d/k8s.conf << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF[root@k8s-m ~]# sysctl --system配置主机名及本地DNS解析[root@k8s-m ~]# hostnamectl set-hostname k8s-master[root@k8s-m ~]# cat >> /etc/hosts << EOF192.168.X.61 k8s-master192.168.X.62 k8s-node1192.168.X.63 k8s-node2EOF配置工夫同步[root@k8s-m ~]# yum install ntpdate -y[root@k8s-m ~]# ntpdate time.windows.com3、k8s组件的装置在所有节点(master、node)装置(1)下载Docker的REPO文件并装置、设置、校验 ...

July 28, 2020 · 2 min · jiezi

关于docker:docker动态挂载

https://github.com/pushiqiang...

July 28, 2020 · 1 min · jiezi

关于docker:docker动态挂载

https://github.com/pushiqiang...

July 28, 2020 · 1 min · jiezi

关于docker:Docker简介及环境搭建

一、Docker的简介什么是Dockerdocker是一个开源的利用容器引擎,基于go语言开发并遵循了apache2.0协定开源。docker是一种容器技术,它能够对软件及其依赖进行标准化的打包;容器之间先对独立,基于容器运行的利用之间也是互相隔离的;并且容器之间是共享一个OS kernel的,充分利用服务器资源,容器能够运行在很多支流的操作系统之上。 容器和虚拟机的区别容器时在linux上运行,并与其它容器共享主机的内核,它运行一个独立的过程,不占用其它任何可执行文件的内存,十分轻量。虚拟机运行的是一个实现的操作系统,通过虚拟机管理程序对主机资源进行虚构拜访,相比之下须要的资源更多。 容器是app层面的隔离虚拟机是物理资源层面的隔离docker架构和底层技术简介docker实质就是宿主机的一个过程,docker是通过namespace实现资源隔离,通过cgroup实现资源限度,通过写时复制技术(copy-on-write)实现了高效的文件操作(相似虚拟机的磁盘比方调配500g并不是理论占用物理磁盘500g) 底层技术简介namespace名称空间namespace的六项隔离namepace零碎调用参数隔离内容UTSCLONE_NEWUTS主机名与域名IPCCLONE_NEWWIPC信号量、音讯队列和共享内存PIDCLONE_NEWPID过程编号NEWWORDCLONE_NEWNET网络设备、网络栈、端口等MOUNTCLONE_NEWNS挂载点(文件系统)USERCLONE_NEWUSER用户和用户组(3.8当前的内核才反对)control group控制组cgroup的性能资源限度:能够对工作应用的资源总额进行限度优先级调配:通过调配的cpu工夫片数量以及磁盘IO带宽大小,实际上相当于管制了工作运行优先级资源统计:能够统计零碎的资源使用量,如cpu时长,内存用量等工作管制:cgroup能够对工作执行挂起、复原等操作二、Docker的环境搭建CentOS装置docker返回官网下载页卸载docker及相干依赖sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine装置yum-utils工具包sudo yum install -y yum-utils增加docker仓库sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo装置最新版docker引擎(社区版)sudo yum install docker-ce docker-ce-cli containerd.io装置指定版本的docker引擎#查问docker版本,版本从高到低排序yum list docker-ce --showduplicates | sort -r#装置指定版本的docker,替换<VERSION_STRING>即可sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io启动dockersudo systemctl start docker查看docker版本sudo docker version 测验docker引擎被胜利装置sudo docker run hello-world 三、Docker的镜像、容器和仓库docker基于linux内核空间,在根底镜像的根底上一层层构建出用户镜像。容器是镜像的运行实例。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包含运行应用程序所须要的所有内容蕴含代码,运行工夫,库、环境变量、和配置文件。 Docker image镜像Docker镜像是什么docker镜像就是一个只读模板,比方,一个镜像能够蕴含一个残缺的centos,外面仅装置apache或用户的其余利用,镜像能够用来创立docker容器。 文件(root filesystem)和meta data的汇合image是分层的,并且每一层都能够增加、批改、删除文件,成为一个新的image不同的image能够共享雷同的layerimage自身是read-only只读的Docker镜像相干命令查看本地已有的镜像列表docker image lsdocker images ...

July 26, 2020 · 1 min · jiezi

关于docker:Docker基础

1、LXC 依赖什么技术实现容器化?次要依赖:Namespace,cgroups,Capbility、SELinux、Chroots,UnionFS、IPTABLES等。Linux底层的容器化,次要依赖两个内核性能来维持。命名空间和cgroup。 通过Namespace实现对各种资源的隔离(比方隔离pid,两个不同的命名空间之前,无奈相互查看到pid)【通过命名空间,并不能达到KVM/虚拟化那样的齐全资源隔离。】通过cgroups实现资源限度/管制/配额,cpu,内存,网络等计算资源进行管制。(比方限度某个过程的cpu应用下限)Capability与权限管制相干,SELinux做平安隔离,IPTABLES实现端口映射和NAT(比方容器间相互拜访等)。 chroot(pivot_root) 零碎级别切换rootfs,目录隔离。UnionFS 和Docker镜像分层相干,能够将相干层合并挂载。 参考:[lxc] https://linuxcontainers.org/lxc/introduction/[lxc] https://www.cnblogs.com/kinwin/archive/2013/01/14/2859393.html[chroot pivot_root] https://www.jianshu.com/p/46791cbbb48ahttps://www.cnblogs.com/feisky/p/4105739.htmlhttp://www.178linux.com/104355 2、Docker 底层应用了什么技术?根本架构如何? runc是什么? 2.1、Docker底层技术晚期Docker也是用LXC(Linux Container)做底层,所以LXC中应用到的技术,Docker根本也都应用了。 namespace,cgroup,chroot,UnionFS都用到了。【前两个是内核个性】 namespace:用于资源隔离,通过应用独立的namespace来实现过程隔离,网络隔离,挂载隔离(文件隔离)等。cgroup:用于资源限度,对一组过程的cpu/内存/网络/IO等资源进行调配限度。UnionFS:AUFS是一种联结文件系统(UnionFS),能够将多个目录合并 再mount到一个目录上。DockerFile 镜像分层构造具体就是利用了AUFS的个性。每一层都是一个目录。镜像的构建过程能够简略了解为将多个目录进行合并【Docker反对泛滥UnionFS,AUFS只是其中一种。】参考:[namespace] https://coolshell.cn/articles/17010.html[cgroup] https://coolshell.cn/articles/17049.html[aufs]  https://coolshell.cn/articles/17061.htmlhttps://segmentfault.com/a/1190000016357628http://dockone.io/article/2941 2.2、docker基础架构:Docker 是一种软件平台,是容器的操作系统,在基础设施和宿主操作系统之上。能够治理、管制容器。【Docker由服务端和客户端组成,这里Docker指的是Docker Deamon 或者说服务端/Docker守护过程】从Docker本身来看,次要分为docker守护过程(服务端),REST API,和docker CLI(客户端)。客户端通过API连贯服务端,服务端创立并治理如下性能: 存储管理(data volumes)网络管理(docker network)容器运行时(containered)镜像相干(eg: image build. Etc.)换一个角度来看(将存储和网络临时疏忽),就能够更分明看清docker的架构: docker守护过程管制治理容器、同时也治理镜像和仓库。docker CLI(客户端)应用命令和守护过程交互。【docker命令行能够近程操控服务端】 参考:https://docs.docker.com/get-started/overview/ 2.3、其余常识Docker --> containerd --> docker shim --> runC(libcontainer):containerd是Docker的容器运行时(rumtime) https://containerd.io/【containerd一个残缺的运行时,能够独立运行。不依赖docker deamon,应用grpc与下层交互。【次要负责镜像治理(镜像、元信息等)、容器执行(调用最终运行时组件执行) runC是依照OCI进行的一个容器运行时的具体实现。 https://github.com/opencontainers/runc【刚开始用的libcontainer,起初将其移交给OCI组织,当初是runc的子项目。】【同时,runc是在libcontainer的根底上进化来的,而且后续会用runc代替前者作为容器的runtime】参考:https://book.51cto.com/art/201710/554421.htm

July 26, 2020 · 1 min · jiezi

关于docker:轻量级日志系统Loki原理简介和使用

前言这篇文章应敌人的要求,让写一篇loki日志零碎,咱定责无旁贷 肯定要好好写 开干! 事实中的需要公司的容器云运行的利用或某一个节点呈现了问题,解决的思路 问题首先被prometheus监控 1、metric是来阐明以后或者历史达到了某个值 2、alert设置metric达到某个特定的基数触发了告警 仅仅这些日志是不可能解决问题的 还须要看下利用的日志 k8s的根本单位是pod pod把日志输入到stdout和stderr 当某个pod的内存变得很大 触发了咱们的alert 这个时候管理员 去页面查问确认是哪个pod有问题 而后要确认pod内存变大的起因 咱们还须要去查问pod的日志 如果没有日志零碎 那么咱们就须要到页面或者应用命令进行查问了 如果这个时候利用挂掉了 那么就没有方法再查问到相干日志了 解决该需要可供选择的计划ELK劣势: 1、功能丰富,容许简单的操作 劣势: 1、支流的ELK(全文检索)或者EFK比拟重 2、ES简单的搜寻性能很多都用不上 规模简单,资源占用高,操作苦难 大多数查问只关注肯定工夫范畴和一些简略的参数(如host、service等) 3、Kibana和Grafana之间切换,影响用户体验 4、倒排索引的切分和共享的老本较高 Loki1、最小化度量和日志的切换老本 有助于缩小异样事件的响应工夫和进步用户的体验 2、在查询语言的易操作性和复杂性之间能够达到一个衡量 3、更具老本效益 loki组件介绍Promtail用来将容器日志发送到 Loki 或者 Grafana 服务上的日志收集工具该工具次要包含发现采集指标以及给日志流增加上 Label 标签 而后发送给 LokiPromtail 的服务发现是基于 Prometheus 的服务发现机制实现的Loki受 Prometheus 启发的能够程度扩大、高可用以及反对多租户的日志聚合零碎应用了和 Prometheus 雷同的服务发现机制,将标签增加到日志流中而不是构建全文索引从 Promtail 接管到的日志和利用的 metrics 指标就具备雷同的标签集不仅提供了更好的日志和指标之间的上下文切换,还防止了对日志进行全文索引Grafana一个用于监控和可视化观测的开源平台反对十分丰盛的数据源在 Loki 技术栈中它专门用来展现来自 Prometheus 和 Loki 等数据源的工夫序列数据可进行查问、可视化、报警等操作能够用于创立、摸索和共享数据 Dashboard激励数据驱动Loki架构 1、 Loki应用了和prometheus一样的标签来作为索引 通过标签既能够查问日志的内容也能够查问到监控的数据 ...

July 26, 2020 · 2 min · jiezi

关于docker:轻量级日志系统Loki原理简介和使用

前言这篇文章应敌人的要求,让写一篇loki日志零碎,咱定责无旁贷 肯定要好好写 开干! 事实中的需要公司的容器云运行的利用或某一个节点呈现了问题,解决的思路 问题首先被prometheus监控 1、metric是来阐明以后或者历史达到了某个值 2、alert设置metric达到某个特定的基数触发了告警 仅仅这些日志是不可能解决问题的 还须要看下利用的日志 k8s的根本单位是pod pod把日志输入到stdout和stderr 当某个pod的内存变得很大 触发了咱们的alert 这个时候管理员 去页面查问确认是哪个pod有问题 而后要确认pod内存变大的起因 咱们还须要去查问pod的日志 如果没有日志零碎 那么咱们就须要到页面或者应用命令进行查问了 如果这个时候利用挂掉了 那么就没有方法再查问到相干日志了 解决该需要可供选择的计划ELK劣势: 1、功能丰富,容许简单的操作 劣势: 1、支流的ELK(全文检索)或者EFK比拟重 2、ES简单的搜寻性能很多都用不上 规模简单,资源占用高,操作苦难 大多数查问只关注肯定工夫范畴和一些简略的参数(如host、service等) 3、Kibana和Grafana之间切换,影响用户体验 4、倒排索引的切分和共享的老本较高 Loki1、最小化度量和日志的切换老本 有助于缩小异样事件的响应工夫和进步用户的体验 2、在查询语言的易操作性和复杂性之间能够达到一个衡量 3、更具老本效益 loki组件介绍Promtail用来将容器日志发送到 Loki 或者 Grafana 服务上的日志收集工具该工具次要包含发现采集指标以及给日志流增加上 Label 标签 而后发送给 LokiPromtail 的服务发现是基于 Prometheus 的服务发现机制实现的Loki受 Prometheus 启发的能够程度扩大、高可用以及反对多租户的日志聚合零碎应用了和 Prometheus 雷同的服务发现机制,将标签增加到日志流中而不是构建全文索引从 Promtail 接管到的日志和利用的 metrics 指标就具备雷同的标签集不仅提供了更好的日志和指标之间的上下文切换,还防止了对日志进行全文索引Grafana一个用于监控和可视化观测的开源平台反对十分丰盛的数据源在 Loki 技术栈中它专门用来展现来自 Prometheus 和 Loki 等数据源的工夫序列数据可进行查问、可视化、报警等操作能够用于创立、摸索和共享数据 Dashboard激励数据驱动Loki架构 1、 Loki应用了和prometheus一样的标签来作为索引 通过标签既能够查问日志的内容也能够查问到监控的数据 ...

July 26, 2020 · 2 min · jiezi

关于docker:用-Docker-极速搭建-Linux-环境-Samba-文件共享服务器

Samba 是 Linux 环境下一个开源的文件共享服务软件,反对跨零碎的文件网络共享。装置比较简单,在各个 Linux 发行版中都通过各自的包治理命令就能很快装置好,但后续的用户和权限的配置管理还是比拟麻烦。 开始之前,先说说我搭建这个 Samba 服务的目标。我集体有两台工作用的电脑: Mac 和 Ubuntu,日常应用中时常有些文件转移的须要,平时都是用 U 盘来解决,但还是感觉插拔不太不便。特地是在 USB 口占满时。我抉择在 Ubuntu 上搭建一个 Samba 服务,通过一个共享的目录来实现两台电脑文件的直达。 用 Docker 实现 Samba 的待建比较简单,首先是到 dockerhub 上搜寻可用的 Samba 镜像。依据下载量和 Star 数我抉择了 dperson/samba,接下来就是执行如下的命令,就启动了一个可用的 Samba 服务: docker run -it --rm \ --name samba \ -p 139:139 -p 445:445 \ -v /home/zzxworld/Public:/mount dperson/samba \ -u "zzxworld;123456" \ -s "zzxworld;/mount/;yes;no;yes;all;all;all" \ -w "WORKGROUP" \ -g "force user=zzxworld" \ -g "guest account=zzxworld"略微解释一下,因为我只是集体应用,所以这里创立的是一个能够匿名拜访并且可读可写的文件共享服务。其中次要的配置项是: -s "zzxworld;/mount/;yes;no;yes;all;all;all",这是一个用分号隔开的共享配置参数,按程序各个参数的阐明如下:<name;/path>[;browse;readonly;guest;users;admins;writelist;comment]。残缺的配置阐明请参阅下面镜像的链接,这里就不重述了。 ...

July 25, 2020 · 1 min · jiezi

关于docker:用-Docker-极速搭建-Linux-环境-Samba-文件共享服务器

Samba 是 Linux 环境下一个开源的文件共享服务软件,反对跨零碎的文件网络共享。装置比较简单,在各个 Linux 发行版中都通过各自的包治理命令就能很快装置好,但后续的用户和权限的配置管理还是比拟麻烦。 开始之前,先说说我搭建这个 Samba 服务的目标。我集体有两台工作用的电脑: Mac 和 Ubuntu,日常应用中时常有些文件转移的须要,平时都是用 U 盘来解决,但还是感觉插拔不太不便。特地是在 USB 口占满时。我抉择在 Ubuntu 上搭建一个 Samba 服务,通过一个共享的目录来实现两台电脑文件的直达。 用 Docker 实现 Samba 的待建比较简单,首先是到 dockerhub 上搜寻可用的 Samba 镜像。依据下载量和 Star 数我抉择了 dperson/samba,接下来就是执行如下的命令,就启动了一个可用的 Samba 服务: docker run -it --rm \ --name samba \ -p 139:139 -p 445:445 \ -v /home/zzxworld/Public:/mount dperson/samba \ -u "zzxworld;123456" \ -s "zzxworld;/mount/;yes;no;yes;all;all;all" \ -w "WORKGROUP" \ -g "force user=zzxworld" \ -g "guest account=zzxworld"略微解释一下,因为我只是集体应用,所以这里创立的是一个能够匿名拜访并且可读可写的文件共享服务。其中次要的配置项是: -s "zzxworld;/mount/;yes;no;yes;all;all;all",这是一个用分号隔开的共享配置参数,按程序各个参数的阐明如下:<name;/path>[;browse;readonly;guest;users;admins;writelist;comment]。残缺的配置阐明请参阅下面镜像的链接,这里就不重述了。 ...

July 25, 2020 · 1 min · jiezi

关于docker:Docker系列1最小jre环境下的springboot工程helloworld

要做的事件是:1装置docker;2启动一个虚拟机;3跑一个spring-boot工程。1、windows上docker装置,通通下一步,搞定。2、下载包,解压重命名,删除不必要文件再打包 $ tar -zxvf jre-8u261-linux-x64.tar.gz $ mv jre1.8.0\_261 jre1.8 $ cd jre1.8$ rm -rf COPYRIGHT LICENSE README release THIRDPARTYLICENSEREADME-JAVAFX.txtTHIRDPARTYLICENSEREADME.txt Welcome.htmlrm -rf ./lib/plugin.jar \\./lib/ext/jfxrt.jar \\./bin/javaws \\./lib/javaws.jar \\./lib/desktop \\./plugin \\./lib/deploy\* \\./lib/\*javafx\* \\./lib/\*jfx\* \\./lib/amd64/libdecora\_sse.so \\./lib/amd64/libprism\_\*.so \\./lib/amd64/libfxplugins.so \\./lib/amd64/libglass.so \\./lib/amd64/libgstreamer-lite.so \\./lib/amd64/libjavafx\*.so \\./lib/amd64/libjfx\*.so $ tar zcvf jre1.8.tar.gz \*3、编写Dockerfile文件 (文件名就叫Dockerfile没有后缀) \# using alpine-glibc instead of alpine is mainly because JDK relies on glibcFROM docker.io/jeanblanchard/alpine-glibc\# authorMAINTAINER scc <wuyeliang>\# A streamlined jreADD jre1.8.tar.gz /usr/java/jdk/\# set envENV JAVA\_HOME /usr/java/jdkENV PATH ${PATH}:${JAVA\_HOME}/bin\# run container with base path:/optWORKDIR /opt4、 $ docker build -t jre8:1.0 . (imageName=jre8 tag=1.0 留神有一个空格和一个点,这个点是通知docker镜像放到docker门路治理,而不是机器门路)5、启动这个image $ docker run --name myjre -p 8080:8080 -d jre86、进入容器 170cf11bc43f是容器iddocker exec -it -u root 170cf11bc43f sh7、在容器外面,能够施行$jave -version,有提醒侧示意ok,有时候会呈现没有权限的状况,须要给权限。 $ chmod 777 java到这里java环境ok了。8、上传jar文件,本机复制文件到容器中docker cp spring-boot-01.jar ba8a4972cf06:/usr/share/java-pro/spring-boot-01.jar9、启动这个spring-boot-01.jar ...

July 24, 2020 · 1 min · jiezi

关于docker:优雅地激活Dockerfile中的virtualenv

由Itamar Turner-Trauring 最初更新2020年6月25日,最后创立于2019年3月20日 在Docker映像中打包Python应用程序时,通常会应用virtualenv。例如,您可能正在执行多阶段构建以获取较小的镜像。 因为您正在应用virtualenv,因而须要激活它-然而,如果您只是开始应用 Dockerfile,那么童稚的办法将不起作用。即便您的确晓得该怎么做,通常的办法也是重复性的,因而容易出错。 有一种激活virtualenv的简略办法,我将在本文中进行演示。 然而首先,咱们将介绍其余一些不太优雅(或损坏!)的办法。 留神:在所探讨的主题之外,本文中的Dockerfile并不是最佳实际的示例,因为减少的复杂性将使本文的重点难以了解。因而,如果要应用Docker在生产环境中运行Python应用程序,能够采纳以下两种办法来利用最佳实际: 如果您想本人动手做:具体的清单,包含示例和参考如果您心愿尽快进行无效的设置:一个模板,其中已为您施行了最佳实际有效的办法如果您只是将shell脚本自觉地转换为Dockerfile,则会失去看起来正确但实际上已损坏的内容: FROM python:3.8-slim-busterRUN python3 -m venv /opt/venv# This is wrong!RUN . /opt/venv/bin/activate# Install dependencies:COPY requirements.txt .RUN pip install -r requirements.txt# Run the application:COPY myapp.py .CMD ["python", "myapp.py"]它的中断有两个不同的起因: RUNDockerfile中的每一行都是一个不同的过程。activate独自运行RUN不会影响当前的RUN通话。出于所有理论目标,这是无人操作的。当您运行生成的Docker映像时,它将运行CMD-也将不会在virtualenv外部运行,因为它也不受RUN过程的影响。最无效的反复办法一种解决方案是显式应用virtualenv中二进制文件的门路。在这种状况下,咱们只有两次反复,然而在更简单的状况下,您须要一遍又一遍。 除了不足可读性之外,反复也是谬误的本源。当您向Python程序增加更多调用时,很容易遗记增加魔术/opt/venv/bin/前缀。 它将(大部分)工作: FROM python:3.8-slim-busterRUN python3 -m venv /opt/venv# Install dependencies:COPY requirements.txt .RUN /opt/venv/bin/pip install -r requirements.txt# Run the application:COPY myapp.py .CMD ["/opt/venv/bin/python", "myapp.py"]惟一须要留神的是,如果任何Python过程启动了子过程,则该子过程将_不会_在virtualenv中运行。 齐全无效的反复办法您能够通过别离别离独自激活virtualenv RUN和:来解决此问题CMD: FROM python:3.8-slim-busterRUN python3 -m venv /opt/venv# Install dependencies:COPY requirements.txt .RUN . /opt/venv/bin/activate && pip install -r requirements.txt# Run the application:COPY myapp.py .CMD . /opt/venv/bin/activate && exec python myapp.py(在exec那里能够失去正确的信号处理。) ...

July 24, 2020 · 1 min · jiezi

关于docker:Docker-registry-GC-原理分析

作者:木子(才云)编辑:Bach(才云) 校对:bot(才云) 此前,《Docker 容器镜像是怎么炼成的》一文简略提到了容器镜像的一些常识,并介绍了镜像在 registry 中存储的目录构造。本文从文件系统层面剖析了 registry GC 的原理,相比源码剖析更加直观。 部署 registry 容器 首先咱们在本地部署一个 registry 容器,再应用 skopeo 工具代替 Docker 命令行客户端进行 copy 镜像和 delete 镜像。 自签 SSL 证书 这样咱们在应用 skopeo 时不必加额定参数。 信赖证书,依据不同的发行版抉择相应的门路和命令行即可。 创立明码 auth 认证 auth.htpasswd 文件 因为 push 镜像和 delete 镜像是通过 HTTP 申请 registry 的 API 实现的,每个申请都须要一个 token 能力实现操作,这个 token 则须要应用 AUTH 文件进行鉴权。咱们应用 htpasswd 来生成一个明文的用户、明码即可。 启动 registry 容器,docker run! -v /var/lib/registry:/var/lib/registry ,将本地的存储目录挂载到容器内的 registry 存储目录下。-v pwd/certs:/certs,将生成的 SSL 证书挂载到容器内。-e REGISTRY_STORAGE_DELETE_ENABLED=true,增加该参数能力进行 DELETE 镜像操作,不然的话会提醒 Error in deleting repository in a private registry V2 #1573 这种谬误。 ...

July 23, 2020 · 4 min · jiezi

关于docker:dockerswarm环境下找不到内核参数netipv4vsexpirenodestconn的错误解决办法

问题形容在最新的docker集群上搭建docker swarm集群之后,每个节点的docker服务都呈现了找不到内核参数net.ipv4.vs.expire_nodest_conn的谬误。 在任意节点上,应用service docker status -l或systemctl status docker -l或cat /var/log/message | grep dockerd | grep error,能够看到以下谬误: ... level=error msg="error reading the kernel parameter net.ipv4.vs.expire_nodest_conn" error="open /proc/sys/net/ipv4/vs/expire_nodest_conn: no such file or directory"环境如下:3台CentOS7节点,OS版本:CentOS Linux release 7.4.1708 (Core) ,内核版本:3.10.0-693.el7.x86_64docker版本:19.03.12以前老点的docker版本仿佛不会报这个错。。。解决办法呈现这个起因是因为宿主机没有加载ip_vs模块。在各个节点加载ip_vs模块后重启docker即可。 modprobe ip_vsservice docker restart再次查看docker日志service docker status -l,发现错误曾经隐没。

July 22, 2020 · 1 min · jiezi

关于docker:Docker-第一次上手

 Docker 第一次上手 引言DevOps/开发运维/不懂运维和部署的前端开发我的项目理论须要,安稳降级构建工具 装置Docker去看官网就好了  波及的几个命令docker images![docker images](./assets/docker-images.jpg) docker build -t 指定image的repository 和 tag, 这两项的含意能够看`docker images`命令之后的输入后果,在docker build时,能够同时指定多个`-t`选项docker run -v 挂载宿主机目录/本地目录到镜像中 docker run``` bash docker run [options] image  [command] [args] ```  构建镜像/ Dockerfile 先看看Dockerfile的一个示例:``` dockerfile  指定以后镜像的根底镜像,上面这行指定以后以node:8-slim构建,这个镜像是官网仓库提供的,FROM node:10-slim  指定镜像的工作目录WORKDIR /usr/local/workdir  拷贝文件 将from拷贝到 /usr/local/workdirCOPY from /usr/local/workdir  构建镜像时,在镜像内执行的指令RUN npm i -g . --registry=https://registry.npm.taobao.org/  指定在容器内运行的命令CMD ["ls"] ``` 除了下面示例中的几个罕用指令,Dockerfile中还有上面这些: - EXPOSE - ENV - ADD - ENTRYPOINT - VOLUME - USER - ONBUILD 对于如何写好一个Dockerfile的倡议,能够参考[Best practices for writing Dockerfiles](https://docs.docker.com/devel..._best-practices/)  遇到的几个问题 1. 镜像中的文件不会被更改`docker run`命令不会批改镜像中的文件,当下次执行`docker run`的时候,上次的后果不会保留。  2. 构建镜像会有缓存,如果在构建过程中,某一步骤失败,则它后面的步骤会被缓存下下来。在下次从新构建时,这些步骤不再执行。 ![docker-build-cache](./assets/docker-build-cache.jpg)  3. container 和 image的关系image能够看作一个特定环境的文件的组合;image是动态的,能够在不同的机器和操作系统之间来回转移; container则是这个环境的具体执行实例;contaier是动静的,跟以后环境密切相关;当某个机器启动一个image时,就产生了一个container。

July 21, 2020 · 1 min · jiezi

关于docker:用URLOS一键安装drupal内容管理系统

最近看到很多小伙伴都在问,drupal内容管理系统怎么装置?drupal内容管理系统装置步骤是什么?明天没,我来介绍一下drupal内容管理系统在linux下的装置教程。 我将采纳最简略的装置办法,通过URLOS的一键装置命令来疾速装置drupal内容管理系统。URLOS是什么,在这里就不多做介绍了,感兴趣的能够百度URLOS官网理解一下。 首先,咱们关上drupal内容管理系统利用页面,获取一键装置命令。点这里获取:[一键装置drupal内容管理系统] 为不便大家应用,我把一键装置命令收回来: export domains="website-059378.com"export ports="80 8080"export dbPassword="dbPass1^8Ajl[:LTuz" export sftpPassword="sftpPass1^u5aBf9JYHu" export appId="73"export nodeId="1"curl -O https://www.urlos.com/uai && sh uai各参数阐明: domains:要绑定的域名,请自行批改;ports:要绑定的端口号,http用80和8080,如用https则加上443即可(可主动申请ssl证书);dbPassword:数据库明码,请自行批改; sftpPassword:SFTP明码(如不须要,可删除该行);appId:drupal内容管理系统的利用ID是73,不必改; nodeId:主机id,默认1即可,不必改;把命令全副复制,ssh登录主机,粘贴到到命令行中即可开始装置: 装置实现之后,关上“http://主机外网ip:9968”来拜访URLOS面板,留神在阿里云平安组中凋谢9966,9967,9968,9969,9970端口(入站规定),当然80和443端口也须要凋谢啊! 登录URLOS面板后的第一件事,就是查看数据库信息,点开左上角的“网站”菜单: 而后关上对应网站服务的文件治理: 查看“database-info.json”这个文件,这就是数据库相干信息了: 最初,咱们应用域名关上drupal内容管理系统页面,依照步骤实现drupal内容管理系统初始化装置即可。 看吧,基于URLOS一键装置drupal内容管理系统就是这么方便快捷!

July 21, 2020 · 1 min · jiezi

关于SegmentFault:深入源码彻底搞懂-Docker-镜像

举荐联合我之前的文章一起食用 万字长文:彻底搞懂容器镜像构建

July 20, 2020 · 1 min · jiezi

关于docker:Ceph实现DockerSwarm集群共享存储的尝试

一、背景与论断在一个四节点的Docker Swarm集群上,尝试应用Ceph作为Docker集群的共享存储,解决有状态服务在分布式环境下的数据存储问题。 通过尝试,胜利应用CephFS实现了多个Docker节点之间的存储共享。但同时留神到,对于小规模Docker集群并且运维老本无限的场景,Ceph这样的分布式对象存储系统依然显得有点重了,本文的4节点docker swarm集群上,在Ceph集群与Portainer-Agent(docker运维工具)部署之后,容器数量达到了30个。因而最终决定采纳其余计划实现小规模docker集群的共享存储,比方NFS。 但Ceph作为一个高可用高性能的分布式对象/块/文件存储系统,在其余场景还是有应用价值的。 本文次要记述Ceph的搭建过程以及如何用cephfs实现docker swarm集群的共享存储。其余诸如原理机制,运维材料等请参考社区文档。 Ceph对外提供了三种存储接口,别离是对象存储 RGW(rados gateway)、块存储 RBD(rados block device) 和文件存储 CephFS。RGW是RestAPI,docker的数据卷无奈间接应用。从性能角度思考,应该是RBD最快,但本文应用的Ceph版本与应用RBD做共享存储所须要的中间件RexRay貌似存在版本不兼容问题,最终没能胜利。。。 最终本文应用了CephFS来实现docker swarm集群的共享存储。 二、版本与相干材料本文搭建Ceph应用了目前社区文档举荐的装置工具cephadm,装置的版本为octopus。四个节点的操作系统均为CentOS7。 社区文档入口:https://docs.ceph.com/docs/master/中文社区文档入口:http://docs.ceph.org.cn/留神,编写本文时,中文社区文档并非最新版本,比方社区文档中目前倡议应用的装置工具cephadm在中文社区文档中就没有相干材料。三、Ceph角色布局NoiphostnameOSD盘Ceph角色1172.17.13.1manager01.xxx.com/dev/sdbmon,osd,ceph-mds,mgr2172.17.13.2manager02.xxx.com/dev/sdbmon,osd,ceph-mds3172.17.13.3worker01.xxx.com/dev/sdbmon,osd,ceph-mds4172.17.13.4worker02.xxx.com/dev/sdbmon,osd,ceph-mds,mgr,cephadm,NTP服务器Ceph用于存储数据的服务OSD须要应用洁净的磁盘,要求如下: 设施没有分区设施不得具备任何LVM状态设施没有挂载设施不蕴含任何文件系统设施不蕴含ceph bluestore osd设施必须大于5G也就是给节点减少一块新磁盘之后,只有linux能辨认到即可,不要做分区/格式化/mount等操作。 四、各节点环境筹备工作4.1 防火墙与Selinux提前将Ceph相干防火墙规定设置好。或间接敞开防火墙。 firewall-cmd --permanent --zone=public --add-service=httpfirewall-cmd --permanent --zone=public --add-service=httpsfirewall-cmd --permanent --zone=public --add-service=cephfirewall-cmd --permanent --zone=public --add-service=ceph-monfirewall-cmd --reloadfirewall-cmd --zone=public --list-servicesfirewall-cmd --zone=public --add-port=3300/tcp --permanentfirewall-cmd --zone=public --add-port=3300/udp --permanentfirewall-cmd --zone=public --add-port=6789/tcp --permanentfirewall-cmd --zone=public --add-port=6800-7300/tcp --permanentfirewall-cmd --zone=public --add-port=8443/tcp --permanentfirewall-cmd --reloadfirewall-cmd --zone=public --list-portsCeph集群在应用中最好禁用Selinux。在各个节点上以root用户vi /etc/selinux/config,批改: #SELINUX=enforcingSELINUX=disabled而后执行setenforce 0 4.2 各节点增加epel-release资源包从阿里云镜像获取/etc/yum.repos.d/epel.repo,如下: wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo4.3 各节点装置依赖库填坑的过程中尝试过不同的搭建计划,这里有些依赖库可能不是必须的。。。 ...

July 19, 2020 · 5 min · jiezi

关于docker:K8S-生态周报-Docker-v190312-发布

「K8S 生态周报」内容次要蕴含我所接触到的 K8S 生态相干的每周值得举荐的一些信息。欢送订阅知乎专栏「k8s生态」。Docker CE v19.03.12 公布在 Docker v19.03.11 公布时,我在「K8S 生态周报| 简直影响所有 k8s 集群的破绽」 一文中曾介绍过,该版本次要是为了修复一个通过应用 IPv6 RA 音讯进行地址坑骗的安全漏洞 CVE-2020-13401。 解决办法也很简略,间接将 /proc/sys/net/ipv6/conf/*/accept_ra 设置成 0 ,这样便可确保不接管 RA 音讯,从而防止蒙受攻打。 然而,在 v19.03.11 的修复中,当无奈禁用 RA 音讯时,会间接报错,导致 docker daemon 无奈启动 (比方在容器内的只读文件系统上)。所以此次 v19.03.12 的一个最次要修复,就是无奈禁用 RA 音讯时,只是会记录一条日志,而不是间接报错。 - return fmt.Errorf("libnetwork: Unable to disable IPv6 router advertisement: %v", err)+ logrus.WithError(err).Warn("unable to disable IPv6 router advertisement")对此版本感兴趣的小伙伴,能够间接更新。 containerd v1.3.5 公布此次 v1.3.5 版本,有可能是 v1.3.x 系列的最初一个版本了。此版本中次要是把主线中的一些修改给移植过去。比方 #4276 修改了镜像用量的计算错误;#4278 当遇到一些谬误时候,清理掉调配的资源;#4327 shim v2 runc 传递了 options.Root;此版本也将很快集成进 Docker 中。 ...

July 18, 2020 · 1 min · jiezi

关于docker:Docker-将-sql-文件导入-mysql

这里Docker MySQL容器名是:mysql56要操作的sql文件是:backup.sql 查看MySQL容器名称docker ps拷贝sql文件到MySQL容器里docker cp backup.sql mysql56:/backup.sql进入MySQL容器docker exec -it mysql56 bash查看backup.sqlroot@mysql56:/lsbackup.sql ...执行sql导入mysql -uroot -p${you pwd} -D ${target database} < backup.sql实现

July 18, 2020 · 1 min · jiezi

关于docker:Docker第2部分Docker术语

原文作者:Jeff Hale原文地址:https://towardsdatascience.co... 翻译:付新圆 在本系列的第1局部《Docker-第1局部:什么是Docker?》咱们探讨了Docker容器的概念以及Docker容器的重要性,文章的最初咱们把Docker类比成了一个披萨,并把它拆解开来解释Docker容器的构造和用处。在本文中,将分享Docker生态系统中的罕用的术语。 遵循本系列第一篇文章中的食品主题,这里咱们将甜甜圈设想成一个Docker容器。 Docker生态系统术语为了不便大家了解,我将Docker术语分为两类:根底术语和进阶术语。 Docker 根底术语1.Docker平台Docker平台是 Docker的软件,可在任何Linux服务器上的容器中打包和运行应用程序。Docker平台捆绑了代码文件和依赖项,反对可移动性和可重复性来促成平台扩大。 2.Docker引擎Docker引擎是客户端服务器应用程序。Docker公司将Docker引擎分为两种产品。 Docker Community Edition(CE)是收费的,并且次要基于开源工具。Docker Enterprise 提供了附加的其余反对,治理和平安性能。 图:引擎让事件运行 3.Docker客户端Docker客户端是许多Docker用户与Docker交互的次要形式。应用 Docker命令行界面(CLI)时,请在终端中输出以docker结尾的命令,而后Docker客户端应用Docker API将命令发送到Docker Daemon。 图:Docker文档中的图表 4.Docker DaemoDocker Daemo是侦听Docker API申请的Docker服务器,治理映像、容器、网络和卷。 5.Docker卷Docker卷是存储应用程序耗费和创立的持久数据的最佳形式。在本系列的第5局部中,咱们将对Docker卷进行更多的探讨。 图:卷 6.Docker 注册表Docker注册表是存储Docker映像的近程地位,将图像推送到注册表并从注册表中提取图像,能够托管注册表或应用提供程序的注册表。例如,AWS和googlecloud都有注册。 7.Docker HubDocker Hub是Docker映像的最大注册表,也是默认注册表。您能够在Docker Hub上收费查找图片并存储图片。 图:轮毂和辐条 8.Docker 存储库Docker 存储库是具备雷同名称和不同标签的Docker图像的汇合,该标签是图像标识符。 通常,一个存储库具备同一映像的不同版本。例如,Python 是Docker Hub上最风行的官网Docker映像存储库的名称。Python:3.7-slim 指的是Python存储库中带有3.7-slim标签的图像版本。您能够将存储库或单个映像推送到注册表。 Docker 进阶术语接下来咱们看一下与扩大多个Docker容器无关的Docker术语,以下四个概念波及一次应用多个容器。 1.网络容器网络容器能够将Docker容器连贯在一起,连贯的Docker容器能够位于同一主机或多个主机上。无关Docker网络的更多信息,请参阅这篇文章。 图:Docker网络 2.Docker Compose Docker Compose是一种工具,可让您更轻松地运行须要多个Docker容器的应用程序。Docker Compose容许您将命令挪动到docker-compose.yml文件中以供重用。Docker Compose命令行界面(cli)使与多容器应用程序的交互变得更加容易。Docker Compose随您的Docker装置一起收费提供。 3.Docker SwarmDocker Swarm是用于协调容器部署的产品。Docker官网教程的第四局部介绍了Docker Swarm。 图:蜂群 4.Docker 服务Docker服务是分布式应用程序的不同局部。 服务实际上只是“生产中的容器”。一个服务仅运行一个映像,但它规定了映像的运行形式—应该应用什么端口,应该运行多少个容器正本,这样服务就有了它须要的容量,等等。扩大服务会更改运行该软件的容器实例的数量,从而在流程中为服务调配更多的计算资源。Docker服务容许您跨多个Docker Daemon扩大容器,并使Docker Swarms成为可能。 回顾以下用一行文字总结以帮忙你理清这十几个术语。 根本平台—使Docker容器成为可能的软件引擎—客户端服务器应用程序(CE或Enterprise)客户端—解决Docker CLI,以便您能够与守护程序进行通信Daemon—Docker服务器,治理要害内容卷—持久数据存储注册表—近程映像存储Docker Hub—默认和最大的Docker 注册表存储库—Docker图像的汇合,例如Alpine缩放比例网络—将容器连贯在一起撰写—节俭多容器应用程式的工夫Swarm—协调容器部署服务—生产中的集装箱因为咱们遵循食物的隐喻,所以咱们为引入了另一个相干术语:Kubernetes。 ...

July 17, 2020 · 1 min · jiezi

在腾讯云使用URLOS快速一键安装禅道项目管理系统

最近看到很多小伙伴都在问,禅道怎么装置?禅道装置步骤是什么?明天没,我来介绍一下禅道在linux下的装置教程。 我将采纳最简略的装置办法,通过URLOS的一键装置命令来疾速装置禅道。URLOS是什么,在这里就不多做介绍了,感兴趣的能够百度URLOS官网理解一下。 首先,咱们关上禅道利用页面,获取一键装置命令。点这里获取:一键装置禅道为不便大家应用,我把一键装置命令收回来: export domains="website-450697.com"export ports="80 8080"export dbPassword="dbPass1^=F:s6LyM15" export sftpPassword="sftpPass1^XoLm0)119u" export appId="56"export nodeId="1"curl -O https://www.urlos.com/uai && sh uai各参数阐明: domains:要绑定的域名,请自行批改;ports:要绑定的端口号,http用80和8080,如用https则加上443即可(可主动申请ssl证书);dbPassword:数据库明码,请自行批改; sftpPassword:SFTP明码(如不须要,可删除该行);appId:禅道的利用ID是56,不必改; nodeId:主机id,默认1即可,不必改;把命令全副复制,ssh登录主机,粘贴到到命令行中即可开始装置:装置实现之后,关上“http://主机外网ip:9968”来拜访URLOS面板,留神在腾讯云平安组中凋谢9966,9967,9968,9969,9970端口(入站规定),当然80和443端口也须要凋谢啊! 登录URLOS面板后的第一件事,就是查看数据库信息,点开左上角的“网站”菜单:而后关上对应网站服务的文件治理:查看“database-info.json”这个文件,这就是数据库相干信息了:最初,咱们应用域名关上禅道页面,依照步骤实现禅道初始化装置即可。 看吧,基于URLOS一键装置禅道就是这么方便快捷!

July 17, 2020 · 1 min · jiezi

docker-非root用户启动

docker非root用户启动容器须要执行以下命令,将docker退出用户组:sudo usermod -aG docker your_username 退出,而后从新登录,以便让权限失效。

July 16, 2020 · 1 min · jiezi

Dockerfile实践小提示

https://mengz.me/posts/docker... 在进行利用容器化的实际中,咱们能够应用多种形式来创立容器镜像,而应用Dockerfile是咱们最罕用的形式。而且在实现CI/CD Pipeline的过程中,应用Dockerfile来构建利用容器也是必须的。 本文不具体介绍Dockerfile的指令和写法,仅仅是在实践中积攒的一些写好一个Dockerfile的小提示,体现在一下几个方面: 缩小构建工夫减小镜像大小镜像可维护性反复构建一致性安全性减小构建工夫首先来看看上面这个Dockerfile FROM ubuntu:18.04COPY . /appRUN apt-get updateRUN apt-get -y install ssh vim openjdk-8-jdkCMD [“java”,”-jar”,”/app/target/app.jar”]要减小构建的工夫,那咱们能够例如Docker构建的缓存个性,尽量保留不常常扭转的层,而在Dockerfile的指令中, COPY和RUN都会产生新的层,而且缓存的无效是与命令的程序有关系的。 在下面的Dockerfile中,COPY . /app在RUN apt-get ...之前,而COPY是常常扭转的局部,所以每次构建都会到导致RUN apt-get ...缓存生效。 Tip-1 : 正当利用缓存,而执行命令的程序是会影响缓存的可用性的。 要减小构建工夫,另一方面是应该仅仅COPY须要的货色,对于下面这个Dockerfile的目标,应该仅仅须要COPY Java利用的jar文件。 Tip-2 : 构建过程中仅仅COPY须要的货色。 下面的Dockerfile对apt-get命令别离应用了两个RUN指令,会生成两个不同的层。 Tip-3 : 尽量合并最终镜像的层数。 还有对于这个示例,咱们最终是想要一个JRE环境来运行Java利用,因而能够抉择一个jre的镜像来作为根底镜像,这样不必花工夫再去装置jdk。 Tip-4 : 抉择适合的根底镜像 这样咱们能够把Dockerfile写成: FROM ubuntu:18.04RUN apt-get update \ && apt-get y install ssh vim openjdk-8-jdkCOPY target/app.jar /appCMD [“java”,”-jar”,”/app/app.jar”]减小镜像大小进一步,咱们如何尽量减小最终利用镜像的大小,来减速咱们的CI构建,以及减小镜像在网络上传输的效率。 在上例中,ssh, vim应该都是不必要的软件包,它们会咱用镜像的空间。 Tip-5 : 移除不必要的软件包装置(包含一些debug工具)。 其次,相似apt-get之类的零碎包管理工具会产生缓存数据,咱们也应该革除。 Tip-6 : 在应用零碎包管理工具装置软件包后清理缓存数据。 ...

July 15, 2020 · 2 min · jiezi

在阿里云上通过URLOS安装Discuz-Q

在阿里云上通过URLOS装置Discuz! Q 起因之前帮敌人装置Discuz! Q,用的是官网提供的办法。碰巧,明天又有一个敌人说想要装置一个Discuz! Q体验一下,索性就在阿里云上装置算了。 置信很多敌人都用过或据说过Discuz,应用过的敌人都晓得,他是一个国内老牌的社区零碎,10年前红得发紫,说到建社区必定都想到他。 最近呢,Discuz! Q曾经开始进入公测阶段,除了官网举荐的几种装置办法外,这里还有一种更加简单易行的装置办法,就是URLOS提供的Discuz! Q专用环境,一键装置,十分不便。上面我就在阿里云进行装置,在此记录一下。 装置话不多说,帮敌人购买的阿里云ECS(2核4G的配置)关上Discuz! Q专用环境,批改并复制一键装置命令,批改本人的域名、数据库明码和SFTP明码:复制命令,粘贴到ssh客户端中即可这一步抉择1,应用阿里云的线路来装置这一步,依据本人的数据盘地位来抉择,我敌人的这个主机没有额定的数据盘,所以我选1好了 而后程序开始装置了,咱们只有期待即可。装置实现后,零碎会主动重启一次。对了,别忘了记下登录URLOS面板的明码(上图箭头所指)。零碎重启之后,能够应用http://主机外网ip:9968来拜访URLOS面板,留神下端口号,须要在阿里云平安组中凋谢9966,9967,9968,9969,9970端口(入站规定),当然80和443端口也须要凋谢啊! 登录URLOS面板后,首先要找到Discuz! Q这个网站的数据库相干信息:而后关上文件治理:database-info.json这个文件就是数据库相干信息了: 接下来,咱们进行Discuz!Q的初始化,关上http://www.你的域名.com/dl.php,留神,咱们须要通过dl.php这个文件来进行Discuz!Q的初始化装置。到这里咱们只需一步一步往下操作就好了! 到填写数据库信息这一步,相干信息都在这个database-info.json文件里。看最初成果:

July 15, 2020 · 1 min · jiezi

私有化部署极简-Docker-Registry

在应用 K8S 和 Docker 进行疾速 CI/CD 的过程中咱们须要提交 Docker 镜像. 在私有云上, 咱们能够应用阿里云镜像服务. 但本地开发和测试环境, 如果应用阿里云等私有云服务, 在速度和流量费用方面都须要思考, 因而少不了私有化部署. 常见的私有化计划有2种: Docker Registry. 以后最新版本为 Registry 2. 提供外围的仓库服务, 但无节面. 适宜开发和测试环境, 以及小团队应用.Harbor. Habor 是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩大,从而取得了更加宽泛的利用,这些新的企业级个性包含:治理用户界面,基于角色的访问控制,反对 Helm charts, AD/LDAP 集成以及审计日志等。因而, 对于比拟大的组织, 或者须要在正式环境应用, 甚至二次开发或对外进行服务, 那么举荐应用Harbor.一. Docker Registry 装置和启动:Registry 间接应用 docker 装置即可, 需裸露一个端口, 以及将镜像存储的门路 map 到 host 长久化.应用以下命令进行装置: docker pull registry:2.6.1docker run -d -p 5000:5000 -v /data2/docker-registry/registry:/tmp/registry --restart=always daocloud.io/registry:2.6.1如果应用应用国内 DaoCloud镜像, 可将下面的 registry:2.6.1 替换为 daocloud.io/registry:2.6.1. 残缺的 compose.yaml 示例如下: ...

July 14, 2020 · 1 min · jiezi

Docker拉取镜像太慢

一、新建daemon.json配置文件进入docker在本机的配置目录,找到daemon.json文件,如果没有就新建一个 cd /etc/docker二、配置daemon.json配置内容如下: { "registry-mirrors":["https://almtd3fa.mirror.aliyuncs.com"]}三、重启dockerservice docker restart

July 14, 2020 · 1 min · jiezi

docker技术博客

docker技术博客

July 12, 2020 · 1 min · jiezi

果然这10个Docker容器坑多数人都中招过

毋庸置疑,容器曾经成为企业IT基础设施中必不可少的局部,它具备许多的长处,比方: 第一:容器是不可变的——操作系统,库版本,配置,文件夹和应用程序都包装在容器内。你保障在质量检查中测试过的同一镜像将以雷同的行为达到生产环境。第二:容器很轻——容器的内存占用量很小。容器将只为次要过程分配内存,而不是数百或数千MB。第三:容器十分快——能够像启动典型Linux过程一样快地启动容器。你能够在几秒钟内启动一个新容器,而不是几分钟。然而,许多用户依然像看待典型虚拟机一样看待容器,而遗记了容器具备重要的特色:即容器是一次性的。 这种特色迫使用户扭转他们对如何解决和治理容器的认识。那么该如何放弃容器的最佳效益呢?以下将介绍Docker容器中应防止的10件事。 1、不要将数据存储在容器中 因为你能够进行,销毁或更换容器。在容器中运行的应用程序版本1.0应该容易地由版本1.1替换,而不会造成任何影响或数据失落。因而,如果须要存储数据,请批量存储。在这种状况下,还应该留神两个容器是否在同一卷上写入数据,因为这可能会导致损坏。确保你的应用程序是为了写入共享数据存储。 2、不要将应用程序分为两局部进行交付 有些人看到像虚拟机这样的容器,大多数人偏向于认为他们应该将应用程序部署到现有的运行容器中。在开发阶段,你须要一直进行部署和调试,这是正确的。但对于一个间断传递(CD)管道QA和Production,你的应用程序应该是镜像的一部分。 3、不要创立大镜像 因为大镜像将很难散发。确保仅具备运行应用程序/过程所需的文件和库。不要装置不必要的软件包或运行将许多文件下载到新镜像层的“更新” 。 4、不要应用单层镜像 为了无效利用分层文件系统,请始终为操作系统创立本人的根底镜像层,为用户名定义创立另一层,为运行时装置创立另一层,为配置创立另一层,最初是应用程序的另一层。从新创立,治理和散发镜像将更加容易。 5、不要从正在运行的容器中创立镜像 换句话说,不要应用“ docker commit”来创立镜像。这种创立镜像的办法不可复制,应完全避免。始终应用齐全可复制的Dockerfile或任何其余S2I(从源到镜像)办法,如果将Dockerfile存储在源代码管制存储库(git)中,则能够跟踪对Dockerfile的更改。 6、不要只应用“最新”标签 对于Maven用户,最新标签就像“ SNAPSHOT”一样。因为容器的分层文件系统性质,因而激励应用标签。几个月后生成镜像并发现你的应用程序无奈运行是因为父层(Dockerfile中的FROM)被不兼容向后的新版本或谬误的新版本所取代,你不会感到诧异从构建缓存中检索了“最新”版本。在生产环境中部署容器时,也应防止应用“最新”标签,因为你无奈跟踪正在运行哪个版本的镜像。 7、不要在单个容器中运行多个过程。 容器非常适合运行单个过程(http守护程序,应用程序服务器,数据库),然而如果有多个过程,则治理起来可能会遇到更多麻烦,检索日志,并别离更新流程。 8、不要将凭据存储在镜像中。 应用环境变量,你不想对镜像中的任何用户名/明码进行硬编码。应用环境变量从容器内部检索该信息。这个原理的一个很好的例子是Postgres镜像。 9、不要以root用户身份运行过程 “默认状况下,docker容器以root用户身份运行。随着docker的成熟,可能会提供更多平安的默认选项。目前,要求root用户对其他人是危险的,可能并非在所有环境中都可用。你的镜像应应用USER指令为运行容器指定一个非root用户。 10、不要依赖IP地址 每个容器都有本人的外部IP地址,如果你启动和进行容器,它可能会更改。如果应用程序或微服务须要与另一个容器通信,请应用环境变量将正确的主机名和端口从一个容器传递到另一个容器。 所以,在Docker容器的利用中,这个10个坏习惯要不得,留神!留神!再留神!

July 11, 2020 · 1 min · jiezi

Docker开启远程安全访问

一、编辑docker.service文件vi /usr/lib/systemd/system/docker.service找到 [Service] 节点,批改 ExecStart 属性,减少 -H tcp://0.0.0.0:2375 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375这样相当于对外开放的是 2375 端口,当然也能够依据本人状况批改成其余的。 二、从新加载Docker配置失效systemctl daemon-reload systemctl restart docker 咱们通过浏览器拜访 2375 测试一下,格局为:http://ip:2375/version 如果无法访问的话,能够尝试一下凋谢防火墙2375端口,具体命令如下: firewall-cmd --zone=public --add-port=2375/tcp --permanentfirewall-cmd --reload如果还是不能拜访,如果应用的机器是云服务器,比方阿里云、腾讯云等等,须要到服务器平安组规定中看看是否凋谢2375端口,如未配置,减少该端口配置即可。 这样咱们就能够间接在Idea中的Docker插件中间接连贯测试了: 三、配置Docker平安拜访如上两步切勿用于生产环境!在开发环境用用就行了,如果间接把Docker这样对外裸露是十分危险的,就跟你Redis对外开放6379还不设置明码一样。 根本网上好多文章都是如上两步,裸奔的步骤... 你品,你细品,不给你挂马给谁挂。 其实官网文档曾经提供基于CA证书的加密办法了,详情点击此处链接 1、创立CA私钥和CA公钥首先创立一个ca文件夹用来寄存私钥跟公钥 mkdir -p /usr/local/cacd /usr/local/ca而后在Docker守护程序的主机上,生成CA私钥和公钥: openssl genrsa -aes256 -out ca-key.pem 4096执行完如上指令后,会要求咱们输出明码能力进行下一步,在这我将明码设置为:niceyoo 2、补全CA证书信息执行如下指令: openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem而后顺次输出:拜访明码、国家、省、市、组织名称、单位名称、轻易一个名字、邮箱等。为了省事,组织、单位之类的我都用 niceyoo 代替了。 niceyoo cn beijing beijing niceyoo niceyoo niceyoo apkdream@163.com ...

July 9, 2020 · 2 min · jiezi

公司新来个同事Docker-日志管理玩的贼-6

起源:自在早晚乱余生www.cnblogs.com/operationhome/p/10907591.htmlDocker-CEServer Version: 18.09.6Storage Driver: overlay2Kernel Version: 3.10.0-862.el7.x86_64Operating System: CentOS Linux 7 (Core)Docker  日志分为两类: Docker 引擎日志(也就是 dockerd 运行时的日志),容器的日志,容器内的服务产生的日志。一 、Docker 引擎日志Docker 引擎日志个别是交给了 Upstart(Ubuntu 14.04) 或者 systemd (CentOS 7, Ubuntu 16.04)。前者个别位于 /var/log/upstart/docker.log 下,后者咱们个别 通过 journalctl -u docker 来进行查看。 二、容器日志2.1、罕用查看日志命令——docker logsdocker logs CONTAINER 显示以后运行的容器的日志信息, UNIX 和 Linux 的命令有三种 输入输出,别离是 STDIN(规范输出)、STDOUT(规范输入)、STDERR(规范谬误输入),docker logs  显示的内容蕴含 STOUT 和 STDERR。在生产环境,如果咱们的利用输入到咱们的日志文件里,所以咱们在应用  docker  logs 个别收集不到太多重要的日志信息。 nginx 官网镜像,应用了一种形式,让日志输入到 STDOUT,也就是 创立一个符号链接/var/log/nginx/access.log 到 /dev/stdout。httpd 应用的是 让其输入到指定文件 ,失常日志输入到 /proc/self/fd/1 (STDOUT) ,谬误日志输入到 /proc/self/fd/2 (STDERR)。当日志量比拟大的时候,咱们应用 docker logs   来查看日志,会对 docker daemon 造成比拟大的压力,容器导致容器创立慢等一系列问题。只有应用了 `local 、json-file、journald`  的日志驱动的容器才能够应用 docker logs 捕捉日志,应用其余日志驱动无奈应用 `docker logs`2.2 、Docker 日志 驱动Docker 提供了两种模式用于将音讯从容器到日志驱动。 ...

July 9, 2020 · 3 min · jiezi

Docker必备六大国内镜像

Docker images国内镜像镜像地址1) 阿里云 docker hub mirrorhttps://registry.cn-hangzhou.aliyuncs.com 如果有账号的, 使用: [系统分配前缀].mirror.aliyuncs.com具体上阿里云容器HUB控制台查看. 2) 腾讯云 docker hub mirrorhttps://mirror.ccs.tencentyun.com 3) 华为云https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com 4) docker中国https://registry.docker-cn.com 5) 网易http://hub-mirror.c.163.com 6) daocloudhttp://f1361db2.m.daocloud.io 修改步骤直接修改 /etc/docker/daemon.json (docker 版本 >= 1.10 时) 内容为: {"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]}修改后重启服务: systemctl daemon-reloadsystemctl restart dockerDocker Toolbox 镜像源站https://developer.aliyun.com/... Docker CE 镜像源站https://developer.aliyun.com/...

July 7, 2020 · 1 min · jiezi

共享容器URLOS最新发布的一项超强功能

什么是共享容器共享容器是指将多个服务(例如网站)放在同一个容器中运行,它们共享同一个运行环境。它区别于URLOS传统的独立容器部署方式,将多个网站放在一个容器中运行,有利于节省主机资源。 URLOS一般方式:为每一个服务独立创建一个容器 共享容器:多个服务共享一个容器,节省主机资源 应用场景场景1:在线试用采用URLOS共享容器方式来部署软件服务可获得更快的部署速度与更低的主机资源占用,并且支持过期自动销毁。该场景不仅可以运用在网站类源码的在线试用或演示,也可以运用在SAAS服务的试用中。 场景2:用户分级企业在提供SAAS服务时,可根据用户级别提供不同的服务资源,如向免费用户提供服务时,可采用共享容器的方式让服务合并到一个容器中运行,降低免费用户对主机资源的消耗,达到降低成本的目的;向付费用户提供服务时,则采用独立容器的方式运行服务,让付费用户得到更优质的服务体验。 典型案例Discuz! Q 一键试用 1、DNSPod官方体验地址,点击前往>> 2、URLOS & 腾讯云 合作试用专题,点击前往>> 使用共享容器必须满足以下条件: 1、参与共享容器的服务必须都是由同一个应用所创建(即:必须由同一个网站应用所创建的网站服务才能共享运行环境); 2、仅限于同一主机下的服务方可共享容器; 3、只有带特定标签的应用才支持共享容器! 目前,URLOS应用市场中支持共享容器的应用有: PHP-7.4-网站环境(新) PHP-5.6-网站环境(新) 如何共享容器1. 创建一个PHP7.4网站环境以PHP-7.4-网站环境(新)为例,在应用市场中安装此应用: 正常安装即可,我们将这个网站服务命名为php74001,也可以称其为源容器。 2. 创建新网站,并共享PHP7.4网站环境在网站列表中找到刚刚创建的php74001,点后面的【更多】按钮,在弹出菜单中选择【安装相同应用】 重点:创建新的网站时,在网站选填卡片下的“网站环境来源”一项中填写php74001(即源容器的服务名称),这样我们就可以共享它的运行环境了。 其他内容请按自身需求正常填写即可。如下: 点击提交,待部署完成,这样新网站就共享了源容器的运行环境了。操作非常简单对吗? 后期我们将会开放基于共享容器的批量建站功能,这将极大提升建站效率和主机成本,尽请期待哦!

July 7, 2020 · 1 min · jiezi

使用docker搭建nginx集群实现负载均衡

最近都是在忙一些琐碎的小事,有几个选题,一直在纠结写哪个,最终决定先从简单的来吧。简单的往往比较琐碎,熟悉的小伙伴可以1.5倍速浏览哈环境基于centos7,docker 安装教程参考https://www.runoob.com/docker/centos-docker-install.html(选择手动安装靠谱一点,毕竟国内网络不稳定),这里不做赘述了。相信聪明如一休的你一定可以解决。最后,别忘了替换镜像源start-------------------------------------分割线好了,废话不多说,开始堆吧 下载镜像docker pull nginx 简单运行一下docker run --name nginx-test -p 8080:80 -d nginx 命令简单解释一下--name + 容器名(自定义)-p +宿主机端口:容器端口--d 后台运行-- nginx 镜像名称 有其他docker命令不明白的,docker -h 查看帮助手册 拷贝nginx配置文件和html文件到宿主机[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESabdd1a0a0be1 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp nginx-test[root@localhost ~]# docker cp nginx-test:/etc/nginx ~/conf[root@localhost ~]# lsanaconda-ks.cfg conf[root@localhost ~]# cd conf/[root@localhost conf]# lsconf.d koi-utf mime.types nginx.conf uwsgi_paramsfastcgi_params koi-win modules scgi_params win-utf[root@localhost conf]# cd ../[root@localhost ~]# docker cp nginx-test:/usr/share/nginx/html ~/www[root@localhost ~]# lsanaconda-ks.cfg conf www[root@localhost ~]# ls www50x.html index.html[root@localhost ~]# 看到了效果,删除容器,这个不是我们需要的[root@localhost ~]# docker stop nginx-test nginx-test[root@localhost ~]# docker rm nginx-testnginx-test[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES[root@localhost ~]# 新建容器`docker run -d -it -p 8080:80 --name nginx8080 -v ~/conf:/etc/nginx -v ~/www:/usr/share/nginx/html nginx`-v 是挂载的意思,将宿主机的文件映射到容器中 ...

July 6, 2020 · 5 min · jiezi

Docker-读取配置文件设置环境变量

场景工程中有一个xxx.properties的配置文件,里面有些环境变量,如数据库连接,文件目录等 同时有一个处理数据的shell脚本,里面也需要这部分环境变量 通常的做法是在写 Dockerfile 时,使用ENV xx xx的方式制定 但是,系统环境有多个,dev、test、release 等 不能针对每一个环境都去修改 Dockerfile 文件 于是乎就尝试使用 shell 脚本读取配置文件,将结果设置到环境变量中 步骤1.按行读取配置文件Linux 有多中按行读取文件的方式:awk,cat 等,我这里采用了 cat 的方式 cat /data/luelue.properties | while read line; do echo $linedone这样就可以将数据读取出来 2.修改数据格式luelue.properties 中的数据格式是 auther:shuaiurl:jdbc:mysql://localhost:3306/liquibase?useSSL=false但是 Linux 环境变量中的数据格式是 export auther=shuaiexport url=jdbc:mysql://localhost:3306/liquibase?useSSL=false因此我们要做的是: 切分 luelue.properties 中的数据组装成 export xx=xx 的格式2.1切分数据Linux 有多种切分字符串的方式,这里我采用了 ${string#*chars}、${string%chars*}的方式 string 是要截取的字符串*是通配符的一种,表示任意长度的字符串 chars 是指定的字符(或者子字符串) %、# 意思是从右向左、从左向右 针对auther:shuai 使用${line%:*} ${line#*:} 就可以截出auther shuai 但是url:jdbc:mysql://localhost:3306/liquibase?useSSL=false 截出的就是`url:jdbc:mysql://localhost: url 为什么呢? 因为单个#、%意思是:遇到第一个匹配的就停止 那么很显然,截取Key的时候,要使用${line%%:*} 2.2 拼装数据使用:echo export ${line%%:*}"="${line#*:} 生成需要的 Linux 环境变量的格式 ...

July 5, 2020 · 1 min · jiezi

Docker安装Portainer

Portainer 是一个轻量级的管理 UI ,可让你轻松管理不同的 Docker 环境(Docker 主机或 Swarm 群集)。它由可在任何 Docker 引擎上运行的单个容器组成,旨在使部署更简单 。第一步:搜索镜像docker search portainer第二步:拉取镜像docker pull portainer/portainer第三步:运行镜像本机模式docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name prtainer portainer/portainer远程模式docker run -d -p 9000:9000 --restart=always --name prtainer portainer/portainer第四步:访问Portainer容器地址:http://IP:9000首次登陆需要设置admin的密码选择docker连接选择Local,代表本地模式,portainer仅管理本机的docker容器选择Remote,代表远程模式,名称随意,在Endpoint URL中填写docker节点的地址:docker远程端口(docker安装教程中的设置的-H 0.0.0.0:2375中的2375)

July 4, 2020 · 1 min · jiezi

Ubuntu1804安装docker

介绍docker:有两个版本:docker-ce(社区版)和docker-ee(企业版)。 笔者这里介绍安装或升级的是最新版docker-ce(社区版)。 docker-compse:可运行和管理多个docker容器。 docker-machine:docker官方提供的docker管理工具。可管理多个docker主机,可搭建swarm集群。 一、docker安装1.卸载旧版本docker,全新安装时,无需执行该步骤 sudo apt-get remove docker docker-engine docker.io2.更新系统软件 sudo apt-get update3.安装依赖包 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common4.添加官方密钥 执行该命令时,如遇到长时间没有响应说明网络连接不到docker网站,需要使用代-理进行。curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -显示OK,表示添加成功. 5.添加仓库 sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"6.再次更新软件 经实践,这一步不能够省略,我们需要再次把软件更新到最新,否则下一步有可能会报错。sudo apt-get update7.安装docker 如果想指定安装某一版本,可使用 sudo apt-get install docker-ce= 命令,把替换为具体版本即可。以下命令没有指定版本,默认就会安装最新版 sudo apt-get install docker-ce8.查看docker版本 sudo docker version9.免sudo使用docker命令 如果还没有 docker group 就添加一个:sudo groupadd docker将用户加入该 group 内。然后退出并重新登录就生效啦sudo gpasswd -a ${USER} docker重启 docker 服务sudo service docker restart切换当前会话到新 group 或者重启 X 会话newgrp - docker二、docker-compose安装1.下载docker-compose ...

July 4, 2020 · 1 min · jiezi

Docker集群并使用Portainer管理

1、portainer管理dockerPortainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。 2.容器集群可视化管理配置2.1、在集群节点开通对外2375端口(方便portainer管理)#先做备份[root@docker_138]#cp /lib/systemd/system/docker.service /lib/systemd/system/docker.service.bak [root@docker_138]#vim /lib/systemd/system/docker.service 找到ExecStart行改成这样的: ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock[root@docker_138]#systemctl daemon-reload[root@docker_138]#systemctl restart docker 重启docker服务[root@docker_138]#netstat -plnt 查看端口号使用tcp 0 0 0.0.0.0:50008 0.0.0.0:* LISTEN 26500/sshd tcp6 0 0 :::2375 :::* LISTEN 25595/dockerd 2.2、Swarm集群创建##1、portainer节点初始化Swarmdocker swarm init --advertise-addr 172.18.239.138...docker swarm join --token SWMTKN-1-1n2fax7x0mu2w1scynbk2tzpu6twp68eb7hp94foi8lrwlwho4-30ogybqi3gn8gz4ch0mz09e1x 172.18.239.138:2377....##2.其它的容器节点添加集群节点docker swarm join --token SWMTKN-1-1n2fax7x0mu2w1scynbk2tzpu6twp68eb7hp94foi8lrwlwho4-30ogybqi3gn8gz4ch0mz09e1x 172.18.239.138:2377#3、查看集群节点[root@docker_138]# docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSIONxvbkkajbntpksx983nkt7r2a8 docker-147 Ready Active 18.06.2-ce4wtkc0yrba2t806ahmc29ozho * docker_138 Ready Active Leader 18.06.2-ce3、下载portainer或镜像3.1、下载zip或镜像##下载zip包;wget https://dl.quchao.net/Soft/Portainer-CN.zip##下载镜像;#查询当前有哪些Portainer镜像docker search portainer#下载镜像docker pull docker.io/portainer/portainer4、zip包部署portainermkdir -p /data/portainer/{data,public}cd /data/portainerunzip Portainer-CN.zip -d public#启动容器docker run -d --restart=always \--name portainer \-p 9000:9000 \-v /var/run/docker.sock:/var/run/docker.sock \-v /data/portainer/data:/data \-v /data/portainer/public:/public portainer/portainer:1.20.25、访问Portainerhttp://URL:9000/1.首次登陆需要注册用户,给admin用户设置密码:2.集群模式, 这样一定要选择Remote, 输入docker_138的ip,然后点击Connect。3.同样点击左边栏的”Endpoints” - “+add endpoint”, 添加集群节点:docker_147的ip4.添加之后,点击左边栏的”Home”, 右边就可以看到节点信息了,可以进行切换操作. ...

July 3, 2020 · 1 min · jiezi

Docker第1部分什么是Docker

原文:https://towardsdatascience.com/learn-enough-docker-to-be-useful-b7ba70caeb4b作者:Jeff Hale翻译:付新圆容器对于提高软件开发和数据科学中的安全性、可重复性和可伸缩性非常有用。容器的崛起是当今科技领域最重要的趋势之一。 Docker是一个用于在容器中开发、部署和运行应用程序的平台。Docker本质上是容器化的同义词。对于有抱负的软件开发人员或数据科学家来说,Docker就是他们的未来。 如果您还不适应最新技术,请不要担心——本文将帮助您理解Docker的概念,了解Docker的过程可以想象成是制作披萨的过程。 在本系列有五篇文章,之后的四篇文章我们将会讲解Docker术语、Dockerfiles、Docker镜像、Docker命令和数据存储。阅读完这个系列(再加上一点练习),你将会了解很多Docker发挥的作用????! Docker的类比首先,阐明一下Docker的类比。 谷歌中对类比的第二个定义是: 象征物被认为是其他事物的代表或象征的事物,尤指抽象的事物。类比可以帮助我们理解新的事物。例如,物理容器的类比可以帮助我们快速掌握虚拟容器的本质。 图为物理容器 容器以下是塑料容器对照Docker容器的类比: 容纳东西——东西要么在容器内,要么在容器外;便携式——可在本地计算机、远程计算机或云提供商的服务器(例如AWS)上使用。就像盒子一样,你可以随时移动。具有清晰的访问接口——物理容器有一个盖子,用于打开和放入物品以及取出物品。同样,Docker容器具有多种与外界交互的机制。它具有可以通过打开浏览器进行交互的端口,您可以通过命令行将其配置为与数据交互。可以从远程位置获取——当您需要用到塑料容器时,您可以网购一个,这些塑料容器是商家从制造商那里购买的,这些制造商通过一个模具就能将数千个塑料容器冲压出来。对于Docker容器,异地注册表会为容器保存一个像模具的镜像。然后,当您需要一个容器时,就可以从图像中制作一个。与虚拟Docker容器不同,网购的塑料容器需要花费钱,并且商家也不会提供商品副本。 实例Docker容器的第二种类比是可以将其视为一个有生命的的实例。实例是以某种形式存在的东西,不仅仅只是代码,正是这些代码赋予了Docker容器生命。像其他生物一样,实例最终将死亡-这意味着容器将关闭。 Docker容器是Docker镜像的生命表现。 软件程序除了容器类比和实例类比,您还可以将Docker容器视为软件程序。毕竟,Docker容器确实是软件,在最基本的层次上,容器是一组操纵其他位的指令。 图为容器是代码 当Docker容器运行时,通常会有程序在运行。容器中的程序执行操作,应用程序也对应执行相关操作。 例如,Docker容器中的代码已经实时将网页上读取的内容发送了您,或者可能会将您的语音命令带到Amazon Alexa,并将其解码为另一个程序并在不同容器中使用的指令。 使用Docker,您可以在主机上同时运行多个容器,和其他软件程序一样,Docker容器可以运行、检查、停止和删除。 概念虚拟机虚拟机是Docker容器的前身,它可以隔离应用程序及其依赖项。但是,Docker容器优于虚拟机,因为它们占用的资源更少,非常便捷,并且启动速度更快。 Docker镜像在本文中,术语“ 镜像 ”的含义无法很好地映射到物理镜像。 Docker镜像更像是蓝图、饼干切割机或模具。镜像是不可变的主模板,用于抽取完全相同的容器。 镜像包含应用程序运行所需的Dockerfile、库和代码,所有这些都是捆绑在一起的。 DockerfileDockerfile 是一个文件,其中包含Docker应如何构建图像的说明。 Dockerfile引用用于构建初始镜像层的基础镜像。流行的官方基础镜像包括python,Ubuntu和alpine。 然后,根据Dockerfile中的说明,可以将其他层堆叠在基本镜像层的顶部。例如,用于机器学习应用程序的Dockerfile可以告诉Docker在中间层添加NumPy,Pandas和Scikit-learn。 最后,根据Dockerfile代码,在其他层之上堆叠了一个可写的薄层。(薄层的尺寸很小,在这里薄是一种类比) 在本系列的后续文章中,将会更深入地探讨Dockerfiles。 Docker容器Docker镜像加上命令docker run image_name,可从镜像创建并启动容器。 容器注册表如果希望其他人能够从自己的镜像中创建容器,则可以将镜像发送到容器注册表。Docker Hub是最大的注册表,也是默认的注册表。 用Docker烹饪 图为景观类比 配方就像Dockerfile一样。它告诉您如何实现最终目标。成分是层。这个比萨饼有皮、酱汁和奶酪。将食谱和食材想像成一体的披萨制作套件。这是Docker镜像。 配方(Dockerfile)告诉我们我们要做什么。计划如下: 外壳是预成型且不可变的,就像基本的Ubuntu父镜像一样。它是最底层的,是首先被构建的。然后添加一些奶酪。将第二层添加到比萨饼就像安装一个外部库——例如NumPy。然后撒一些芝士。芝士就像运行应用程序的文件中编写的代码。 图为烤箱 烤披萨的烤箱就像Docker平台一样。搬进烤箱并将烤箱安装到了自己的房子里,就可以制作东西了。同样,在计算机上安装了Docker,就可以制作容器了。通过旋转旋钮可以启动烤箱。该docker run image_name命令就像烤箱的旋钮一样——它可以创建并启动容器。煮熟的比萨就像一个Docker容器。吃披萨就像使用您的应用程序一样。就像制作披萨一样,在Docker容器中制作应用程序需要一些工作,但最终您会拥的是非常有价值的。 总结以上就是Docker概念的内容。在本系列的第2部分,将阐明在Docker生态系统中常用的一些术语。希望本文对您了解Docker有所帮助,同时也希望您看到类比在理解新技术中的价值。

July 1, 2020 · 1 min · jiezi

为什么你应该在docker-中使用gosu

为什么要使用gosu?Docker容器中运行的进程,如果以root身份运行话会有安全隐患,该进程拥有容器内的全部权限,更可怕的是如果有数据卷映射到宿主机,那么通过该容器就能操作宿主机的文件夹了,一旦该容器的进程有漏洞被外部利用后果是很严重的。 因此,容器内使用非root账号运行进程才是安全的方式,这也是我们在制作镜像时要注意的地方。 而我们今天讲到的gosu 正是解决使用非root用户运行业务进程的一种最佳实践方法。 su和sudo具有非常奇怪且经常令人讨厌的TTY和信号转发行为的问题。su和sudo的设置和使用也有些复杂(特别是在sudo的情况下),虽然它们有很大的表达力,但是如果您所需要的只是“以特定用户身份运行特定应用程序”,那么它们将不再那么适合。 处理完用户/组后,我们将切换到指定用户,然后执行指定的进程,gosu本身不再驻留或完全不在进程生命周期中。这避免了信号传递和TTY的所有问题。 概念总是晦涩的,让我们通过一些示例来加深理解。 $ docker run -it --rm ubuntu:trusty su -c 'exec ps aux'USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 46636 2688 ? Ss+ 02:22 0:00 su -c exec ps aroot 6 0.0 0.0 15576 2220 ? Rs 02:22 0:00 ps aux$ docker run -it --rm ubuntu:trusty sudo ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 3.0 0.0 46020 3144 ? Ss+ 02:22 0:00 sudo ps auxroot 7 0.0 0.0 15576 2172 ? R+ 02:22 0:00 ps aux$ docker run -it --rm -v $PWD/gosu-amd64:/usr/local/bin/gosu:ro ubuntu:trusty gosu root ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 7140 768 ? Rs+ 02:22 0:00 ps aux安装gosu对于debian: ...

July 1, 2020 · 3 min · jiezi

Docker文件系统实战

关键词:Docker 联合文件系统 镜像 容器 云信私有化 在本文中,我们来实战构建一个Docker镜像,然后实例化容器,在Docker的生命周期中详细分析一下Docker的文件存储情况和DockerFile优化策略。 在开始实战之前,我们先介绍一个概念,联合文件系统(Union File System)。联合文件系统是实现Docker镜像的技术基础,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。镜像的分层存储和继承就是基于此特性实现。 下面是Docker官方的一张描述文件系统的图片,显示了一张联合文件系统在串联镜像层和容器层起到的作用 Docker支持多种联合文件系统,常见的有aufs,deviceMapper,overlay,overlay2,本文章中使用的系统版本为debian9.1,Docker版本为17.06.2-ce,默认使用是overlay2。 看到这里如果你已经对Docker文件系统有了简单的概念,那么让我们开始实战,来对分层文件系统的存储方式进行更加深入的了解。 镜像层这是一个云信私有化项目中基于debian系统镜像创建的jdk8基础镜像,为了方便阅读和分析,我们Dockerfile进行了一些精简,只保留核心部分内容 FROM hub.c.163.com/library/debian:stretchMAINTAINER nim#下载jdkADD http://10.173.11.100/nim/jdk-8u202-linux-x64.tar.gz /usr/local/nim/#解压jdk并删除RUN tar -xzvf /usr/local/nim/jdk-8u202-linux-x64.tar.gz -C /usr/local/nim/ \\&& rm /usr/local/nim/jdk-8u202-linux-x64.tar.gz#设置环境变量ENV JAVA\_HOME=/usr/local/nim/jdk1.8.0\_202ENV PATH=$JAVA\_HOME/bin:$PATHCMD \["/bin/bash"\]根据构建镜像,查看构建结果,原基础镜像100M,构建后镜像体积697M。 镜像存储 现在开始看一下构建镜像工作在文件层存储情况。首先我们使用Docker history查看一下刚刚构建镜像情况,可以看到基础镜像占用100M,两个镜像分层占用194MB和403M。 接下来我们看查看一下文件系统中的存储情况,本环境使用overlay2,Docker镜像层存储默认路径为/var/lib/Docker/overlay2/,可以看到镜像存储目录下有4个目录,其中110M的对应是基础镜像,另外两个为ADD JDK(186M)和解压JDK压缩包的镜像分层(389M)。 其中的l目录包含了所有层的软连接,软链接使用短名称,避免mount时候参数达到页面大小限制。 下面我们了解一下,每个分层中的文件内容。基础镜像分层包含diff文件夹和link文件,diff文件夹中存放当前分层内容,link文件记录短名称。 接下来看一下COPY JDK生成的内容,diff文件夹保存了jdk压缩包,本层相比基础镜像层,多了lower,merged,work三个文件/文件夹,其中lower记录了此层的下层ID(基础镜像层),merged目录作为提供了统一视图,在容器层读写层被使用,work目录用于联合挂载指定的工作目录,使用过程对用户不可见。 解压JDK层的文件夹结构内容和上一层类似,主要关注jdk压缩包占用空间为0,表示已被删除。 现在来重点关注一个问题,镜像大小等于所有分层相加,在后续分层中被删除的jdk压缩包仍然要占用存储空间,这并不是我们原本意图,因此这里就出现了镜像文件进行优化的点。优化后的Dockerfile如下 FROM hub.c.163.com/library/debian:stretchMAINTAINER nimRUN curl -o /usr/local/nim/jdk-8u202-linux-x64.tar.gz http://10.173.11.100/nim/jdk-8u202-linux-x64.tar.gz \\&& tar -xzvf /usr/local/nim/jdk-8u202-linux-x64.tar.gz -C /usr/local/nim/ \\&& rm /usr/local/nim/jdk-8u202-linux-x64.tar.gz \\&& export JAVA\_HOME=/usr/local/nim/jdk1.8.0\_202 \\&& export PATH=$JAVA\_HOME/bin:$PATHCMD \["/bin/bash"\]借这个优化后的内容,我们再谈一下构建Docker镜像时在时间和空间可优化的点: ...

June 30, 2020 · 1 min · jiezi

Docker学习笔记-第六篇网络

1 Docker网络1.1 简介Dokcer通过使用 Linux 桥接提供容器之间的通信,docker0 桥接接口的目的就是方便 Docker 管理。当 Docker daemon 启动时需要做以下操作: 如果 docker0 不存在则创建搜索一个与当前路由不冲突的 ip 段在确定的范围中选择 ip绑定 ip 到 docker01.2 Docker的四种网络模式docker run 创建 Docker 容器时,可以用 --net 选项指定容器的网络模式,Docker 有以下 4 种网络模式: host 模式:使用 --net=host 指定container 模式:使用 --net=container:NAMEorID 指定none 模式:使用 --net=none 指定bridge 模式:使用 --net=bridge 指定,默认设置1.2.1 host 模式如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。 1.2.2 container 模式这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。 1.2.3 none模式在这种模式下,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。 ...

June 29, 2020 · 1 min · jiezi

在WSL2里使用Docker

原文链接 WSL2因为是基于Hyper-V虚拟化的一个Linux,因此我想着在WSL里跑Docker。当我高高兴兴地安装好了Docker之后发现不能启动,因为PID为1的进程不是systemd,而是init,让我这个菜鸡呆了。一番搜索之后发现有人在GitHub给出一个解决方案,Genie,原理是利用Linux namespace实现隔离,在隔离出的空间里运行systemd,这样systemd的PID就是1了。 看过代码之后得到里几个关键的命令 unshare:在新的namespace里运行命令。man pagensenter:在某个namespace里运行命令。man pagerunuser:切换执行命令的用户。man page我们的步骤是 用pidof检查是否有systemd进程,有则跳到3,否则2。让unshare运行systemd,这样systemd在新的namespace里的PID就是1。整个命令用daemonize命令执行,这样创建出来的systemd以后台进程形式一直运行。用nsenter和runuser进入新创建的namespace里以某个用户身份运行shell。于是我们可以得到这样的一个脚本,GitHub传送门 #!/bin/bashsystemd_pid=if [ -z $(pidof systemd) ]; then daemonize /usr/bin/unshare -fp --propagation shared --mount-proc systemdfiwhile [ -z $systemd_pid ]do for pid in $(pidof systemd) do systemd_pid=$pid donedoneif [ -z $WHO ]; then WHO=root WD=/else WD=/home/$WHOfinsenter -t $systemd_pid -m -p --wd=$WD runuser -m -p -u $WHO zsh使用方法: WHO=`whoami` sudo -E ./wslsystemd.sh

June 27, 2020 · 1 min · jiezi

Docker学习笔记-第四篇镜像仓库

cc老师最新一期的高级架构师课程终于确定日期了,7月6号正式开课,现在618活动,三天限时折扣中6800一人不限时免费更新课程是最大的卖点,里面包含了现在主流的架构,以及最新的技术,据说从理论到运用全部带着做,像现在面试常用的 Netty, Redis, Kafka,Zookeeper, Dubbo, Nginx + openResty + kong + Lua, ElasticSearch等技术都深入源码层级,对于有想跟我一样有着像提高自身技术的同学,课程的详情都在私塾的首页详细说明了,感兴趣的小伙伴,可以一起去 【私塾在线 】 学习1 Docker仓库1.1 简介官方Docker Hub地址:https://hub.docker.com/1.2 搭建私有仓库1:下载镜像:docker pull registry 2:启动Docker Registry容器        docker run -d -p 5000:5000 -v /ccuse/myregistry/:/tmp/registry --privileged=true registry 3:查看Docker Registry进程:docker ps 1.3 私有仓库基本操作1:查看Registry仓库中现有的镜像        curl -XGET http://192.168.1.111:5000/v2/_catalog 2:将Docker镜像推到Registry中 给本地镜像打Tag      docker tag cctomcat9 192.168.1.111:5000/cctomcat9test 推送镜像到Registry中       docker push 192.168.1.111:5000/cctomcat9test 会出现错误,因为client与Registry交互默认将采用https访问,但我们在安装Registry时并未配置指定相关的key和crt文件,https将无法访问 在/etc/sysconfig/docker中做配置:       ADD_REGISTRY='--add-registry 192.168.1.111:5000’        INSECURE_REGISTRY=‘--insecure-registry 192.168.1.111:5000’        然后重启docker服务:        service docker restart        然后重新推送镜像到仓库中。 ...

June 27, 2020 · 2 min · jiezi

docker-安装卸载

Linux环境安装、卸载Docker 安装: 1、Docker要求CentOS系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本是否支持安账docker 2、更新yum包:sudo yum update 3、安装需要的软件包,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 4、设置yum源:sudo yum-config-manager --add-repo https://download.docker.com/l... 5、可以查看所有仓库中所有docker版本,并选择特定版本安装:yum list docker-ce --showduplicates | sort -r 6、安装docker:sudo yum install docker-ce-17.12.0.ce 7、启动、设置开启开机启动 sudo systemctl start docker sudo systemctl enable docker 8、验证安装是否成功(有client和service两部分表示docker安装启动都成功了):docker version 9、查看docker启动状态:systemctl status docker(如下图即启动成功) 卸载: 1、查询docker安装过的包: yum list installed | grep docker 2、删除安装包: yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y ...

June 25, 2020 · 1 min · jiezi

Windows10系统如何安装使用docker

说在前面windows系统想装docker的同学首先需要清楚自己电脑的配置,因为docker容器运行最少需要占用2G的运行内存,我平时用的时候一般占用在5G左右,所以没跟8G内存条就别想着安docker了。 两个重点打开cpu的虚拟化 => 先打开任务管理器查看cpu的虚拟化有没有打开如果没有则 => 重启电脑进入bios页面打开cpu的虚拟化(自行百度,每台电脑不太一样)启用本地的hyperV服务(控制面板搜索程序与功能 => 启用或关闭windows功能 => 找到hyperV然后全部勾上然后重新启动一下)下载docker去docker download一下

June 24, 2020 · 1 min · jiezi

Docker安装的一个daemonjson例子

使用systemd ▶ cat /etc/docker/daemon.json { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" }, "exec-opts": ["native.cgroupdriver=systemd"], "data-root": "/data/docker", "insecure-registries":["192.168.233.214"], "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 64000, "Soft": 64000 } }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], "mtu": 1450}

June 23, 2020 · 1 min · jiezi

centos7离线安装docker可解决大部分docker环境问题

1.环境要求:docker安装环境:centos7及以上kernel内核:3.10及以上可使用下面命令查看2.准备docker安装包和安装脚本 docker-18.06.3安装包 docker安装脚本 #!/bin/shusage(){ echo "使用方法: $0 FILE_NAME_DOCKER_CE_TAR_GZ" echo " $0 docker-18.06.3-ce.tgz" echo "Get docker-ce binary from: https://download.docker.com/linux/static/stable/x86_64/" echo "eg: wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz" echo ""}SYSTEMDDIR=/usr/lib/systemd/systemSERVICEFILE=docker.serviceDOCKERDIR=/usr/binDOCKERBIN=dockerSERVICENAME=dockerif [ $# -ne 1 ]; then usage exit 1else FILETARGZ="$1"fiif [ ! -f ${FILETARGZ} ]; then echo "Docker binary tgz files does not exist, please check it" echo "Get docker-ce binary from: https://download.docker.com/linux/static/stable/x86_64/" echo "eg: wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz" exit 1fiecho "##unzip : tar xvpf ${FILETARGZ}"tar xvpf ${FILETARGZ}echoecho "##binary : ${DOCKERBIN} copy to ${DOCKERDIR}"cp -p ${DOCKERBIN}/* ${DOCKERDIR} >/dev/null 2>&1which ${DOCKERBIN}echo "##systemd service: ${SERVICEFILE}"echo "##docker.service: create docker systemd file"cat >${SYSTEMDDIR}/${SERVICEFILE} <<EOF[Unit]Description=Docker Application Container EngineDocumentation=http://docs.docker.comAfter=network.target docker.socket[Service]Type=notifyEnvironmentFile=-/run/flannel/dockerWorkingDirectory=/usr/local/binExecStart=/usr/bin/dockerd \ -H tcp://0.0.0.0:4243 \ -H unix:///var/run/docker.sock \ --selinux-enabled=false \ --log-opt max-size=1gExecReload=/bin/kill -s HUP $MAINPID# Having non-zero Limit*s causes performance problems due to accounting overhead# in the kernel. We recommend using cgroups to do container-local accounting.LimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinity# Uncomment TasksMax if your systemd version supports it.# Only systemd 226 and above support this version.#TasksMax=infinityTimeoutStartSec=0# set delegate yes so that systemd does not reset the cgroups of docker containersDelegate=yes# kill only the docker process, not all processes in the cgroupKillMode=processRestart=on-failure[Install]WantedBy=multi-user.targetEOFecho ""systemctl daemon-reloadecho "##Service status: ${SERVICENAME}"systemctl status ${SERVICENAME}echo "##Service restart: ${SERVICENAME}"systemctl restart ${SERVICENAME}echo "##Service status: ${SERVICENAME}"systemctl status ${SERVICENAME}echo "##Service enabled: ${SERVICENAME}"systemctl enable ${SERVICENAME}cat >/etc/docker/daemon.json <<EOF{ "registry-mirrors": ["http://hub-mirror.c.163.com"]}EOFswapoff -aiptables -P FORWARD ACCEPTsysctl --systemsystemctl daemon-reloadsystemctl restart docker.serviceecho "## docker version"docker version3.将docker安装脚本和安装包放在同一目录后执行安装脚本: ...

June 20, 2020 · 1 min · jiezi

你的-docker-stop它优雅吗

原文链接:https://blog.gaoyuexiang.cn/2020/06/18/graceful-shutdown-docker-container/我们平时在使用 Docker 的时候,一般会使用 ctrl+c 或者 docker stop 的方式关闭容器。但有时候我们可能会遇到 ctrl+c 不生效,或者 docker stop 之后要等待 10s 的情况,就像这样: 也许你会觉得 10s 是一个可以忍受的时间,但这样的问题真的只有 10s 这么简单吗?为什么有的时候不能立即关闭容器呢? docker stop 怎么关闭容器首先我们来看一下这两个命令做了什么。 ctrl+c 到底做了什么我们能够使用 ctrl+c 的场景,是我们在使用 foreground 模式运行容器的时候。这时我们按下 ctrl+c 就像在普通的 shell 中按下这个组合键一样,发送一个 SIGINT 信号给当前的进程,通知它终止运行。 docker stop 做了什么docker stop 命令是在对 detached 模式运行的容器发出停止命令时使用的,从发送信号上来讲,它将发送 SIGTERM 信号给容器,通知其结束运行。 SIGINT 一般用于关闭前台进程,SIGTERM 会要求进程自己正常退出。当我们在 shell 中给进程发送 SIGTERM 和 SIGINT 信号的时候,这些进程往往都能正确的处理。但是在 docker 中却不灵了。这是因为在 docker 中,只会将 SIGTERM 等所有的 signal 信号发送给 PID 为 1 的进程,当我们 docker 中运行的进程的进程号不是 1 时,就不会收到这样的信号。 ...

June 19, 2020 · 4 min · jiezi

docker-系列8深入剖析容器

这是本专栏的第二部分:容器篇,共 6 篇,帮助大家由浅入深的认识和掌握容器。 前面,我为你介绍了容器生命周期管理和资源管理相关的内容,让你对容器有了更加灵活的控制。 本篇,我来为你深入剖析容器,从本质上理解到底容器是什么。 在正式开始之前,我们总结一下到目前为止的学习: 使用 Docker 相关的一些命令可以完成对容器生命周期的管理,包括启动、暂停、停止、删除等;通过 docker update 命令可热更新容器的一些配置,包括 CPU,内存等资源限制;在宿主机上可使用 docker top 和 docker stats 命令拿到容器的一些状态,并且也可通过访问 /sys/fs/cgroup 下的一些特定目录或文件,得到容器的相关信息。现在,我们来更进一步,对容器进行深入剖析。 容器是什么在前面我们一直都在用 Docker 启动和管理容器,第一部分中也提到了关于容器技术和 Docker 的发展历程,我们不妨看看 Docker 对容器的定义是什么。 引用 Docker 官网对容器的一个定义: What is a Container?A standardized unit of software. 容器是什么?一个软件的标准化单元。 我们来分析下这个定义,首先是软件,跟容器相关的是软件而不是硬件,而我们也知道软件主要分为系统软件和应用软件,而容器中运行的程序并非系统软件,它实际运行在宿主机上,与宿主机上的其他进程共用一个内核,这也是容器与传统虚拟机的一个很大区别。 再者,标准化单元,刚才我们已经说了,容器内运行的程序并非系统软件,每个软件运行都需要有必要的环境,包括一些 lib 库之类的,而如何能在复杂的环境中做到“标准化”呢?显然,隔离是一个最佳选择。将程序及其所需的环境 /lib 库之类的组织在一起,并与系统环境隔离,这就很容易做到“标准化”了。 说白了,容器其实是在一台机器上的“一组”进程,当然这组进程可能只有一个;它们有相同的特性,同样所受的限制也相同;另外既然叫做容器,很自然地我们认为它们与外界可以进行隔离/应该有一个分界线。 在本专栏的第一部分,我为你介绍过 Docker 和容器技术的发展历程。本篇中,我们不妨从进程的角度来深入容器内部。 获取容器底层信息Docker 为我们提供了一个很方便的命令 docker inspect,使用此命令可以得到容器的底层信息。我们先启动一个 Alpine Linux 的容器,然后用此命令查看该容器的信息: (MoeLove) ➜ ~ docker run --rm -it alpine/ #打开另一个终端窗口,执行以下命令: ...

June 18, 2020 · 2 min · jiezi

使用helm将复杂应用打包并部署到k8s集群中

前言Helm是K8S集群下面的一个包管理器,通过其工程师可将应用打包成一个整体,而用户可使用helm安装打包后的应用,其功能类似于apt-get之于ubuntu系统、yum/dnf之于redhat系统。本文作者将讲述如何通过helm打包应用,以及如何使用其部署应用,但读者须先了解K8S基础知识,如Deployment、Satefulset、Service、Configmap、Secret、PV/PVC等,否则可先移步“迈入Docker、Kubernetes容器世界的大门”这里。 常规部署应用本节使用清单文件部署一测试用例,其含两个服务hello、greeter,hello依赖于greeter,调用关系如下所示: <http get> --------> (hello) --------> (greeter)执行如下命令clone仓库1,而后将示例部署于demo命名空间中。 git clone https://github.com/zylpsrs/helm-example.gitcd helm-examplekubectl create namespace demokubectl -n demo apply -f k8s为简单考虑,本文示例仅使用deployment、ingress、service这些技术部署且内容很简单,k8s目录如下所示: $ tree k8s/k8s/├── deploy-greeter.yaml # 部署greeter├── deploy-hello.yaml # 部署hello├── ing-hello.yaml # 为hello服务创建ingress,故集群需部署有ingress控制器├── svc-greeter.yaml # 为greeter创建服务└── svc-hello.yaml # 为hello创建服务如下所示,本节在demo命名空间中部署有如下对象: $ kubectl -n demo get deploy,svc,ingress,podNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/greeter 1/1 1 1 20hdeployment.apps/hello 1/1 1 1 20hNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/greeter ClusterIP 10.100.44.79 <none> 9080/TCP 20hservice/hello ClusterIP 10.106.116.73 <none> 9080/TCP 20hNAME CLASS HOSTS ADDRESS PORTS AGEingress.extensions/hello <none> hello.app.zyl.io 192.168.120.6 80 20hNAME READY STATUS RESTARTS AGEpod/greeter-7cbd47b5bd-6vtxk 1/1 Running 1 20hpod/hello-6f8f75f799-z8kgj 1/1 Running 1 20h若集群安装有ingress controller,则可通过ingress地址访问hello服务,否则在计算节点上通过其service地址访问,如下所示,我们调用hello服务时传递helloTo=<value>参数,其返回Hello, <value>!字符串。 ...

June 18, 2020 · 4 min · jiezi

centos7-使用-docker-部署-gitlab-gitlabrunner

快速配置应用docker-compose.yml使用 docker-compose 对 docker 容器集群进行快速编排 获取 docker-gitlab 的 docker-compose.yml 配置文件,进行快速构建 $ wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml获取 docker-compose.yml 文件后,进行自定义配置。 配置环境打开 docker-compose.yml 文件,针对 gitlab 进行环境配置 version: '2.3'services: ... # 省略显示其他服务 ... gitlab: restart: always image: sameersbn/gitlab:13.0.6 depends_on: - redis - postgresql ports: - "10080:80" - "10022:22" volumes: - gitlab-data:/home/git/data:Z healthcheck: test: ["CMD", "/usr/local/sbin/healthcheck"] interval: 5m timeout: 10s retries: 3 start_period: 5m environment: - DEBUG=false - DB_ADAPTER=postgresql - DB_HOST=postgresql - DB_PORT=5432 - DB_USER=gitlab - DB_PASS=password - DB_NAME=gitlabhq_production - REDIS_HOST=redis - REDIS_PORT=6379 - TZ=Asia/Kolkata - GITLAB_TIMEZONE=Kolkata - GITLAB_HTTPS=false - SSL_SELF_SIGNED=false - GITLAB_HOST=localhost - GITLAB_PORT=10080 - GITLAB_SSH_PORT=10022 - GITLAB_RELATIVE_URL_ROOT= - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string - GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string - GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string ... # 省略其他配置 ...参考配置文档,我们需要将时区设置为东八时区,设置数据混淆密匙,设置服务地址。 ...

June 18, 2020 · 3 min · jiezi

docker系列7容器资源管理

这是本专栏的第二部分:容器篇,共 6 篇,帮助大家由浅入深的认识和掌握容器。前两篇,我为你介绍了容器生命周期管理相关的内容,带你掌握容器生命周期。本篇我将为你介绍容器资源管理相关的内容。 前两篇我已经为你介绍了容器生命周期管理相关的内容,本篇的主题是容器资源管理。我们带着以下三个问题开始本篇的内容: 哪些分配给容器的资源可被我们管理容器实际使用了多少资源如何对容器使用的资源进行管理资源类型对于第一个问题,当我们启动一个容器的时候,它可以使用一些系统资源,这与我们在物理机上启动程序基本是一致的。比如主要的几类: CPU内存网络I/OGPU这些系统资源是在我们启动容器时,需要考虑和可被我们管理的。比如,我们可以执行 docker run --help 查看 docker run 命令所支持的全部参数。现在 docker run 命令所支持的参数已超过 90 项,这里就不一一列出了。 查看容器占用资源docker statsDocker 提供了一个很方便的命令 docker stats,可供我们查看和统计容器所占用的资源情况。 我们仍然启动一个 Redis 容器作为示例。 # 启动一个容器(MoeLove) ➜ ~ docker run -d redis c98c9831ee73e9b71719b404f5ecf3b408de0b69aec0f781e42d815575d28ada# 查看其所占用资源的情况(MoeLove) ➜ ~ docker stats --no-stream $(docker ps -ql) CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDSc98c9831ee73 amazing_torvalds 0.08% 2.613MiB / 15.56GiB 0.02% 3.66kB / 0B 0B / 0B 4这里传递了一个 --no-stream 的参数,是因为 docker stats 命令默认是一个持续的动态流式输出(每秒一次),给它传递 --no-stream 参数后,它就只输出一次便会退出了。 ...

June 18, 2020 · 8 min · jiezi

SpringBoot-构建-Docker-镜像的-3-种方式

本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像。 (1)使用 spring-boot-maven-plugin 内置的 build-image. (2)使用 Google 的 jib-maven-plugin。 (3)使用 dockerfle-maven-plugin。 Spring Boot 应用为了方便实践,需要一个 Spring Boot 项目。 Demo 项目地址: https://github.com/davelms/medium-articles/tree/master/spring-maven-docker 项目环境: Java 11Maven 3.6.3使用 mvn package 可以正常构建 jar 包。 也可以正常运行: java -jar target/demo-application-0.0.1-SNAPSHOT.jar测试页面: http://localhost:8080/hello Demo 项目 OK 了,下面就开始实践构建镜像的3个方法。 1 Spring Boot maven 插件 的 build-imageSpring Boot 预装了自己的用于构建 Docker 镜像的插件,我们无需进行任何更改,因为它就在 pom.xml 中的 spring-boot-starter-parent。 你不需要写 Dockerfile,也不用操别的心,plugin 都帮你做了,例如 Spring 建议的安全、内存、性能等问题。 只需要简单的执行: ...

June 18, 2020 · 1 min · jiezi

我的第一本Docker书Docker镜像和仓库

Docker镜像和仓库什么是Docker镜像docker 镜像是由文件系统系统叠加而成, 最底层是一个引导文件系统,即 bootfs 和 linux 引导文件系统很像,用户是不会和引导文件系统有什么交互,当一个容器启动后,它将会被移到内存中,docker看起来很像一个典型的 linux虚拟化栈,docker 镜像第二层是root文件系统 rootfs,它位于引导文件系统之上,rootfs 可以是一种或多张操作系统,root 文件系统永远是能是只读状态,并且 docker 利用 联合加载技术 又会在 root 文件系统层上加载更多的只读文件系统,联合加载 是指一次同时加载多个文件系统,但是在外层看起来只能看到一个文件系统,联合文件系统会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。docker 将这样的文件系统称之为镜像,一个镜像可以放到另外一个镜像顶部,位于下面的镜像称之为父镜像,直到镜像栈的最底部,最底部的镜像称之为基础镜像,当启动容器时,Docker 会在该镜像的最顶层加载一个读写文件系统,我们运行的程序就是在就是在读写层中执行当docker 第一次启动一个容器时,初始读写层是空的,当文件系统发生变化时,这些变化都会应用到这一层上,当修改一个文件时,这个文件首先会从该读写层下面的只读层复制到该读写层,只读版本依然存在,但是已经被读写层中的该文件副本所隐藏,这种机制称为写时复制,每个只读镜像层都是只读的,并且以后永远不会变化,创建新容器时, docker会构建初一个镜像栈,并在栈的最顶端添加一个读写层,这个读写层加上其下面的镜像层以及一些配置数据,就构成一个容器。列出镜像想要知道本机中有哪些镜像,可以使用 docker images 命令查看,本地镜像都保存在 Docker 宿主机的 /var/lib/docker 目录下。$ sudo docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu latest c4ff7513909d 6 days ago 225.4 MBdocker 从仓库中下载下来, 镜像保存在仓库中, 而仓库位于 Registry 中,默认的Registry 是由Docker公司运营的公共 Registry 服务,Docker 提供一种标签功能(tag) 来区别镜像,这样可以使得同一个仓库中可以存储多个镜像,同一个镜像可以有多个标签,在构建镜像的时候,建议指定标签,这样更容易来区分镜像拉取镜像启动容器时, 如果镜像不在本地,Docker会从Docker hub 拉去镜像,没有指定镜像标签,会自动下载 latest标签的镜像。也可以使用 docker pull 拉取镜像到本地,然后再启动容器,拉取指定标签的镜像为docker pull 镜像名:标签名查找镜像可以通过 docker search 命令来查找所有 Docker hub 上公共可用的镜像$ sudo docker search puppetNAME DESCRIPTION STARS OFFICIAL AUTOMATEDwfarr/puppet-module...jamtur01/puppetmaster. . .查找镜像会返回该镜像的详细信息,仓库名, 镜像描述, 用户评价(stars), 是否官方(official)-由上游开发这管理的镜像, 自动构建(Automated)-表示镜像是由 Docker Hub 自动构建构建镜像在使用过程中我们需要修改,更新和管理这些镜像,可以自动构建镜像,构建镜像的方法有两种,docker commit 命令和 Dockerfile 文文件构建,在实际开发中,不推荐使用 docker commit 方式构建,应该使用更灵活,更强大,的Dockerfile 来构建镜像docker commitdocker commit 方式构建镜像,需要我们先创建一个容器,并在容器內做出修改,最后将修改提交为一个新的镜像创建容器$ sudo docker run -i -t ubuntu /bin/bashroot@4aab3ce3cb76:/#安装软件root@4aab3ce3cb76:/# apt-get -yqq update. . .root@4aab3ce3cb76:/# apt-get -y install nginx. . .构建镜像$ sudo docker commit 4aab3ce3cb76 jamtur01/apache28ce0ea7a1528docker commit 指定要提交的修改过的容器ID, 以及一个目标镜像仓库,和镜像名,docker commit 提交的两个镜像的差异部分,使得构建镜像非常的轻量化$ sudo docker commit -m"A new custom image" -a"James Turnbull" \4aab3ce3cb76 jamtur01/apache2:webserverf99ebb6fed1f559258840505a0f5d5b6173177623946815366f3e3acff01adef还可以指定 -m 来指定新创建的镜像的提交信息,-a 来指定该镜像的作者信息Dockerfile并不推荐 docker commit 来构建镜像,推荐使用 Dockerfile 定义文件,和 docker build 命令来构建镜像,使用 Dockerfile 的好处是构建镜像更具可重复性,透明性等好处。Dockerfile初体验编写Dockerfile文件创建一个目录,并初始化 Dockerfile文件$ mkdir static_web$ cd static_web$ touch Dockerfile创建的目录就是我们的构建环境, Docker 称此环境为上下文,或者构建上下文,Docker 会在构建镜像时,将构建上下文和该上下文中的文件和目录上传到 Docker 守护进程, 这样 Docker 守护进程就能直接访问用户想要在镜像中存储的任何代码,文件,或者其他数据。Dockerfile 文件内容# Version: 0.0.1FROM ubuntu:14.04MAINTAINER James Turnbull "james@example.com"RUN apt-get update && apt-get install -y nginxRUN echo 'Hi, I am in your container' \>/usr/share/nginx/html/index.htmlEXPOSE 80Dockerfile 由一系列指令和参数组成, 指令都是大写字母,指令后面跟随一个参数, Dockerfile会按照顺序,从上到下执行,在书写Dockerfile时,需要合理安排指令的顺序。每条指令都会创建一个新的镜像层并对镜像进行提交, 大致执行流程如下Docker 从基础镜像运行一个容器执行一条指令,对容器作出修改执行类似 docker commit 操作,提交一个新的镜像层Docker 再基于刚提交的镜像运行一个新容器,执行 Dockerfile 中的下一条指令,直到所有指令都执行完毕如果用户的Dockerfile 由于某些原因(指令失败), 没有正常结束,那么用户将得到一个可以使用的镜像,方便用户调试,用户可以基于该镜像运行一个具备交互功能的容器,进行 失败指令调试。Dockerfile 也支持注视, 已 # 开始。每个Dockerfile第一条指令必须是 FROM, FROM 指定一个与存在的镜像,后续指令都将基于该镜像进行,这个镜像被称基础镜像MAINTAINER 指令,指定该镜像的作者是谁,以及作者的电子邮件嘻,联系方式RUN 指令, 会在当前镜像中运行指定的命令,每条 RUN 指令都会创建一个新的镜像层,如果指令成功,就会将此镜像层提交,之后继续执行 Dockerfile中的吓一条指令, 默认情况下,RUN 指令会在 shell 中使用命令包装器, /bin/sh -c 来执行,如果在一个不支持 shell的平台上运行,或者不希望在shell中运行,可以使用 exec 格式的run 命令exec 格式的 RUN 指令RUN [ "apt-get", " install", "-y", "nginx" ]EXPOSE 指令, 告诉 Docker 该容器內额应用程序将会使用容器的指定端口,并不意味这可以自动访问任意容器运行中服务的端口,出于安全原因,Docker 并不会自动打开该端口,而是需要用户在使用 docker run 运行容器是来指定需要打开那些端口,可以指定多个 EXPOST 指令向外部公开多个端口Dockerfile构建新镜像Dockerfile 编写完毕,需要使用 docker build 来构建镜像,执行docker build 命令时, Dockefile中所有的指令都会被执行,并且提交,并且在该命令成功结束后返回一个新镜像$ cd static_web$ sudo docker build -t="jamtur01/static_web" .Sending build context to Docker daemon 2.56 kBSending build context to Docker daemonStep 0 : FROM ubuntu:14.04---> ba5877dc9becStep 1 : MAINTAINER James Turnbull "james@example.com"---> Running in b8ffa06f9274---> 4c66c9dcee35Removing intermediate container b8ffa06f9274Step 2 : RUN apt-get update---> Running in f331636c84f7---> 9d938b9e0090Removing intermediate container f331636c84f7Step 3 : RUN apt-get install -y nginx---> Running in 4b989d4730dd---> 93fb180f3bc9Removing intermediate container 4b989d4730ddStep 4 : RUN echo 'Hi, I am in your container' >/usr/share/nginx/html/index.html---> Running in b51bacc46eb9---> b584f4ac1defRemoving intermediate container b51bacc46eb9Step 5 : EXPOSE 80---> Running in 7ff423bd1f4d---> 22d47c8cb6e5Successfully built 22d47c8cb6e5-t 参数,为新镜像设置了仓库和名称, 也可以为过程中镜像设置一个标签,镜像名:标签$ sudo docker build -t="jamtur01/static_web:v1" .自Docker 1.5.0 开始,-f 标志指定一个区别与标准Dockerfile 的构建源的位置,这个文件可以不必命名为Dockerfile 但是必须要位于构建上下文中docker build –t="jamtur01/static_web" -f path/to/file构建失败在构建过程中,指令失败,也会也会得到一个镜像,我们可以使用 docker run命令来基于这个构建到目前为止已经成功的最后一步创建一个容器,方便调试指令Dockerfile和构建缓存每一步构建过程都会将结果提交为镜像,Docker 会讲之前的镜像层看作缓存, 构建起来额速度非常块,也可以在确保构建过程中不实用缓存,可以使用 --no-cache标志$ sudo docker build --no-cache -t="jamtur01/static_web" .查找新镜像可以使用 docker images 可以查看到刚刚构建出来的镜像,也可以使用docker history命令来查看镜像是如何构建出来的$ sudo docker history 22d47c8cb6e5IMAGE CREATED CREATED BY SIZE22d47c8cb6e5 6 minutes ago /bin/sh -c #(nop) EXPOSE map[80/tcp:{}] 0 Bb584f4ac1def 6 minutes ago /bin/sh -c echo 'Hi, I am in your container' 27 B93fb180f3bc9 6 minutes ago /bin/sh -c apt-get install -y nginx 18.46 MB9d938b9e0090 6 minutes ago /bin/sh -c apt-get update 20.02 MB4c66c9dcee35 6 minutes ago /bin/sh -c #(nop) MAINTAINER James Turnbull " 0 B. . .新镜像启动容器我们可以使用新镜像,检查构建镜像是否一切正常$ sudo docker run -d -p 80 --name static_web jamtur01/static_web \nginx -g "daemon off;"6751b94bb5c001a650c918e9a7f9683985c3eb2b026c2f1776e61190669494a8-p 该标志用来控制Docker 在运行是应该公开那些网络端口给外部(宿主机),Docker 可以在宿主机随机选择一个位于 32768-61000 的一个较大的端口来映射到容器的80端口上, 可以在宿主机指定一个具体的端口来映射到容器的 80 端口上 Docker 提供了一个更简单的方式, 即 -P 参数, 该参数可以用来对外公开在Dockerfile中通过 EXPOSE 指令公开的所有端口$ sudo docker run -d -P --name static_web jamtur01/static_web \nginx -g "daemon off;"该命令会将容器內的80端口对本地宿主机公开,并且绑定到宿主机的一个随机端口上, 该命令会将用来构建该镜像的Dockerfile文件中的EXPOST 指令指定的其他端口也一并公开

June 16, 2020 · 3 min · jiezi

Image镜像与Container容器基础篇

前言这是一篇关于镜像与容器的基础篇,虽然有些内容与18年写的文章迈入Docker、Kubernetes容器世界的大门有重叠,但随着这几年对容器的熟悉,我想将一些认识分享出来,并作为我后续将要写的文章一些技术铺垫。 镜像是什么在描述什么是镜像前,先来看一下如下示例程序,其为基于flask框架写的一个简单的python程序。 # 文件app.pyfrom flask import Flaskapp = Flask(__name__)@app.route('/')def hello(): return "Hello, World"if __name__ == "__main__": app.run(host='::', port=9080, threaded=True) # 文件requirements.txtflask为了运行此程序,我们首先需要一个操作系统(如ubuntu),而后将程序上传到主机某个目录(如/app),接着安装python 3与pip程序,而后使用pip安装flask模块,最后使用python运行此程序,其过程涉及命令如下所示: apt-get updateapt-get install python3 python3-pippip install -r /app/requirements.txtpython3 /app/app.py假设另一款程序只能运行在某特定版本(如0.8)的flask模块上,那么此时运行pip install flask=0.8将会与上面安装的flask版本相冲突,为了解决此问题,我们可使用容器技术将程序运行环境与程序本身打包起来,而打包后的东西我们称之为Image镜像。 为了制作镜像,我们需选择一款工具,如docker、,而本文选择一款名为podman的工具,功能可用alias docker=podman来描述。在centos 7.6以上操作系统,执行如下命令安装: yum -y install podman通常,我们将制作镜像的过程或逻辑编写在一个名为Dockerfile的文件中,对于示例程序,我们在主机源码目录下添加一个Dockerfile,其包含的构建逻辑如下所示: # 1. 选择ubuntu操作系统,版本为bionic(18.04),我们后续将使用apt-get安装python与pipFROM docker.io/library/ubuntu:bionic# 2. 指定工作目录,等价于命令:mkdir /app && cd /appWORKDIR /app# 3. 使用ubuntu操作系统包管理软件apt-get安装pythonRUN apt-get update && apt-get install -y \ python3 \ python3-pip \ && rm -rf /var/lib/apt/lists/*# 4. 将python模块依赖文件拷贝到工作目录并执行pip从阿里云pypi源安装python模块COPY requirements.txt ./ENV INDEX_URL https://mirrors.aliyun.com/pypi/simpleRUN pip3 install -i $INDEX_URL --no-cache-dir -r requirements.txt# 5. 将主程序拷贝到工作目录COPY app.py ./# 6. 指定使用此镜像运行容器时的命令CMD python3 /app/app.py接着,我们执行如下命令将应用打包成镜像,也就是说,下述命令执行Dockerfile文件内的指令从而生成应用镜像(名为hello-flask),其包含python运行环境与源码。 ...

June 13, 2020 · 6 min · jiezi

Docker初遇见

Docker简介Docker 是一个 能够把开发的应用程序自动部署到容器的开源引擎,Docker 在 虚拟化的容器执行环境中增加了一个应用程序部署引擎。该引擎的目标就是提供一个 轻量、快速 的环境,能够 运行开发者的程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境Docker 客户端和服务端Docker 是一个客户端/服务端(c/s)架构程序, 客户端只需要向服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。docker 提供一个命令工具以及已restapi与守护进程进行交互Docker 镜像镜像是构建Docker的基石,用户基于镜像来运行自己的容器,镜像是基于联合(union) 文件系统的一种层式的结构,也可以把镜像当作是容器的源代码。RegistryDocker 用 Registry 来保存用户构建的镜像,(Registrt分为公共和私有两种),用户也可以在Docker Hub 上保存自己的私有镜像容器Docker 可以帮用户构建和部署容器,用户只需要把自己的应用程序或服务打包放进容器即可,容器中可以运行一个或者多个进程, 镜像是Docker生命周期的构建和打包阶段,而容器则是启动或者执行阶段Docker 安装yum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum update -y && yum install -y docker-ce# 创建 /etc/docker 目录mkdir /etc/docker# 配置 daemon.jsoncat > /etc/docker/daemon.json <<EOF{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"}}EOFmkdir -p /etc/systemd/system/docker.service.d# 设置开机自启systemctl daemon-reload && systemctl restart docker && systemctl enable docker查看是否安装成功docker -v官方安装方式https://docs.docker.com/engine/install/centos/

June 10, 2020 · 1 min · jiezi

docker学习

安装步骤# 安装docker yum install docker # 启动docker systemctl start/status docker # 查看docker启动状态 docker version启动查看版本

June 9, 2020 · 1 min · jiezi

Docker-入门二dockernodeJs制作镜像与本地部署

在熟悉docker基本命令与运作逻辑后,尝试实战。 目标:制作一个nodejs服务镜像,并使用nginx反向代理,在本地跑通。 本次项目配置与工具构成: node后端:使用阿里的 Egg.js 脚手架db:mongodbnginxNoSqlBooster for MongoDB,一个mongodb可视化工具postman 一个可以发起网络请求的工具,用于测试注:本机操作系统为 macOS 本文主讲docker部分,其余知识面仅描述部分准备工作: docker镜像:nginx:latest、node:10.15.3、mongo:latestdocker-compose可用Egg.js脚手架初始化后端项目,命名为 egg-center项目配置 Egg.js安装egg-mongoose库,以便连接mongodb。 数据库配置,修改./config/config.default.js config.mongoose = { clients: { center: { url: 'mongodb://你本地的内网ip:27017/example', options: { dbName: 'center', // 数据库名,自己取 user: '', // 连接数据库的账号,默认为空 pass: '', // 连接数据库的账号,默认为空 } } } }接下来写一个后台用户管理系统在 ./app/controller 下新增对应的控制器、在./app/model下新增对应的表结构。 然后写几个简单的接口,修改:./app/router.js,定义路由: 'use strict'/** * @param {Egg.Application} app - egg application */module.exports = app => { const { router, controller } = app router.get('/', controller.home.index) /* 新增用户 */ router.post('/api/admin/user', controller.admin.user.create) /* 用户列表 */ router.get('/api/admin/user', controller.admin.user.index) ...略}本地启动服务测试: npm run dev本地使用 postman 调通接口,造些测试数据。 ...

June 8, 2020 · 2 min · jiezi

docker系列5容器生命周期管理上

这是本专栏的第二部分:容器篇,共 6 篇,帮助大家由浅入深地认识和掌握容器。这一篇和下一篇,我会为你介绍容器生命周期管理相关的内容,带你掌握容器生命周期。下面我们一起进入第一篇的内容,主要涉及容器状态的变化。 在第一部分第二篇《Docker 的基本使用》中,我为你介绍了 Docker 的基本使用,包括使用 docker run 启动一个容器,使用 docker exec 进入一个正在运行的容器。那你有没有考虑过容器的整个生命周期是什么样的?当我们不使用它的时候,它是什么状态? 我们启动一个 Redis 的容器作为示例。 (MoeLove) ➜ ~ docker run -d rediscf56a27e94f6142e7f69eb34de837b9bc091986006b1a7b563750317185376ea使用 docker ps 命令查看容器当前的状态,在输出结果中包含一列 STATUS 状态信息,我们以此状态作为本篇的切入点。 (MoeLove) ➜ ~ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMEScf56a27e94f6 redis "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 6379/tcp cranky_yonath创建一个容器(Created)使用 docker container create 或者 docker create 命令可创建一个处于 Created 状态的容器,但是该容器并没有真正运行,我们是不能通过 docker exec 进入该容器的。 # 创建一个容器(MoeLove) ➜ ~ docker container create redis2017ecbb4da676069ce0f57583765a7f2562475bb0f7dfab12de8d1e0a93f322# 查询容器的状态(MoeLove) ➜ ~ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2017ecbb4da6 redis "docker-entrypoint.s…" 11 seconds ago Created condescending_cray# 尝试进入容器内部(MoeLove) ➜ ~ docker exec -it 2017ecbb4da6 shError response from daemon: Container 2017ecbb4da676069ce0f57583765a7f2562475bb0f7dfab12de8d1e0a93f322 is not running虽然它没有真正运行,但是它运行所需的相关文件却已经都创建好了,并且你也可以在 create 的时候给它传递各种可用于配置容器运行时的参数;这种方式通常是用来预配置容器,因为在执行完 docker create 命令后,会直接输出容器的 ID。你可以在一切准备就绪后,随时启动它。 ...

June 8, 2020 · 3 min · jiezi

个人学习系列-Docker搭建Nginx

在docker中搭建一个nginx,然后进行简单的测试。nginx简介Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强。 nginx搭建获取镜像查看镜像docker search nginx 拉取镜像docker pull nginx 查看下拉的镜像docker images 启动镜像启动镜像docker run -d -p 8081:80 --name nginx nginx 访问你的IP地址 + 端口号 修改index.html从宿主机复制index.html到容器中index.html的内容如下: <html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>系统时间</title></head><body><div id="datetime"> <script> setInterval("document.getElementById('datetime').innerHTML=new Date().toLocaleString();", 1000); </script></div></body>宿主机中文件位置为:/var/nginx/html/index.html docker cp /var/nginx/html/index.html nginx:/usr/share/nginx/html再次访问nginx 暂时先这样!!! 个人网站http://www.zhouzhaodong.xyz

June 8, 2020 · 1 min · jiezi

安利-WSL-Linux-子系统真香附完整实操

WSL 初体验 WSL Linux 子系统体验原生 Docker,真香! Windows 的 linux 子系统出来挺长时间了,你体验过了吗? 今天就带你折腾一下吧,毕竟想甩掉超占用硬件资源的大块头VM,比如VMware 本文献给爱折腾的你,折腾吧,后浪! 简单说下这篇文章的重点: 安装 WSL 的全过程选择性升级到 WSL 2 的全过程WSL 2 中体验原生 Docker啥是 WSL ?WSL 是 Windows Subsystem for Linux 的缩写,意思是 linux 版的 window 子系统。 引用自:微软官网 https://docs.microsoft.com/zh... The Windows Subsystem for Linux lets developers run a GNU/Linux environment -- including most command-line tools, utilities, and applications -- directly on Windows, unmodified, without the overhead of a virtual machine. ...

June 8, 2020 · 3 min · jiezi

使用nginx-docker镜像部署服务器配置https附带java后端部署例子

背景- 需求https,已有备案通过域名- 腾讯云服务器,所以从腾讯云上申请了免费的https证书(阿里云服务器上阿里云申请)- 服务器安全组打开443端口- 纯docker部署(nginx、java后端)- 服务器上准备好nginx镜像:docker pull nginx- 使用docker-compose编排步骤域名解析至目标服务器,在目标服务器新增目录nginx-config,用于存放nginx配置文件。下载https证书,它有多种部署方案的证书选择(Apache、IIS、Nginx、Tomcat),将Nginx使用的证书储存至目标服务器nginx-config目录下,它包含两个文件: 1_[这里是你的域名].top_bundle.crt2_[这里是你的域名].key在nginx-config目录下新建文件:docker-compose.ymlservice.conf当前服务器nginx-config目录结构:/root/nginx-config/docker-compose.yml/root/nginx-config/service.conf/root/nginx-config/1_[这里是你的域名]_bundle.crt/root/nginx-config/2_[这里是你的域名].key修改docker-compose.yml,完整代码: version: '3'services: nginx: image: nginx:latest ports: - 443:443 volumes: - "/root/nginx-config/service.conf:/etc/nginx/conf.d/service.conf" - "/root/nginx-config/1_[这里是你的域名]_bundle.crt:/etc/nginx/1_[这里是你的域名]_bundle.crt" - "/root/nginx-config/2_[这里是你的域名].key:/etc/nginx/2_[这里是你的域名].key" java: image: java:8 ports: - 8088:8088 volumes: - "/root/java/[java打包后的jar包].jar:/root/java/[java打包后的jar包].jar" command: ["java", "-jar", "/root/java/java打包后的jar包.jar"]docker-compose.yml解读 两个docker镜像nginx: image: nginx:latest java: image: java:8nginx使用443端口。左边为宿主机端口,右边为容器端口。 https使用的是443端口,http使用的是80端口java服务使用 8088端口 ports: - 443:443 ports: - 8088:8088挂载文件至容器。nginx配置文件和java配置文件分别挂载至对应的容器下。volumes: - "/root/nginx-config/service.conf:/etc/nginx/conf.d/service.conf" - "/root/nginx-config/1_[这里是你的域名]_bundle.crt:/etc/nginx/1_[这里是你的域名]_bundle.crt" - "/root/nginx-config/2_[这里是你的域名].key:/etc/nginx/2_[这里是你的域名].key" volumes: - "/root/java/[java打包后的jar包].jar:/root/java/[java打包后的jar包].jar"commond,在容器内执行的shell命令。这里为启动服务。command: ["java", "-jar", "/root/java/java打包后的jar包.jar"]修改service.conf: upstream javaserver { server [宿主机内网ip]:[后端java服务docker容器的端口];}server { listen 443 ssl; server_name [这里是你的域名]; ssl_certificate 1_[这里是你的域名]_bundle.crt; # https的证书文件路径 ssl_certificate_key 2_[这里是你的域名].key; # https的证书文件路径 ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 这里是腾讯云的配置,阿里云的ssl_ciphers请上阿里云查看 ssl_prefer_server_ciphers on; location /api { # 接口前缀为/api开头的,全部转发至java后端服务,可以配置多个location proxy_pass http://javaserver; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; }}启动服务: ...

June 5, 2020 · 1 min · jiezi

docker安装elasticsearch和kibana

1.安装elasticsearchpull elasticsearch镜像 docker pull elasticsearch 创建一个交接模式网络 docker network create elasticsearch_net安装 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 --network elasticsearch_net -v elasticsearch_volume:/root -e "privileged=true" -e "discovery.type=single-node" elasticsearch# -d 后台运行# --name elasticsearch 容器名称# -p 9200:9200 -p 9300:9300 映射端口 # --network elasticsearch_net 指定网络# -v elasticsearch_volume:/root 具名共享目录# -e "privileged=true" 配置访问权限# -e "discovery.type=single-node" 指定elasticsearch部署模式# elasticsearch 指定镜像----# -v elasticsearch_volume:/root 具名共享目录# -e "privileged=true" 配置访问权限开始没有配置访问权限,es一直起不起来,加了权限就可以起来了 修改配置 echo 'http.cors.allow-origin: "*"' >> elasticsearch.ymlecho "http.cors.enabled: true" >> elasticsearch.yml重启es ...

June 4, 2020 · 1 min · jiezi

Docker-实战笔记容器

Docker 容器之基本命令$ docker container run #启动新容器的命令,可按需求内嵌参数Ctrl+PQ #断开Shell和容器终端的命令,退出之后保持容器的运行状态$ docker container ls #列出当前主机处于运行状态的容器$ docker container ls -a #列出当前主机所有的容器,运行状态和停止状态都会被显示$ docker container stop #停止容器$ docker container start #启动容器$ docker container rm #删除已经停止运行的容器$ docker container inspect #显示容器的配置细节和运行时信息初探容器下面展示了一些 Docker 的基本操作,帮助我们从0到1学习这项伟大的技术! $ docker image ls #查看当前主机的镜像$ docker container run -it ubuntu:latest /bin/bash #拉取镜像并启动容器,-it参数表示切换到容器的shellroot@e1sdk4e81486:ps -elf #查看容器内进程需要注意的是,此时在容器内使用ps -elf查看进程的命令,会显示两个UID都是root的进程。在我的运行环境上,PID1代表的是/bin/bash进程,该进程是通过docker container run命令来通知容器运行的;PID10代表的是ps -elf进程,查看当前运行中进程所使用的命令。但是当ps命令退出之后,就意味着容器内长期运行的进程其实只有/bin/bash。 通过Ctrl-PQ组合键,可以在退出容器的同时还保持容器的运行,此时 shell 就已经返回到 docker 主机(指宿主机)终端;依旧可以通过使用docker container ls查看当前 docker 主机内全部处于运行状态的容器。 $ docker container ls #查看当前主机正在运行的容器执行docker container exec命令,可以将当前 docker 主机的 Shell 连接到指定运行中的容器终端: ...

June 3, 2020 · 3 min · jiezi

Docker-实战笔记应用容器化

应用的容器化Docker 的核心思想就是如何将应用整合到容器中,并且能在容器中实际运行。将应用整合到容器中并且运行起来的这个过程,称为“容器化(Containerizing)”,有时候也叫“Docker化(Dockerizing)”。 应用容器化主要分为以下几个步骤: 编写应用代码创建一个 Dockerfile ,其中包括当前应用的描述、依赖以及该如何运行这个应用对该 Dockerfile 执行 docker image build 命令等待 Docker 将应用程序构建到整个 Docker 镜像中一旦应用容器化完成,就能够以镜像的形式交付并以容器的方式运行了。 ######### 应用容器化的基本命令 #########基于Dockerfile文件构建镜像 -t表示为镜像打标签 -f表示为Dockerfile指定路径和名称 -f表示指定位于任意路径下的任意名称的Dockerfile$ docker image build ######### Dockerfile指令 ###############$ FROM #指定构建的基础镜像$ RUN #在镜像层执行命令,每次使用将会构建新的镜像层$ COPY #将文件作为一个新的层添加到镜像中,通常使用赋值的形式$ EXPOSE #为镜像设置监听端口$ ENTRYPOINT #指定镜像以容器方式默认运行的应用程序$ LABEL #给镜像打标签,以键值对的形式$ ENV #指定镜像的环境变量$ ONBUILD #添加镜像触发器,以当前基础镜像构建新的镜像时,会触发相应的指令$ HEALTHCHECK #增加自定义的心跳检测功能,多次使用只有最后一次有效$ ADD #构建镜像时,复制上下文中的文件到镜像内$ WORKDIR #指定镜像工作目录...更多Dockerfile文件指令可到官方文档查询:https://docs.docker.com/v17.09/engine/reference/builder/ 单体应用容器化获取源码 由于我所用的学习资料是Nigel Poulton所著的《深入浅出Docker》,再次感谢作者的不吝贡献!关于接下来所分析的部分,我克隆了本书作者的Github仓库源代码进行分析。 $ git clone https://github.com/nigelpoulton/psweb.git #克隆源码$ cd psweb/$ ls app.js circle.yml Dockerfile package.json README.md test views可以看出,整个应用容器化的结构已经一目了然了! ...

June 3, 2020 · 3 min · jiezi

Docker-学习笔记底层实现

前言在前面一章的学习中,我们已经了解到了 Docker 的前世今生以及它的一些开源项目,Docker 凭借高度组件化和快捷部署等优点,成为运维和开发中炙手可热的工具。 运维视角(Ops)在运维视角中,主要包括下载镜像、运行和登录新的容器、在容器内输入相关命令、销毁容器等。运维人员关心的是怎么操作,如何利用 Docker 帮助运维人员完成更高效的工作。 开发视角(Dev)在开发视角中,更多关注与应用相关的内容,学习 Docker 底层原理和技术细节,学习编写 Dockerfile ,将应用容器化、并在容器内运行,推送至云端仓库,包括使用 Golang 为 Docker 一众开源生态提交贡献等。 底层实现基本架构Docker 采用了 C/S 架构,即客户端(client)和服务端(server)。Docker 守护进程(Daemon)作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTful API 来进行通信。 Docker Daemon 守护进程一般在宿主主机后台运行,等待接收来自客户端的消息。Docker Client 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker 守护进程交互。 Docker 引擎在“Docker 前世今生”已经略微提到了关于 Docker 引擎的一些内容,可以将其类比成虚拟机(VM)的引擎 ESXi。不过在本节中,将会带来更多 Docker 引擎的具体细节。 Docker 引擎是用来运行和管理容器的核心软件。基于开放容器计划(OCI)相关标准的要求,Docker 引擎采用了模块化的设计原则,其组件是高度解耦的,是可以替换的。 Docker 引擎主要由以下构件组成:Docker 客户端(Docker Client)、Docker 守护进程(Docker Daemon)、contained 以及 runc 和 shim。 (补图) 早期的 Docker 引擎是由两个核心组件构成:LXC 和 Docker Daemon。 Docker Daemon 是单一的二进制组件,包含了Docker Client、Docker API、容器运行时、镜像构建等。LXC 提供了诸如命名空间(Namespace)和控制组(CGroup)等基础工具的操作能力,它们是基于 Linux 内核的容器虚拟化技术。(Docker和LXC交互图) ...

June 3, 2020 · 1 min · jiezi

Docker-学习笔记镜像

前言Docker 有三大基础概念: 镜像(Image)容器(Container)仓库(Repository)在本章的学习中,我将会单独把镜像(Image)做一个比较系统化的梳理和记录笔记。那么先来认识什么叫做 Docker Image 吧! Docker Image 简介镜像由多个层组成(每层的基本单位被称为镜像层),每层镜像叠加以后,从外部看来就像一个独立的对象。(这个外部独立的对象的基本单位也是镜像)。 镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包,甚至比最小化安装还要更少的软件栈(soft stack)。 Docker Image 详解镜像(Image)可以理解成构建时,(build-time)结构,而容器(Container)可以理解成运行时,(run-time)结构。 一旦容器从镜像启动后,二者之间就变成了相互依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的。可以使用以下命令对 alpine:latest 镜像进行删除。 $ docker image rm alpine:latest

June 3, 2020 · 1 min · jiezi

Docker-前世今生

前言记得是在二零一八年十月份,当时是因为在学校报名参加了一个叫什么全国大学生大数据技能竞赛的玩意儿,赛点设置在中国农业大学计算中心,比赛是搭建一个伪分布式Hadoop集群系统,按照搭建步骤完成度得分。 我相信学习过Hadoop平台的同学们都知道,传统的搭建教学方法是借助于三台虚拟机,每台虚拟机之间需要互相配置ssh免密登录、防火墙安全规则以及端口许可等步骤,为了无痛解决这些繁琐的安装问题,于是乎就想到了可以写个一键自动化安装的Shell脚本。 与此同时,我也在Google有什么办法让开发人员能在配置环境上减少更多的时间开销,在瞎几把捣鼓一番之后,终于了解到Docker的大名。在尝到了使用Docker拉取系统镜像极其轻量和便捷的甜头之后,就一直对容器技术保持相当高的关注度。 过去,我一直是以运维(Ops)的视角来对待Docker,只关心怎么使用和操作层面上的东西,而对于它本身的底层原理、怎么实现、如何自己编写Dockerfile等并没有实践地去了解。因为今后想要从事服务端工程师(Dev)相关的工作,于是便开始了Golang和Docker的系统化学习。因此,所有的学习笔记我都会归档在博客里。 事不宜迟,我们先开始了解Docker的前世今生吧!这对于今后的Docker学习旅程将十分有帮助! 我所使用的学习资料: 官方文档,Docker源码《深入浅出Docker》落后的旧时代要知道今天的互联网生态是由于亿万个业务构成成的,起初,业务是基于应用(Application)运转的;如果应用故障,那么业务也会故障,也就会进而导致企业的破产。 绝大部分的应用都是运行在服务器之上的。在因特网诞生之初,每个服务器只能运行一个应用。在那个时代,Windows和Linux都没有相应的技术手段来保证一台服务器可以稳定而安全地运行多个应用。所以,经常会出现这样的一幕,一个公司为了扩大它的业务线,需要增加一个新的应用时,就必须要采购一台新的服务器。但在大部分情况下,没有人知道新增应用能在服务器上耗费多少的负载,即能够使用多少的性能,负责采购服务器的IT部门人员只能凭借经验去购买服务器。这会带来两个问题,第一,服务器性能不足,可能会导致公司的业务线崩溃,造成交易失败,损失商业价值;第二,服务器性能过剩,因为无法计算服务器负载性能,长期以往将会对公司的资产造成极大的浪费。 虚拟机的时代为了解决上述问题,VMware公司创造了划时代的虚拟机技术(VM),这种技术能够允许一台服务器上执行多个应用和服务,可以很好地解决旧时代所遗留下的问题。但是,虚拟机也有很明显的缺点,它需要依赖于专用的操作系统(OS),而OS会占用宿主机额外的CPU、内存、RAM及存储空间,这些资源本该可以允许运行更多的应用...所以,在性能稍差一点的计算机上运行虚拟机软件,这绝对是一个天大的噩梦。同时,在某些情况下,OS的运行需要依赖某些许可证才能运行,例如Windowns和Mac,倘若将虚拟机技术应用于市场,技术许可的运营成本也是一笔十分巨大的开销。 容器时代容器模型实际上跟虚拟机模型很相似,但它们唯一的而且是最根本的区别就在于,容器的运行不会独占宿主机的OS和资源。此外,利用容器部署系统镜像,不仅具有启动快和快速迁移的特性,还能节省大量花费在许可证和为OS打补丁的运维成本,因为倘若一个容器环境需要更新或者回退,只需要将当前容器销毁(一般是一个容器部署一个应用,销毁后不会破坏当前依赖),接着再从Docker Hub上拉取(pull)一个下来即可,这就是我们经常提到“开箱即用,out-of-the-box feature”的特性。 Linux容器我在博客上记录的所有关于容器技术的运行环境全都是基于Linux环境之下,Windows和Mac的心得暂时不会收录。但是也要了解,现代容器技术起源于Linux,并且对Windows和Mac有着程度不一的支持。 我们需要了解的第一个重点是,对容器发展影响比较大的技术主要有内核命名空间(Kernel Namespace)、控制组(Control Group)、联合文件系统(Union File System)、以及 Docker。当然,容器技术的发展也离不开基金会对上游开源项目的支持,如果没有它们的支持,也就不会有今天蓬勃发展的容器生态。 Docker简介前面铺垫了这么多,终于进入本篇的正题了。Docker是一种运行于Linux和Windows上的软件,用于创建、管理和编排容器。 Docker公司位于旧金山,由法裔美籍开发者和企业家 Solumon Hykes 创立,其标志和吉祥物是一条蓝色的鲸鱼。Docker公司起初是一家名为dotCloud的平台即服务(PaaS)提供商。在底层技术上,dotCloud使用了Linux容器技术,后来公司内部自己开发了一套管理和编排的工具,之后被命名为“Docker”,于是,Docker就是这么诞生了!【注】:“Docker”一词来源于英国口语,意为码头工人(Dock Worker),即从船上装卸货物的人。 Docker容器引擎在今天,我们谈及Docker时,大多时候是指Docker引擎。Docker引擎是用于运行和编排容器的基础设施工具。可以这么类比,ESXi是虚拟机技术(VM)的核心管理程序,而Docker引擎时是运行容器的核心容器运行时。 Docker引擎主要有两个版本,企业版(EE)和社区版(CE),我在博客所使用的Docker引擎版本为社区版。 企业版(EE)会提供12个月的稳定技术支持。社区版(CE)会提供4个月的稳定技术支持。社区版还会通过 Edge 方式发布月度版。Docker开源项目由于以Docker为代表的容器技术在计算机领域内应用很广,所以当今“Docker”一词也会用于指代那些开源的Docker项目,例如各种衍生版本。不过,Docker项目在2017年于Austin举办的DockerCon上被正式命名为Mody项目(其Logo如图所示)。因为这次改名,Github上的docker/docker库也被转移到moby/moby。 开发语言从Github仓库可以看到,多数项目及其工具都是基于Golang编写的,也称Go语言,这是谷歌推出一种新的系统级编程语言。使用Go语言的开发者,将会更容易地为该项目贡献代码。 开发容器生态前面我们提到了,容器生态的发展离不开基金会的支持,其中就不得不提到开放容器计划(The Open Container Initative, OCI),这是一个旨在对容器基础架构中的组件进行标准化的管理委员会。 关于OCI的成立,其实还有段小插曲,在这里可以大概简述一下是何故?事情起源于,一个名为CoreOS的公司不喜欢Docker的某些行事方式,因此,它就创建了一个新的开源标准,称作“appc”,该标准涉及诸如镜像格式和容器运行时等方面,此外它还开发了一个名为“rkt”的实现。 CoreOS公司和Docker公司分别主导的两个处于竞争状态的容器标准将容器生态陷入一种尴尬的境地,这使得容器生态陷入了分裂。考虑到这一点,相关的双方都使用的尽量成熟的方式来处理此事,共同成立了OCI——一个旨在管理容器标准的委员会。 今天,OCI已经发布了两份标准:镜像规范和运行时规范。OCI在Linux基金会的支持下运作,Docker和CoreOS都是其主要的贡献者。

June 3, 2020 · 1 min · jiezi

Docker-实验环境Play-With-Docker

前言工欲善其事必先利其器,在继续深入研究Docker之前,搭建开发环境是必不可少的步骤,但这往往也是让很多萌新的产生畏难心理的一步。在本文中,我将会详细地介绍如何搭建Docker的实验环境,分为服务端(server)和在线环境两个部分进行讲解。 Play With Docker 在线实验室继 DockerCon 2017 会议之后,Marcos Nils 和 Jonathan Leibiusky 决定共同打造一款可以在浏览器上帮助大家学习Docker的产品,于是 Play With Docker 就这样诞生了。Play With Docker( PWD )是一个利用云主机搭建的在线实验环境,具有开源免费、 Web 端友好、指引步骤详细、开箱即用等特性,用户可以构建、运行Docker容器,甚至可以在Docker Swarm模式下创建集群。下面是PWD的在线环境地址,在使用之前需要注册仓库存储服务 Docker Hub 账户,这里省略注册过程(需要挂载代理)。 Play With Docker官网:https://labs.play-with-docker.com/Play With Docker开源地址:https://github.com/play-with-docker/play-with-docker 点击“Start”之后,就可以进入在线实验环境,请注意,这是一个沙盒环境(sandbox),请不要将您的任何个人信息输入至终端。 由于云主机的性能资源有限,所以每次启动PWD,只提供了四个小时的在线实验时间,所以,当你的实验完成或者因为各种原因终止实验的时候,应当关闭当前终端,即点击左上角的橙色按钮“CLOSE SEESION”。此外,PWD还提供了预定义模板功能,可以用鼠标单击左侧的扳手icon,请注意,如果需要使用预定义模板功能,需要关闭当前 seesion 才可以正确启动。 模板功能提供了三个快速启动集群的选项: 3 Managers and 2 Workers5 Managers and no Workers1 Manager and 1 Workers 搭建 Play With Docker 在线实验室 ( 教程 )由于众所周知的原因,在不挂代理的时候访问 PWD 的网站很慢,以及 PWD 本身也是一个开源项目,它的源代码和搭建教程都是对外公开的,所以我们也可以利用自己在国内的云服务器,搭建一个 Play With Docker 在线实验环境,可以完美地解决网络不通畅的问题。需要特别提示的一点,除了自己练习,否则在使用第三方搭建的 PWD 环境时,请勿将个人文件传输到终端上。搭建教程就暂时咕咕了,等什么时候有空另外再找台性能稍微好点的服务器再把教程补上。 ...

June 3, 2020 · 1 min · jiezi

Docker-实战笔记多阶段构建镜像

生产环境的多阶段构建在生产环境中,使用Dockerfile文件构建的镜像应该尽量小,只需要将其缩小到仅包含运行应用所必需的内容即可。不同的Dockerfile写法也会对镜像的大小产生显著的影响,例如,使用RUN指令会新增一个镜像层,如果出现多个这样的指令,镜像层数将会变得很臃肿;因此,通过使用&&连接多个命令以及使用反斜杠\换行的方法,将多个命令包含在一个RUN指令中,就可以有效地利用镜像层。 构建镜像完成后的清理工作同样也是尤为重要的!例如,当RUN指令执行完毕后,会残留一些构建镜像完成后的文件,这些文件会随着镜像移交至生产环境而存在,无论从哪方面来说,这是极为不妥的!Docker 提供了多种方式来解决这一问题,传统的做法是采用建造者模式。 建造者模式(Builder Pattern)建造者模式至少需要两个Dockerfile文件:一个用于开发环境(.dev),另一个用于生产环境(.prod),需要注意的是:整个过程需要编写额外的脚本才能串联起来。 首先,编写Dockerfile.dev,它基于一个大型的基础镜像,拉取所需的构建工具并构建应用。然后,基于Dockerfile.dev作为基础镜像,构建一个新的镜像层,再使用新的镜像层创建并启动容器。接着,编写Dockerfile.prod,它基于一个较小的基础镜像,并从上一步创建的容器将应用程序的相关文件和代码复制过来。多阶段构建方式多阶段构建是Docker 17.05版本新增的一个特性,用于构建精简的生产环境! 多阶段构建方式使用一个Dockerfile,其中包含多个FROM指令,每一个FROM指令都是一个新的构建阶段(Build Stage),并且可以方便地复制之前阶段的构件。多阶段构建的优点是能够在不增加复杂性的情况下优化构建过程,而且不需要编写额外的脚本就能完成构建。 拉取源码 $ git clone https://github.com/nigelpoulton/dotnet-docker-samples.git$ cd dotnet-docker-samples/aspnetapp/ $ ls #查找Dockerfileappsettings.Development.json aspnetapp.csproj bundleconfig.json Dockerfile README.md Viewsappsettings.json bower.json Controllers Program.cs Startup.cs wwwroot分析Dockerfile文件 FROM microsoft/aspnetcore-build:2.0 AS build-envWORKDIR /app# copy csproj and restore as distinct layersCOPY *.csproj ./RUN dotnet restore# copy everything else and buildCOPY . ./RUN dotnet publish -c Release -o out# build runtime imageFROM microsoft/aspnetcore:2.0WORKDIR /appCOPY --from=build-env /app/out .ENTRYPOINT ["dotnet", "aspnetapp.dll"]首先注意到,Dockerfile有三个FROM指令。每一个FROM指令构成一个单独的构建阶段。每个构建阶段在内部从0开始编号,多阶段构建方式只用到了一个Dockerfile文件,分析如下: ...

June 3, 2020 · 1 min · jiezi

Docker-实战笔记部署-Compose-应用

前言Docker Compose的前身是Fig,Fig是一个由Orchard公司开发的多容器管理工具。这是一个基于Docker的Python工具,允许用户基于一个YAML文件定义多容器应用,从而可以使用fig命令行工具进行应用的部署,还能实现对应用的生命周期进行管理。而后,Docker公司收购了Fig,并更为为Docker Compose,命令行工具fig更名为docker-compose,自此成为绑定在Docker引擎之上的外部工具。 安装Docker Compose在Linux上安装Docker Compose可分为两步: 使用curl命令下载二进制文件使用chmod命令赋予权限验证版本号 $ curl -L \curl -L https://github.com/docker/compose/releases/download/1.25.1-rc1/docker-compose-\`uname -s`-`uname -m` \-o /usr/local/bin/docker-compose$ chmod +x /usr/local/bin/docker-compose $ docker-compose --version #查看版本docker-compose version 1.25.1-rc1, build d92e9beeCompose 文件Docker Compose使用YAML文件来定义多服务的应用,网络和卷,文件存放的默认路径是:./docker-compose.yml,可传入-f参数指定具体文件,并且支持.yml和.yaml扩展名。YAML文件是JSON的一个子集(JSON是JavaScript的子集),因此也可以使用JSON文件进行数据传输。 YAML文件有以下语法规则: 大小写敏感使用缩进表示层级关系,相同缩进表示同级key(理解为相同层级)缩进时不允许使用Tab键,只允许使用空格。缩进的空格数目不重要,只要相同层级的元素左侧对齐即可# 表示注释,从这个字符一直到行尾,都会被解析器忽略。使用Docker Compose部署应用帮助文档$ docker-compose --help #查看帮助拉取源码,查看项目结构 $ git clone https://github.com/nigelpoulton/counter-app.git$ cd counter-app/$ tree -C #查看树状图结构.├── app.py├── docker-compose.yml├── Dockerfile├── README.md└── requirements.txt用tree查看工作目录结构,一目了然!简要介绍这几个文件:app.py是应用程序代码(一个Python Flask应用)同时也是核心文件;docker-compose.yml是Compose文件,用于指导Docker如何部署应用;Dockerfile定义了如何构建应用服务的镜像;requirements.txt列出了应用所需依赖的Python包。 启动Compose应用 $ docker-compose up & #前台启动应用,&表示返回终端窗口默认情况下,docker-compose up会查找名为docker-compose.yml或docker-compose.yaml的Compose文件。*如果Compose文件是其他文件名,则需要通过-f参数来指定。 $ docker-compose -f prod-equus-bass.yml up #指定prod-equus-bass.yml文件名启动应用如果需要在后台启动应用,需要传入-d参数: $ docker-compose up -f prod-equus-bass.yml up -d #指定文件名在后台启动应用查看启动Compose应用的过程中构建或者拉取的镜像: ...

June 3, 2020 · 3 min · jiezi

docker系列4docker版本及内核兼容性选择

这是本专栏的第一部分:Docker 入门,共 3 篇,帮助大家进入 Docker 的世界。上一篇,我带大家了解了 Docker 入门的基础知识,知道了如何运行和操作容器。下面我们一起进入第三篇的内容。 Docker 的版本历程快速迭代期在第一篇,我们已经知道 Docker 是在 2013 年首次亮相,在 2014 年 6 月 9 日发布了 1.0.0 版本;直到 2017 年,Docker 的版本号都是 X.Y.Z 这样的格式。差不多每 2~3 个月会升一次 Y 的版本号,比如:1.3.0 是 2014 年 10 月发布的,1.4.0 则是 2014 年 12 月发布。 2017 年 2 月 8 日 Docker 发布了 1.13.1 版本,这是 最后一个 以 X.Y.Z 格式命名的版本了。 在这个阶段,Docker 在主流 Linux 发行版上的安装包一般叫做 docker、docker-engine 或 docker.io,所以现在如果你需要安装新版本 Docker 的话,如果你已经安装了上述包中的任何一个,一般会建议你先删除掉。 同年 Docker 宣布将原 GitHub 上开源的 Docker 项目 更名为 Moby,这次更名之后,产生了几个重要的变化: ...

June 3, 2020 · 3 min · jiezi

Kubernetes笔记四详解Namespace与资源限制ResourceQuotaLimitRange

前面我们对K8s的基本组件与概念有了个大致的印象,并且基于K8s实现了一个初步的CI/CD流程,但对里面涉及的各个对象(如Namespace, Pod, Deployment, Service, Ingress, PVC等)及各对象的管理可能还缺乏深入的理解与实践,接下来的文章就让我们一起深入K8s的各组件内部来一探究竟吧。下图是基于个人的理解梳理的一个K8s结构图,示例了各个组件(只包含了主要组件)如何协同。 后续几篇文章围绕该图涉及组件进行整理介绍,本文主要探究Namespace及与Namespace管理相关的资源限制ResourceQuota/LimitRange部分。 Namespace理解Namespace即命名空间,主要有两个方面的作用: 资源隔离:可为不同的团队/用户(或项目)提供虚拟的集群空间,共享同一个Kubernetes集群的资源。比如可以为团队A创建一个Namespace ns-a,团队A的项目都部署运行在 ns-a 中,团队B创建另一个Namespace ns-b,其项目都部署运行在 ns-b 中,或者为开发、测试、生产环境创建不同的Namespace,以做到彼此之间相互隔离,互不影响。我们可以使用 ResourceQuota 与 Resource LimitRange 来指定与限制 各个namesapce的资源分配与使用权限控制:可以指定某个namespace哪些用户可以访问,哪些用户不能访问Kubernetes 安装成功后,默认会创建三个namespace: default:默认的namespace,如果创建Kubernetes对象时不指定 metadata.namespace,该对象将在default namespace下创建kube-system:Kubernetes系统创建的对象放在此namespace下,我们前面说的kube-apiserver,etcd,kube-proxy等都在该namespace下kube-public:顾名思义,共享的namespace,所有用户对该namespace都是可读的。主要是为集群做预留,一般都不在该namespace下创建对象实践1.查看namesapce kubectl get namespaceskubectl get namesapcekubectl get ns # 三个操作等效kubectl get ns --show-labels # 显示namespace的label使用namesapces,namesapce,ns都是可以的。如下列出了当前集群中的所有namespace [root@kmaster ~]# kubectl get nsNAME STATUS AGEdefault Active 34ddevelop Active 17dingress-nginx Active 33dkube-node-lease Active 34dkube-public Active 34dkube-system Active 34dkubernetes-dashboard Active 31dpre-release Active 17d可以使用 kubectl describe 命令来查看某个namespace的概要信息,如 [root@kmaster ~]# kubectl describe ns defaultName: defaultLabels: <none>Annotations: <none>Status: ActiveNo resource quota.No resource limits.2.创建namespace ...

June 3, 2020 · 4 min · jiezi

docker系列3docker的基本使用

这是本专栏的第一部分:Docker 入门,共 3 篇,带大家进入 Docker 的世界。上一节,我带大家了解了 Docker 和容器技术的发展历程,知道了它的基础技术发展路线。下面一起进入第二节的内容。 Docker 安装Docker 支持 Linux、MacOS 和 Windows 等系统,且在 Linux 的各发行版中的安装步骤也都略有差异。 这里我不会列出它在各个系统平台上的具体安装步骤,因为Docker 的文档描述的很详细了,没必要赘述。 这里我对在 Linux 平台下的安装多说一点,如果你使用的是比较常见的发行版,如 Debian、Ubuntu、CentOS、Fedora 等,可以直接通过https://get.docker.com/中提供的脚本来一键完成安装。 # 下载脚本$ curl -fsSL https://get.docker.com -o get-docker.sh脚本中内置了使用国内源进行加速: # 使用 Azure 进行加速$ sh get-docker.sh --mirror AzureChinaCloud或 # 使用 Aliyun 进行加速$ sh get-docker.sh --mirror Aliyun在安装完成后,强烈建议阅读官方文档,对已经安装的 Docker 进行配置,比如配置 Docker 的开机自启动。 第一个容器 在安装完成后,我们正式开始。 经过上一节的介绍,我们也知道 Docker 一开始能胜出,而且吸引无数开发者,与它的易用性是密不可分的。 使用 Docker 启动容器很简单,只需要一句 docker run 命令行即可搞定。 例如,当我想要运行最新版本的 Python 解释器时,只需要一句 docker run -it python 即可。 ...

June 2, 2020 · 3 min · jiezi

推荐-5-款超好用的开源-Docker-工具

导读Docker 社区已经创建了许多开源工具,它们能帮我们处理各种用例。作者在本文中推荐了 5 款认为最有用的 Docker 工具,分别是 Watchtower(自动更新 Docker 容器)、docker-gc(容器和镜像的垃圾回收)、docker-slim(容器瘦身)、 rocker:突破 Dockerfile 的限制,以及 ctop(容器的类顶层接口)。 Docker 社区已经创建了许多开源工具,它们所能帮你处理的用例甚至会超出你的想象。 你可以在网上找到很多酷炫的 Docker 工具,其中大部分是开源的,都可以在 Github 上找到。在过去的两年里,我非常热衷于 Docker,在大多数开发项目中都使用了它。当你开始使用 Docker 后,你会发现它适用的场景比你最初预想的还更多。你会希望 Docker 尽可能为你多做一点事,而它不会让你失望的! Docker 社区非常活跃,每天都会出现许多有用的工具,时时关注社区中发生的所有创新是很困难的。为了帮助你,我收集了一些我在日常工作中使用的又有趣又实用的 Docker 工具,这些工具提升了我的工作效率,减少了原本需要手工完成的工作。 watchtower(自动更新 Docker 容器)Watchtower 监视运行容器并监视这些容器最初启动时的镜像有没有变动。当 Watchtower 检测到一个镜像已经有变动时,它会使用新镜像自动重新启动相应的容器。我想在我的本地开发环境中尝试最新的构建镜像,所以使用了它。 Watchtower 本身被打包为 Docker 镜像,因此可以像运行任何其他容器一样运行它。要运行 Watchtower,你需要执行以下命令: docker run -d --name watchtower --rm -v /var/run/docker.sock:/var/run/docker.sock v2tec/watchtower --interval 3在上面的命令中,我们使用一个挂载文件 /var/run/docker.sock 启动了 Watchtower 容器。这么做是有必要的,为的是使 Watchtower 可以与 Docker 守护 API 进行交互。我们将 30 秒传递给间隔选项 interval。此选项定义了 Watchtower 的轮询间隔。Watchtower 支持更多的选项,你可以根据文档中的描述来使用它们。 ...

June 2, 2020 · 2 min · jiezi

K8S-生态周报-Docker-v190310-正式发布

「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」。Node Exporter v1.0.0 正式发布Prometheus 是最早由 SoundCloud 开源的监控告警解决方案。并已经成长为继 Kubernetes 之后,第二个从 CNCF 毕业的项目。伴随着云原生理念的普及和 Kubernetes 等技术的发展, Prometheus 在监控领域也有了长足的发展。 其主要组件包括 Prometheus,Alertmanager,Node Exporter,Blackbox Exporter 和 Pushgateway 等。 Promethues 采取 Pull 的模式,所采集的 metrics 需要由对应的 Exporter 暴露出来。我们最常用的用于收集系统 metrics 的组件便是 Node Exporter 了。 本周,Node Exporter 终于迎来了 v1.0.0 版本,标志着它更加稳定,更加通用。 我在本周专门写了一篇文章来介绍它这个版本中我最关注的特性: 为 Prometheus Node Exporter 加上认证, 我们可以让监控变得更加安全。 当然这个版本中也包含了众多变更和 bugfix, 这里暂且跳过,有兴趣的小伙伴可直接参阅其 ReleaseNote Docker v19.03.10 发布Docker 在本周发布了 v19.03.10 版本,距离上个版本 v19.03.9 仅过了两周的时间,如果在使用 Docker v19.03.x 版本的小伙伴,我个人还是建议你更新到此版本。 此版本中最主要的一个修复是网络相关的,具体而言是与内置 DNS (embedded DNS) 有关的问题,在特定场景下,如果你创建了自定义网络,当解析外部域名时,可能会出现解析失败的情况。 ...

June 1, 2020 · 1 min · jiezi

docker系列2docker-的前世今生

Docker 入门,共 3 篇,将带大家进入 Docker 的世界。 首先了解 Docker 的发展历程, 然后快速掌握 Docker 的基本使用; Docker 版本及内核兼容性选择是这部分的重点内容。大家如果在生产环境中需要使用 Docker 的话,建议重点关注这一篇。 下面我们就进入第一篇的内容。 Docker 在大多数人眼中几乎是容器(container)的代名词,即使是现在我也常会听到有人说“我在服务器上启动了 N 个 docker 在跑 XX 服务” 之类的话。 我们来看看为何 Docker 能成为容器的代名词,引领容器的时代。 容器技术的发展chroot在我看来,要梳理容器技术的发展,最早可以追溯到 1979 年,那时候 chroot 系统调用首次问世。 之后 1982 年 chroot 机制被移植到了 BSD 系统上,再后来便是我们所熟知的 Linux 系统上的 chroot 了。 我们有时会使用 chroot 改变某进程的根目录,使它不能访问该目录之外的其他目录。 这和我们在一个容器内的感觉很像了。事实上在几年前确实有人用一百多行的 bash 利用 chroot 写了一个模拟 Docker 创建容器的实现,称之为 bocker , 有兴趣的读者可以去看看该项目的代码。 这里我们来介绍一个实际使用 chroot 创建隔离环境的例子: 比方说我们想创建一个 Debian 的隔离环境,那可以使用 chroot 将 Debian 的 rootfs 根文件系统作为新进程的根。 ...

June 1, 2020 · 2 min · jiezi

对接-Docker-Compose-和-CloudWatch

使用 Docker Compose 运行服务的时候,我们可以在命令行中查看容器的日志,但这也许远远不够,我们可能会需要对日志进行持久化存储,并希望能够方便的检索,AWS 的 CloudWatch 服务给我们提供了强大的日志管理能力,那么如何将我们 Docker Compose 的服务产生的日志输出到 CloudWatch 中呢,本文提供了一个成功的实践步骤。 配置 AWS 权限创建文件 /etc/systemd/system/docker.service.d/aws-credentials.conf将以下内容写到文件中 [Service]Environment="AWS_ACCESS_KEY_ID=<aws_access_key_id>"Environment="AWS_SECRET_ACCESS_KEY=<aws_secret_access_key>"执行 sudo systemctl daemon-reload 重新加载虚拟机配置执行 sudo service docker restart 重启 docker执行 systemctl show --property=Environment docker 检查配置是否生效配置 docker-compose.yml给需要收集日志的服务添加 logging 配置(更多的配置项请参考 官方文档): version: '2'services: my-service: image: my-service:latest logging: driver: awslogs options: awslogs-region: ap-northeast-1 awslogs-group: /log-prod/my-service执行 docker-compose up -d 重启 Docker Compose 容器。 检查是否对接成功进入 AWS 的 CloudWatch 菜单,打开服务所在的日志组,默认情况下我们应该已经可以看到以容器 ID 命名的日志流,此时说明已经成功的完成了对接。

June 1, 2020 · 1 min · jiezi

docker-安装-redisrediscli测试连接python-api测试连接

docker 安装 redis拉取镜像、启动拉取镜像 docker pull redis查看已有镜像 docker images启动 docker docker run -itd --name redis -p 6379:6379 redis查看 docker 运行的容器状态 docker ps测试使用在容器内部测试连接docker exec -it redis /bin/bash进入容器内部后 root@2ff6e2c47742:/data# redis-cli127.0.0.1:6379> set username jabinOK127.0.0.1:6379> get username"jabin"127.0.0.1:6379>在容器外部测试连接redis 容器绑定到了宿主主机的6379端口,因此可以认为 redis 跑在了本机的6379端口。 使用 redis-cli 连接如果本机(宿主机)安装了redis-cli,可以使用本机的redis-cli测试。 ➜ Desktop redis-cli -h 127.0.0.1 -p 6379127.0.0.1:6379> get username"jabin"127.0.0.1:6379>使用 python 的 api 连接import redisr = redis.StrictRedis(host='127.0.0.1', port=6379)print(str(r.get("username"), encoding="utf-8"))输出 jabin

June 1, 2020 · 1 min · jiezi

Windows10-WSL1转WSL2

WSL2(win10 子系统二代)特殊优势彻底重构 wls 一代,速度比上一代快 20%支持原生 Docker 安装,启动(相当于完整的 Linux 系统、虚拟机运行)支持各种一键脚本,比如宝塔一键脚本、佰阅一键脚本等等win10 文件管理器可访问 Linux 系统文件搭配 vs code 的插件 vs remote 可以超低延迟、急速开发基于 Linux 系统的开发环境对于 Docker,win10 桌面版docker 启动耗时大概一分钟左右,在 wls2 上,启动 docker 真的是一瞬间就完成。 WLS2 win10 子系统安装方法(速度很快,一分钟不到)若要安装并开始使用 WSL 2,请完成以下步骤: 启用“虚拟机平台”可选组件使用命令行设置要由 WSL 2 支持的发行版验证发行版使用的 WSL 版本并且需要已安装 WSL(可在此处找到有关执行此操作的说明)。请注意,需要运行 Windows 10 版本 18917 或更高版本才能使用 WSL 启用“虚拟机平台”可选组件1.以 管理员身份 打开 PowerShell 并运行: Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform2.需要 重新启动计算机,这些更改才能更好地生效 更新 WSL 2 Linux 内核更新wsl2内核 1.下载 Linux 内核更新包请下载适用于 x64 计算机的最新 WSL2 Linux 内核更新包。2.运行下载的安装包 ...

May 30, 2020 · 1 min · jiezi

Linux环境下使用Docker安装mysql

前言前几天在跑一个项目的时候,后台死活起不起来,看一眼报错信息,发现我的mysql版本太旧了不能用。因为我用的是xampp,版本是跟着xampp版本走的。网上给出的解决办法是运行命令:mysql_upgrade -u root -p    更新mysql库,但是在我这里不能使用。在好友的建议下我决定安装docker。 安装Linux安装Docker网上有详细的教程,在这里不再赘述,有需要的请看Ubuntu Docker 安装安装完Docker后,如果执行sudodocker run hello-world出现说明docker安装成功。接下来我们用docker安装mysql。1.我们先可以使用 sudo docker search mysql来查看可用版本,但是我们选择稳定的5.7版本作为我们的安装版本2.拉取mysql镜像 docker pull mysql:5.7如果下载速度缓慢,建议更换国内源首先修改或者新增/etc/docker/daemon.json文件,内容改为 {"registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"]}保存退出,如果下载还是缓慢,建议多换几个源试试这篇文章提供了很多国内原。保存后重启docker服务。 service docker restart再次进行pull mysql。安装好后,我们通过sudo docker images来查看是否正确安装好mysql.3.运行mysql容器安装完成后,我们使用 docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7来运行mysql容器--name mysql-test是我们起的容器名字-p 3306:3306是映射服务的3306端口到宿主机的3306端口,我们访问的时候访问3306端口。MYSQL_ROOT_PASSWORD=123456 我们设置的root用户密码mysql:5.7 设置启动的mysql版本。成功后,我们使用sudo docker ps -a命令查看启动是否成功。4.进入我们使用 sudo docker exec -it mysql-test bash进入刚才我们创建的容器,然后通过 mysql -uroot -p123456命令进入mysql环境注意开头的变化判断命令是否生效。最后,我们使用 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '';命令来允许root用户从任意位置登录。最后打开我们的navicat测试连接成功。 补充我们通过sudo docker ps -a来查看启动的容器后,可以通过sudo docker stop XXX来停止和sudo docker rm XXX删除容器。XXX为容器的ID值值得注意的是,我们这里的容器是虚拟机,我们关机后也是保留状态,不用开机后再进行一系列繁琐的命令,而是可以直接使用,如果删除再重建,你的数据表都会消失。 ...

May 29, 2020 · 1 min · jiezi