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創建各種應用容器