array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 docker容器技术 - 爱码网

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

 

docker三大理念

一,构建

二,运输

三,运行

 像java一次构建到处运行

可以把运行环境和代码整体打包

docker组成

docker容器技术

 

安装docker

yum -y install docker

启动

docker是C/S结构 docker进程可以了解为server端执行命令理解为client端,如果把docker进程停了其他client也无法运行(不同于KVM进程宕机了虚拟机还继续运行)

docker组件

a,镜像(Image)    类似于虚拟机的镜像,组成不同,作用是一样的

b,容器(Container)  类似于运行KVM虚拟机,相当于从镜像创建了一个实例,容器间相互是隔离的,不同于虚拟机那样是彻底隔离

c,仓库(Repository)  类似于yum仓库,github

 

PS:容器可以理解为一个简化版的Linux环境

 

docker与虚拟机的区别

docker容器技术

虚拟机的应用运行在操作系统上,docker直接运行不需要操作系统

 

docker容器技术

PS:虚拟机用户资源是完全隔离的

docker容器技术

 docker容器技术

docker可以实现状态的回滚

 

docker的作用

  1,简化配置,代码和环境在一块

  2,代码流水线管理

  3,提高开发效率

  4,隔离应用

  5,整合服务器

  6,提高调试能力

  7,多租户环境

  8,快速部署

docker容器技术

docker容器技术

 

启动docker

systemctl start docker

(会产生一个docker的网桥)

docker容器技术

docker的网络访问

与kvm一样是通过桥接的方式访问

docker容器技术

docker容器技术

 

搜索镜像

docker search centos

下载镜像

docker pull centos:7.2.1511

查看镜像

docker images

docker容器技术

PS:不是pull下载的使用docker load --input centos.tar导入后再使用docker images查看

pull下来使用docker save -o centos.tar centos导出镜像

删除

docker rmi 镜像id

docker容器技术

运行

docker run centos:7.2.1511 /bin/echo 'hello world'

PS:镜像名称centos必须在所有选项后面

  不自定义名称会自动生成一个名称

查看在运行过的

docker ps -a

自己定义一个启动的docker的name

docker run --name mydocker -t -i centos:7.2.1511 /bin/bash

PS:-t启动伪终端 -i标准输入

伪终端可以运行各种命令

docker容器技术

PS:进入了容器但是不是一个虚拟机,其实是一个进程,进程结束了容器就结束了

停止的容器再启动

docker start mydocker

docker容器技术

登录这个容器

docker attach mydocker

exit退出以后这个容器也关闭了

删除

docker rm mydocker

PS:后面接容器名或者是容器ID

使用

nsenter连接

启动容器先获取Pid

docker inspect -f "{{ .State.Pid }}" mydocker

28254

 nsenter -t 28254 -m -u -i -n -p 

 退出以后这个容器不会终止

docker容器技术

写个脚本实现以上功能

vim docker_in.sh

#!/bin/bash

#Use nsnter to access docker

docker_in(){
    NAME_ID=$1
    PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
    nsenter -t $PID -m -u -i -n -p
}

docker_in $1

sh docker_in.sh mydocker

 不进入容器执行一个命令

docker exec mydocker whoami

root

也能使用exec进入容器

docker exec -it mydocker /bin/bash

PS:建议使用nsenter进入容器因为使用exec进入可能会导致一些奇怪的问题

 

删除容器

docker rm mydocker

如果想删除正在运行的容器

docker rm -f mydocker

PS:可以在运行容器的时候加-rm参数 当一个容器运行完会自动删除

 

 pull一个nginx

docker pull nginx

docker run -d nginx

-d后台运行并且输出id

docker容器技术

怎么访问这个nginx

查看容器访问日志

docker logs c4aefb55c183   因为刚刚没有取name 所以这个用的是id

 

docker的网络访问

带端口启动

docker run -d -P nginx

docker容器技术

把本机10000端口映射到80端口

访问以下

curl 127.0.0.1:10000

使用命令查看访问日志

docker logs 6c43246b6ce3

 

指定端口映射

docker run -d -p 10.13.85.9:81:80 --name mynginx nginx

本地ip是10.13.85.9 端口81映射到容器的80端口

访问

docker容器技术

单独查看端口映射

docker port mynginx

也可以一次性启动多个端口

docker run -d -p 443:443 -p 82:80 --name nginxv2 nginx

docker容器技术

 

docker数据管理

启动数据卷

 docker run -d --name nginx-volume-test1 -v /data nginx

进入

./docker_in.sh nginx-volume-test1

输入

mount

退出

docker inspect -f {{.Mounts}} nginx-volume-test1

docker容器技术

进入到对应的目录

/var/lib/docker/volumes/014fa27d7fea367252f91445c6268f1376b67357ca51f0163f7dc480174cbc5a/_data

 新建一个文件

touch hehe

 新建一个窗口进入容器

ls /data 就能看到新建的那个文件hehe了

另外一种挂载方式

新建一个目录

mkdir -p /data/docker-volume-nginx

启动容器挂载

docker run -d --name nginx-volume-test2 -v /data/docker-volume-nginx/:/data/ nginx

进入容器

./docker_in.sh nginx-volume-test2

cd /data

touch hehe

