dockerfileCMD命令,dockerfile 命令

http://www.itjxue.com  2023-01-04 22:49  来源:未知  点击次数: 

DockerHub里的镜像太多了,怎么选择

创建镜像的目的首先说DockerHub或其它一些镜像仓库已经提供了够多的镜像,有最小版本,也有一些安装了mysql、nginx、apache等等第三方软件的版本可以直接拿来使用。虽然已经足够多了,但是有些情况下并不能满足我们的需求,例如需要安装一些比较少用到的第三方软件,这个时候只能先用公共仓库中的镜像,启动容器,然后在容器中按照我们的需求安装软件,修改配置等等操作,之后提交镜像。这些操作在之前的文章中介绍了。这样操作完成之后,可以用如下两种方式实现定制镜像的目的:1.用save和export的方式将镜像保存为tar包,然后在需要的时候导入tar镜像包2.将已经配置好的镜像push到我们的私有仓库(docker创建私有仓库)或者已注册过的共有仓库中,需要的时候直接pull下来使用这两种方式都可以,但是自动化程度低、自由度不够、定制起来比较麻烦。既然如此,那就来说一下更加自动化的创建方式。Dockerfile结构dockerfile由4部分信息组成:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。123456789101112131415161718#Thisdockerfileusestheubuntuimage#VERSION2-EDITION1#Author:docker_user#Commandformat:Instruction[arguments/command]..#Baseimagetouse,thismustbesetasthefirstlineFROMubuntu#Maintainer:docker_user(@docker_user)MAINTAINERdocker_userdocker_user@email.com#CommandstoupdatetheimageRUNecho"deb/ubuntu/raringmainuniverse"/etc/apt/sources.listRUNapt-getupdateapt-getinstall-ynginxRUNecho"\ndaemonoff;"/etc/nginx/nginx.conf#CommandswhencreatinganewcontainerCMD/usr/sbin/nginx其中#表注释,可以标注一些说明性的文字。FROM关键字指定镜像的来源,默认为DockerHub,也可以写私有仓库的镜像,例如:localhost:5000/centos:6.7,如果本地已经存在指定的镜像名称,则会从本地缓存直接获取。MAINTAINER指定镜像的作者,之后为镜像操作执行RUN、ADD等,最后是容器启动时发起的指令。Dockerfile中的指令FROM:指定镜像名称,格式为FROM或FROM:,例如FROMubuntu或FROMubuntu:12.04 MAINTAINER:镜像作者,格式为MAINTAINERRUN:格式为RUN或RUN["executable","param1","param2"]。前者将在shell终端中运行命令,即/bin/sh-c;后者则使用exec执行。指定使用其它终端可以通过第二种方式实现,例如RUN["/bin/bash","-c","echohello"]。每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\来换行。CMD:支持三种格式1.CMD["executable","param1","param2"]使用exec执行,推荐方式;2.CMDcommandparam1param2在/bin/sh中执行,提供给需要交互的应用;3.CMD["param1","param2"]提供给ENTRYPOINT的默认参数;指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令。EXPOSE:格式为EXPOSE[]。告诉Docker服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过-P,Docker主机会自动分配一个端口转发到指定的端口。ENV:格式为ENV。指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持。这就对应程序语言中的变量定义,可在需要的时候引用。例如:1234ENVPG_MAJOR9.3ENVPG_VERSION9.3.4RUNcurl-SL/postgres-$PG_VERSION.tar.xz|tar-xJC/usr/src/postgress…ENVPATH/usr/local/postgres-$PG_MAJOR/bin:$PATHADD:格式为ADD。该命令将复制指定的到容器中的。其中可以是Dockerfile所在目录的一个相对路径;也可以是一个URL;还可以是一个tar文件(自动解压为目录)。COPY:格式为COPY。复制本地主机的(为Dockerfile所在目录的相对路径)到容器中的。当使用本地目录为源目录时,推荐使用COPY。COPY和ADD的不同就是:ADD多了自动解压和支持URL路径的功能。ENTRYPOINT:两种格式:ENTRYPOINT["executable","param1","param2"]ENTRYPOINTcommandparam1param2(shell中执行)。配置容器启动后执行的命令,并且不可被dockerrun提供的参数覆盖。每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。CMD和ENTRYPOINT比较:两个命令都是只能使用一次,并且都是在执行dockerrun指令时运行,如果有多个,只执行最后一条。两者的不同在于参数的传递方式,如果在Dockerfile中定义如下指令1CMDechohello或1ENTRYPOINT["echo","hello"] 那么在运行命令dockerruncontainerIdechohello时,指定了CMD的输入结果为world,可以看出Dockerfile中指定的命令被覆盖了,而指定了ENTRYPOINT时,输出结果为helloechoworld,可以看出指定的命令被作为ENTRYPOINT指定指令的参数了。VOLUME:格式为VOLUME["/data"]。创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。不过此属性在Dockerfile中指定并没有什么意义,因为没有法指定本地主机的目录。如果需要指定挂载点可以在执行dockerrun命令时指定:1dockerrun-it-v/home/fengzheng/ftp/:/data859666d51c6d/bin/bashUSER:格式为USERdaemon。指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:RUNgroupadd-rpostgresuseradd-r-gpostgrespostgres。要临时获取管理员权限可以使用gosu,而不推荐sudo。WORKDIR:格式为WORKDIR/path/to/workdir。为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如1234WORKDIR/aWORKDIRbWORKDIRcRUNpwd则最终路径为/a/b/c。ONBUILD:格式为ONBUILD[INSTRUCTION]。配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。例如,Dockerfile使用如下的内容创建了镜像image-A。1234[]ONBUILDADD./app/srcONBUILDRUN/usr/local/bin/python-build--dir/app/src[]如果基于image-A创建新的镜像时,新的Dockerfile中使用FROMimage-A指定基础镜像时,会自动执行ONBUILD指令内容,等价于在后面添加了两条指令。12345FROMimage-A#AutomaticallyrunthefollowingADD./app/srcRUN/usr/local/bin/python-build--dir/app/src使用ONBUILD指令的镜像,推荐在标签中注明,例如ruby:1.9-onbuild。基于CentOS6.7并源码安装nginx首先准备了nginx-1.9.9.tar.gz安装包和CentOS6-Base-163.repo(163源),将这两个文件放到同一目录下,并在此目录下创建名称为Dockerfile的文件。之后在此文件中实现源替换、nginx编译安装、及一些依赖包的安装,Dockerfile内容如下:12345678910111213141516171819202122232425262728293031#thisisatestubuntu12.04imagedockerfile#Author:fengzheng#Baseimage,thismustbesetasthefirstline#localhost:5000/centos:6.7是我的私有仓库的镜像,可替换为centos:6.7(DockerHub中的镜像)FROMlocalhost:5000/centos:6.7MAINTAINERfengzheng#CommandstoupdatetheimageRUNmkdir/usr/nginx1.9.9ADDnginx-1.9.9.tar.gz/usr/nginx1.9.9/#RUNyum-yinstalltar#RUNtar-zxvf/usr/nginx1.9.9/nginx-1.9.9.tar.gzRUNcd/etc/yum.repos.d/mvCentOS-Base.repoCentOS-Base.repo.bakADDCentOS6-Base-163.repo/etc/yum.repos.d/RUNcd/etc/yum.repos.d/mvCentOS6-Base-163.repoCentOS-Base.repo\yumcleanallyummakecache\yum-yinstallgcc\yum-yinstallyuminstall-ypcre-devel\yum-yinstallzlibzlib-devel\yum-yinstallopensslopenssl--devel\cd/usr/nginx1.9.9/nginx-1.9.9/./configuremakemakeinstall#如果设置daemonoff;nginx无法启动#RUNecho"\ndaemonoff;"/etc/nginx/nginx.conf#Commandswhencreatinganewcontainer#启动nginx需进入/usr/local/nginx/sbin执行./configureCMD/bin/bash最后执行命令"dockerbuild-tnginx-centos:6.7."其中.表示在当前目录下搜索Dockerfile文件,-t参数指定镜像名称和tag。

