努比亚z17s尺寸什么尺寸

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
【编者的话】鉴于还没有用Docker创建本地开发环境的先例,Jeff Nickoloff开创了一个先例,相信大家也可以。
译者解释:作者在此处使用了Frankenstein一词。Frankenstein,《弗兰肯斯坦》原是英国诗人雪莱的妻子玛丽·雪莱在1818年创作的小说,被认为是世界第一部真正意义上的科幻小说。弗兰肯斯坦来自于此小说,可以理解为怪人;毁灭创造者自己之物
知道一个事物和实现这个事物是完全不同的事情。从Docker诞生那天开始,我们就梦想着诸如“15秒部署一个项目”,“版本可控开发环境”,以及时髦的运维用语,如“滚动开发”,“软件定义架构”。处于浪尖的行业人士都在以前所未有的热情参与到将很多名词和工具,例如“编排”,“服务发现”等,定义,重新定义以及商品化大潮中。
我认为这股大潮的催化剂来自于Docker在应用和基础架构之间带来的美妙接口和抽象。开发者可以在不必知道底层架构情况下谈论基础架构,操作人员也不必花大量时间研究如何安装和管理软件。肯定有什么力量隐藏在看似简单的外表下使得大家生活简化,更加高效。
现实世界时残酷的,不要想当然认为采用一项新技术只会带来享受。过去几年经过一些项目的磨练,经历过奇怪的环境,我认为Docker也不例外。但是某一个经验一般可以直接应用到项目的下一阶段。要想从Docker获得功力,必须浸淫到实际项目中去磨练。
过去一年中,我全身心投入去教授我的关于Dokcer基础的书,Docker in Action。
我注意到几乎所有人开始学习Docker技术时都会纠结于如何创建开发环境,然后才能了解生态系统之内大家的关系。每个人开始都会认为使用Docker会使环境搭建变的简单,也不是完全不对,有很多“容器化”教程都涵盖了创建一个image和如何将某个工具打包到容器(Container)内,但是如何将开发环境Docker化是一个完全不同的事情。
作为一个踏坑先驱者,我可以分享一下我的经验。
我曾经是一个资深Java使用者,但这个分享的经验不是关于Java的,而是围绕着我使用Go和Node开发应用发生的。我有一定的Go开发经验,主动提高在这一领域的能力。进入一个不熟悉领域迅速上手碰到的主要问题就是如何获得正确的工作流,而且我还比较厌恶在笔记本上不断安装软件,这些都驱使我尝试用Docker做这些工作,或者有时候采用Vagrant。
我所参与的项目是用Go写一个标准的REST服务,基于gin,依赖Redis和NSQ的某些库和服务。也就是说需要import一些本地运行着的Redis和NSQ实例的库,更有趣的是我还使用了一些服务于NGINX的静态资源。
对门外汉来说,Go是一种编程语言,实际上还有一种命令行工具也叫“go”。从依赖型管理、编译、测试用例到其它各种任务都使用它。对Go项目来说,除了Git和一个好用的编辑器,剩下就是跟它打交道了。然而还是有一个问题,我不想在笔记本上安装Go,笔记本上我只想安装Git和Docker。这些问题限制了其他环境下的兼容性,并且对新手来说降低了门槛。
这个项目有运行时依赖,意味着此工具集需要为简单环境定义和编排而包括Docker Compose。 很多人会为此感到不适应,那么我们怎么办?开始创建一个Dockerfile或者docker-compose.yml?好吧,先让我告诉大家我是怎么办的,然后解释为什么这么做。
此案中,我希望我的本地包是完全自动的。我不喜欢手动逐条执行步骤,而且我的vim配置文件也很简单。我只想从“是否运行”层次控制运行环境。本地化开发环境目标被快速复制,不仅用于提高生产效率,而且用于共享Docker images。 我最终完成了Dockerfile,用来产生包含Go,Node,和我最经常使用的打包工具Gulp的images。 此Dockerfile没有嵌入代码,image也没有嵌入Gulpfile。相反的,在一个建立了的GOPATH(Go workspace的根路径)上定义了一个卷。
最终,我为此images设置了给gulp提供服务的entrypoint,设置默认命令来监控。输出images肯定不是我称为build artifact的东西,从这个意义上来讲,此环境唯一做的就是提供了一个运行实例,帮助我们判断是否代码运行。对我的场景来说,运行的非常棒。而我将“artifacts”用于称呼另外一个build。
下一步我用Compose定义本地开发环境。首先定义了在images中用到的所有Docker
Hub 中定义的依赖服务,将他们连接到某一个“目标”服务。此服务引用了新Dockerfile从哪里生成,将本地源目录绑定到新image期望输出的挂载点,暴露一些可以测试的端口。然后,添加了一个服务,可以不断地向目标服务循环发起一系列集成测试。最终,我添加了NGINX服务,挂载了有很多配置文件和静态assets的卷。使用卷的好处在于重复使用配置文件和assets而不用重建image。
$&cat&./service/local.df
FROM&golang:alpine
RUN&apk&--update&add&--no-cache&git&nodejs
RUN&npm&install&--global&gulp
ENV&GOPATH=/go&PATH=$PATH:/go/bin
VOLUME&[&/go//.../myproj&,&&/go/pkg&,&/go/bin&]
WORKDIR&/go//.../myproj
#&Bring&in&dependencies&in&the&image
RUN&go&get&/bitly/go-nsq&&&&\
go&get&/codegangsta/cli&&&&\
go&get&/gin-gonic/gin
CMD&[&gulp&]
$&cat&./service/gulpfile.js
var&gulp&&=&require('gulp');
var&child&=&require('child_process');
var&server&=&
gulp.task('default',&['watch']);
gulp.task('watch',&function()&{
gulp.watch('./**/*.go',&['fmt','build','spawn']);
gulp.task('fmt',&function()&{
return&child.spawnSync('go',&['fmt']);
gulp.task('build',&function()&{
return&child.spawnSync('go',&['install']);
gulp.task('spawn',&function()&{
if&(server)
server.kill();
server&=&child.spawn('myproj');
server.stderr.on('data',&function(data)&{
process.stdout.write(data.toString());
server.stdout.on('data',&function(data)&{
process.stdout.write(data.toString());
$&cat&docker-compose.yml
image:&nginx
-&./web/assets:/var/www
-&./web/config:/etc/nginx/conf.d
integtest:
build:&./integ
build:&./service
dockerfile:&local.df
-&./service/src/:/go//.../myproj
image:&nsqio/nsq
image:&redis
所有代码最终会在电脑上生成本地开发环境,当使用:
docker-compose&up&–d
时,会启动git clone,然后循环运行;不需要重建image或者重启容器。每当.go文件发生变化,Gulp就会重建,并且在运行的容器中重启我的服务。就这么简单。
创建此环境很简单吗?不尽然,但是确实实现了。难道不用容器,而在本地直接安装Go,Node,Gulp不是更简单吗?也许在这个场景是,但也只限于用Docker运行此依赖服务。我不喜欢这样。
我曾经要管理这些工具的不同版本,而产生了复杂的环境变量,到处生成artifacts。我不得不提醒同事们注意这些容易发生冲突的环境变量,他们太缺乏集中版本控制了。
也许你并不喜欢上面描述的环境,或者对项目有不同的需求。很好,确实是这样,本文并不是让所有工具都运行在Docker中,如果这样就说明并没考虑过要解决什么问题。
当我设计这个环境时,考虑过下面几个问题,顾虑,以及某些潜在答案。当开始Docker工作环境时,就会发现实际情况可能比自己的回答更糟糕。
当你考虑打包和环境时,最先考虑的因素是什么?
这个确实是最重要的问题。在此场景中,有几个选项。我可以使用go直接在容器内编程,看起来如下:
#&get&dependencies
$&docker&run&--rm&-v&&$(pwd)&/go/src/app&golang:1.5&go&get&-d&-v
#&start&the&other&services
#&build&and&link
$&docker&run&--rm&-v&&$(pwd)&:/go/src/app&golang:1.5&go&install&\
/allingeek/myproj
#&run&the&program&stand&alone
$&docker&run&--rm&-v&&$(pwd)&/bin/myproj:/bin/myproj&alpine&myproj
#&to&iterate,&make&changes&and&repeat&the&last&two&steps&
其实这个示例中大部分bolierplate可以通过shell别名或者函数隐藏,感觉Go是安装在自己的设备中似的,还可以跟Go工作流联系,创建artifacts。这些特性对非服务项目有益处,但是对库和软件项目就不一定了。
假设你已经在使用Gulp、make、ant或者其他脚本,那么可以继续,并且使用Dokcer作为这些工具的目标。
另外一种方法,我可以通过使用Dockerbuild来定义和控制我的build,获得更多面向Docker的经验。代码如下:
$&cat&Dockerfile
FROM&golang:1.5-onbuild
#&start&the&other&services
#&install&dependencies,&build,&and&link
$&docker&build&-t&local/myproj&.
#&run&the&program
$&docker&run&--rm&local/myprog
#&to&iterate,&make&changes&and&repeat&the&last&two&steps
使用Dokcer来控制build有若干好处。可以使用以前编译好的image,Dockerfilebuilds使用缓存方法,使得编译工作只重复最小的步骤(假设有一个很棒的Dockerfile)。最后,这些builds生成的images也可以跟其他开发者共享。
这个案例中,我使用golang资源库中的onbuildimage作为基础。其中包括一些很棒的下载依赖包逻辑。这个方法会生成可以方便用于其他非生产环境的Dockerimage。这个方法对于生产级别的image的问题在于,必须有步骤避免大image并且包括某些初始化脚本,用于启动和监控服务前验证状态。
有意思的是,Docker使用一系列脚本,Makefiles和Dockerfiles。build系统相对很健壮了,负责各种测试,linting等,以及各种操作系统和架构的artifacts。本场景中,容器是用来产生二进制的工具,然而是从一个本地build image中实现的。
扩充Docker build的选项,可以使用Compose来定义一整套开发环境。
$&cat&Dockerfile
FROM&golang:1.5-onbuild
$&cat&docker-compose.yml
image:&redis
image:&nsqio/nsq
#&install&dependencies,&build,&link,&launch&dependency&services,&run
$&docker-compose&up&-d
#&to&iterate,&make&changes&and&then
$&docker-compose&build&&&&docker-compose&up&-d
Compose负责环境管理。如果觉得系统非常干净并不奇怪,Compose把所有事情都联系起来,优化卷管理,当images缺失时自动build,汇总日志输出。我之所以选这些开关是为了简化服务依赖,也因为它能生成我需要的artifacts。
这个示例是一个运行时容器,Compose或者Docker都有合适的工具做到这点。此场景中,也可能更需要一个分布式image,或者可能希望build可以为本机产生一个二进制文件。
如果期望获得想要的image,必须确保源码或者预编译库在build时候嵌入image中。build时候没有挂载卷,也即需要每次重复时都要重建image。
如果希望在容器内部产生某些artifacts,则需要引入挂载卷。使用Docker命令行或者Compose环境可以很容易实现。但是要注意,除非容器在运行,否则build并不工作,也就意味着不能只用dockerbuild。
汇总目前没有Docker方式创建开发环境。Docker是一个可编排工具,不只是圣书。与其使用别人已有的dockerbuild系统,不如花一定时间学习此工具,明确自己的需求,然后创建适合自己的Docker环境。
记住,如果需要比Docker Fundamentals进阶书籍,那么Docker in Action很快就会出版。大家可以留意。
原文链接:(翻译:杨峰)
要回复文章请先或docker(33)
&pre name=&code& class=&html&&docker:/root# docker run -itd --name zjtest8_frontend -v /data/zjtest8/frontend/:/var/www 192.168.32.150:5000/zjzc_centos6.5_m3 bash
e7ddb534ff695fe520e057a960e340bcbbc31f8f
我们可以用 docker run 命令在镜像上运行一个 docker 容器。在 Docker 镜像上运行一个 docker 容器时我们有很多选项和标记。我们使用 -t 和 -i 选项来运行一个 docker 镜像并进入容器
docker run --创建容器
docker:/root# docker ps
CONTAINER ID
e7ddb534ff69
192.168.32.150:5000/zjzc_centos6.5_m3
3 seconds ago
Up 1 seconds
zjtest8_frontend
192.168.32.150:5000/zjzc_centos6.5_m3
52 minutes ago
Up 42 minutes
zjtest8_haproxy
docker:/root# docker exec -it e7ddb534ff69 bash
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:916698次
积分:35044
积分:35044
排名:第119名
原创:2682篇
转载:15篇
评论:38条
(24)(47)(21)(63)(41)(46)(52)(89)(106)(116)(130)(152)(114)(87)(60)(88)(53)(65)(54)(86)(96)(51)(83)(80)(58)(90)(66)(45)(40)(46)(43)(36)(53)(27)(72)(65)(41)(40)(33)(44)(17)(45)(58)(5)1、直接用Docker提供的镜像registry运行私有仓库
docker run -d -p 5000:5000 -v /data/registry:/var/lib/registry --name registry --restart='always' registry
-d : 后台运行
-p : 宿主机跟容器映射端口   SERVER_PORT:CONTAINER_PORT
-v : 挂载宿主机目录到容器中作为数据卷,docker registry上传镜像默认存放到容器/var/lib/registry,将本地/data/registry目录挂载到容器中,避免删除容器是数据丢失
--name : 容器名称,不配置将随机生成
--restart: 重启策略,这里配置为always为任何时候
2、查看仓库是否正常
# curl -XGET http://192.168.62.200:5000/v2/_catalog
{&repositories&:[&saltruler_web&,&ubuntu&]}
3、查看本地images
# docker images
REPOSITORY
f86ee612af8f
20 minutes ago
f851c8406430
5 hours ago
6 hours ago
centos/resin
24b506c6b19a
4 days ago
192.168.62.200:5000/saltruler_web
a2e9e9205aea
4 days ago
saltruler_web
a2e9e9205aea
4 days ago
djangotest_web
3c00ad940197
5 days ago
11 days ago
c588c14f484e
2 weeks ago
68caceba17ab
2 weeks ago
2 weeks ago
3 weeks ago
3 weeks ago
jdeathe/centos-ssh-apache-php
c2ae3c97feb1
4 weeks ago
5 weeks ago
5 weeks ago
5 weeks ago
6b914bbcb89e
5 weeks ago
52bb991b482e
17 months ago
4、标记上传的镜像
# docker tag saltops:v3 192.168.62.200:5000/saltops:v3
# docker images
REPOSITORY
192.168.62.200:5000/saltops
f86ee612af8f
22 minutes ago
f86ee612af8f
22 minutes ago
f851c8406430
5 hours ago
6 hours ago
centos/resin
24b506c6b19a
4 days ago
192.168.62.200:5000/saltruler_web
a2e9e9205aea
4 days ago
saltruler_web
a2e9e9205aea
4 days ago
djangotest_web
3c00ad940197
5 days ago
11 days ago
c588c14f484e
2 weeks ago
68caceba17ab
2 weeks ago
2 weeks ago
3 weeks ago
3 weeks ago
jdeathe/centos-ssh-apache-php
c2ae3c97feb1
4 weeks ago
5 weeks ago
5 weeks ago
5 weeks ago
6b914bbcb89e
5 weeks ago
52bb991b482e
17 months ago
5、push上传到私有仓库
# docker push 192.168.62.200:5000/saltops:v3
The push refers to a repository [192.168.62.200:5000/saltops]
d8d7b4725725: Pushed
81e97be478f1: Pushed
f245be9edb71: Pushed
9b198ff9ff5b: Pushed
v3: digest: sha256:4a7c610dbeab40aeb7b98bc95c585d1c3fc1f99c34a06348eea0c19 size: 1162
6、查看刚刚上传到私有仓库的saltops
# curl -XGET http://192.168.62.200:5000/v2/saltops/tags/list
{&name&:&saltops&,&tags&:[&v3&]}
7、部署私有仓库管理UI,
小蜗牛收集以下三种Docker Registry 管理 UI,Breezes亲测使用
I、 :  Breezes 是一个多中心和多版本的 Docker Registry 管理 UI,
I、Breezes部署
安装Breezes
git clone https://git.oschina.net/kbsonlong/Breezes.git
cd Breezes/
yum install -y gcc gcc-c++ python-devel
pip install -r requirements.txt -i http:///simple --trusted-host
启动Breezes
# sh Control.sh
Breezes start over.
# netstat -ntlp|grep Breezes
0 0.0.0.0:10210
33787/Breezes
0 :::10210
33787/Breezes
添加私有仓库
docker run -d --name saltops -v /data/saltops:/data/saltops -p
-p 80:8000 saltops:v2 python3 /data/saltops/manage.py runserver 0.0.0.0:8001
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:347444次
排名:千里之外
原创:34篇
转载:25篇
评论:11条
(2)(5)(2)(3)(11)(4)(6)(1)(1)(1)(5)(1)(1)(1)(7)(2)(6)UDN-企业互联网技术人气社区
后使用快捷导航没有帐号?
浏览&&:&742
回复&&:&0
回复的帖子
本帖最后由 genie1003 于
16:50 编辑
  如何创建自定义镜像
  初次安装部署好docker后,大多数镜像可以从DockerHub 提取,但是大多数人都希望自己可以完全自定义一个镜像,那么这里需要一个第三方工具 febootstrap
  epel6的源提供febootstrap的RPM包
  yum install docker-io febootstrap -y
  service docker start
  chkconfig docker --level35 on复制代码  制作CentOS6.6镜像目录
  febootstrap -i yum -i iputils -i iproute -i bash -i vim-minimal -i coreutils -i tar -i net-tools centos6 base   &a href=&http://centos./centos/6.6/os/x86_64/& target=&_blank&&http://centos./centos/6.6/os/x86_64/&/a& -u &a href=&http://centos./centos/6.6/updates/x86_64/& target=&_blank&&http://centos./centos/6.6/updates/x86_64/&/a&复制代码  -i 表示镜像里面安装的RPM包(包括一些人为有必要的软件包)
  centos6 表示镜像的版本说明
  base 表示生成的镜像目录
  后面之后了系统安装源和更新源为USTC
  安装执行后,会开始一系列的RPM包下载安装,过程与yum类似,安装完成后当前目录会多了base目录,里面就是一个镜像的系统文件
  进入base目录等于进入镜像的根目录
  [root@image ~]# cd base/
  [root@image base]# ls
  bin&&boot&&dev&&etc&&home&&lib&&lib64&&media&&mnt&&opt&&proc&&root&&sbin&&selinux&&srv&&sys&&tmp&&usr&&var复制代码  可以像一般的系统文件一样先做一些修改配置,例如配置第三方yum源等等
  把base目录把所有文件打包成二进制文件后导入docker创建为镜像
  cd ~/root/base/ && tar -c . | docker import - centos6:base复制代码  docker images 可以查看镜像的信息
  一个基本centos镜像创建完毕,下面再利用Dokcerfile制作mysql镜像
  cat Dockerfile
  FROM centos6:base
  MAINTAINER Lion &&
  VOLUME /var/lib/mysql
  RUN yum install mysql-server mysql -y
  RUN echo -ne &NETWORKING=yes\\nHOSTNAME=mysql& & /etc/sysconfig/network
  RUN echo -ne &bind-address = 0.0.0.0\\ndefault-storage-engine=innodb\\ninnodb_file_per_table\\n\
collation-server=utf8_general_ci\\ninit-connect='SET NAMES utf8'\\ncharacter-set-server = utf8& & insert
  RUN sed -i &/user=mysql/r insert& /f && rm -f insert
  RUN echo -ne &/usr/bin/mysql_install_db\\n/usr/bin/mysqld_safe& && /opt/mysql_start
  RUN chmod 777 /opt/mysql_start
  ENV PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:
  WORKDIR /opt
  EXPOSE 3306
  CMD /bin/sh -c mysql_start复制代码
  FROM 声明以centos:base镜像为基础
  MAINTAINER 声明镜像的维护者信息
  VOLUME 挂载本地目录到容器里/var/lib/mysql目录(这是mysql默认的数据保存目录)
  由于我希望数据可以持久化防止因为容器误删除而丢失,所以映射到宿主本地目录
  RUN 在镜像中执行安装mysql
  在新镜像中写入HOSTNAME信息,因为mysql启动过程需要network文件
  在my.cnf配置文件插入一些修改配置
  创建启动脚本
  声明环境变量
  制定默认工作目录
  EXPOSE 声明容器需要暴露的端口号
  CMD 是指镜像生成容器后自动执行的命令,类似docker exec,这里是自动启动mysql服务
  根据Dockerfile创建mysql服务镜像
  docker build --rm=true -t mysql:frist .
  查看镜像的树状关系可以发现,mysql:frist是以centos:base为父镜像
  [root@image ~]# docker images -t
  Warning: '-t' is deprecated, it will be removed soon. See usage.
  ├─4fbd Virtual Size: 311.3 MB Tags: centos6:base
  │ └─a71fea602906 Virtual Size: 311.3 MB
  │& &└─94c593f6f199 Virtual Size: 311.3 MB
  │& &&&└─171ec9550634 Virtual Size: 433.3 MB
  │& && & └─68fb Virtual Size: 433.3 MB
  │& && && &└─fded Virtual Size: 433.3 MB
  │& && && &&&└─ca Virtual Size: 433.3 MB
  │& && && && & └─fec9adb1fdfc Virtual Size: 433.3 MB
  │& && && && && &└─7de Virtual Size: 433.3 MB
  │& && && && && &&&└─d62cab992eb9 Virtual Size: 433.3 MB
  │& && && && && && & └─ Virtual Size: 433.3 MB
  │& && && && && && && &└─e45cde27c49e Virtual Size: 433.3 MB
  │& && && && && && && &&&└─ca01 Virtual Size: 433.3 MB Tags: mysql:frist复制代码  启动一个mysql容器测试,会返回一个完整的容器ID
  docker run -d -P --name mysql mysql:frist复制代码  可以查看容器目前的状态
  [root@image ~]# docker ps
  CONTAINER ID& && &&&IMAGE& && && && && &COMMAND& && && && && & CREATED& && && && & STATUS& && && && &&&PORTS& && && && && && && &NAMES
  410b6e08c3ed& && &&&mysql:frist& && && &&/bin/sh -c '/bin/sh& &2 minutes ago& && & Up 2 minutes& && &&&0.0.0.0:4/tcp& &mysql复制代码
  宿主机的49163映射到容器里面mysql服务的端口3306
  目前是无法从外部访问mysql容器,因为mysql初始化没有允许远程访问,进入容器修改mysql设置
  docker exec -it 410b6e08c3ed /bin/bash复制代码  进入容器的bash环境后就如同一般的linux差不多,设置mysql密码和允许远程访问
  bash-4.1# mysql -e &grant all privileges on *.* to 'root'@'%' identified by 'password'&
  bash-4.1# mysql -e &grant all privileges on *.* to 'root'@'localhost' identified by 'password'&
  bash-4.1# exit复制代码
  此时外部网络的主机客户端直接访问 宿主机IP:49163 即可链接mysql
  以上就是如何从零制作一个自定义的Docker镜像,其实在Dockerfile中还有优化的地方,因为每一行都会生成一层镜像层,行太多就会导致镜像树很臃肿.在base容器里面直接修改配置,节省RUN的次数,这样最终镜像就只保留必须的几行就可以了.
地址:北京市海淀区北清路68号
移动客户端下载
微信公众号:yonyouudn
扫描右侧二维码关注我们
专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041
京公网网备安4
Powered by Discuz!}

我要回帖

更多关于 努比亚z17s机身尺寸 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信