從docker鏡像大小來講,一個比較小的鏡像只有十幾MB,而內核文件須要一百多兆。所以docker鏡像沒有內核。鏡像再被啓動爲容器後將直接使用宿主機的內核,而鏡像自己只提供相應的rootfs,即xitong系統正常運行所須要的用戶空間的文件系統,好比/dev/,/proc/,/bin/,/etc/等目錄。因此容器當中基本沒有/boot/目錄的,而/boot/當中保存的就是與內核相關的文件和目錄。html
爲何沒有內核?java
因爲容器的啓動和運行過程是直接使用宿主機的內核,因此沒有直接調用物理硬件,因此也不會涉及到yin硬件驅動,所以也不會用到內核和驅動,另外有內核的是vm。linux
docker鏡像製做分爲手工製做鏡像和自動製做鏡像(基於DockerFile)nginx
手工製做鏡像c++
下載鏡像並初始化系統web
基於某個鏡像之上從新制做,所以須要一個基礎鏡像,本次使用官方提供的centos基礎鏡像爲基礎。docker
[root@192 ~]# docker pull centosshell
[root@192 ~]# docker run -it --name centos-base centos /bin/bashapache
從新配置yum源ubuntu
[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能夠說是一種被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
鏡像的結構