前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >docker—定制web服务器

docker—定制web服务器

作者头像
dogfei
发布2020-07-31 11:53:14
1.7K0
发布2020-07-31 11:53:14
举报
文章被收录于专栏:devops探索devops探索

镜像是多层存储,每一层是在前一层的基础上进行的修改,而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。

1 2 3

docker run --rm --name webserver -d -p 8000:80 nginx 用nginx镜像启动一个容器,命名为webserver,并且将nginx的80端口映射到本地8000端口上 访问使用192.168.111.25:8000测试

如果启动报错信息如下:

1 2 3 4

# docker run -d --rm --name webserver01 -p 8000:80 nginx 14f598c0e8d3e15a7c2f0ef90cd06b4f90563fb168b157f133493297541561db docker: Error response from daemon: driver failed programming external connectivity on endpoint webserver01 (355fc06384dc80beeecd32f65856d3ffdfe65d0181bd7935aa25a206047fe65a): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8000 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name. (exit status 1)).

这个错误是说iptables链中缺少docker向iptables注册的一条链,可能是由于重启了firewalld也有可能iptables一直处于关闭状态导致,所以我们重启下docker服务,重新注册下即可

1

systemctl restart docker

下面开始修改web的欢迎页

1 2 3 4 5 6 7 8 9 10

1、进入容器 docker exec -it webserver /bin/bash 2、修改网页内容 echo '<h1>Hello,Docker!!!</h1>' > /usr/share/nginx/html/index.html 3、退出 exit 4、测试 192.168.111.25:8000 这里以交互式终端(-it)进入webserver容器,执行了/bin/bash命令,即获得了一个可操作的shell

定制好内容后,接下来就是要将其保存下来形成镜像

当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化

一、docker commit 使用

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

[root@xs_test01 ~]# docker commit \ > --author "devilf" \ > --message "change the welcome page" \ > webserver \ > nginx:v2 sha256:ada0bc75fda7ff5ca09c533f05bce623bfabd9069a38090264b4ecb09ea1d9dd 查看新提交的镜像: [root@xs_test01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx v2 ada0bc75fda7 About a minute ago 109MB nginx latest e548f1a579cf 12 days ago 109MB centos latest ff426288ea90 7 weeks ago 207MB hello-world latest f2a91732366c 3 months ago 1.85kB [root@xs_test01 ~]# docker image ls nginx REPOSITORY TAG IMAGE ID CREATED SIZE nginx v2 ada0bc75fda7 About a minute ago 109MB nginx latest e548f1a579cf 12 days ago 109MB [root@xs_test01 ~]# docker history nginx:v2 IMAGE CREATED CREATED BY SIZE COMMENT ada0bc75fda7 About a minute ago nginx -g daemon off; 138B change the welcome page e548f1a579cf 12 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B &lt;missing> 12 days ago /bin/sh -c #(nop) STOPSIGNAL [SIGTERM] 0B &lt;missing> 12 days ago /bin/sh -c #(nop) EXPOSE 80/tcp 0B &lt;missing> 12 days ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B &lt;missing> 12 days ago /bin/sh -c set -x && apt-get update && apt… 53.4MB &lt;missing> 12 days ago /bin/sh -c #(nop) ENV NJS_VERSION=1.13.9.0.… 0B &lt;missing> 12 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.13.9-… 0B &lt;missing> 2 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B &lt;missing> 2 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B &lt;missing> 2 weeks ago /bin/sh -c #(nop) ADD file:27ffb1ef53bfa3b9f… 55.3MB

运行这个镜像

1 2 3 4 5 6

[root@xs_test01 ~]# docker run --name webserver02 -d -p 8001:80 nginx:v2 3ba1430dd04b10bfc917725f24815526f8363eaf42fc7a3e02632d04c7c6660d [root@xs_test01 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3ba1430dd04b nginx:v2 "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds 0.0.0.0:8001->80/tcp webserver02 3c50e86fe5ab nginx "nginx -g 'daemon of…" 17 minutes ago Up 17 minutes 0.0.0.0:8000->80/tcp webserver

使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。 首先,如果仔细观察之前的 docker diff webserver 的结果,你会发现除了真正想要修改的/usr/share/nginx/html/index.html 文件外,由于命令的执行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。 此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像 更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。

二、dockerfile定制镜像

使用dockerfile来定制镜像可以把每一层修改、安装、构建、操作的命令都写入一个脚本,那么之前提及的无法重复的问题,镜像构建透明性的问题,体积过大的问题都会解决。

dockerfile是一个文本文件,其内包含了一条条的指令,每条指令构建一层,因此每条指令的内容,就是描述该层应当如何构建

1、在一个空白目录中创建一个文本文件,命名为Dockerfile

1 2 3 4 5 6 7 8 9 10

定制内容: FROM nginx RUN echo '&lt;h1>Hello,Docker,this is a test!!!&lt;/h1>' > /usr/share/nginx/html/index.html FROM 指定基础镜像 定制镜像,必须以一个镜像为基础,在其上进行定制,FROM因此是必备的命令,且为第一条指令 还有一个特殊的镜像,scratch(空白镜像),也就是不以任何镜像为基础,接下来缩写的指令将作为镜像第一层开始存在,不以任何系统为基础 RUN 执行命令 shell格式:就像直接在命令行中输入命令一样,如上所写

2、执行该Dockerfile

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

[root@xs_test01 mynginx]# docker build -t nginx:v3 . Sending build context to Docker daemon 2.048kB Step 1/2 : FROM nginx ---> e548f1a579cf Step 2/2 : RUN echo '&lt;h1>Hello,Docker,this is a test!!!&lt;/h1>' > /usr/share/nginx/html/index.html ---> Running in 3c056111cf29 Removing intermediate container 3c056111cf29 ---> 7386045ee352 Successfully built 7386045ee352 Successfully tagged nginx:v3 其他执行方式: cat Dockerfile | docker build - 或 docker build - &lt; Dockerfile 这是从标准输入中读取Dockerfile进行构建 docker build命令格式为: docker build [选项] &lt;上下文路径/URL/->

3、启动容器,并启动服务

1 2 3 4 5 6

1、启动容器 docker run -itd -p 8002:80 --rm --name webserver_04 nginx:v3 /bin/bash 2、启动服务 docker exec -it webserver_04 /bin/bash 进去容器之后启动服务即可/etc/init.d/nginx start 3、测试

以上就是最简单的定制镜像的两种方法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、docker commit 使用
  • 二、dockerfile定制镜像
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档