docker基本入门之后,能够试试打包docker镜像与dockerfile了html
docker hub仓库有2类仓库,用户仓库和顶层仓库,用户仓库由docker用户建立的,顶层仓库由docker内部的人来管理的。仓库里存放的是镜像文件,那么问题来了 ,怎么去建立镜像呢?node
构建docker镜像的有2种方法:python
notice:
you should remeber , we are not create new image from 0。而是基于一个已有的基础镜像,如CentOs来构建新镜像而已。若是真的想从0构建一个全新的镜像,能够参考: https://docs.docker.com/engine/userguide/eng-image/baseimages/linux
咱们先启动一个container,而后安装个python3。nginx
咱们先启动一个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
参数解释:web
[root@salt docker]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 1403208717 latest 001d2ee1399c 12 minutes ago 840.4 MB
docker经过load放来导入其余的镜像文件。redis
[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,这个目录成为构建环境(base environment),docker称为这个为上下文或者构建上下文(build context)。docker会在构建镜像时将构建上下文和该上下文的文件和目录上传到Docker守护进程。这样docker守护进程就能直接访问你想在镜像中存储的任何代码,文件或者其余数据。
下面看看DockerFIle的样例:docker
[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中的指令。apache
确认无误后,咱们开始执行dockerfile文件:
[root@salt docker_pratice]# docker build -t="test/run_httpd" . --no-cache
ubuntu
构建缓存带来的好处就是,咱们能够实现简单的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
[root@salt var]# docker run -tdi -p 80:80 --name apache_web basic_sys -p : hostip : host_port : docker_container's port
rmi紧接着后面镜像ID。
[root@salt var]# docker rmi 1403208717
[root@salt ~]#docker run -p 5000:5000 registry
[root@salt ~]#docker images test/run_httpd
[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
首先建立一个redis容器
[root@salt nginx]#docker -ti --name redis xxxx
[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也是共享的。
-v /var/www/html/:/var/www/html/:ro
表示把本地宿主机的/var/www/html映射到容器的/var/www/html,ro表示为Only read,也能够为rw权限。