1.DockerFile介绍
dockerfile 使用来创建docker镜像的文件!命令参数脚本!
构建步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库!)
查看一下官方是怎么做的?
很多官方镜像都是基础包,很多功能都没有,我们通常自己搭建自己的镜像!
官方既然可以制作镜像,我们也可以!
2.DockerFile的构建过程
2.1基础知识
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交!
2.2基础名词
- dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
- Docker镜像逐渐成为了企业交付的标准,必须要掌握!
- 步骤:开发、部署、运维,缺一不可
- DockerFile:构建文件,定义了一切的步骤,源代码。
- DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品,原来是jar war
- Docker容器:容器就是镜像运行起来提供服务器
3.DockerFile的指令
FROM #基础镜像 centos/ubuntu,一切从这里开始构建 MAINTAINER #镜像是谁写的,姓名+邮箱 RUN #镜像构建的时候需要运行的命令 ADD #步骤:tomcat镜像,这个tomcat压缩包!添加内容 WORKDIR #镜像的工作目录 VOLUME #挂载的目录 EXPOSE #保留端口配置 CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTERPOINT #指定这个容器启动的时候要与运行的命令,可以追加命令 ONBUILD #当构建一个被继承的 DockerFile这个时候就会运行 Onbuild的指令,触发指令 COPY #类似ADD,将我们的文件拷贝到镜像中 ENC #构建的时候设置环境变量
4.实战测试
- Docker Hub中99%镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置类进行构建。
- 创建一个自己的centos
# 1./home下新建dockerfile目录 $ mkdir dockerfile # 2. dockerfile目录下新建mydockerfile-centos文件 $ vim mydockerfile-centos # 3.编写Dockerfile配置文件 FROM centos # 基础镜像是官方原生的centos MAINTAINER swz<1362745408@qq.com> # 作者 ENV MYPATH /usr/local # 配置环境变量的目录 WORKDIR $MYPATH # 将工作目录设置为 MYPATH RUN yum -y install vim # 给官方原生的centos 增加 vim指令 RUN yum -y install net-tools # 给官方原生的centos 增加 ifconfig命令 EXPOSE 80 # 暴露端口号为80 CMD echo $MYPATH # 输出下 MYPATH 路径 CMD echo "-----end----" CMD /bin/bash # 启动后进入 /bin/bash # 4.通过这个文件构建镜像 # 命令: docker build -f 文件路径 -t 镜像名:[tag] . $ docker build -f mydockerfile-centos -t mycentos:0.1 . # 5.出现下图后则构建成功
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 0.1 cbf5110a646d 2 minutes ago 311MB # 6.测试运行 $ docker run -it mycentos:0.1 # 注意带上版本号,否则每次都回去找最新版latest $ pwd /usr/local # 与Dockerfile文件中 WORKDIR 设置的 MYPATH 一致 $ vim # vim 指令可以使用 $ ifconfig # ifconfig 指令可以使用 # docker history 镜像id 查看镜像构建历史步骤 $ docker history 镜像id
- 我们可以列出本地进行的变更历史
5.CMD 和 ENTRYPOINT区别?
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
5.1测试cmd
# 编写dockerfile文件 $ vim dockerfile-test-cmd FROM centos CMD ["ls","-a"] # 启动后执行 ls -a 命令 # 构建镜像 $ docker build -f dockerfile-test-cmd -t cmd-test:0.1 . # 运行镜像 $ docker run cmd-test:0.1 # 由结果可得,运行后就执行了 ls -a 命令 . .. .dockerenv bin dev etc home # 想追加一个命令 -l 成为ls -al:展示列表详细数据 $ docker run cmd-test:0.1 -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown. ERRO[0000] error waiting for container: context canceled # cmd的情况下 -l 替换了CMD["ls","-l"] 而 -l 不是命令所以报错
5.2测试ENTRYPOINT
# 编写dockerfile文件 $ vim dockerfile-test-entrypoint FROM centos ENTRYPOINT ["ls","-a"] # 构建镜像 $ docker build -f dockerfile-test-entrypoint -t cmd-test:0.1 . # 运行镜像 $ docker run entrypoint-test:0.1 . .. .dockerenv bin dev etc home lib lib64 lost+found ... # 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的 $ docker run entrypoint-test:0.1 -l total 56 drwxr-xr-x 1 root root 4096 May 16 06:32 . drwxr-xr-x 1 root root 4096 May 16 06:32 .. -rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin drwxr-xr-x 5 root root 340 May 16 06:32 dev drwxr-xr-x 1 root root 4096 May 16 06:32 etc drwxr-xr-x 2 root root 4096 May 11 2019 home lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ....
- Dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后测试效果!
6.实战Tomcat镜像
6.1 准备镜像文件
准备tomcat 和 jdk 到当前目录,编写好README
jdk1.8下载
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.co
- tomcat9.0.22下载
https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.22/bin/
选择下面的下载即可
6.2 编写dokerfile
$ vim dockerfile FROM centos # 基础镜像centos MAINTAINER swz<1362745408@qq.com> # 作者 COPY readme.txt /usr/local/readme.txt # 复制README文件 ADD jdk-8u141-linux-x64.tar.gz /usr/local/ # 添加jdk,ADD 命令会自动解压 ADD apache-tomcat-9.0.22.tar.gz /usr/local/ # 添加tomcat,ADD 命令会自动解压 RUN yum -y install vim # 安装 vim 命令 ENV MYPATH /usr/local # 环境变量设置 工作目录 WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_141 # 环境变量: JAVA_HOME环境变量 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22 # 环境变量: tomcat环境变量 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22 # 设置环境变量 分隔符是: ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 # 设置暴露的端口 CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/logs/catalina.out # 设置默认命令
如下图:名字需要对应上
6.3 构建镜像
# 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件 [root@iZ2zefiis08efdip3nlhu2Z tomcat]# docker build -t diytomcat .
6.4 run镜像
# -d:后台运行 -p:暴露端口 --name:别名 -v:绑定路径 [root@iZ2zefiis08efdip3nlhu2Z tomcat]# docker run -d -p 8081:8080 --name swztomcat -v /home/tomcat/test:/usr/local/apach-tomcat-9.0.22/webapps/test -v /home/tomcat/tomcatlogs/:/usr/local/apach-tomcat-9.0.22/logs diytomcat
6.5 访问测试
$ docker exec -it 自定义容器的id /bin/bash $ cul localhost:8080
6.6发布项目
(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
发现:项目部署成功,可以直接访问!
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!
7.发布自己的镜像
1.发布到 Docker Hub
- 1、地址 https://hub.docker.com/
- 2、确定这个账号可以登录
- 3、登录
$ docker login --help Usage: docker login [OPTIONS] [SERVER] Log in to a Docker registry. If no server is specified, the default is defined by the daemon. Options: -p, --password string Password --password-stdin Take the password from stdin -u, --username string Username $ docker login -u 你的用户名 -p 你的密码
- 4、发布镜像
# 可以看到直接发布是错误的 # 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library # 解决方法: # 第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了 $ docker build -t songwz123/diytomcat:0.1 . # 第二种 使用docker tag #然后再次push $ docker tag 镜像id songwz123/diytomcat:1.0 #然后再次push $ docker push songwz123/diytomcat:1.0 #可以看到下面出现了songwz/diytomcat [root@iZ2zefiis08efdip3nlhu2Z tomcat]# docker tag e399a48469f4 songwz123/diytomcat:1.0 [root@iZ2zefiis08efdip3nlhu2Z tomcat]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diytomcat latest e399a48469f4 17 hours ago 688MB songwz/diytomcat 1.0 e399a48469f4 17 hours ago 688MB songwz123/diytomcat 1.0 e399a48469f4 17 hours ago 688MB mycentos 0.1 3b63e7073db0 18 hours ago 323MB swz/centos latest e1e7359dcbfa 23 hours ago 231MB tomcat02 1.0 2c026d52e774 41 hours ago 684MB redis latest 7614ae9453d1 3 days ago 113MB mysql 5.7 c20987f18b13 4 days ago 448MB tomcat latest 24207ccc9cce 2 weeks ago 680MB nginx latest f652ca386ed1 3 weeks ago 141MB centos latest 5d0da3dc9764 3 months ago 231MB portainer/portainer latest 580c0e4e98b0 9 months ago 79.1MB #这里太慢了,我就不等了 [root@iZ2zefiis08efdip3nlhu2Z tomcat]# docker push songwz123/diytomcat:1.0 The push refers to repository [docker.io/songwz123/diytomcat] 1c2c241a9a68: Pushing [======================> ] 28.66MB/64.75MB a10bb06755d9: Pushing [==============================> ] 9.281MB/15.41MB 5204d4951b10: Pushing [=> ] 8.193MB/376.2MB 7e8e5af2adbb: Pushed 74ddd0ec08fa: Pushing [====> ] 19.11MB/231.3M
2. 发布到 阿里云
官网:https://cr.console.aliyun.com/repository/
- 创建命名空间
- 创建仓库
- 浏览阿里云
https://cr.console.aliyun.com/repository/cn-beijing/swz_test/swz_repository/details
(细节见网站)
8.小结
学习视频:
https://www.bilibili.com/video/BV1og4y1q7M4?p=28&spm_id_from=pageDriver
部分参考:
https://blog.csdn.net/weixin_43591980/article/details/106316094