退出在目录/data/docker-volume-nginx下面就有了文件hehe

 

PS:第二种方式比较常用,挂载数据导致移植性差

 

挂载单个文件

docker run --rm -it -v /root/.bash_history:/.bash_history nginx /bin/bash

 PS: --rm参数退出后自动停止删除这个容器

数据卷容器

可以让数据在多个容器之间共享

docker run -it --name volume-test3 --volumes-from nginx-volume-test2 centos /bin/bash

可以访问 nginx-volume-test2挂载的目录

docker容器技术

PS:即使停止了容器nginx-volume-test2还是一样可以访问

docker stop nginx-volume-test2

  使用这种方式挂载不需要指定挂载目录了和源镜像挂载目录一样

 

Docker改变了什么

面向产品: 产品交付

面向开发: 简化环境配置

面向测试: 多版本测试

面向运维: 环境一致性

面向构架: 自动化扩容(微服务)

 

docker镜像的构建

1,手动构建

先kill掉所有运行的容器

docker kill $(docker ps -a -q)

删除所有容器

docker rm $(docker ps -a -q)

PS:生产最好不用这样做

构建

docker run --name mynginx -it centos

yum安装nginx

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx

编辑nginx配置文件

vim /etc/nginx/nginx.conf

加一行(尾部增加即可不是加在http里面)

daemon off;

PS:不能少掉;符号

代表nginx在前台运行

exit退出

提交到本地

docker commit -m "My Nginx" 0ef327b06604 oldboy/mynginx:v1

docker容器技术

启动

 docker run --name mynginxv1 -d -p 81:80 oldboy/mynginx:v1 nginx

PS:这里末尾nginx并非nginx镜像而是nginx启动命令

 访问

docker容器技术

访问日志

sh docker_in.sh mynginxv1

vi /var/log/nginx/access.log 

 

使用命令构建新建目录

docker容器技术

vim Dockerfile

# This Dockerfile

#Base image
FROM centos
MAINTAINER Jason.Zhao xxx@gmail.com

#Commands
RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum -y install nginx && yum  clean all
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx"]

  

新建首页文件和Dockerfile在同一目录

echo "nginx in docker,hahha" >>index.html

 构建

docker build -t mynginx:v2 .

生成了 查看一下

docker容器技术

启动

docker run   --name mynginx2 -d -p 82:80 mynginx:v2

访问82端口就是现实刚刚是index.html内容

docker容器技术

 CMD只能使用一次,加入使用了CMD在启动容器的时候优先使用指定的启动命令

生存环境构建docker镜像

docker容器技术

分层设计

docker容器技术

 

cd /root/docker/system/centos

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

mv /etc/yum.repos.d/epel.repo .

vim Dockerfile

#Docker for CentOS
 
#Base image
FROM centos

#Who
MAINTAINER Liuyueming 

#EPEL
ADD epel.repo /etc/yum.repo.d/

#Base pkg
RUN yum -y install wget mysql-devel supervisor git redis tree net-tools sudo psmisc && yum clean all

构建

docker build -t oldboy/centos:base ./

docker容器技术

PS:以上及把生产环境所需的最基础的包yum安装上,其他环境可以在此基础上继续构建,而不是其他环境需要这些包重新再安装一遍

创建应用环境就from oldboy/centos

cd /root/docker/runtime/python

vim Dockerfile

#Base image
FROM oldboy/centos:base

MAINTAINER Liuyueming

RUN yum install -y python-devel python-pip

#Upgrade pip
#RUN pip install --upgrade pip

构建

docker build -t oldboy/python ./

PS:加上升级pip的会报错

 

构建一个带ssh的

cd /root/docker/system/centos-ssh

#Docker for CentOS

#Base image
FROM centos

#Who
MAINTAINER Liuyueming

#EPEL
ADD epel.repo /etc/yum.repo.d/

#Base pkg
RUN yum -y install openssh-clients openssl-devel openssh-server wget mysql-devel supervisor git redis tree net-tools sudo psmisc && yum clean all

#For SSHD
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
RUN echo "root:oldboy"|chpasswd

构建

ocker build -t oldboy/centos-ssh ./

 

python也基于centos-ssh构建

cd /root/docker/runtime/python-ssh

vim Dockerfile

#Base image
FROM oldboy/centos-ssh:latest

MAINTAINER Liuyueming

RUN yum install -y python-devel python-pip

#Upgrade pip
#RUN pip install --upgrade pip 

docker build -t oldboy/python-ssh ./

docker容器技术

 

使用这个运行一个python测试脚本

cd 

/root/docker/app/shop-api

vim app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello World!'

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

yum -y install python-pip

pip install flask

运行

python app.py

使用5000端口提供服务

 docker容器技术

访问

docker容器技术

 

 

插入学习supervisor进程管理

yum -y install supervisor

vim /etc/supervisord.conf

 

docker仓库

作业:需要https加认证nginx

1,申请免费ssl证书(沃通)

2,部署

3,设置验证

4,proxy_pass 5000

5,docker run -d -p 5000:5000 --name registry registry:2

 

开源企业级 VMware Harbor

 

docker的web管理界面admiral

docker run -d -p 8282:8282 --name admiral vmware/admiral

相关文章: