以太坊docker镜像
A. DockerHub里的镜像太多了,怎么选择
目前系统或基础语言的镜像选官方的就可以了,多数情况下以他们为 base image 做自己的镜像。问题就是这些镜像大多是国外的源下载依赖会很费劲,最好from 之后换一下源。
应用相关的镜像,很多其实都不能很好满足需求,都需要自己改,这方面也没啥太好的办法,看自己需求了,一般是看他们的 dockerfile 然后把启动脚本改一下。
official 的镜像很多并不好用,可以参考一下 tutum 或者 Sameer 感觉他们做的要实用一些
B. docker 镜像一定是系统吗
不一定的,你直接拉取系统镜像,那当然使用这个镜像创建容器,他就是一个系统,如果使用docker pull下来的成品,那么你会发现创建后的容器,使用docker attach无法进入容器,很明显说明这个容器就不是系统。
C. 怎么制作docker镜像 有多大
方法/步骤
在使用Docker的过程中,我们除了从Docker Hub上下载已经做好的镜像,很多时候需要我们自己制作镜像。下面想在这个文章中说明一下镜像的制作方法。
制作镜像的方式主要有两种:
通过docker commit 制作镜像
通过docker build 制作镜像
这两种方式都是通过改进已有的镜像来达到自己的目的。制作基础镜像,会在另外一篇文章“从零开始制作基础镜像”中介绍。
docker commit
docker commit 是往版本控制系统里提交一次变更。使用这种方式制作镜像,本质上是运行一个基础镜像,然后在基础镜像上进行软件安装和修改。最后再将改动提交到版本系统中。
选择基础镜像
基础镜像的选择要结合自己的需求。可以选择已有的应用镜像来改造,也可以选择Ubuntu,Debian,OpenSuse这类基础系统镜像
我们以ubuntu为例子来说明
步骤1:运行ubuntu 镜像
docker run -i -t ubuntu /bin/bash
步骤2:安装软件并修改软件配置, 比如:安装apache2
apt-get -yqq update
apt-get -y install apache2
安装完成后,对apache2进行配置和修改
步骤3:退出docker并保存镜像
使用“exit”命令退出容器
运行docker comit 命令, 进行保存
docker commit 61412230ae46 own-apache2
docker commit 命令参数说明
命令格式
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS:
-a, --author= 提交的镜像作者
-c, --change=[] Apply Dockerfile instruction to the created image, 没用过
-m, --message= 提交时的说明文字
-p, --pause=true 在commit时,将container 暂停
CONTAINER:
可以使用container 的名字或者ID
REPOSITORY
指定镜像仓库,上述例子中,指定的是本地存储
可以指定远程镜像仓库,如docker hub。也可自建仓库来存放image
TAG:
镜像TAG
docker build
使用docker build创建镜像需要编写Dockerfile.
步骤:
编写自己的Dcokerfile
运行docker build 命令打包镜像
仍然以apache打包为例子。以下是Dockerfile的例子
FROM ubuntu:latest
MAINTAINER sky
#Add 163 mirror for apt
ADD sources.list /etc/apt/sources.listADD .bashrc /root/.bashrcENV DEBIAN_FRONTEND noninteractive# PackagesRUN rm -rf /var/lib/apt/listsRUN apt-get update -q --fix-missingRUN apt-get -y upgrade#ubuntu wwwRUN apt-get install -y apache2 curl libapache2-mod-php5 php5-curl php5-gd php5-mysql rsync mysql-client -qqRUN apt-get autocleanRUN rm -rf /var/lib/apt/lists/*# Setup environmnt for apache's init scriptENV APACHE_CONFDIR /etc/apache2ENV APACHE_ENVVARS $APACHE_CONFDIR/envvarsENV APACHE_RUN_USER www-dataENV APACHE_RUN_GROUP www-dataENV APACHE_RUN_DIR /var/run/apache2ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pidENV APACHE_LOCK_DIR /var/lock/apache2ENV APACHE_LOG_DIR /var/log/apache2ENV LANG CRUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIRRUN find "$APACHE_CONFDIR" -type f -exec sed -ri ' \ s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \ s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \' '{}' ';'EXPOSE 80CMD ["apache2", "-DFOREGROUND"]
编辑完成后,在与Dockerfile同一目录下运行docker build 命令
docker build -t apache-img .
如果没有命令出错,docker build会持续运行直到镜像创建完成
而创建的过程本质上是运行一个镜像,然后在镜像中按序执行在Dockerfile中的命令,直到执行结束。
如果中间有命令执行失败,镜像创建会停止。这时就需要看log,并修改Dockerfile,然后再次执行docker build
注:两种镜像创建方式的对比:
docker commit
docker build
难度相对容易,适合新手和对Linux不熟悉的用户相对难,要求有一定的linux和脚本基础知识
文档化
文档化在通过其他文件来实现
Dockerfile本身就是比较好的文档,可读和可理解性比较强。也可配合其他文档带来详细说明
升级,维护
后续升级和维护麻烦,需要再次运行镜像并对内部软件进行升级或者安装新软件增加特性
后续升级和维护会相对简单,可以直接在dockerfile中更改并增加新特性
具体选择哪种方式来制作镜像需要结合实际情况来选择
Dockerfile 关键字详解
FROM
FROM用来指定基础包。在上面的例子中,基础包用的是ubuntu。
MAINTAINER
镜像作者信息,或者维护人员信息
ADD
将文件拷贝到Container内文件系统对应的路径
格式 ADD <src file> <dst file>
所有拷贝到Container中的文件和文件夹权限为0755,uid和gid为0
如果需要修改owner用户或者权限,需要使用RUN进行修改
ADD文件,文件路径要在docker build<PATH>中指定的<PATH>下
RUN
创建镜像时执行
ENV
用来设置环境变量
EXPOSE
Container内部服务开启的端口
主机上如果要使用,还需要在启动Container时,做host-container的商品映射
使用EXPOSE后,一些自动化布署工具可以直接读取这个信息,自动进行端口映射
EXPOSE可以有多条,指定多个端口
WORKDIR
切换工作目录,可进行多次切换(相当于cd命令)
切换目录对RUN,CMD,ENTRYPOINT有效
USER
执行container的用户,如未指定,则默认使用root用户
ENTRYPOINT
Container启动时执行的命令,一个Dockerfile中只能有一条ENTRYPOINT
ENTRYPOINT没有CMD的可替换特性
CMD
Container 启动时执行的命令,一个Dockerfile 中只能有一条CMD命令,如果有多条则只执行最后一条CMD
如果有多条命令希望在启动后执行,可以考虑使用shell 脚本
与ENTRYPOINT的区别
CMD的主要用途是为可执行的container提供默认命令
CMD在运行时是可替换的,比如
在ubuntu中,CMD指定的是/bin/bash。默认情况下运行ubuntu,container中的/bin/bash会被执行
如果使用docker run指定运行命令,那CMD会被替换掉
如:docker run ubuntu /bin/echo "this is a echo". 这时,container 启动后会执行echo 而不是/bin/bash了
ENTRYPOINT是不会替换的,如果在ubuntu镜像中加入ENTRYPOINT,那ENTRYPOINT在启动后会先被执行
CMD可以为ENTRYPOINT来提供参数
例子:
FROM ubuntu:14.10
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
VOLUME
语法:VOLUME [PATH]
VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移
可以将本地文件夹或者其他Container的文件夹挂载到Container中
D. docker 镜像越来越大怎么办
看dockerfile:
FROM alpine:latest
MAINTAINER alex [email protected]
RUN apk --update add nginx
COPY . /usr/share/nginx/html
EXPOSE 80
CMD [“nginx”, “-g”, “daemon off;”]
极简化的利用dockerfile和base镜像和github的特性,能少一句就少一句,动动手试一下,这样build出来,整个镜像不超过10M,回过头来看看前面的镜像,光一个ubuntu得多大啊,实在是居家必备。
E. docker基础镜像是什么意思
当想让一个容器做两件事情,或者使一个Docker镜像包含来自两个不同镜像的依赖库时,就需要知道每个镜像的Dockerfile。本文介绍了如何通过docker history命令来对Docker镜像进行反向工程,得到它们的Dockerfile,并组织到一个Dockerfile里然后build,从而实现想做的事情。
常言道,“不要重复发明轮子!”
在使用Docker时,构建自己的镜像之前,最好在Docker Hub寻找一些可以直接使用的镜像做练习。把软件架构分布到一系列容器中,每一个容器只做一件事情,这样的效果非常好。构建分布式应用的最好的基石是使用来自Docker Hub的官方镜像,因为可以信任它们的质量。
在某些情况下,可能想让一个容器做两件不同的事情。而在另外一些情况下,可能想让一个Docker镜像包含来自两个不同镜像的依赖库。如果有每个镜像的Dockerfile,这是非常简单的。将它们组织到一个Dockerfile里然后build就行。
然而,大多数时间都在使用Docker Hub上准备好的镜像,不会有它们的源Dockerfile。我花时间找一个可以合并(或flatten)两个不同Docker镜像的工具,当然没有它们的Dockerfile。也就是说在找一个能做下面这件事的东西:
image 1 --
\
---> merged_image_12
/
image 2 --
此前在GitHub上有两个相关的讨论(1、2),尽管它们都被关闭了。
这可能吗?
那么,是否存在工具能够像这样做吗:docker merge image2 image2 merged_image?
没有!
你甚至不可以用下面的方式来构建Dockerfile:
FROM image1
FROM image2
简而言之,在一个Dockerfile里不能有多个基础镜像。
但是我需要这个功能!
唯一的解决办法是取得这些镜像的Dockerfile,然后把它们组织到一个文件中,再进行构建。那么,我能在Docker Hub上获得一个镜像的Dockerfile吗? 幸运的是可以。它不能离线获取(译注:原文是online,但显然online时对于来自GitHub的自动构建镜像是可以直接获取的),但是你可以使用docker history命令,通过反向工程获取。
怎么来使用?
在你的机器上使用docker pull从Docker Hub下载镜像。
docker pull image1
docker pull image2
然后使用docker history来取得构建这两个容器时运行的命令。
docker history --no-trunc=true image > image1-dockerfile
docker history --no-trunc=true image2 > image2-dockerfile
接下来打开这两个文件,你可以看到每个镜像的命令堆栈。这是因为Docker镜像通过层(阅读更多)的方式来构建。即你在Dockerfile中键入的每一个命令所构建的新镜像,都是在之前的命令产生的镜像之上。所以你可以对镜像进行逆向工程。
限制
不能对镜像进行反向工程的唯一场景,是镜像的维护者在他的Dockerfile中使用了ADD或COPY命令。你会看到这样一行:
ADD file:1ac56373f7983caf22
或 ADD dir:cf6fe659e9d21535844
这是因为不知道维护者在他自己的机器上,包括镜像里使用了什么本地文件。
F. docker镜像如何实现共享
青云QingCloud日前宣布推出Docker镜像仓库服务。该服务包括Docker公有镜像仓库和Harbor私有镜像仓库,用户可以根据需求选择适合的镜像仓库方案。Docker镜像仓库的推出,标志着QingCloud容器平台的进一步完善,包含Kubernetes容器编排及管理、Harbor私有镜像仓库、Docker公有镜像仓库、etcd键值存储服务、SDN网络直通服务等在内的一系列容器应用与服务,并联合Rancher、希云等容器领域的合作伙伴,帮助用户快速进行容器相关的应用开发、部署和升级,大幅降低容器应用的开发和管理门槛。
此次推出的Docker公有镜像仓库免费为用户提供安全可靠、简单易用、兼容开放的Docker镜像集中存储与分发服务,支持创建多个Docker命名空间和多个Docker用户,灵活地管理用户的Docker镜像。Docker公有镜像仓库底层基于QingStor对象存储,为用户提供海量的镜像存储服务。此外,QingCloud还提供Harbor私有镜像仓库,便于用户一键部署高可用、高安全、高性能的Docker镜像仓库。
青云QingCloud容器平台是通过QingCloud AppCenter交付的一套完整的容器部署与管理平台,支持多种云端容器部署方式,并提供镜像仓库、调度与编排、服务感知、跨平台管理等容器管理功能。QingCloud 容器平台充分整合了QingCloud IaaS平台的高性能网络及存储能力,为容器平台提供极致的性能保障,支持企业用户一键部署高可用、高可靠、高性能的容器平台。
青云QingCloud完整的企业级容器服务平台有如下亮点:
云平台深度整合:与青云QingCloud云平台深度集成,充分整合QingCloud IaaS底层的SDS(软件定义存储)与SDN(软件定义网络)能力,提供SDN网络直通及存储持久化方案,为容器运行环境提供极致的网络及存储性能支持。
一键部署、轻量运维:应用通过QingCloud AppCenter框架交付,一键完成部署,持续升级,提供创建、扩容、健康监测、用户管理等应用全生命周期管理功能,并提供完善的服务监控及日志功能,是实践DevOps的绝佳之路。
兼容与开放:QingCloud Kubernetes容器服务完全兼容原生API语法,将用户的学习和迁移成本降至最低,基于Kubernetes开发的原生应用也可以无缝迁移至QingCloud平台。
统一架构:QingCloud IaaS实现了在同一套技术架构下对虚拟主机、物理主机(Bare Metal Service)和容器进行统一的管理和运维,三者之间可以在统一的网络和存储环境下实现无缝互通及共享资源,避免了系统的割裂。
青云QingCloud CTO甘泉表示,结合QingCloud在IaaS和AppCenter上的技术优势,QingCloud推出的容器平台能够为企业级用户提供一键部署、弹性伸缩、极致性能的容器服务,为用户轻松构建Docker服务、DevOps平台及微服务架构提供技术平台支持。未来,QingCloud将深度参与各类容器开源项目,联合更多容器领域合作伙伴,为用户提供一站式的容器平台服务。
G. docker 怎么从镜像仓库获取镜像
配置docker的启动参数。
执行:
# systemctl status docker 1
可以看出,这里在执行docker pull的时候不需要带上本地镜像仓库的地址,直接会自动从本地镜像仓库拉取。
H. docker怎么查看容器使用的镜像
Docker容器运行后,如何进入容器进行操作呢?起初我是用SSH。如果只启动一个容器,用SSH还能应付,只需要将容器的22端口映射到本机的一个端口即可。当我启动了五个容器后,每个容器默认是没有配置SSHServer的,安装配置SSHD,映射容器SSH端口,实在是麻烦。我发现很多Docker镜像都是没有安装SSHD服务的,难道有其他方法进入Docker容器?有很多种方法,包括使用dockerattach命令或nsenter工具等。使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示。nsenter可以访问另一个进程的名字空间。为了连接到容器,你还需要找到容器的第一个进程的PID,可以通过下面的命令获取。
I. docker镜像和虚拟机镜像有区别吗
docker centos 和 ubuntu 镜像的区别Docker是基于镜像的。镜像类似于已经包含了文件、配置和安装好的程序的虚拟机镜像。同样的,你可以像启动虚拟机一样启动多个镜像实例。运行中的镜像称为容器。你可以修改容器(比如删除一个文件),但这些修改不会影响到镜像。不过,你使用docke...