Docker 镜像与制作
Docker 镜像有没有内核?
从镜像大小上面来说,一个比较小的镜像只有十几MB,而内核文件需要一百多兆,因此镜像里面是没有内核的,镜像在被启动为容器后将直接使用宿主机的内核,而镜像本身则只提供相应的rootfs,即系统正常运行所必须的用户空间的文件系统,比如/dev/,/proc,/bin,/etc等目录,所以容器当中基本是没有/boot目录的,而/boot当中保存的就是内核相关的文件和目录。
为什么没有内核?
由于容器启动和运行过程中是直接使用了宿主机的内核,所以没有直接调用过物理硬件,所以也不会涉及到硬件驱动,因此也用不上内核和驱动,另外有内核的那是虚拟机。
实验一:yum安装nginx镜像
- 下载官方Centos 基础镜像
~# docker pull centos:7.7.1908
- 启动为容器
~# docker run -it -p 80:80 centos:7.7.1908 bash
- 在容器安装EPEL和Nginx
#安装epel源
ed86315ef22c /]# yum install epel-release -y
#安装nginx、及常用命令
ed86315ef22c /]# yum install zip unzip gcc wget iproute openssl openssl-devel pcre pcre-devel iotop zlib zlib-devel vim net-tools -y
ed86315ef22c /]# yum install nginx -y
- 生成自定义web页面 '/usr/share/nginx/html/index.html',无法保存需要删除源链接文件
#进到目录
ed86315ef22c html]# pwd
/usr/share/nginx/html
#删除
ed86315ef22c html]# rm -rf index.html
#创建新的 index.html
ed86315ef22c html]# cat index.html
linux web1
#进程nginx语法
ed86315ef22c html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
#开启nginx
ed86315ef22c html]# nginx
- 修改配置文件、关闭nginx后台运行
ed86315ef22c html]# vim /etc/nginx/nginx.conf
...
daemon off; <--
...
- 原来窗口不要动、再开一个窗口
~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed86315ef22c centos:7.7.1908 "bash" 40 minutes ago Up 40 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp suspicious_satoshi
# 镜像版本 镜像名称
~# docker commit -a "stao clark_0932@qq.com" -m "nginx 1.20.1" ed86315ef22c centos-nginx:v1.20.1
sha256:a326dc889e662af77fd487d040dc4c731f5f06a554a7ba216fc024174e5d51fb
~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-nginx v1.20.1 a326dc889e66 2 minutes ago 536MB
centos 7.7.1908 08d05d1d5859 3 years ago 204MB
测试
~# docker run -it -p 8801:80 centos-nginx:v1.20.1 nginx
浏览器查看
实验二:编译安装镜像
- 下载官方Centos 基础镜像
~# docker pull centos:7.7.1908
- 启动为容器
~# docker run -it -p 80:80 centos:7.7.1908 bash
- 在容器安装EPEL和Nginx
#安装epel源
f0a23935f2f1 /]# yum install epel-release -y
- 安装常用命令
f0a23935f2f1 /]# yum install gcc wget iproute openssl openssl-devel pcre pcre-devel iotop zlib zlib-devel vim net-tools zip unzip -y
- 下载镜像
f0a23935f2f1 /]# cd /usr/local/src/
f0a23935f2f1 src]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
- 解压缩
f0a23935f2f1 src]# tar xvf nginx-1.18.0.tar.gz
- 编译安装
f0a23935f2f1 src]# cd nginx-1.18.0
#安装路径'/apps/nginx'
f0a23935f2f1 nginx-1.18.0]# ./configure --prefix=/apps/nginx
f0a23935f2f1 nginx-1.18.0]# make
f0a23935f2f1 nginx-1.18.0]# make install
- 修改测试页面信息
f0a23935f2f1 nginx-1.18.0]# cat /apps/nginx/html/index.html
nginx web2 test
- 制作镜像
原来窗口不要动、再开一个窗口
9.1. 状态1:nginx.conf没有加'daemon off;'也没有做nginx软链接
~# docker commit -a "stao clark_0932@qq.com" -m "nginx-make 1.18.0" f0a23935f2f1 centos-nginx:v1
~# docker run -it -p 8801:80 centos-nginx:v1 /apps/nginx/sbin/nginx "-g daemon off;" bash
9.2. 状态2:有nginx软链接但是没有nginx.conf没有加'daemon off;'
旧窗口
f0a23935f2f1 nginx-1.18.0]# ln -sv /apps/nginx/sbin/nginx /usr/bin/
新窗口
软链接后就不需要写绝对路径了
~# docker commit -a "stao clark_0932@qq.com" -m "nginx-make 1.18.0" f0a23935f2f1 centos-nginx:v2
~# docker run -it -p 8802:80 centos-nginx:v2 nginx "-g daemon off;" bash
9.3. 状态3:有nginx软链接和nginx.conf中加'daemon off;'
旧窗口
f0a23935f2f1 nginx-1.18.0]# vim /apps/nginx/conf/nginx.conf
...
daemon off; <--
...
新窗口
~# docker commit -a "stao clark_0932@qq.com" -m "nginx-make 1.18.0" f0a23935f2f1 centos-nginx:v3
~# docker run -it -p 8803:80 centos-nginx:v3 nginx bash