docker 和 k8s 面试总结

花了大半个月对k8sdocker进行了梳理,包括之前读过的书,官方文档以及kd在公司项目的实践等。

以下是个人对docker k8s 面试知识点的总结:

1 docker

常见面试题如下 每一点可根据回答进行适当深入

1.1 什么是docker

docker和传统linux的差异?

容器和镜像的区别?

如何理解docker的缓存机制?

1.2 docker 网络模型是什么?有何局限

docker的网络基础是什么?

docker的网络模型是?有什么局限?

docker如何实现容器间通信的?

1.3 docker 基础命令

cmd和entryPoint差异?

copy和add的差异?

简单讲下swam/compose?

2 kubernetes

常见面试题如下 每一点可根据回答进行适当深入

2.1 什么是k8s?

1 为什么用k8s 解决了什么问题?

2 k8s有哪些组件,有什么作用?【同:Master节点和Node节点都用哪些组件】

3 可以简单说下Node Pod container 之间的关系吗? 【可引入2.2/2.3对Pod SVC的考察】

4 什么是SVC可以简单描述下吗?【可引入2.3对SVC的考察】

5 可以简单讲下k8s的网络模型吗?

6 Pod SVC Node Container 之间如何相互访问

7 swarm和k8s如何选择?

2.2 考察Pod

