目錄
一.Docker鏡像管理
? 1.Docker鏡像結構
? 2.Dockerfile介紹
二.Dockerfile實施
? 1.構建nginx容器
? 2.構建Tomcat容器
? 3.構建mysql容器
三.Dockerfile語法注意事項
? 1.指令書寫范圍
? 2.基礎鏡像選擇
? 3.文件操作注意
? 4.執行命令要點
? 5.環境變量和參數設置
? 6.緩存利用與清理
一.Docker鏡像管理
? ? ? Docker 鏡像除了是 Docker 的核心技術之外,也是應用發布的標準格式。一個完整的 Docker 鏡像可以支撐一個 Docker 容器的運行,在 Docker 的整個使用過程中,進入一個已經定型的容器之后,就可以在容器中進行操作,最常見的操作就是在容器中安裝應用服務。 如果要把已經安裝的服務進行遷移,就需要把環境以及搭建的服務生成新的鏡像。本案例將介紹如何創建 Docker 鏡像。
1.Docker鏡像結構
? ?鏡像不是一個單一的文件,而是有多層構成。可以通過 docker history 命令查看鏡像中各層內容及大小,每層對應著 Dockerfile 中的一條指令 。Docker 鏡像默認存儲在 /var/lib/docker/<storage-driver> 目錄中。容器其實是在鏡像的最上面加了一層讀寫層,在運行容器里做的任何文件改動,都會寫到這個讀寫層。如果刪除了容器,也就刪除了其最上面的讀寫層,文件改動也就丟失了。Docker 使用存儲驅動管理鏡像每層內容及可讀寫層的容器層。Docker 鏡像是分層的,下面這些知識點非常重要。
-
Dockerfile 中的每個指令都會創建一個新的鏡像層;
-
鏡像層將被緩存和復用;
-
當 Dockerfile 的指令修改了,復制的文件變化了,或者構建鏡像時指定的變量不同了,對應的鏡像層緩存就會失效;
-
某一層的鏡像緩存失效,它之后的鏡像層緩存都會失效;
-
鏡像層是不可變的,如果在某一層中添加一個文件,然后在下一層中刪除它,則鏡像中依然會包含該文件,只是這個文件在 Docker 容器中不可見了。
2.Dockerfile介紹
? ?Dockerfile 是一個用于構建 Docker 鏡像的文本文件,它由一系列指令和參數組成。通過 Dockerfile,可以自動化地創建自定義鏡像,無需手動干預每個步驟。
二.Dockerfile實施
1.構建nginx容器
(1)拉取centos鏡像
[root@localhost ~ ]# docker pull centos:7
(2)創建dockerfile工作目錄
[root@localhost ~ ]# mkdir /opt/nginx
?[root@localhost ~ ]# cd /opt/nginx
(3)創建dockerfile
?[root@localhost? nginx]# vim dockerfile
FROM centos:7
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum clean all
#RUN yum makecache
RUN yum -y install net-tools pcre-devel zlib-devel zlib gcc* make
ADD nginx-1.19.5.tar.gz /root
WORKDIR /root/nginx-1.19.5
RUN ./configure --prefix=/usr/local/nginx && make && make install
ADD nginx.conf /usr/local/nginx/conf/nginx.conf
EXPOSE 80
EXPOSE 443
#RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
WORKDIR /root/nginx
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]
(4)編寫nginx啟動腳本
?[root@localhost? nginx]# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
(5)用dockerfile創建鏡像
??[root@localhost? nginx]# docker build -t mynginx .
(6)啟動容器
[root@localhost?~]# mkdir /nginx
[root@localhost~]# cp /opt/nginx/nginx.conf /nginx
[root@localhost nginx]# docker run -dit
-p 8083:80
-v /www/html:/web
-v /nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf
--name nginx04
mynginx
/bin/bash -c /run.sh[root@localhost?nginx]# echo "web test">/www/html/index.html
(7)訪問nginx網站
?http://192.168.10.101:8003
2.構建Tomcat容器
?(1)創建工作目錄
[root@localhost ~ ]# mkdir /opt/tomcat/
[root@localhost ~ ]# cd /opt/tomcat
(2)創建dockerfile文件
?[root@localhost tomcat ]# vim dockerfile
FROM centos:7
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_91
ENV JAVA_BIN /usr/local/jdk1.8.0_91
ENV JRE_HOME /usr/local/jdk1.8.0_91ENV PATH $PATH:/usr/local/jdk1.8.0_91/bin:/usr/local/jdk1.8.0_91/jre/bin
ENV CLASSPATH /usr/local/jdk1.8.0_91/jre/bin:/usr/local/jdk1.8.0_91/lib:/usr/local/jdk1.8.0_91/jre/lib/charsets.jar
ADD apache-tomcat-8.5.16.tar.gz /
RUN mv /apache-tomcat-8.5.16 /usr/local/tomcat
EXPOSE 8080
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]
?(3)創建啟動腳本
[root@localhost tomcat ]# vim run.sh
#!/bin/bash
export JAVA-OPTS ="-Xms2048m -Xmx4096m"
ulimit -n 65536
/usr/local/tomcat/bin/startup.sh
tailf /usr/local/tomcat/logs/catalina.out
(4)用dockerfile生成鏡像
?[root@localhost tomcat ]# docker build -t mytomcat .
(5)運行容器
??[root@localhost tomcat ]# docker run -d -i -p 8080:8080 --name tomcat01 mytomcat
(6)訪問tomcat網站
httpd://192.168.10.101:8080?
3.?構建mysql容器
(1)創建工作目錄
[root@localhost ~ ]# mkdir /opt/mysql
(2)創建dockerfile文件
?[root@localhost ~ ]# cd /opt/mysql
[root@localhost mysql?]# vim dockerfile
FROM centos:7
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum clean all
RUN yum -y install mariadb mariadb-server
RUN chown -R mysql:mysql /var/lib/mysql
ADD init.sh /init.sh
RUN chmod 775 /init.sh
RUN /init.sh
EXPOSE 3306
CMD ["mysqld_safe"]
(3)編寫mysql初始化腳本?
[root@localhost mysql?]# vim init.sh
#!/bin/bash
mysql_install_db --user=mysql
sleep 3
mysqld_safe &
sleep 3
mysqladmin -u "root" password "123456"
mysql -uroot -p123456 -e "grant all privileges on *.* to 'root'@'%' identified by '123456';"
mysql -uroot -p123456 -e "grant all privileges on *.* to 'root'@'localhost' identified by '123456';"
mysql -uroot -p123456 -e "flush privileges;"
(4)生成鏡像
?[root@localhost mysql?]# docker build -t mysql .
(5)創建容器
?[root@localhost mysql?]# docker run -tid -p 3306:3306 mysql
?[root@localhost mysql?]# dnf -y install mysql
??[root@localhost mysql?]# mysql -uroot -p123456 -h 192.168.10.101 -P 3306