Docker探索系列2之镜像打包与DockerFile
preface
docker基本入门以后,可以试试打包docker镜像与dockerfile了
docker镜像
docker hub仓库有2类仓库,用户仓库和顶层仓库,用户仓库由docker用户创建的,顶层仓库由docker内部的人来管理的。仓库里存放的是镜像文件,那么问题来了 ,怎么去创建镜像呢?
how to create image
构建docker镜像的有2种方法:
- 使用docker commit命令。
- 使用docker build 命令和Dockerfile文件。
在这里并不推荐使用docker commit命令,而应该使用更灵活,更强大的Dockerfile来构建镜像
但是还得介绍下如何使用docker commit。。
notice:
you should remeber , we are not create new image from 0。而是基于一个已有的基础镜像,如CentOs来构建新镜像而已。如果真的想从0构建一个全新的镜像,可以参考: https://docs.docker.com/engine/userguide/eng-image/baseimages/
使用commit来创建一个新的镜像
我们先启动一个container,然后安装个python3。
我们先启动一个container,然后安装个python3,
[root@salt docker]# docker run --name python3 -i -t centos /bin/bash
#省去安装py3步骤。。。。。。
[root@cb6903f738e1 python3.5.2]# exit #安装好后退出
[root@salt docker_pratice]# docker commit -m="install python3" --author='Leo' python3 1403208717:test
参数解释:
- -m: 用来指定新创建的镜像的提交信息
- --author选项用来列出镜像的作者信息
- 标签: 我们在1403208717追加了一个test,表示冒号后面的是标签。
查看有刚才commit的信息
[root@salt docker]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
1403208717 latest 001d2ee1399c 12 minutes ago 840.4 MB
导入镜像
docker通过load放来导入其他的镜像文件。
[root@linux-node2 ~]# docker load < docker_httpd.iso # docker_http.iso是一个标准的docker镜像文件
[root@linux-node2 ~]# docker images # 导入成功
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
httpd latest 4f1d18bcf20b 7 weeks ago 531.5 MB
使用dockerfile构建镜像(基于DSL语法指令创建一个docker镜像)
我们首先创建一个目录用来存放dockerfile,这个目录成为构建环境(base environment),docker称为这个为上下文或者构建上下文(build context)。docker会在构建镜像时将构建上下文和该上下文的文件和目录上传到Docker守护进程。这样docker守护进程就能直接访问你想在镜像中存储的任何代码,文件或者其他数据。
下面看看DockerFIle的样例:
[root@salt docker_pratice]# mkdir /docker_pratice/
[root@salt ~]# cat /docker_pratice/Dockerfile
# this is a comment # 注释
FROM 1403208717 #从哪个基础镜像开始
MAINTAINER Docker Newbee <newbee@docker.com> #表明作者信息
RUN yum -y update # 需要运行命令,运行成功后提交该镜像
RUN yum -y insall httpd # 需要运行命令,运行成功后提交该镜像
RUN echo "Hi, i am in your container" >/var/www/html/index.html #同上
EXPOSE 80
流程讲解:
每条指令都会创建一个新的镜像层并对镜像进行提交。docker大体上按照如下流程执行DockerFile中的指令。
- Docker从基础镜像运行一个容器。
- 执行一条指令,对容器修改。
- 执行类似与docker commit的操作,提交一个新的镜像层。
- Docker再基于刚刚提交的镜像运行一个新的容器。
- 执行Dockerfile中的下一条指令,直到所有的指令执行完毕。
确认无误后,我们开始执行dockerfile文件:
[root@salt docker_pratice]# docker build -t="test/run_httpd" . --no-cache
- -t 是指明到哪个repository下的哪个tag
- . 表示当前目录下的dockerfile
- --no-cache: 表示不使用缓存功能,在没有结束提交之前的镜像层,都看作缓存层,比如我们yum update后,再次执行dockefile是不会在yum update了,所以使用--no-cache后才会执行yum update。
基于构建缓存的DockerFile模版
构建缓存带来的好处就是,我们可以实现简单的Dockerfile模版(比如在Dockerfile文件顶部增加包仓库或者更新包,从而尽可能确保缓存命中)。我们一般都会在自己的Dockerfile文件顶部使用相同的指令集模版,比如对Ubuntu,可以使用下面的代码:
FROM ubuntu:14.04,
MAINTAINER James Turnbull "liaojiafa@qq.com"
ENV REFRESHED_AT 2016-12-05
RUN apt-get -qq update
让我们一步步来分析一下这个新的Dockerfile。首先,我通过FROM指令为新镜像设置了一个基础镜像ubuntu:14.04。接着,我又使用MAINTANINER指令添加了自己的详细信息联系信息,之后我又使用了一个名为REFERSHED_AT的环境变量,这个环境变量用来表明该镜像模版最后的更新时间。最后,我使用run指令来运行apt-get -qq update。
有了这个模版,如果想刷新一个构建,只需要修改ENV指令中的日期。这使DOcker在命令中ENV指令时开始重置这个缓存,并运行后续指令而无需依赖该缓存。也就是说,RUN apt-get update这条指令就会被再次执行,包缓存也会被刷新为最新内容。可以扩展此模版,比如适配到不同的平台或者添加额外的需求。比如像下面的的一样:
FROM centos
MAINTAINER Leo liaojiafa@exmpale.com
ENV REFRESHED_AT 2016-12-09
RUN yum -y -q update
dockerfile常用命令:
- workdir: 指令在从镜像创建一个新容器时,在容器内部设置一个工作目录,entrypoint 和 cmd指定的程序会在这个目录下执行。 如 WORKDIR /tmp
- env : 在镜像构建过程中设置环境变量 。 ENV TEST /HOME/RMV
- user: 指定该镜像用什么用户身份去运行 。 USER roo
- volume: 指令用来向基于镜像创建的容器添加卷。一个卷是可以存在一个或者多个容器内的特订目录,这个目录可以绕过联合文件系统,并提供以下功能 :
- 卷可以在容器间共享和重用。
- 一个容器可以不是必须和其他容器共享卷。
- 对卷的修改必须是修改不会对更新镜像产生影响。
- 卷会一直存在直到没有任何容器再使用它。
- add: 用来构建环境下的文件和目录复制到镜像中。如安装一个应用程序的时候,add指令需要源文件位置和目的文件位置两个参数。
端口映射
[root@salt var]# docker run -tdi -p 80:80 --name apache_web basic_sys
-p : hostip : host_port : docker_container's port
- -p 从左往右的可以依次写成宿主机IP,宿主机端口,容器的端口。
经过上面的配置以后,此时访问宿主机的80端口就等于访问容器的80端口。
删除镜像:
rmi紧接着后面镜像ID。
[root@salt var]# docker rmi 1403208717
本地部署repository
服务器端架器repository:
[root@salt ~]#docker run -p 5000:5000 registry
查看本地镜像信息
[root@salt ~]#docker images test/run_httpd
给需要上传的镜像打上tag
[root@salt nginx]# docker tag 9d16dcc5a7a3 127.0.0.1:5000/test/run_httpd
上传:
[root@salt nginx]# docker push 127.0.0.1:5000/test/run_httpd
docker内部容器互联
首先创建一个redis容器
[root@salt nginx]#docker -ti --name redis xxxx
创建一个web容器,和redis容器互联。
[root@salt ~]# docker run -ti -p 0.0.0.0:80:80 --name httpweb --link redis:db -v /var/www/html/:/var/www/html/:ro test/run_httpd
[root@d71914aabd87 redis-3.2.3]# redis-cli -h db -p 5555
db:5555> keys *
(empty list or set)
我们可以查看/etc/hosts文件里面,可以看到和子容器对应的信息的。
此时能够访问http,也能够连接redis了。容器与容器,宿主机和容器的/var/www/html也是共享的。
参数解释:
- -p 0.0.0.0:80:80 从左往右,表示把宿主机的80端口和 容器的80端口绑定到一块。
- --link redis:db 表示连接到容器名为redis的这个容器,db是为这个子容器取个别名。
-v /var/www/html/:/var/www/html/:ro
表示把本地宿主机的/var/www/html映射到容器的/var/www/html,ro表示为Only read,也可以为rw权限。
Docker探索系列2之镜像打包与DockerFile的更多相关文章
- Docker探索系列1之docker入门安装与操作
preface docker这种时髦的技术我接触的比较晚,如果不是公司在使用这项技术,估计还得会更晚接触.好了,说下我司现在docker使用的情况.docker在我司是用来跑web服务的,里面的web ...
- 通过docker把本地AspNetCore WebAPI镜像打包到阿里云镜像仓库并在centos部署
在centos上安装docker # step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data l ...
- docker学习系列-jdk基础镜像制作
准备一台安装有docker服务的机器 1.编辑Dockerfile vim Dockerfile FROM centos:latest ADD ./jdk-8u141-linux-x64.tar. ...
- docker学习系列(二):使用Dockerfile创建自己的镜像
dockerfile可以允许我们自己创建镜像,通过编写里面的下载软件命令,执行docker build 即可生成镜像文件. 初尝dockerfile 新建一个目录test,然后进入这个目录,创建一个名 ...
- CMD centos7 安装 最新版本的docker -- dockerfire 原语 ENTRYPOINT - 导入镜像 tar mariadb Dockerfile 构建镜像
yum update # vim /etc/yum.repos.d/docker.repo //添加以下内容 [dockerrepo] name=Docker Repository baseurl=h ...
- 【Docker】(5)---springCloud注册中心打包Docker镜像
[Docker](5)---springCloud注册中心打包Docker镜像 上一篇文章讲了将镜像推送到远处私有仓库,然后再从私有仓库拉取该镜像的过程.而这里的镜像是直接从Docker拉取的. 所以 ...
- docker教程——docker镜像打包上传
在开始使用URLOS进行docker应用开发之前,我们先来了解一下docker镜像的打包方法.首先,安装URLOS,安装完成之后,docker也随之安装到了主机里.执行以下命令安装URLOS: cur ...
- Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上
这个系列的前两篇文章,我们已经把我们的应用成功地在Docker里通过nginx运行了起来,并且用dockerfile里制作好了一个镜像. Docker入门系列之一:在一个Docker容器里运行指定的w ...
- Docker深入浅出系列 | 5分钟搭建你的私有镜像仓库
Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会根据本人理解去做阐述,具体官方概念可以查阅官方 ...
随机推荐
- 深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
[整理] 在求解最优化问题中,拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush Kuhn Tucker)条件是两种最常用的方法.在有等式约束时使用拉格朗日乘子法,在有 ...
- 使用Topshelf创建Windows服务
概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...
- 关于iphone 6 ios8网站背景图片错乱的问题解决办法
最近公司有个客户的网站用手机safari打开出现背景图片错乱,本来应该显示A图片的却显示B图片,网速越慢的情况下越容易出现这种问题,悲催的是这种情况只在iPhone 6上出现,并且不是一直这样,多刷新 ...
- Android 拍照或者从相册获取图片的实现
我们常常会用到上传头像,或者发帖子的时候选择本地图片上传的功能.这个很常见 今天因为app的需求我研究了下.现在分享下. 其实不论是通过拍照还是从相册选取都会用到Intent 这是系统提供给我们用来调 ...
- 把php上传sae问题要使用IO
应用移植指南 一,为什么要移植应用 SAE禁止IO写操作,代码目录不能写入.这意味着普通程序的上传图片.生成缓存等操作都不能在SAE上正常运行,这时候你需要对这些代码进行修改后才能让你的程序运行在SA ...
- 【BZOJ 3165】【HEOI 2013】Segment
往区间上覆盖一次函数,做法是用线段树维护标记永久化. 每次都忘了线段树要4倍空间,第一次交总是RE,再这么手残的话考场上就真的要犯逗了. #include<cstdio> #include ...
- jsp 中的js 与 jstl 运行的先后顺序
在jsp 中运行下面的代码,结论是:js 中可以使用 标签,js 的注释 对标签无效-- 有知道原理的吗<c:set var="flag" value="false ...
- HTTP协议学习---(十二)理解转发与重定向
解释一 转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求---->web服务器接受此请求-->调用内部的一个方法在容 ...
- 12 抽象函数-abstract
只有函数的定义,没有函数体的函数被称为抽象函数 1.抽象函数就是没有函数体的函数 2.抽象类使用abstract来定义 3.抽象类不能生产对象,但是可以拥有构造函数 abstract void fun ...
- 【CodeForces 699B】One Bomb
r[i],c[i]分别表示第i行有几个*,第i列有几个*. 枚举每个位置如果c[i]+r[j]-(本身是不是*)==总*数,则该位置即为答案. #include<cstdio> #incl ...