docker学习笔记-2.docker镜像制作
docker镜像制作
docker镜像内核
从docker镜像大小来说,一个比较小的镜像只有十几MB,而内核文件需要一百多兆。因此docker镜像没有内核。镜像再被启动为容器后将直接使用宿主机的内核,而镜像本身只提供相应的rootfs,即xitong系统正常运行所需要的用户空间的文件系统,比如/dev/,/proc/,/bin/,/etc/等目录。所以容器当中基本没有/boot/目录的,而/boot/当中保存的就是与内核相关的文件和目录。
为什么没有内核?
由于容器的启动和运行过程是直接使用宿主机的内核,所以没有直接调用物理硬件,所以也不会涉及到yin硬件驱动,因此也不会用到内核和驱动,另外有内核的是vm。
docker镜像的制作
docker镜像制作分为手工制作镜像和自动制作镜像(基于DockerFile)
手工制作镜像
下载镜像并初始化系统
基于某个镜像之上重新制作,因此需要一个基础镜像,本次使用官方提供的centos基础镜像为基础。
[root@192 ~]# docker pull centos
[root@192 ~]# docker run -it --name centos-base centos /bin/bash
重新配置yum源
[root@330ddc132509 yum.repos.d]#cd /etc/yum.repos.d/
[root@330ddc132509 yum.repos.d]#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@330ddc132509 yum.repos.d]#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
配置yum缓存
[root@330ddc132509 yum.repos.d]#yum makecache
yum安装nginx
[root@330ddc132509 yum.repos.d]#yum install nginx -y
yum安装一些常用的软件
[root@330ddc132509 yum.repos.d]# yum install -y vim wget pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
配置nginx,关闭nginx的后台运行
[root@330ddc132509 yum.repos.d]# vim /etc/nginx/nginx.conf
自定义web页面
[root@330ddc132509 yum.repos.d]#vim /usr/share/nginx/html/index.html
[root@330ddc132509 yum.repos.d]#cat /usr/share/nginx/html/index.html
提交为镜像
在宿主机基于容器ID提交为镜像
[root@192 ~]# docker ps -a
[root@192 ~]# docker commit -m 'nginx-base image' 330ddc132509
带tag的镜像提交
标记tag号,生产中比较常用,后期可以根据tag标记启动不同版本的image
[root@192 ~]# dokcer commit -m 'nginx image' 330ddc132509 nginx-base:v1
[root@192 ~]# docker images
从自己的镜像启动容器
[root@192 ~]# docker run -d -p 8886:80 --name nginx-88 nginx-base:v1 /usr/sbin/nginx
访问测试
DockerFile制作yum版本的nginx镜像
DockerFile可以说是一种被Docker程序解释的脚本,DockerFile是由一条条的命令组成的,每条命令对应linux下的一条命令,Docker程序将这些DockerFile指令再翻译成真正的linux命令,其有自己的书写方式和支持的命令,Docker程序读取DockerFile并根据指令生成Docker镜像,相比于手工制作镜像的方式,DockerFile更能直观的展示镜像是怎么产生的,有了DockerFile,当后期有额外的需求时,只要在之前的DockerFile添加或者修改响应指令的命令即可重新产生新的Docker镜像,避免了重复手工制作镜像的麻烦。
下载镜像并初始化
[root@192 ~]# docker pull centos
[root@192 ~]# cd /opt/ #创建目录环境
[root@192 ~]# mkdir dockerfile/{web/{/nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}} -pv
[root@192 dockerfile]# cd web/nginx/
编写DockerFile文件
[root@192 dockerfile]# vim ./Dockerfile #生成镜像的时候会在执行命令的当前目录查找Dockerfile 文件,所以名称不能够写错,而且D必须大写
#My Dockerfile
##为注释行 跟shell脚本一样
#除了注释行以外的第一行,必须是From xxx (xxx是基础镜像名)
From centos #第一行定义基础镜像,如果本地没有,会从远程仓库下载,第一行很重要
#镜像的维护者信息
MAINTAINER sakula 137841632@qq.com
###########其他的可选参数################
#USER #指定容器运行时的用户名和UID,后续的RUN命令也会使用这面指定用户执行
#WORKDIR /a
# WORKDIR b #制定工作目录 ,最终为 /a/b
#VOLUME 设置主机挂在卷
#执行命令 将编译安装nginx的步骤执行一遍
1 #My Dockerfile 2 FROM centos 3 MAINTAINER hexintong 137841632@qq.com 4 RUN yum install -y wget 5 RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 6 RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 7 RUN yum install -y vim tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop 8 ADD nginx-1.8.1.tar.gz /usr/local/src/ 9 RUN cd /usr/local/src/nginx-1.8.1/ && ./configure --prefix=/usr/local/nginx --with-http_sub_module && make && make install 10 RUN cd /usr/local/nginx/ 11 ADD nginx.conf /usr/local/nginx/conf/nginx.conf 12 RUN useradd nginx -s /sbin/nologin 13 RUN ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx 14 RUN echo "test nginx page." >/usr/local/nginx/html/index.html 15 EXPOSE 80 443
[root@192 nginx]# docker build -t nginx.1.8.1:v3 #从Dockerfile生成doker镜像
测试 dockerfile生成的镜像
[root@192 nginx]# docker run -d -p 8822:80 --name nginx_v5 nginx.1.8.1:v3 nginx
编译过程中使用的镜像
执行构建jdk镜像
1 [root@localhost jdk]# pwd 2 /opt/dockerfile/web/jdk 3 [root@localhost jdk]# cat Dockerfile 4 #JDK 7 base centos7.5 1804 5 FROM centos 6 MAINTAINER hexintong 137841632@qq.com 7 COPY jdk-7u79-linux-x64.rpm /home/ 8 RUN cd /home/ 9 RUN pwd 10 RUN ls 11 RUN rpm -ivh /home/jdk-7u79-linux-x64.rpm 12 RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" >/etc/timezone 13 [root@localhost jdk]#
[root@localhost jdk]#docker build -t jdk7:v1 .
[root@localhost jdk]#docker images
从镜像启动,查看java环境是否正确,验证时间是否正确
[root@localhost jdk]# docker run -it jdk7:v2 bash
[root@localhost jdk]# java -version
[root@localhost jdk]# date
Tue Jul 10 10:56:12 CST 2018
镜像的结构