一、 手动制作yum版nginx镜像
Docker镜像制作类似于虚拟机的模板制作,即按照公司的实际业务务求将需要安装的软件、相关配置等基础环境配置完成,然后将虚拟机再提交为模板,最后再批量从模板批量创建新的虚拟机,这样可以极大的简化业务中相同环境的虚拟机运行环境的部署工作,Docker的镜像制作分为手动制作和自动制作(基于DockerFile),企业通常都是基于Dockerfile制作镜像
1.1 下载镜像并初始化系统
#拉取基础镜像并启动
root@docker-node1:~# docker pull centos:centos7
root@docker-node1:~# docker run -it centos:centos7 /bin/bash
#更换容器yum源
[root@85c4534b854c /]# yum install wget -y
[root@85c4534b854c /]# cd /etc/yum.repos.d/
[root@85c4534b854c yum.repos.d]# rm -rf ./*
[root@85c4534b854c yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@85c4534b854c yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
在容器安装nginx
[root@85c4534b854c ~] yum install nginx -y
[root@85c4534b854c ~] chown nginx.nginx /usr/share/nginx -R
#安装常用命令
[root@85c4534b854c ~] yum install -y vim wget pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
/usr/share/nginx/html
#添加测试页面
[root@85c4534b854c ~] vim /usr/share/nginx/html/index.html
test
关闭nginx后台运行
#在nginx配置文件添加daemon off; 关闭nginx后台运行
[root@85c4534b854c ~]# vim /etc/nginx/nginx.conf
daemon off;
1.2 提交为镜像
root@docker-node1:~# docker commit -a "123456@qq.com" -m "yum nginx v1" 85c4534b854c centos-nginx:v1
root@docker-node1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-nginx v1 6e85cf470acb 3 seconds ago 478MB
centos centos7 8652b9f0cb4c 10 months ago 204MB
1.2 启动验证
root@docker-node1:~# docker run -it -d -p 80:80 --name nginx centos-nginx:v1 /usr/sbin/nginx
访问测试
二、DockerFile制作镜像
DockerFile可以说是一种可以被Docker程序解释的脚本,DockerFile是由一条条的命令组成的,每条命令对应linux下面的一条命令,Docker程序将这些DockerFile指令再翻译成真正的linux命令,其有自己的书写方式和支持的命令,Docker程序读取DockerFile并根据指令生成Docker镜像,相比手动制作镜像的方式,DockerFile更能直观的展示镜像是怎么产生的,有了写好的各种各样DockerFile文件,当后期某个镜像有额外的需求时,只要在之前的DockerFile添加或者修改相应的操作即可重新生成新的Docke镜像,避免了重复手动制作镜像的麻烦,具体如下:
https://docs.docker.com/engine/reference/builder/
FROM #指定基础镜像,必须为第一个命令
LABEL #用于为镜像添加元数据
STOPSIGNAL #维护者信息
ADD #将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY #功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
ENV #设置环境变量
EXPOSE #指定端口
USER #指定执行命令的用户
VOLUME #指定挂载点
WORKDIR #工作目录
RUN #构建镜像时执行的命令
CMD #指定容器运行时执行的命令,可通过docker run指定运行命令覆盖
ENTRYPOINT #指定容器运行时执行的命令,不可被覆盖,后续通过CMD或docker run加的命令会当作参数传递给ENTRYPOINT
2.1 使用dockerfile制作nginx+tomcat镜像
2.1.1 基于官方alpine制作nginx镜像
2.1.1.1 下载基础镜像,并创建Dockerfile目录环境
root@docker-node1:~# docker pull alpine:3.13.6
root@docker-node1:~# cd /opt/
#目录结构按照业务类型或系统类型等方式划分,方便后期镜像比较多的时候进行分类。
root@docker-node1:/opt# mkdir dockerfile/{web/{nginx,tomcat,jdk},system/{centos,ubuntu,alpine}} -pv
mkdir: created directory 'dockerfile'
mkdir: created directory 'dockerfile/web'
mkdir: created directory 'dockerfile/web/nginx'
mkdir: created directory 'dockerfile/web/tomcat'
mkdir: created directory 'dockerfile/web/jdk'
mkdir: created directory 'dockerfile/system'
mkdir: created directory 'dockerfile/system/{centos.ubuntu.alpine}'
2.1.1.2 编写Dockerfile
root@docker-node1:~# cd /opt/dockerfile/web/nginx/
#编辑Dockerfile文件,注:Dockerfile文件名称不可写错,而且D必须大写
root@docker-node1:/opt/dockerfile/web/nginx# vim Dockerfile
#指定基础镜像
FROM alpine:3.13.6
#添加作者信息
MAINTAINER cwy 123456@qq.com
#替换alpine软件源,并安装基础命令
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk update \
&& apk add iotop gcc libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2 openssl-dev
#拷贝nginx源码到容器,并编译安装
ADD nginx-1.18.0.tar.gz /opt/
RUN cd /opt/nginx-1.18.0 && ./configure --prefix=/apps/nginx && make && make install && ln -s /apps/nginx/sbin/nginx /usr/bin && addgroup -g 2019 -S nginx && adduser -s /sbin/nologin -S -D -u 2019 -G nginx nginx
#添加配置文件及公司代码
COPY nginx.conf /apps/nginx/conf/nginx.conf
ADD static.tar.gz /data/nginx/html
RUN chown nginx.nginx /data/nginx /apps/nginx -R
#将nginx放前台运行
CMD ["nginx","-g","daemon off;"]
2.1.1.3 执行镜像构建
#构建镜像
root@docker-node1:/opt/dockerfile/web/nginx# docker build -t nginx-alpine:v1 ./
#查看镜像
root@docker-node1:/opt/dockerfile/web/nginx# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-alpine v1 1e6b3b403914 7 minutes ago 216MB
alpine 3.13.6 12adea71a33b 2 weeks ago 5.61MB
2.1.1.4 运行容器测试
root@docker-node1:~# docker run -it --name nginx -d -p 80:80 nginx-alpine:v1
762885b9ed461da089164294ba7125d86db022cab32b403a6281ef4a42cbd84c
root@docker-node1:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
762885b9ed46 nginx-alpine:v1 "nginx -g 'daemon of…" 9 minutes ago Up 9 minutes 0.0.0.0:80->80/tcp nginx
root@docker-node1:~#
2.1.1.5 访问测试
2.2.1 基于ubuntu制作tomcat镜像
根据公司需求,基于官方提供的centos、debain、ubuntu、alpine等基础镜像构建JDK(Java环境),然后再基于自定义的JDK镜像构建出业务需要的tomcat镜像
2.2.1.1 制作jdk基础镜像
2.2.1.1.1 编辑DockerfileW文件
#下载官方基础镜像
root@docker-node1:~# docker pull ubuntu:18.04
root@docker-node1:~# cd /opt/dockerfile/web/jdk/
#编辑dockerfile文件
root@docker-node1:/opt/dockerfile/web/jdk# vim Dockerfile
#jdk-8u301 base Image
FROM ubuntu:18.04
MAINTAINER cwy 123456@qq.com
#替换apt源
COPY sources.list /etc/apt/sources.list
#安装jdk
ADD jdk-8u301-linux-x64.tar.gz /usr/local/src
RUN ln -s /usr/local/src/jdk1.8.0_301 /usr/local/jdk
#配置jdk环境变量
ADD jdk.sh /etc/profile.d/
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin
#修改容器时区
RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2.2.1.1.2 准备安装包就配置文件
准备好jdk安装包,环境变量文件,及apt源配置文件
root@docker-node1:/opt/dockerfile/web/jdk# ls
Dockerfile jdk-8u301-linux-x64.tar.gz jdk.sh sources.list
#环境变量
root@docker-node1:/opt/dockerfile/web/jdk# cat jdk.sh
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
#apt使用阿里源
root@docker-node1:/opt/dockerfile/web/jdk# cat sources.list
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
2.2.1.1.3 构建镜像
root@docker-node1:/opt/dockerfile/web/jdk# docker build -t jdk-8u301-ubuntu:v1 .
2.2.1.1.4 启动容器测试
root@docker-node1:/opt/dockerfile/web/jdk# docker run -it --rm jdk-8u301-ubuntu:v1 bash
root@f352a862bab0:/# java -version
java version "1.8.0_301"
Java(TM) SE Runtime Environment (build 1.8.0_301-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)
2.2.1.2 基于jdk镜像制作tomcat镜像
2.2.1.2.1 编辑Dockerfile文件
root@docker-node1:~# cd /opt/dockerfile/web/tomcat
root@docker-node1:/opt/dockerfile/web/tomcat# vim Dockerfile
#Tomcat base Image
FROM jdk-8u301-ubuntu:v1
MAINTAINER cwy 123456@qq.com
#拷贝安装包
ADD apache-tomcat-8.5.71.tar.gz /apps
RUN ln -s /apps/apache-tomcat-8.5.71 /apps/tomcat && rm -f /apps/apache-tomcat-8.5.71.tar.gz
COPY run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
RUN groupadd www -g 2020 && useradd www -u 2020 -g www && chown -R www.www /apps/
#运行tomcat
CMD ["/apps/tomcat/bin/run_tomcat.sh"]
2.2.1.2.2 准备tomcat安装包及启动脚本
#下载安装包
root@docker-node1:/opt/dockerfile/web/tomcat# wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.71/bin/apache-tomcat-8.5.71.tar.gz
#启动脚本
root@docker-node1:/opt/dockerfile/web/tomcat# ls
apache-tomcat-8.5.71.tar.gz Dockerfile run_tomcat.sh
root@docker-node1:/opt/dockerfile/web/tomcat# cat run_tomcat.sh
#!/bin/sh
su - www -c "/apps/tomcat/bin/catalina.sh start"
su - www -c "tail -f /etc/hosts"
2.2.1.2.3 构建镜像
root@docker-node1:/opt/dockerfile/web/tomcat# docker build -t tomcat:v1 .
2.2.1.2.4 启动测试
root@docker-node1:/opt/dockerfile/web/tomcat# docker run -it -d -p 8080:8080 tomcat:v1