Docker镜像构建

简述

Docker镜像的制作一共有两种方法,一种是手动构建,另一种是使用Dockerfile自动构建Docker镜像。本例使用两种方法,基于centos镜像重新构建两个nginx镜像。


手动构建Docker镜像

基于centos 创建容器

run -it --name yum_nginx centos 

进入容器安装需要用到的软件包

yum install  openssl openssl-devel zlib zlib-devel gcc-c++ pcre pcre-devel wget -y

下载nginx源码

cd  /usr/local/src/ 
wget http://nginx.org/download/nginx-1.14.2.tar.gz   

解压源码

tar -xvf nginx-1.14.2.tar.gz

添加nginx用户

useradd -M nginx -s /sbin/nologin 

编译源码

cd nginx-1.14.2
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-pcre
make && make install

修改配置文件,让nginx在前台运行,放置容器主进程退出后,nginx也终止运行

echo "daemon off;" >>  /usr/local/nginx/conf/nginx.conf

退出容器,并让容器处于退出状态
image_1d60ttqhs1mp31qgb5bhn7h8f21t.png-16.5kB
构建镜像

docker commit -m "my nginx"  ac7b398c89a5  jiangpeisi/my-nginx:v1

查看构建的镜像

docker images

image_1d60u01la1qov1iasd541t2c1jp33n.png-12.7kB
使用新构建镜像创建容器

docker run -d -p 8080:80 jiangpeisi/my-nginx:v1 /usr/local/nginx/sbin/nginx
links 47.107.103.142:8080

image_1d60u265915ev19t78rb1a0qo7a4u.png-17.1kB


使用Dockerfile自动创建镜像

创建Dockerfile目录

mkdir /opt/nginx/

下载需要用到的文件

wget http://nginx.org/download/nginx-1.14.2.tar.gz  #下载到Dockerfile目录下

创建Dockerfile

vim /opt/nginx/Dockerfile  #Dockerfile一定要写正确

#This is my first Dockerfile
#Version 1.0

#Base images 
FROM centos

#MAINTAINER
MAINTAINER Jiang Pei Si

#ADD
ADD nginx-1.14.2.tar.gz /usr/local/src

#RUN
RUN yum install  openssl openssl-devel zlib zlib-devel gcc-c++ pcre pcre-devel wget -y
RUN useradd -M nginx -s /sbin/nologin

#WORKDIR
WORKDIR /usr/local/src/nginx-1.14.2

RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-pcre
RUN make && make install
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf

EXPOSE 80

ENV PATH /usr/local/nginx/sbin:$PATH

CMD ["nginx"]

构建镜像

docker build -t my-nginx:v1 /opt/nginx/ 

image_1d60u8mfd9drpr3127bcravt477.png-15.3kB
使用新构造的镜像创建容器

docker run -d -p 8088:80 my-nginx:v1 
links 47.107.103.142:8088 

image_1d60urjrues3170a7opndck3m8e.png-16.9kB

补充

docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker 容器pid挂了,那么docker容器便会直接退出。
dockerrun的时候把command做为容器内部命令,如果你使用nginx,那么nginx程序将后台运行,这个时候nginx并不是pid为1的程序,而是执行的bash,这个bash执行了nginx指令后就挂了,所以容器也就退出了
daemon off nginx可以在没有主进程的情况下在前台运行