docker 怎么封装镜像

拥有镜像的三种方式

  1. 官网hub.docker.com提供的docker pull 镜像

一般情况下官网能提供的服务基本已经满足了我们日常所需
docker 怎么封装镜像_第1张图片docker 怎么封装镜像_第2张图片

自动会到官网仓库下载镜像,不指定tag版本,默认就是最新的

  1. docker commit 命令(类似ghost系统)

类似自己打包了一个容器,这个需求常见公司内部服务的部署安装

  • 首先是基于基础镜像系统上运行的容器,可以是centos、ubuntu等等
  • 根据需求部署好服务后进行封装成的镜像,命令就是docker commit
  • 基于镜像的系统会有三个权限上问题,一个是用户权限、一个是服务权限、一个是资源权限

举例:

我选择的是centos7.6.1810安装一个http服务,然后进行封装

启动一个centos容器

docker run -d -p 5000:80 --privileged=true centos:centos7.6.1810 /usr/sbin/init

#--privileged=true(用户权限)
#/usr/sbin/init(服务权限)
#可以看我之前写的docker的三个权限问题

额外话题:启动一个基础系统,如果没有加/usr/sbin/init,是需要加-it参数,不然容器会自动关闭

docker容器是以一个进程的形式启动在系统上,而基础系统默认最后是/bin/bash,系统下是没有任何进程启动的,也就是默认容器没有运行任何服务,容器的启动停止都会检测到PID为1的进程,加上it参数模拟一个交互式终端等待用户输入,进程PID1停止容器也就跟着停止
docker 怎么封装镜像_第3张图片

封装镜像

进入容器系统,安装服务

docker exec -it xxxxx /bin/bash
#xxxxx为容器ID号,docker ps -a查看
yum install httpd -y
systemctl start httpd
systemctl enable httpd

访问默认测试也成功
docker 怎么封装镜像_第4张图片

docker commit 封装

docker commit xxxxx my_httpd
#xxxxx为容器ID号
#my_httpd为镜像名称

docker 怎么封装镜像_第5张图片查看封装好的镜像系统
在这里插入图片描述查看docker分层结构,加了一层,大小为144M(还安装了net-tools)
在这里插入图片描述总结:可以看出这样方式就能完成一个镜像,但是有一个问题就是这个镜像系统分层无法判别安装了具体服务是什么,要是安装了病毒或者其他不需要的服务,系统不就是变的不安全了,这个时候就需要透明的模式就是Dockerfile

Dockerfile 构建文件

由于Dockerfile是基于透明的,所以就需要定义各种参数来指定具体每一步的操作

  • FROM
    指定 base 镜像
FROM centos:centos7.6.1810
#根据需求选择系统:版本
  • MAINTAINER
    镜像维护者(地址或人名都可以)
MAINTAINER Y-S-H

  • COPY
    拷贝文件或目录到镜像中
COPY 源目录  容器目录
COPY test /root/
  • ADD
    拷贝文件或目录到镜像中,跟COPY不同之处就是,如果是压缩包,会自动下载或自动解压
COPY 源目录  容器目录
ADD /root/httpd.tar.gz /var/www/html
ADD https://xxx.com/httpd.tar.gz /var/www/html
  • ENV
    设置环境变量
    1、可以用于dockerfile构建内使用,使用以$xxxx
    2、docker run -e 覆盖使用,从而修改变量值
ENV name1=ping name2=on_ip
CMD $name1 $name2
  • EXPOSE
    暴露服务运行的端口号
EXPOSE 80
  • VOLUME
    将文件或目录声明为 volume数据持久化,一般还是在run启动容器中指定 -v(

好处为了防止使用者忘记使用参数启动容器从而导致容器变得很大(jenkins就是默认添加了,因为插件会非常的大)

docker 怎么封装镜像_第6张图片

VOLUME /var/www/html
#默认存储位置/var/lib/docker/volumes/xxxxx
#具体的ID号可以通过docker inspect c809bdc2787e(容器ID)

docker 怎么封装镜像_第7张图片

  • WORKDIR
    为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录
WORKDIR /test
#cd /test
#就是cd命令的作用
  • RUN
    构建镜像时运行的Shell命令
RUN yum install httpd -y
  • CMD
    启动容器时执行的Shell命令,docker run -it [image] 默认最后不加参数就运行CMD

对于系统来说一个容器就是一个进程,那么在启动容器的时候,需要指定所运行的程序及参数,CMD为默认参数,一般都是运行服务或者脚本

CMD /usr/sbin/httpd -D FOREGROUND
#启动httpd服务

重点:为什么需要 -D FOREGROUND

前面说了容器是以进程形式存在,而容器的状态是同容器里PID为1的进程同步的,/usr/sbin/httpd默认是以守护进程的方式启动web服务器,也就不会是PID为1进程存在,不加 -D FOREGROUND现象就是docker永远无法UP
docker 怎么封装镜像_第8张图片

  • ENTRYPOINT
    作用和CMD一样,不同之处就是命令一定会被执行,不会被覆盖

当指定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令,ENTRYPOINT CMD

  1. 不会被docker run命令行指定的参数所覆盖
  2. 命令行参数会被当作参数传递给ENTRYPOINT指定的程序

好处就是CMD命令可以变成一个变量进行传参,便于程序的扩展
详细参考:https://www.cnblogs.com/reachos/p/8609025.html

推荐阅读CloudMan编写的docker容器学习,便于深刻理解

RUN vs CMD vs ENTRYPOINT

#重点:
1.ADD拷贝的文件必须在构建文件目录下
2.构建文件名词默认为:Dockerfile(可以通过-f指定)
3.CMD xxx,不带中括号,docker执行命令在login shell,也可以写成CMD [“bin/bash”,”-c”,”/usr/local/bin/checkout.sh”],但是建议ENTRYPOINT和CMD配合使用

举例:

编写dockerfile文件

vi Dockerfile

FROM centos:centos7.6.1810
MAINTAINER Y-S-H
COPY test.txt /root/
VOLUME /var/www/html
RUN yum install httpd -y && echo 'ServerName  localhost:80'>>/etc/httpd/conf/httpd.conf
EXPOSE 80
CMD /usr/sbin/httpd -D FOREGROUND

通过file文件构建镜像

docker build -t http_dockerfile .
#http_dockerfile 为镜像名
#最有有一个点,说明dockerfile文件在当前目录下

启动容器

docker run  -itd -p 22222:80 http_dockerfile

docker 怎么封装镜像_第9张图片
docker 怎么封装镜像_第10张图片

如果遇到容器启动失败,可以尝试不要加d,这样便于交互式查看具体是哪个步骤导致的错误,也会有相关错误提示,方便解决

你可能感兴趣的:(docker,docker,容器,运维)