静态Pod和普通Pod的差异?

简单讲下Pod的生命周期重启策略呢?

- 不同组件对Pod的重启策略要求一样吗?

如何检查Pod的健康状态?哪2种探针?

- 2种探针的实现方式

简单说下Pod的调度方式?

2.3 考察SVC

SVC有哪4种类型

2.4 k8s网络模型

DNS和Iptables在k8s中的运用?有何差异

- k8s如何解决多机器部署容器的网络问题?

Pod SVC Node Container 之间如何相互访问

3 参考答案

答案是根据所在公司项目结合自己的理解给出的答案 不一定完全准确但在面试中要做到有理有据突出自己的思路即可。

4 docker

问题和答案 如下

4.1 什么是docker?

通常问这个问题主要在于考察候选人是否真正了解过docker,很多人项目中都有用到docker,真正去了解过概念,架构的不多。从而来辨别简历上的熟悉/了解docker的水分。

如果这个都无法回答,那么接下来的docker考察也就毫无意义了,此问题通常也会结合以下问题来进行考察。

docker和传统linux的差异?

docker都有哪些核心组件?

可以简单说下docker的架构吗?

容器和镜像的区别?

docker是什么: ?Docker是一个可以把开发的应用程序自动部署到容器的开源引擎。

docker和VM差异: ?docker是一个应用层的抽象,容器之间通过网络命名空间进行隔离,多个容器共享同一个操作系统内核。VM是对物理硬件层的抽象,每个VM都包含独立的操作系统,重且启动缓慢。VM主要为了提供系统环境,容器主要是为了提供应用环境。

docker组件: ?docker引擎【包含Docker客户端服务端】,docker镜像,docker容器,Registry【镜像仓库】

docker的架构: ?C/s架构

容器和镜像的区别: ?镜像是一个只读模板,包括运行容器所需的数据,其内容在构建之后就不会被改变,可以用来创建新的容器。 镜像由多个只读层组成,容器在只读层的基础上多了一个读写层。

4.2 docker 网络模型是什么?有何局限

这里也经常会结合K8s网络原理进行考察,以及如下几个考点

docker的网络基础是什么?

docker的网络模型是?有什么局限?

docker如何实现容器间通信的?

Docker网络基础: ?Docker是在操作系统层上对应用的抽象,使用网络命名空间来对不同容器之间进行网络隔离,用Veth设备对来进行容器之间的通讯。

docker的网络模型: ?有4种网络模型 分别是Bridge Container host none 默认使用bridge网络模型,容器的初次启动会虚拟化出来一个新的网卡名为docker0,在多机器部署下docker0地址可能会冲突。所以docker对多机部署支持的不够友好。

4.3 docker 基础命令

出现频率较高的为以下几条命令的考察

cmd和entry差异?

copy和add的差异?

docker-compose docker swarm?

CMD ENTRYPONIT

都是容器操作指令:

CMD?用于指定容器启动时候默认执行的命令。可以被docker run指定的启动命令覆盖。ENTRYPONIT?指令可让容器以应用程序或者服务的形式运行。一般不会被docker run指定的启动命令覆盖。dockerfile中的多个CMD ENTRYPONIT只有最后一个会生效。

注意区别docker run 和RUN 一个是容器启动命令,一个是镜像构建时候所用。

copy add

