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

[经验分享] Docker的镜像创建、数据管理及网络通信

[复制链接]

尚未签到

发表于 2019-2-21 08:39:18 | 显示全部楼层 |阅读模式
Docker镜像的创建
  Docker镜像除了是Docker的核心技术之外也是应用发布的标准格式。一个完整的Docker镜像可以支撑一个Docker容器的运行,在Docker的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用程序,如果要把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。
镜像的生方式分为三种,分别为基于已有镜像创建、基于本地模板创建以及基于dockerfile创建。

基于已有镜像创建
  基于已有镜像创建主要使用docker commit 命令。实质上是把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。
在创建新的镜像时,首先第一步是启动镜像,在容器中做修改,最后将修完之后的容器提交为新的镜像,这里我是实验演示,所以就没有进去容器进行修改。

docker commit -m "new" -a "nginx1" ac3b61096300 nginx1:test
  常用选项介绍:


  • m:说明信息
  • a:作者信息
  • p:生成过程中停止容器的运行


基于本地模板创建
  通过导入操作系统模板文件可以生成镜像,模板可从OPENVZ开源项目下载
示例:
使用docker命令将下载的debian模板压缩包导入为本地镜像

下载debian压缩包

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
生成镜像

cat debian-7.0-x86-minimal.tar.gz | docker import - debian:latest


基于Dockerfile创建镜像
  Dockerfile是由一组指令组成的文件,其中每条指令对应的Linux中的一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像。Dockerfile结构大致分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用"#"号开头的注释。
在编写Dockerfile时,有严格的格式需要遵循:


  • 第一行必须使用FROM指令指明所基于的镜像名称
  • 第二行使用MAINTAINER指令说明维护该镜像的用户信息
  • 接下来是镜像操作相关指令,如RUN指令,每运行一条,都会给基础镜像添加新的一层
  • 最后使用CMD指令,来指定启动容器时要运行的命令操作
  Dockerfile创建操作指令及含义


指令
含义




FROM镜像
指定新镜像所所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令


MAINTAINER
说明新镜像的维护人信息


RUN命令
在所基于的镜像上执行命令,并提交到新的镜像中


CMD命令
指定启动容器时要于运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条,则只有最后一条被执行


EXPOSE端口号
指定新镜像加载到Docker时要开启的端口


ENV环境变量 变量值
设置一个环境变量的值,会被后面的RUN使用


ADD源文件/目录 目标文件/目录
将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL


COPY源文件/目标 目标文件/目录
将本地主机上的源文件/目录复制到目标地点,源文件目录要与Dockerfile在相同的目录中


VOLUME["目录"]
在容器中创建一个挂载点


USER用户名/UID
指定运行容器时的用户


WORKDIR路径
为后续的RUN、CMD、ENTRYPOINT指定工作目录


ONBUILD命令
指定所生成的镜像作为一个基础镜像时所要运行的命令
  示例:
创建一个web网站(httpd)镜像,以centos作为基础镜像

建立工作目录

mkdir apache
cd apache
创建并编写Dockerfile文件

vim Dockerfile
#基于的基础镜像
FROM centos
#维护镜像的用户信息
MAINTAINER The porject
#镜像操作指令安装apache软件
RUN yum -y update
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
编写执行脚本内容

vim run.sh
#!/bin/bash                                  //声明
rm -rf /run/httpd/*                          //清理httpd缓存
exec /usr/sbin/apachectl -D FOREGROUND       //启动httpd服务
创建测试首页

echo "this is apache test web" > index.html


使用Dockerfile生成镜像

docker build -t httpd:centos .    //最后又一个空格和“.”不要遗忘,选项-t指定镜像的标签信息


使用新镜像运行容器

docker run -d -p 1234:80 httpd:centos    //-p选项实现从本地1234端口到容器中80端口的映射


运行镜像报错解决

docker服务启动时定义的自定义链DOCKER由于某种原因被清掉重启docker服务即可重新生成自定义链DOCKER


systemctl restart docker.service
使用浏览器访问


本地私有仓库的建立

下载registry镜像

docker pull registry
在/etc/docker目录下创建json文件

vim /etc/docker/daemon.json
{ "insecure-registries":["172.16.10.22:5000"]}
重启docker服务

systemctl restart docker.service
创建registry容器

docker create -it registry /bin/bash
启动容器

docker start 5f817c015faa
挂载宿主目录
  将本地目录挂载到容器仓库的默认存储地址中,这样即使容器被删除,镜像还是会有保存。

docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
//宿主机的/data/registry挂载容器中的/tmp/registry 宿主机中的目录会自动创建
重命名镜像

docker tag nginx 172.16.10.22:5000/nginx
上传镜像到本地仓库

docker push 172.16.10.22:5000/nginx
获取私有仓库列表

curl http://172.16.10.22:5000/v2/_catalog


Docker数据管理
  管理Docker容器中数据主要有两种方式:数据卷和数据卷容器

数据卷
  数据卷是一个共容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。

创建数据卷
  在docker run命令中使用-v 选项可以在容器中创建数据卷。多次使用-v可以创建多个数据卷。使用--name选项可以为容器创建一个简单的自定义名称

docker run -d -v /data1 -v /data2 --name web nginx:latest


挂载主机目录作为数据卷
  在容器数据卷中创建文件,在本地文件夹中可见,同样的在本地文件夹中创建文件,容器中仍可见,实现了从宿主机到容器,容器到宿主机的数据迁移。

docker run -v /var/www:/data --name web1 -it nginx /bin/bash   //主机目录不存在时会自动创建


数据卷容器
  如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器就是一个普通的容器,专门提够数据卷给其他容器使用。首先需创建一个容器作为数据卷容器,之后再创建时使用--volumes-from挂载数据卷容器中的数据卷使用。
之前创建好的数据卷容器web,其中所创建的数据卷分贝挂载在了/data1和/data2目录上,创建新容器来挂载数据卷容器中的数据卷。

docker run -it --volumes-from web --name db1 nginx /bin/bash


Docker网络通信

端口映射
  在启动容器的时候,如果不指定对应的端口,在容器外将无法通过网络来访问容器内的服务。Docker提供端口映射机制来将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。在使用docker run命令是接选项设置端口映射,P系统分配端口映射,p自定义指定端口映射。

P系统指定

docker run -d -P httpd:latest


p自定义指定

docker run -d -p 12345:80 --name web httpd:latest


容器互联
  容器互联时通过容器的名称在容器间建立一条专门的网络通信隧道从而实现容器的互联。简而言之,就是在源容器和接受容器之间建立一条隧道,接收容器可以看到源容器指定的信息。

创建源容器

docker run -d -P --name web1 httpd:latest
创建接受容器

docker run -d -P --name web2 --link web1:web httpd:latest
//--link web1:web   web1是要源容器的名称:web是这个连接的名称
测试容器互联

ping  //测试连通性





运维网声明 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-675112-1-1.html 上篇帖子: 开发测试环境通过gitlab+jenkins+docker 实现一命令部署 下篇帖子: 用Docker安装Gitlab-gogourl的博客
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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