一、Dockerfile介绍
dockerfile 是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 1、 编写一个dockerfile文件
- 2、 docker build 构建称为一个镜像
- 3、 docker run运行镜像
- 4、 docker push发布镜像(DockerHub 、阿里云仓库)
但是很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
二、DockerFile构建过程
基础知识:
- 1、每个保留关键字(指令)都是必须是大写字母
- 2、执行从上到下顺序
- 3、#表示注释
- 4、每一个指令都会创建提交一个新的镜像曾,并提交!
- Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
- Docker镜像逐渐成企业交付的标准,必须要掌握!
- DockerFile:构建文件,定义了一切的步骤,源代码
- DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
- Docker容器:容器就是镜像运行起来提供服务。
# DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
三、创建一个自己的centos
[root@VM-12-16-centos home]# mkdir dockerfile
[root@VM-12-16-centos home]# cd dockerfile/
[root@VM-12-16-centos dockerfile]# vim mydockerfile
编写dockerfile文件
FROM centos
MAINTAINER mltang<2329173619@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo “-----end----”
CMD /bin/bash
构建镜像
[root@VM-12-16-centos dockerfile]# docker build -f mydockerfile -d mycentos:1.0 . #构建镜像
启动镜像,默认就进入local目录,因为之前dockerfile里定义了工作目录的路径。
原来原始的centos是没有ifconfig指令,现在可以看到它安装成功了。
[root@VM-12-16-centos dockerfile]# docker run -it mycentos:1.0
[root@a99e5d660f9b local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.9 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:09 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.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
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
查看一个镜像是如何构建生成的
[root@VM-12-16-centos ~]# docker history c904e88bc800
IMAGE CREATED CREATED BY SIZE COMMENT
c904e88bc800 2 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
128c0249dede 2 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
f20315d835ec 2 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
9581a6b186ba 2 hours ago /bin/sh -c #(nop) EXPOSE 80 0B
03b259fabafe 2 hours ago /bin/sh -c yum -y install net-tools 28.4MB
fe8581f3edc2 2 hours ago /bin/sh -c yum -y install vim 66.3MB
f4516b13d9e0 2 hours ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
9a8c96357823 2 hours ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
6e1e03659251 2 hours ago /bin/sh -c #(nop) MAINTAINER mltang<2329173… 0B
5d0da3dc9764 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB
CMD 和 ENTRYPOINT区别
测试CMD
#编写dockerfile文件
$ vim dockerfile-test-cmd
FROM centos
CMD ["ls","-a"]
#构建镜像
$ docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
#运行镜像
$ docker run cmd-test:0.1
.
..
.dockerenv
bin
dev
#想追加一个命令 -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 不是命令所以报错
测试ENTRYPOINT
#编写dockerfile文件
$ vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
$ docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...
# 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的,即ls -l不会报错
$ docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x 1 root root 4096 May 16 06:32 .
Dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后测试效果!
四、构建自己的Tomcat镜像
1、准备镜像文件
准备tomcat 和 jdk到当前目录,编写好README 。
2、编写dokerfile
FROM centos
MAINTAINER mltang<2329173619@qq.com>
COPY README /usr/local/README #复制文件
ADD jdk-8u231-linux-x64.tar.gz /usr/local/ #复制解压
ADD apache-tomcat-9.0.35.tar.gz /usr/local/ #复制解压
RUN yum -y install vim
ENV MYPATH /usr/local #设置环境变量
WORKDIR $MYPATH #设置工作目录
ENV JAVA_HOME /usr/local/jdk1.8.0_231 #设置环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 #设置环境变量
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib #设置环境变量 分隔符是:
EXPOSE 8080 #设置暴露的端口
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache- tomcat-9.0.35/logs/catalina.out # 设置默认命令
3、构建镜像
# 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件
$ docker build -t mytomcat:0.1 .
4、run镜像
$ docker run -d -p 8080:8080 --name tomcat01 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test - v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logs mytomcat:0.1
5、访问测试,本地访问8080端口即可成功
6、发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
发现:项目部署成功,可以直接访问!
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!
五、发布自己的镜像
1、地址 https://hub.docker.com/
2、确定这个账号可以登录
3、登录[root@VM-12-16-centos ~]# docker login -u xxx
4、docker push 镜像id
会发现push不上去,因为如果没有前缀的话默认是push到 官方的library
解决方法 :
-
第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了
docker build -t kuangshen/mytomcat:0.1 .
-
第二种 使用docker tag #然后再次push
docker tag 容器id kuangshen/mytomcat:1.0
#然后再次push
提交到阿里云镜像服务上
看官网 很详细https://cr.console.aliyun.com/repository/
$ sudo docker login --username=zchengx registry.cn-shenzhen.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像 版本号]
# 修改id 和 版本
sudo docker tag a5ef1f32aaae registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:1.0
# 修改版本
$ sudo docker push registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像版本号]
如果其他人要这个网站,那么就可以直接docker pull
拉取我们发布的这个镜像即可。