Docker 镜像分层
- Dockerfile 中的每个指令都会创建一个新的镜像层
- 镜像层讲被缓存和复用(相当于创建了一个临时存放的内存空间)
- 当 Dockerfile 的指令修改后,复制的文件变化后,或者构建镜像时指定的变量不同时,原本对应的镜像层缓存就会失效
- 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
- 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
Docker 镜像的创建
Docker 镜像
- 是应用发布的标准格式
- 可支撑一个 Docker 容器的运行
所有的环境部署包括环境迁移,先要打包成镜像,然后上传到仓库,上传到仓库之后可以在其他地点把镜像下载下来,直接加载到指定的容器
流程
Create Images (or Registry ——> Images)——> Containers
Docker 镜像的创建方法,镜像有自己的工具进行生成
- 基于已有镜像创建
- 基于本地模板创建
- 基于 Dockerfile 创建
基于 Dockerfile 创建
Dockerfile 是由一组指令组成的文件
Dockerfile 结构四部分
- 基础镜像信息(基于基础镜像,进行后期的变更而创建出新的镜像)
- 维护者信息(镜像创建者的描述形信息)
- 镜像操作指令
- 容器启动时执行指令
使用 Dockerfile 创建镜像并在容器中运行
Dockerfile操作指令
apache 镜像制作
mkdir /apache
cd /apache
vim Dockerfile
#基于的基础镜像
FROM centos
#维护镜像的用户信息
MAINTAINER The project <[email protected]>
#镜像操作指令安装 apache 软件
RUN yum -y update
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
vim run.sh
#!/bin/bash
rm -rf /run/httpd/* #删除原有的缓存
exec /usr/sbin/apachectl -D FOREGROUND #启动 apache 服务守护进程
echo "web test" > index.html
#生成镜像
docker build -t httpd:centos . (注意别忘了末尾有".")
#新镜像运行容器
docker run -d -p 1216:80 httpd:centos
nginx 镜像制作
mkdir nginx
cd nginx/
//拷贝nginx-1.12.2源码包到 nginx/ 中
vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER The Nginx Image <Container-Nginx>
#添加环境包
RUN -y update
RUN -y yum install gcc gcc-c++ pcre-devel zlib-devel make
RUN useradd -M -s /sbin/nologin nginx
#下载nginx软件包
ADD nginx-1.12.2.tar.gz /usr/local/src
#指定工作目录
WORKDIR /usr/local/src/nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
#类似建立软链接,方便进行管理
ENV PATH /usr/local/nginx/sbin:$PATH
#开启http和httpd端口
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
#添加宿主机中 run.sh 到容器中
ADD run.sh /run.sh
RUN chmod +x /run.sh
//启动容器时执行脚本
CMD ["/run.sh"]
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
//创建新镜像
docker build -t nginx:new .
docker run -d -P nginx:new
docker ps -a
tomcat镜像制作
mkdir /opt/tomcat
拷贝 jdk-8u91-linux-x64.tar.gz
apache-tomcat-8.5.16.tar.gz 到 /opt/tomcat 下
cd /opt/tomcat
vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER The Tomcat Image <Container-tomcat>
ADD jdk-8u91-linux-x64.tar.gz /usr/java
ENV JAVA_HOME /usr/local/java
ENV JAVA_BIN /usr/local/java
ENV JRE_HOME /usr/local/java/jre
ENV PATH $PATH:/usr/local/java/bin:/usr/local/java/jre/bin
ENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.
ADD apache-tomcat-8.5.16.tar.gz /usr/local
WORKDIR /usr/local/
RUN mv apache-tomcat-8.5.16 /usr/local/tomcat8
EXPOSE 8080
#CMD ["/usr/local/tomcat8/bin/catalina.sh","run"]
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh","run"]
docker build -t tomcat:centos .
docker run -d --name tomcat01 -p 1216:8080 tomcat:centos
mysq镜像制作
mkdir /opt/mysql
拷贝 mysql-5.7.17.tar.gz
boost_1_59_0.tar.gz 到 /opt/mysql 下
cd /opt/mysql
vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER The Mysql Image <Container-Mysql>
RUN useradd -s /sbin/nologin mysql
RUN install yum install gcc gcc-c++ ncurses ncurses-devel bison make cmake -y
ADD zxvf mysql-5.7.17 /opt/mysql
ADD boost_1_59_0.tar.gz /usr/local/
RUN mv /usr/local/boost_1_59_0
总结
- Docker镜像的分层
- Dockerfile基本创建的方法
- Dockerfile创建各种应用容器