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
Dockerfile

[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

镜像的结构

原文地址:https://www.cnblogs.com/hexintong/p/9285914.html