ADD COPY?选取目标文件复制到镜像当中。是针对镜像的指令,唯一差别在于add源文件可以支持url且可以对压缩文件进行解压操作。而copy针对的是当前构建环境。

docker-compose docker swarm

使用Docker compose可以用YAML文件来定义一组需要启动的容器,以及容器运行时的属性。docker-compose用来对这一组容器进行操作。

docker swarm?原生的Docker集群管理工具,依赖docker本身,很多重要功能依赖团队二次开发。且社区不够活跃,一般公司生产环境会选择k8s,个人项目或者容器数量较少可选swarm,只需要docker即可完成,相对较轻。

5 kubernetes

5.1 什么是k8s?

对k8s的考察一般逃不过这样入门级的问题,针对入门级的问题,面试官可能也会针对如下几个点进行考察,在候选人答出来的基础上,选择其中一个进行深入。

为什么用k8s 解决了什么问题?

k8s有哪些组件,有什么作用?

可以简单说下Node Pod container 之间的关系吗? 【进一步可对Pod SVC细节进行考察】

什么是SVC可以简单描述下吗?【可引对SVC的考察】

可以简单讲下k8s的网络模型吗?【可以和docker网络模型结合考察】

Pod SVC Node Container 之间如何相互访问【衍生 外部环境如何访问k8s】

swarm和k8s如何选择?

1 什么是k8s 为什么用k8s:

一个开源的容器集群管理平台【容器编排工具】,可提供容器集群的自动部署,扩缩容,维护等功能。分为管理节点Master和工作节点Node。在我们的项目中主要解决了环境一致性的问题,通过CI/CD使得运维部署变得简单起来,以及自动部署,故障监控,自动扩缩容。可以提升开发效率。

2 k8s有那些组件:

etcd保存了整个集群的状态;

apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;

controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;

kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;

Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);

kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;

3 NodePodcontainer之间的关系:Node一般指工作节点包含多个Pod Pod中包含多个Container,Pod中的container共享同一个网络命名空间。

4 什么是SVC: SVC是对一组功能相似的Pod资源的抽象,相当于一组服务的负载均衡。

5 k8s的网络模型:IP-Per-Pod 每个Pod有独立的Ip地址,无论是否处于同一个Node节点,Pod可以通过IP相互访问,且Pod和容器的地址和外部看到的地址是同一个地址。

6 Pod SVC Node Container 之间如何相互访问:

同Pod内的容器:同一个Pod的容器共享同一个网络命名空间可以直接进行通讯

同Node内不同Pod的容器:多个Pod都关联在同一个Docker0网桥上,通过docker0网桥完成相互通讯。

不同Node内Pod的容器:不同Node上的docker0可能会相同,PodIP和docker0是同网段的,所以需要将PodIP和NodeIP进行关联且保障唯一,不同Pod之间的数据通过物理机的端口进行转发即可完成通讯。

7: k8s 和docker swarm如何选择: ?:

5.2 对SVC的考察

SVC是k8s中的核心概念 这里涉及知识点众多 常见的面试考点如下

什么是SVC? 如何创建SVC?

使用SVC创建多个副本和使用RC创建多个副本有什么差异?

SVC有哪几种类型?

SVC 负载分发策略有那些?

集群外如何访问SVC?

SVC: 是对一组功能相似的Pod资源的抽象,相当于一组服务的负载均衡。可以使用配置文件的方式创建也可以使用命令创建kubectl expose

SVC和RC提供服务的差距: ?RC创建的服务PodIP可能会变。SVC提供的clusterIP不会。通过Iptables的NAT转换重定向到本地端口,在均衡到后端Pod。

svc的几种类型: ?ClusterIp/NodePort/LoadBalancer/ExternalName

ClusterIp 默认类型 分配的一个虚拟地址,内部可以相互访问,外部不行

NodePort 将SVC端口号映射到物理机

LoadBalancer 基于NodePort,云服务商在外部创建了一个负载均衡到Pod

ExternalName 将外部地址经过集群内部的再一次封装(实际上就是集群DNS服务器将CNAME解析到了外部地址上),实现了集群内部访问即可。

svc负载分发策略: ?RoundRobin/SessionAffinity/自定义实现【基于标签选择器】

集群外部访问: ?端口映射到物理机即可

5.2 Pod考察

