dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、 编写一个dockerfile文件
2、 docker build 构建称为一个镜像
3、 docker run运行镜像
4、 docker push发布镜像(DockerHub 、阿里云仓库)
但是很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、命令从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
dockerfile常用命令
# DockerFile常用指令 FROM # 基础镜像,一切从这里开始构建 MAINTAINER # 镜像是谁写的, 姓名+邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录 EXPOSE # 保留端口配置 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。 COPY # 类似ADD,将我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量!
创建一个自己的centos
由于官方镜像的centos中的yum源无法直接使用,这里使用fodora来测试
1.编写Dockerfile文件
[root@fedora ~]# vim dockerfile-fedora [root@fedora ~]# cat dockerfile-fedora FROM fedora MAINTAINER charlie<2837384732@qq.com> ENV MYPATH /uer/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo "hello world !" CMD echo "-----end-----" CMD /bin/bash
2、通过这个文件构建镜像
# 命令 docker build -f 文件路径 -t 镜像名:[tag] . [root@fedora ~]# docker build -f dockerfile-fedora -t fedora-test:1.0 . Sending build context to Docker daemon 22.06MB Step 1/10 : FROM fedora ...... ...... Successfully built 38c506ae8c48 Successfully tagged fedora-test:1.0 [root@fedora ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE fedora-test 1.0 38c506ae8c48 About a minute ago 499MB fedora latest b78af7a83692 6 months ago 153MB centos latest 5d0da3dc9764 9 months ago 231MB
3、 运行测试刚刚构建的镜像
[root@fedora ~]# docker run -it fedora-test:1.0 [root@12b99b6f3d56 local]# pwd /uer/local [root@12b99b6f3d56 local]# vim [root@12b99b6f3d56 local]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 26 bytes 3135 (3.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4、查看这个镜像的本地变更历史
[root@fedora ~]# docker history fedora-test:1.0 IMAGE CREATED CREATED BY SIZE COMMENT 38c506ae8c48 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B 0feb6a235f38 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 89f3f4a51de7 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 6eaa58d9f4b9 8 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B d61754097294 8 minutes ago /bin/sh -c yum install -y net-tools 43.3MB 4c89a289975a 9 minutes ago /bin/sh -c yum install -y vim 303MB 42c9d6ec66fa 15 minutes ago /bin/sh -c #(nop) WORKDIR /uer/local 0B 4d9c09fb52b7 15 minutes ago /bin/sh -c #(nop) ENV MYPATH=/uer/local 0B 697a92cc27ee 15 minutes ago /bin/sh -c #(nop) MAINTAINER charlie<283738… 0B b78af7a83692 6 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 6 months ago /bin/sh -c #(nop) ADD file:f495e5783588b2180… 153MB <missing> 8 months ago /bin/sh -c #(nop) ENV DISTTAG=f35container … 0B <missing> 14 months ago /bin/sh -c #(nop) LABEL maintainer=Clement … 0B
CMD 和 ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试cmd
# 编写dockerfile文件 [root@fedora ~]# touch cmd-test [root@fedora ~]# vim cmd-test [root@fedora ~]# cat cmd-test FROM centos CMD ["ls","-a"] # 构建镜像 [root@fedora ~]# docker build -f cmd-test -t cmd-test:1.0 . Sending build context to Docker daemon 22.06MB Step 1/2 : FROM centos ...... Successfully built f433adf26614 Successfully tagged cmd-test:1.0 # 运行镜像 [root@fedora ~]# docker run cmd-test:1.0 . .. .dockerenv bin ...... ...... var # 想追加一个命令 -l 成为ls -al [root@fedora ~]# docker run cmd-test:1.0 -l docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown. ERRO[0001] error waiting for container: context canceled # cmd的情况下 -l 替换了CMD["ls","-l"]。 -l 不是命令所以报错
测试ENTRYPOINT
# 编写Dockerfile文件 [root@fedora ~]# touch entrypoint-test [root@fedora ~]# vim entrypoint-test [root@fedora ~]# cat entrypoint-test FROM centos ENTRYPIONT ["ls","-a"] # 构建镜像 [root@fedora ~]# docker build -f entrypoint-test -t entrypoint-test:1.0 . ...... ...... Successfully built 561367223508 Successfully tagged entrypoint-test:1.0 # 运行测试,此时和CMD命令一致 [root@fedora ~]# docker run entrypoint-test:1.0 ...... ...... tmp usr var # 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的 # 追加“-l”,可以正常执行 [root@fedora ~]# docker run entrypoint-test:1.0 -l total 16 ...... ...... drwxrwxrwt. 1 root root 202 Sep 15 2021 tmp drwxr-xr-x. 1 root root 100 Sep 15 2021 usr drwxr-xr-x. 1 root root 176 Sep 15 2021 var
Dockerfile中很多命令都十分相似,我们需要了解它们的区别,最好的学习方式就是对比他们然后测试效果!
1、准备镜像文件
准备tomcat 和 jdk到当前目录,编写好readme.txt
[root@fedora ~]# touch readme.txt [root@fedora ~]# ls apache-tomcat-10.0.22.tar.gz Dockerfile jdk-18_linux-x64_bin.tar.gz readme.txt
2、编写dokerfile
[root@fedora ~]# vim Dockerfile [root@fedora ~]# cat Dockerfile FROM centos MAINTAINER charlie<2837384732@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-18_linux-x64_bin.tar.gz /usr/local/ ADD apache-tomcat-10.0.22.tar.gz /usr/local/ ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk-18.0.1.1 ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.22 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib EXPOSE 8080 CMD /usr/local/apache-tomcat-10.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.22/logs/catalina.out
3、构建镜像
因为dockerfile命名使用默认命名 因此不用使用-f 指定文件
[root@fedora ~]# docker build -t tomcat-test . Sending build context to Docker daemon 216.3MB Step 1/12 : FROM centos ---> 5d0da3dc9764 ...... Successfully built efd70b9f3c8c Successfully tagged tomcat-test:latest [root@fedora ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat-test latest efd70b9f3c8c 8 seconds ago 566MB centos latest 5d0da3dc9764 9 months ago 231MB
4、run镜像
[root@fedora ~]# docker run -d -p 8080:8080 --name tomcat-test \ -v /root/tomcat/test/:/usr/local/apache-tomcat-10.0.22/webapps/test \ -v /root/tomcat/tomcatlogs/:/usr/local/apache-tomcat-10.0.22/logs \ tomcat-test [root@fedora ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 25c48fcaeb16 tomcat-test "/bin/sh -c '/usr/lo…" 6 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat-test
5、访问测试
[root@fedora ~]# curl localhost:8080 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Apache Tomcat/10.0.22</title> <link href="favicon.ico" rel="icon" type="image/x-icon" /> <link href="tomcat.css" rel="stylesheet" type="text/css" /> </head> ...... ......
6、发布项目
(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
[root@fedora test]# pwd /root/tomcat/test [root@fedora test]# ls index.jsp WEB-INF [root@fedora test]# cat index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>test pages</title> </head> <body> Hello World!<br/> <% System.out.println("---my test web logs---"); %> </body> </html> [root@fedora test]# cat WEB-INF/web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> </web-app>
发现:项目部署成功,可以直接访问!
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!