设为首页 收藏本站
查看: 677|回复: 0

[经验分享] Docker 构建镜像

[复制链接]

尚未签到

发表于 2018-5-27 12:36:21 | 显示全部楼层 |阅读模式
  docker默认提供了一些镜像,在github上我们也可以找到很多已经做好的镜像,但是不可避免大多数情况我们需要根据自己的需求来定制构建自己需要的镜像。

  Docker可以通过从Dockerfile(包含所有命令的文本文件)中读取构建映像所需的指令来自动构建映像。 Dockerfiles遵循特定格式并使用一组特定的说明。很多软件版本也提供了Dockerfile文件。它就像一个自动化的脚本一样,帮我们设置好所需的镜像功能。
  手工构建镜像
  为了更好的理解Dockerfile,我们先不使用Dockerfile,纯手工构建一个docker 镜像。构建镜像就是在镜像中安装一种服务,当容器使用这个镜像运行时,就可以对外提供服务。
  构建一个nginx服务的镜像:
  1、创建一个容器
docker run -it --name nginx1 centos  2、进入容器,对容器进行定制
rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install nginx -y  3、修改nginx配置文件,我们让nginx默认在前台启动,这样才能保证我们的docker容器持续运行不退出。(像nginx这中无状态的服务,docker 单进程运行完毕后就会自动退出)
vi /etc/nginx/nginx.conf
...
user nginx;
daemon off;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
...  4、退出容器,提交镜像
docker commit -m "nginx test images" nginx1 trying/nginx:v1  这里的语法类似于git的commit 参数, nginx1表示的之前创建的容器名, trying表示用户名称可以任意填写,nginx表示镜像名称,v1是tag标签,这里可以表示版本号。
  查看本地提交的镜像:
# docker images
REPOSITORY           TAG            IMAGE ID         CREATED             SIZE
trying/nginx          v1            984bbb4cdad8       5 minutes ago       381.9 MB
docker.io/centos       latest          36540f359ca3       6 days ago          192.5 MB  5、以定制的镜像启动容器,最后的nginx参数为nginx服务的启动命令:

docker run --name testnginx -d -p 81:80 trying/nginx:v1 nginx  查看容器运行状态:

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
c2f907850623        trying/nginx:v1     "nginx"             19 seconds ago      Up 16 seconds       0.0.0.0:81->80/tcp   testnginx  这样通过在外部使用ip+端口的访问方式就可以访问nginx了。
  Dockerfile
  Dockerfile制作容器镜像非常简单,只要按照规则书写Dockerfile文件,然后在Dockerfile存放的路径执行docker build . 即可。

  警告:不要使用root目录或/目录作为build路径,因为它将会构建硬盘驱动器的所有内容传输到Docker守护程序,docker的核心思想是一个容器一个进程(one process per container),所以不要在容器中安装不必要的软件工具包,这样会使容器镜像过于庞大。
  确保Dockerfile在当前目录下,如果不在也可以采用绝对路径的方式,此外Dockerfile的首字母D必须大写。在Dockerfile中#表示注释信息。
  Dockerfile语法格式
FROM          指定的基础镜像,如之前指定的centos镜像
MAINTAINER    镜像的作者信息,维护信息等
RUN           构建的时候所要执行的命令
ADD           需要增加的文件,软件包等,如果是压缩文件则会进行自动解压,可以使用多次
WORKDIR       设置当前工作目录
VOLUME        设置目录挂载
EXPOSE        开放一个端口
CMD           容器启动时执行的命令,一个dockerfile中只能有一个CMD命令,如果命名复杂,可以使用 command1 && command2 && command3 的方式  我们使用Dockerfile对上面手工制作的镜像重新定制一次:
  创建Dockerfile目录/docker/dockerfile/,编辑一个index.html的网页文件:

echo "Stay Hungry.Stay Foolish." > index.html  编写Dockerfile:
# vim /docker/dockerfile/Dockerfile#build nginx image docker file
FROM centos
MAINTAINER trying tryingstuff@163.com
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install nginx -y
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx"]  使用build命令构建镜像:

# docker build -t trying/nginx_dockerfile:v1 /docker/dockerfile/Sending build context to Docker daemon 3.072 kB
Step 1 : FROM centos
---> 36540f359ca3
Step 2 : MAINTAINER trying tryingstuff@163.com
---> Running in 719632447d38
---> 720fb072144a
Removing intermediate container 719632447d38
Step 3 : RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
---> Running in eadff91a88c6
...
Step 4 : RUN yum install nginx -y
---> Running in d76ae111324c
...
Step 5 : ADD index.html /usr/share/nginx/html/index.html
---> 587a9f14a14d
Removing intermediate container 31055a385b89
Step 6 : EXPOSE 80
---> Running in 8be900e770b6
---> 83ef87f3d178
Removing intermediate container 8be900e770b6
Step 7 : CMD nginx
---> Running in c6a67d852704
---> 676b792ab10e
Removing intermediate container c6a67d852704
Successfully built 676b792ab10e  这里-t参数指定了仓库名称和版本号,后面的路径是Dockerfile文件和添加的文件所在的路径。
  查看生成的镜像:
# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
trying/nginx_dockerfile   v1                  676b792ab10e        37 seconds ago      400.7 MB  使用此镜像启动一个容器:
docker run -d -p 80:80 --name nginx-dockerfile3 trying/nginx_dockerfile:v1 nginx -g 'daemon off;'  由于在容器中没有配置nginx前台运行,所以在启动的时候指定前台启动,在实际生产中,这些配置文件都需要通过ADD去添加。
  在其他机器上访问docker宿主机:
# curl 192.168.1.33
Stay Hungry.Stay Foolish.  在实际的生产中,对于无法解耦的复杂应用就不适合使用docker,docker 更多是提供微服务架构解决方案,对于一般的业务平台可以将虚拟机和容器混合使用。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-481786-1-1.html 上篇帖子: (八)Docker网络跨主机通讯vxlan和vlan 下篇帖子: 如何共享数据?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表