Pod和静态Pod的区别

生命周期和重启策略 【这里可扩展 不同控制器对Pod的重启策略要求】

Pod如何健康检查?

Pod的调度方式?【扩展调度算法】

Pod如何扩缩容?【扩展 RC和RS的差异】

答案

待补充 --详见 《k8s权威指南》读书笔记

5.3 基础原理类考察

主要考察对基本组件的理解 和原理分析

API Server

Controller Manager【Replication Controller/Node Controller/ResourceQuota Controller/Namespace Controller/SVC Controller Endpoint Controller】

Scheduler

Kubelet 【Pod健康检查 资源监控】

Kube-Proxy

k8s-DNS Iptables差异

k8s中Ingress是什么

简述k8s中的如下属性及其作用resources tolerations affinity

k8s中pod、rs、deployment、hpa的基本概念,以及他们之间的关系

答案

待补充 --详见 《k8s权威指南》读书笔记

5.4 网络原理类考察

主要考察对基本组件的理解 和原理分析

k8s的网络模型是什么?

Docker的网络基础是什么?

Docker的网络模型和局限?

k8s的网络组件之间是如何通讯的?

外部如何访问k8s集群?

有那些开源组件支持k8s网络模型?

云计算核心技术Docker教程:Docker存储写入时复制(CoW)策略

【点击右上角加'关注',全国产经信息不错过】

写时复制是一种共享和复制文件的策略,可最大程度地提高效率。如果文件或目录位于映像的较低层中,而另一层(包括可写层)需要对其进行读取访问,则它仅使用现有文件。另一层第一次需要修改文件时(在构建映像或运行容器时),将文件复制到该层并进行修改。这样可以将I / O和每个后续层的大小最小化。这些优点将在下面更深入地说明。

共享可以提升较小的图像

当您用于docker pull从存储库中下拉映像时,或者当您从本地尚不存在的映像中创建容器时,每个层都会被分别下拉,并存储在Docker的本地存储区域中,该区域通常/var/lib/docker/在Linux主机上。在此示例中,您可以看到这些层被拉出:

$ docker pull ubuntu:18.04

18.04: Pulling from library/ubuntu

f476d66f5408: Pull complete

8882c27f669e: Pull complete

d9af21273955: Pull complete

f5029279ec12: Pull complete

Digest: sha256:ab6cb8de3ad7bb33e2534677f865008535427390b117d7939193f8d1a6613e34

Status: Downloaded newer image for ubuntu:18.04

这些层中的每一层都存储在Docker主机的本地存储区域内的自己的目录中。要检查文件系统上的各层,请列出的内容/var/lib/docker/。本示例使用overlay2 存储驱动程序:

$ ls /var/lib/docker/overlay2

16802227a96c24dcbeab5b37821e2b67a9f921749cd9a2e386d5a6d5bc6fc6d3

377d73dbb466e0bc7c9ee23166771b35ebdbe02ef17753d79fd3571d4ce659d7

3f02d96212b03e3383160d31d7c6aeca750d2d8a1879965b89fe8146594c453d

ec1ec45792908e90484f7e629330666e7eee599f08729c93890a7205a6ba35f5

l

目录名称与层ID不对应(自Docker 1.10开始就是如此)。

现在,假设您有两个不同的Dockerfile。您使用第一个创建名为的图像acme/my-base-image:1.0。

# syntax=docker/dockerfile:1

FROM ubuntu:18.04

COPY . /app

第二acme/my-base-image:1.0层基于,但具有一些附加层:

# syntax=docker/dockerfile:1

FROM acme/my-base-image:1.0

CMD /app/hello.sh

第二个图像包含第一个图像的所有层,再加上带有CMD指令的新层,以及一个可读写容器层。Docker已经具有第一个映像中的所有层,因此不需要再次将其拉出。这两个图像共享它们共有的任何图层。

如果从两个Dockerfile构建映像,则可以使用docker image ls和 docker history命令来验证共享层的密码ID是否相同。

1.创建一个新目录cow-test/并更改到该目录中。

2.在中cow-test/,创建一个hello.sh具有以下内容的新文件:

#!/bin/sh

echo "Hello world"

保存文件,并使其可执行:

chmod +x hello.sh

3.将上面第一个Dockerfile的内容复制到一个名为的新文件中 Dockerfile.base。

