手动制作nginx 镜像

由于容器启动和运行过程中是直接使用了宿主机的内核,所以没有直接调用过物理硬件,所以也不会涉及到硬件驱动,因此也用不上内核和驱动,另外有内核的那是虚拟机

Docker 制作类似于虚拟机的镜像制作,即按照公司的实际业务务求将需要安装的软件、相关配置等基础环境配置完成,然后将其做成镜像,最后再批量从镜像批量生产实例,这样可以极大的简化相同环境的部署工作,Docker 的镜像制作分为手动制作和自动制作(基于 DockerFile),企业通常都是基于 Dockerfile 制作精细。

1. 手动制作 yum 版 nginx 镜像

基于某个基础镜像之上重新制作,因此需要先有一个基础镜像,本次使用官方提供的 centos 7.6镜像为基础

1.1 基于官方镜像运行一个容器
docker pull centos:7.8.2003
docker run -it docker.io/centos:7.8.2003   /bin/bash
1.2 下载安装基本工具

进入容器后执行

yum  install wget -y
 cd /etc/yum.repos.d/
 rm -rf ./*
 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
 wget  -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
1.3 yum 安装并配置 nginx

容器内执行

# 安装nginx
yum install nginx  -y
#安装常用命令
yum install -y vim wget   pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
vim /etc/nginx/nginx.conf
#添加此行,关闭后台运行 
daemon off;

自定义 web 页面

vim /usr/share/nginx/html/index.html 
centos_yum_nginx

然后容器不用退出,可以开启另外一个窗口用于提交镜像

1.4 提交为镜像

docker commit 的用法

Usage:	docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")  # 作者的信息
  -c, --change list      Apply Dockerfile instruction to the created image #运行时的指令
  -m, --message string   Commit message  #提交的信息
  -p, --pause            Pause container during commit (default true) #提交时暂停容器的运行

提交镜像

root@z2:~# docker commit -a "25958889@qq.com" -m "nginx yum v1" --change="EXPOSE 80 443" 4608fcda24bf  centos-nginx:v1 
sha256:3e4519d53230297616d4e3d40814174dc868ddcb8398a2fdc97cbce9fbbf402f
1.5 带 tag 的镜像提交

提交的时候标记 tag 号:

标记 tag 号,生产当中比较常用,后期可以根据 tag 标记创建不同版本的镜像以及创建不同版本的容器。

root@z2:~# docker commit -m "nginx image"  4608fcda24bf   zt/centos-nginx:v1 
sha256:4b83400f6ddb22f1bcd7e7840f7085fa76440f4c7222bd18a8fdc59216d17e89
1.6 用刚打的镜像启动容器 测试
root@z2:~# docker run -d -p 80:80 --name my-centos-nginx zt/centos-nginx:v1 /usr/sbin/nginx
1.7 访问测试
root@z2:~# curl 192.168.1.102
centos_yum_nginx

2. 手动制作编译版本 nginx 镜像

2.1 下载镜像并初始化系统
docker pull centos:7.8.2003
docker run -it docker.io/centos:7.8.2003   /bin/bash
root@z2:~# docker run -it docker.io/centos:7.8.2003   /bin/bash
[root@035d76841de4 /]#  yum install wget  -y
[root@035d76841de4 /]# cd /etc/yum.repos.d/
[root@035d76841de4 yum.repos.d]#  rm -rf ./*

[root@035d76841de4 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@035d76841de4 yum.repos.d]#  wget  -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2.2 编译安装 nginx

在容器内 安装基础命令, 然后下载源码包,解压编译,完成安装

yum install -y vim wget tree  lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
[root@035d76841de4 yum.repos.d]# cd /usr/local/src/ 

[root@035d76841de4 src]# wget http://nginx.org/download/nginx-1.10.3.tar.gz 
[root@035d76841de4 src]# tar xvf nginx-1.10.3.tar.gz
[root@035d76841de4 src]#  cd nginx-1.10.3
[root@035d76841de4 nginx-1.10.3]#  ./configure  --prefix=/usr/local/nginx  --with-http_sub_module
[root@035d76841de4 nginx-1.10.3]# make && make install
2.3:关闭 nginx 后台运行,修改启动用户
[root@035d76841de4 nginx-1.10.3]# cd /usr/local/nginx/ 
[root@035d76841de4 nginx]# vim conf/nginx.conf
daemon off;
user  nginx;

创建软连接

[root@035d76841de4 nginx]# ln -sv /usr/local/nginx/sbin/nginx  /usr/sbin/nginx 
'/usr/sbin/nginx' -> '/usr/local/nginx/sbin/nginx'
2.4 自定义 web 界面
[root@035d76841de4 nginx]# echo  "My  Nginx   Test   Page"  > /usr/local/nginx/html/index.html
2.5 创建用户及授权
[root@035d76841de4 nginx]# useradd  nginx -s /sbin/nologin
[root@035d76841de4 nginx]# chown  nginx.nginx /usr/local/nginx/  -R
2.6:提交为镜像
root@z2:~# docker commit -m "test nginx" 035d76841de4 zt/nginx-test-image 
sha256:04f1847c12cb0a71197aade63b93e53dd199d408b319340a4ab917b1ba963644
2.7 启动镜像并且测试
root@z2:~# docker run -d -p 81:80   zt/nginx-test-image  /usr/sbin/nginx
ffaf6a53149602a3cf9ed1f1de8d2962310963d729c39a62746c5020b0bb93e9
root@z2:~# curl  192.168.1.102:81
My  Nginx   Test   Page