一、手动制作镜像
以yum版nginx镜像为例,一般基于某基础镜像之上进行镜像制作,本次使用centos基础镜像
1、下载基础镜像centos
~]# docker pull centos:7.5.1804
2、基于centos启动一个容器
图一~]# docker run -it centos:7.5.1804 bash
3、安装系统常见命令
[root@8e0df75fd0be /]# yum -y install wget vim pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
4、在容器之上更改yum源
[root@c0de5aa39852 /]# mkdir /etc/yum.repos.d/bak
[root@c0de5aa39852 /]# mv /etc/yum.repos.d/* /etc/yum.repos.d/bak/
[root@c0de5aa39852 /]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@c0de5aa39852 /]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
5、yum安装nginx
[root@c0de5aa39852 /]# yum -y install nginx
6、自定义一个测试用的web页面
图二[root@c0de5aa39852 /]# rm -rf /usr/share/nginx/html/index.html
[root@c0de5aa39852 /]# vim /usr/share/nginx/html/index.html
[root@c0de5aa39852 /]# cat /usr/share/nginx/html/index.html
docker_test_commit 20201220
7、切换到宿主机终端,基于改容器ID构建镜像
图三~]# docker commit -a "mamzi 18883552477@163.com" -m "centos-yum-nginx image" c0de5aa39852 centos-nginx:1.16
注:
-a 指定镜像的作者信息
-m 提交镜像的文字说明
8、基于自己构建的镜像创建容器
图四~]# docker run -d -p 81:80 centos-nginx:1.16 nginx -g "daemon off;"
9、测试访问结果如下
图五二、基于Dockerfile构建镜像
Docker以从上到下的顺序读取Dockerfile中的指令,使用docker build命令来完成镜像的构建,dcokerfile的第一行必须是FROM。以下先针对dockerfile的常用指令进行说明:
FROM 指定基础镜像
格式:
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]示例:
FROM centos:7.5.1804注:
tag和digest为可选的,如果不指定默认使用latest版本
RUN 指定镜像构建需执行的命令
格式:
RUN <command> #shell形式
RUN ["executable", "param1", "param2"] #exec形式示例:
RUN echo 'hello,$name'
RUN ["/bin/bash","-c","echo hello,$name"]注:
shell语句会自主默认/bin/sh -c 来执行,而exec格式不会,exec格式需要指定使用什么脚本来执行
CMD 指定容器启动命令
格式:
CMD ["executable","param1","param2"] #exec形式
CMD ["param1","param2"] #作为ENTRYPOINT的默认参数
CMD command param1 param2 #sehll形式示例:
CMD ["nginx","-g","daemon off;"]
CMD nginx -g "daemon off;"注:
CMD是在基于该进行启动容器的时候执行的命令,RUN是在镜像构建时候执行的命令
ENTRYPOINT 指定容器启动命令
格式:
ENTRYPOINT ["executable", "param1", "param2"] #exec形式
ENTRYPOINT command param1 param2 #shell形式示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]注:
ENTRYPOINT和CMD非常相似,都是在容器启动时候运行的命令,其区别在于CMD中的命令会被docker run传递的命令覆盖掉,而ENTRYPOINT则不会,且将docker run指定的参数传递到ENTRYPOINT命令中当参数;
CMD可以为ENTRYPOINT传递默认参数,且会被docker传递的覆盖。
LABEL 添加镜像标签
格式:
LABEL <key>=<value> <key>=<value>示例:
LABEL maintainer='镜像的作者信息' #说明镜像的作者信息
ENV 指定环境变量
格式:
ENV <key>=<value>示例:
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy注:
允许一次设置多个变量ENV <key>=<value> ...
ADD 将宿主机上的文件添加到镜像中
格式:
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]示例:
add --chown=bin test_add / #将当前目录的的test_add文件,添加到容器的/根目录
COPY 将宿主机文件复制到镜像中
和ADD类似,其中不同点在于ADD可以将tar类型文件会自动解压,可以访问网络资源,如wget
EXPOSE 指定开放端口
格式:
EXPOSE <port> [<port>...]示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
STOPSIGNAL 指定容器退出的信号值
格式:
STOPSIGNAL signal示例:
STOPSIGNAL 9注:
主要的目的是为了实现容器的平滑退出,如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,默认10s
USER 指定运行容器时或者RUN指令执行时的用户
格式:
USER <user>[:<group>]示例:
USER www
RUN mkdir /home/www/app注:
使用USER指定用户后,Dockerfile中后面的RUN、CMD、ENTRYPOINT等均使用该用户执行;docker run命令创建容器时可通过-u覆盖该用户
WORKDIR 工作目录
格式:
WORKDIR path示例:
WORKDIR /opt/nginx #工作目录为/opt/nginx
WORKDIR /a
WORKDIR b
WORKDIR c #工作目录为/a/b/c注:
类似cd命令,设置WORKDIR工作目录后,Dockerfile中其后面的RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录执行
(1)Dockerfile文件示例:构建基础镜像
# cat Dockerfile
FROM centos:7.5.1804 #导入一个基础镜像
LABEL maintaine='san.zhang 18883552477@163.com' #镜像的作者信息,也可添加其他的标签信息
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum -y install vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl-devel iproute net-tools iotop
RUN groupadd www -g 2020 && useradd www -u 2020 -g www
执行docker build构建镜像
images# docker build -t centos-base:v1.0 . #-t指定镜像名称及tag号,如果dockerfile不在当前目录需要指定指定所在路径
# docker images #查看镜像是否构建成功
# docker run -it --rm centos-base:v1.0 bash #测试使用该镜像运行容器
(1)Dockerfile文件示例:构建JDK镜像
[root@VM_0_16_centos jdk]# ls
Dockerfile jdk-8u151-linux-x64.tar.gz profile[root@VM_0_16_centos jdk]# cat Dockerfile
#JDK base images
FROM centos-base:v1.0
LABEL maintaine='san.zhang 18883552477@163.com' description='This text illustrates that label-values can span multiple lines.'
ADD jdk-8u151-linux-x64.tar.gz /opt/RUN ln -s /opt/jdk1.8.0_151 /opt/jdk1.8
#COPY profile /etc/profile
#RUN echo "source /etc/profile" >> ~/.bashrc
ENV JAVA_HOME /opt/jdk1.8
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH .$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
ENV PATH $JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOME/bin:$PATH
RUN rm /etc/localtime -f && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
执行docker build构建镜像
jdk-base# docker build -t jdk-base:v1.0 . #构建镜像
# docker run -it --rm jdk-base:v1.0 bash #测试镜像
网友评论