4.将上面第二个Dockerfile的内容复制到一个名为的新文件中 Dockerfile。

5.在cow-test/目录中,构建第一个映像。不要忘记.在命令中包含final 。设置了PATH,它告诉Docker在哪里寻找需要添加到映像中的任何文件。

$docker build -t acme/my-base-image:1.0 -f Dockerfile.base .

6.建立第二张镜像。

$docker build -t acme/my-final-image:1.0 -f Dockerfile .

7.检查镜像的大小:

$docker image ls

8.检出构成每个镜像的图层:

$docker history bd09118bcef6

请注意,除了第二个图像的顶层以外,所有层都是相同的。所有其他层在两个图像之间共享,并且仅在中存储一次/var/lib/docker/。实际上,新层根本不占用任何空间,因为它不更改任何文件,而仅运行命令。

全国产经平台联系电话:010-65367702,邮箱:hz@people-energy.com.cn,地址:北京市朝阳区金台西路2号人民日报社

docker commit和docker file的区别

制作镜像的方式主要有两种:

通过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 buildPATH中指定的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中

Docker Compose 入门(V3)

[TOC]

编写文件 docker-compose.yml

目录结构如下

在docker-compose.yml文件添加内容

重新构建镜像

运行所有容器。加上 -d 参数表示后台运行容器,加上 --build 参数表示运行容器前先重新构建镜像

指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来

示例:

指定容器的名称

指定Dockerfile文件的路径。若用此指令,则每次执行 docker-compose up 都会构建镜像。

可以是一个路径,例如:

也可以是一个对象,用以指定Dockerfile和参数,例如:

覆盖容器启动后默认执行的命令

示例:

也可以是一个list,类似于Dockerfile总的CMD指令,格式如下:

链接到其他服务中的容器。可以指定服务名称和链接的别名使用 SERVICE:ALIAS 的形式,或者只指定服务名称,示例:

表示链接到docker-compose.yml外部的容器,甚至并非Compose管理的容器,特别是对于那些提供共享容器或共同服务。格式跟links类似 CONTAINER:ALIAS ,示例:

暴露端口信息。使用 宿主端口:容器端口 的格式,或者仅仅指定容器的端口(此时宿主机将会随机指定端口),类似于docker run -p ,示例:

暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机,示例:

容器的启动策略,有如下值可选:

卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。示例:

从另一个服务或者容器挂载卷。可以指定只读或者可读写,如果访问模式没有指定,则默认是可读写。示例:

设置环境变量。可以使用数组或者字典两种方式。只有一个key的环境变量可以在运行Compose的机器上找到对应的值,这有助于加密的或者特殊主机的值。示例:

从文件中获取环境变量,可以为单独的文件路径或列表。如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则以envirment 为准。示例:

继承另一个服务,基于已有的服务进行扩展。

设置网络模式。采用与docker --network 参数相同的值,添加了特殊格式 service:[service name]

指定要加入的网络

配置dns服务器。可以是一个值,也可以是一个列表。示例:

配置DNS的搜索域,可以是一个值,也可以是一个列表,示例:

docker-compose文件官方文档

使用Spring Cloud与Docker实战微服务

如何在Docker中设定Go并部署应用

如何在Docker中设定Go并部署应用

步骤一 - 建立Dockerfile

如下的Dockerfile可以满足以上的要求:

**FROM** golang:1.6

*# Install beego and the bee dev tool*

**RUN** go get github./astaxie/beego go get github./beego/bee

*# Expose the application on port 8080*

**EXPOSE** 8080

*# Set the entry point of the container to the bee mand that runs the*

*# application and watches for changes*

**CMD** ["bee", "run"]

第一行,

FROM golang:1.6

将Go的官方映像档案作为基础映像。该映像档案预安装了 Go 1.6 . 该映像已经把 $GOPATH 的值设定到了 /go 。所有安装在 /go/src 中的包将能够被go命令访问。

第二行,

RUN go get github./astaxie/beego go get github./beego/bee

安装 beego 包和 bee 工具。 beego 包将在应用程式中使用。 bee 工具用语在开发中再现地重新载入我们的程式码。

第三行,

EXPOSE 8080

在开发主机上利用容器为应用程式开放8080埠。

最后一行,

