自动会到官网仓库下载镜像,不指定tag版本,默认就是最新的
类似自己打包了一个容器,这个需求常见公司内部服务的部署安装
举例:
我选择的是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 exec -it xxxxx /bin/bash
#xxxxx为容器ID号,docker ps -a查看
yum install httpd -y
systemctl start httpd
systemctl enable httpd
docker commit 封装
docker commit xxxxx my_httpd
#xxxxx为容器ID号
#my_httpd为镜像名称
查看封装好的镜像系统
查看docker分层结构,加了一层,大小为144M(还安装了net-tools)
总结:可以看出这样方式就能完成一个镜像,但是有一个问题就是这个镜像系统分层无法判别安装了具体服务是什么,要是安装了病毒或者其他不需要的服务,系统不就是变的不安全了,这个时候就需要透明的模式就是Dockerfile
Dockerfile 构建文件
由于Dockerfile是基于透明的,所以就需要定义各种参数来指定具体每一步的操作
FROM centos:centos7.6.1810
#根据需求选择系统:版本
MAINTAINER Y-S-H
COPY 源目录 容器目录
COPY test /root/
COPY 源目录 容器目录
ADD /root/httpd.tar.gz /var/www/html
ADD https://xxx.com/httpd.tar.gz /var/www/html
ENV name1=ping name2=on_ip
CMD $name1 $name2
EXPOSE 80
好处为了防止使用者忘记使用参数启动容器从而导致容器变得很大(jenkins就是默认添加了,因为插件会非常的大)
VOLUME /var/www/html
#默认存储位置/var/lib/docker/volumes/xxxxx
#具体的ID号可以通过docker inspect c809bdc2787e(容器ID)
WORKDIR /test
#cd /test
#就是cd命令的作用
RUN yum install httpd -y
对于系统来说一个容器就是一个进程,那么在启动容器的时候,需要指定所运行的程序及参数,CMD为默认参数,一般都是运行服务或者脚本
CMD /usr/sbin/httpd -D FOREGROUND
#启动httpd服务
重点:为什么需要 -D FOREGROUND
前面说了容器是以进程形式存在,而容器的状态是同容器里PID为1的进程同步的,/usr/sbin/httpd默认是以守护进程的方式启动web服务器,也就不会是PID为1进程存在,不加 -D FOREGROUND现象就是docker永远无法UP
当指定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令,ENTRYPOINT CMD
好处就是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
如果遇到容器启动失败,可以尝试不要加d,这样便于交互式查看具体是哪个步骤导致的错误,也会有相关错误提示,方便解决