CMD ["bee", "run"]

使用bee命令启动应用程式的线上重新载入。

步骤二 - 构建image

一旦建立了Docker file,执行如下的命令来建立image:

docker build -t ma-image .

执行以上的命令将建立名为ma-image的image。该image现在可以用于使用该应用程式的任何人。这将确保这个团队能够使用一个统一的开发环境。

为了检视系统上的image列表,执行如下的命令:

docker images

这行该命令将输出与以下类似的内容:

REPOSITORY TAG IMAGE ID CREATED SIZE

ma-image latest 8d53aa0dd0cb 31 seconds ago 784.7 MB

golang 1.6 22a6ecf1f7 5 days ago 743.9 MB

注意image的确切名字和编号可能不同,但是,应该至少看到列表中有 golang 和 ma-image image。

步骤三 - 执行容器

一旦 ma-image 已经完成,可以使用以下的命令启动一个容器:

docker run -it --rm --name ma-instance -p 8080:8080 \

-v /app/MathApp:/go/src/MathApp -w /go/src/MathApp ma-image

步骤一 - 建立Dockerfile 如下的Dockerfile可以满足以上的要求: **FROM** golang:1.6 *# Install beego and the bee dev tool* **RUN** go get ...

如何在idea中设定tomcat热部署

一、配置Project Structure

1

先找到软体上如图所示的图示,开启Project Structure.

2

【配置project】

这里需要注意四个地方。

1.专案名称,可以随便起。

2.New一个jdk的安装路径。

3.选一个6.0的介面。

4.专案的classes路径。

3

【配置modules】

先配置Source。点选“+”,可以增加专案。栏目中会出现专案,右侧也会出现专案。

将游标移动到专案的src上,点选上面的source按钮,进行专案的src的新增,右边会显示出来的。

4

【配置modules】

配置Path路径。

这里需要注意的就一个,配置专案的classes目录,提供输出的路径。

5

【配置modules】

配置dependence。

这里载入的是jar包。点选右边的“+”。

1.jdk的路径。

2.专案lib路径。

3.新增Tomcat的jar包。要选library格式。(jsp-api.jar ,servlet-api.jar)

END

二、配置Tomcat

点选如图所示的地方,进行进入Tomcat配置页面。

进入页面后,点选右侧的“+”。

弹出页面后,按照如图顺序找到,tomcat---》Local。

按照如图方式进行配置。

1代表名称,给配置的Tomcat取名称。

2代表配置Tomcat的安装路径。

3代表Tomcat伺服器启动后,预设开启的浏览器,根据自己习惯开启。

4代表浏览器显示路径,根据自己喜好可以改。

5和6都是预设的,不需要修改。

配置Deployment,webapp为专案的webapp,后面的名字可以自己定义,别忘了加“/”.

首先开启idea开发工具,open一个java的web专案,然后点选Run选单,选择Edit Configurations...选单,开启Run/Debug Configurations对话方块

如何在idea中设定tomcat热部署

点选对话方块左上角的加号,选择Tomcat Server,再选择Local子选单

如何在idea中设定tomcat热部署

设定个名称,如果之前没有关联过tomcat的,需要先关联一个tomcat,关联tomcat选择Application server的Configure按钮

如何在idea中设定tomcat热部署

Application Servers对话方块开启之后,点选加号,设定一个下载好的tomcat目录路径就可以关联上

如何在idea中设定tomcat热部署

在Run/Debug Configurations对话方块中,选择Deployment选项卡,对需要部署的专案档案做设定,点选加号选择Artifact,然后选择war exploded方式,这种方式是以资料夹方式部署的,而war是以war包的方式,exploded方式支援热部署,开发的时候选择exploded方式就可以了

如何在idea中设定tomcat热部署

新增完Artifact档案之后,可以设定下Application context,不设定的话,预设应用路径为根目录

如何在idea中设定tomcat热部署

然后回到Server选项卡,设定On Update action和On frame detectivation选项,都设定为Update classes and resources,表示classes档案和资原始档都更新

如何在idea中设定tomcat热部署

8

如果只设置On Update action选项,则需要每次自己手动点选更新,设定了On frame detectivation,会监测视窗,idea视窗发生切换则自动更新档案

商业版有这个功能,社群版的功能比较鸡肋,只能reload classes 从上面的图中可以看到,reload class 是在pile之后的,而Intellij没有类似储存java档案就自动pile的功能,需要手动触发下pile, ctrl+shift+f9 就会在左下角看到绿色的提...

如何在docker中部署springboot的web应用

第一步:搭建springboot的web应用,可在CMD命令列中通过mvn install命令将应用打成jar包:如demo-0.0.1-SNAPSHOT.jar

第二步:将jar包copy到centos档案系统中,指定目录示例为:/usr/local/demo-0.0.1-SNAPSHOT.jar

第三步:构建docker映象:此处以docker build方式构建

首先你要明白docker是什么,其实他就和虚拟机器一样,只是比虚拟机器占用资源更小,使用更方便,要部署应用,你可以先拉取一个LINUX的系统下来,然后用docker基于拉取的linux映象建立容器,再在容器中进行环境搭建,部署,就和在linux系统里操作是一样的。

如何在 Visual Studio 中设定部署属性

在配置管理器中启用专案部署

在 Visual Studio 中,单击主选单上的“生成”,然后单击“配置管理器”。

为每个需要从开启的解决方案进行部署的专案选中“部署”选项。

配置专案属性

在 Visual Studio 解决方案资源管理器中,右键单击要为其配置属性的专案,然后单击“属性”。

单击专案设计器中的“部署”选项卡。

按下表中所述方法配置专案属性,然后单击“确定”。

对于解决方案中的每个专案,重复执行步骤 1、2 和 3。

如何在docker里部署nodejs

下载映象,安装环境

我们先执行如下命令,启动虚拟机器:

$ boot2docker start

2014/08/18 21:22:41 Waiting for VM to be started...

...........

2014/08/18 21:23:21 Started.

2014/08/18 21:23:21 Docker client does not run on Windows for now. Please use

2014/08/18 21:23:21 "boot2docker" ssh

2014/08/18 21:23:21 to SSH into the VM instead.

如果我们的物理机记忆体低于4G,那么跑这个boot2docker可能需要手动设定记忆体占用大小:

$ boot2docker start -m=512

我们利用命令就可以进入linux虚拟机器了

$ boot2docker ssh

boot2docker: 1.1.2

master : 740106c - Thu Jul 24 03:24:10 UTC 2014

执行 docker 命令,会有一个命令列表,里面列出了所有 docker 支援的功能,列表如下:

Commands:

attach Attach to a running container

build Build an image from a Dockerfile

mit Create a new image from a container's changes

... ...

下面会对一些常用的命令进行示例说明,我们可以通过如下命令,先查询centos的映象,并把他下载下来

$ docker search centos #查询centos名字的映象

$ docker pull centos #下载官方纯净版本的centos映象

在呼叫search命令时,你会看到有好多centos包,他们都是这样的username/image_name,这些不在根目录的映象都是非官方的,是其他使用者提交到docker hub上去的,耐心等待片刻我们就可以将centos的映象拉下来了。

如果脸黑,映象又不幸被墙,那么试试加上下面的hosts:

54.234.135.251 get.docker.io

54.234.135.251 cdn-registry-1.docker.io

成功下载好centos映象之后,我们可以利用如下命令来检视映象列表:

$ docker images

REPOSITORY TAG IMAGE ID CREATED

VIRTUAL SIZE

centos centos6 b1bd49907d55 2 weeks ago

212.5 MB

centos centos7 b157b77b1a65 2 weeks ago

243.7 MB

centos latest b157b77b1a65 2 weeks ago

243.7 MB

接下来我们就利用centos7这个映象输出一段 hello world

$ docker run b15 /bin/echo 'Hello world'

Hello world

注意这里的 b15,他表示centos7这个images的id,不用全部打全,只要保证输入的id前几位能找到唯一映象即可,这点很赞。

稍微复杂一点的例子:

$ docker run -i -d -t b15 /bin/sh -c "while true; do echo hello world; sleep 1; done"

-i表示同步container的stdin,-t表示同步container的输出,-d表示deamon,以后台启动这个container,执行这个container是永远不会停止的,每一秒钟都会输出hello world。

至于什么是container,container和image的关系我们下一段再说,列出映象的历史:

$docker history image_name

(责任编辑:IT教学网)

更多

推荐数据库文章