Dockerfile详解
1. Dockerfile介绍Dockerfile是用来构建Docker镜像的文本文件,也可以说是命令参数脚本。docker build命令用于从Dockerfile构建镜像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。Docker镜像发布的步骤:1、编写一个dockerfile文件2、docker build 构建成为一个镜像3、docker r
1. Dockerfile介绍
Dockerfile是用来构建Docker镜像的文本文件,也可以说是命令参数脚本。docker build命令用于从Dockerfile构建镜像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。
Docker镜像发布的步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 镜像
4、docker push 镜像(发布镜像到DockerHub、阿里云镜像仓库)
镜像操作图:
查看官方各个镜像的Dockerfile(以centos为例)
像官方很多镜像的基础包,很多功能都没有,所以我们通常会搭建自己的镜像!
拓展:
- dockerflie是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件(必须要掌握的技术)
- 联系DockerFile -DockerImages -Docker容器:
1.DockerFile : 构建文件 ,定义了一切步骤,类似于源代码
2.DockerImages : 通过DockerFile 构建生成的镜像,最终发布和运行的产品!
3.Docker容器 :容器就是镜像运行起来提供服务器
2. Dockerfile的指令
这里推荐一篇文档,里面很详细的讲解了Dockerfile的一些注意事项,以及一些指令Dockerfile介绍,推荐看完此博文,对Dockerfile有一定了解再看,不然懵的。
FROM | 指定基础镜像 |
---|---|
MAINTAINER | 镜像是谁写的,姓名+邮箱 |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget |
WORKDIR | 镜像的工作目录 |
VOLUME | 挂载的目录 |
EXPOSE | 保留端口配置 |
CMD | 指定这个容器启动的时候要运行的命令(只有最后一个会生效) |
EMTRYPOINT | 指定这个容器启动的时候要运行的命令,可以追加命令 |
ONBUILD | 当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令,触发指令 |
COPY | 构建的时候设置环境变量 |
ENV | 构建的时候设置环境变量 |
指令图:
3. Dockerfile的构建过程
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
DockerFile文件的基础知识有:
1、每个保留关键字(指令)都必须是大写字母
2、文件中的指令从上到下顺序执行,第一个指令必须是FROM
3、# 号表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
下面开始编写Dockerfile,构建镜像
[root@iZwz99sm8v95sckz8bd2c4Z dockerfile]# cat mydockerfile-centos
FROM centos
MAINTAINER cilmber<169631@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
接下来通过命令:docker build -f dockerfile文件路径 -t 镜像名[:版本号] .
(这里有个小点.),来执行这个dockerfile文件构建镜像
-t参数用来指定 image 文件的名字
最后那个小数点来表示Dockerfile 文件所在的路径
接下来执行build命令生成镜像,执行成功以后,可以通过docker images
来查看新生成的镜像文件。
并测试 ifconfig 与 vim命令
[root@node01 home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 cd8911381c7f 37 minutes ago 336MB
diytomcat 1.0 21868be21b48 4 hours ago 674MB
[root@node01 home]# docker run -it mycentos:1.0
[root@a3fedc0a7263 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 7 bytes 586 (586.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@a3fedc0a7263 local]# vim test.java
我们对比下面官方的centos,发现其实官方的很多命令都不能使用,比较简单的centos,所以很多情况下我们如果需要自己编写dockerfile文件创建镜像
[root@node01 ~]# docker run -it centos
[root@2c8a66906d62 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@2c8a66906d62 /]# ifconfig
bash: ifconfig: command not found
[root@2c8a66906d62 /]# vim persion.java
bash: vim: command not found
另外,我们可以通过 docker history 镜像id
命令来查看镜像构建步骤(构建历史)
[root@node01 home]# docker history cd8911381c7f
IMAGE CREATED CREATED BY SIZE COMMENT
cd8911381c7f 44 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
8e81dca9c511 44 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
7cf1b8c2f886 44 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
d649f6586b52 44 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
ed0232814d9d 44 minutes ago /bin/sh -c yum -y install net-tools 32.4MB
bd23d4c30bca 45 minutes ago /bin/sh -c yum -y install vim 72.7MB
91404cb35099 46 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
6d88b0f107a8 46 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
e5e97c9df334 46 minutes ago /bin/sh -c #(nop) MAINTAINER cilmber<169631… 0B
5d0da3dc9764 5 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 5 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 5 weeks ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB
4. RUN,CMD和ENTRYPOINT的区别
- RUN 指令:用于指定 docker build 过程中要运行的命令。
- CMD :指定容器启动的时候要运行的命令,只有最后一个会生效。CMD 指令类似于 RUN 指令,用于运行程序,但二者运行的时间点不同;CMD 在docker run 时运行,而非docker build;
- ENTRYPOINT :指定容器启动的时候要运行的命令,命令可以追加
首先测试 CMD
[root@node01 home]# cat centos_test
FROM centos
CMD ["ls","-a"]
#构建镜像
[root@node01 home]# docker build -f centos_test -t cmd_centos:1.0 .
Sending build context to Docker daemon 503.3MB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"]
---> Using cache
---> 3c9f4bd7697d
Successfully built 3c9f4bd7697d
Successfully tagged cmd_centos:1.0
#运行镜像
[root@node01 home]# docker run cmd_centos:1.0
.
..
.dockerenv
bin
dev
#由于使用的是 CMD指令,命令无追加,-l取代了原本的ls -a,而-l命令不存在所以报错。
[root@node01 home]# docker run cmd_centos:1.0 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
接着测试 ENTRYPOINT
[root@node01 home]# cat entrypoint_test
FROM centos
ENTRYPOINT ["ls","-a"]
#构建镜像
[root@node01 home]# docker build -f entrypoint_test -t entry_centos:1.0 .
Sending build context to Docker daemon 503.3MB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Using cache
---> 2eb0234f035a
Successfully built 2eb0234f035a
Successfully tagged entry_centos:1.0
#运行镜像
[root@node01 home]# docker run entry_centos:1.0
.
..
.dockerenv
bin
dev
etc
...
#4.追加命令 依旧可以运行
[root@node01 home]# docker run entry_centos:1.0 -l
total 0
drwxr-xr-x. 1 root root 6 Oct 21 14:57 .
drwxr-xr-x. 1 root root 6 Oct 21 14:57 ..
-rwxr-xr-x. 1 root root 0 Oct 21 14:57 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Oct 21 14:57 dev
...
5. 制作Tomcat镜像并发布镜像
- 准备镜像文件tomcat、jdk压缩包
[root@node01 tomcat]# ls
apache-tomcat-8.5.69.tar.gz jdk-8u271-linux-x64.tar.gz
- 编写dockerfile文件,文件名使用官方命名:
Dockerfile
,build的时候会默认寻找当前目录
下的文件,不需要使用-f参数指定
[root@node01 tomcat]# cat Dockerfile
FROM centos
MAINTAINER climber<169613@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u251-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.69.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_251
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.69
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.69
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.69/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.69/bin/logs/catalina.out
- 使用该Dockerfile构建镜像
[root@node01 tomcat]# docker build -t diytomcat:1.0 .
- 启动镜像(注意后面的文件没有会自动创建)
[root@node01 tomcat]# docker run -d -p 9090:8080 --name climber -v /home/build/tomcat/test:/usr/local/apache-tomcat-8.5.69/webapps/test -v /home/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-8.5.69/logs diytomcat
#进入diytomcat镜像容器
[root@node01 tomcat]# docker exec -it bb871fac3364 /bin/bash
[root@bb871fac3364 local]# ls
apache-tomcat-8.5.6 apache-tomcat-8.5.69 bin etc games include jdk1.8.0_271 lib lib64 libexec readme.txt sbin share src
[root@bb871fac3364 local]# pwd
/usr/local
[root@bb871fac3364 local]# cd apache-tomcat-8.5.6
[root@bb871fac3364 apache-tomcat-8.5.6]# ls
logs
[root@bb871fac3364 apache-tomcat-8.5.6]# cd ..
[root@bb871fac3364 local]# cd apache-tomcat-8.5.69
[root@bb871fac3364 apache-tomcat-8.5.69]# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs temp webapps work
[root@bb871fac3364 apache-tomcat-8.5.69]#
- 访问测试(成功以后可以通过本机使用 ip:9090访问)
[root@bb871fac3364 apache-tomcat-8.5.69]# curl localhost:9090
curl: (7) Failed to connect to localhost port 9090: Connection refused
- 发布项目(由于做了卷挂载,我们可以直接在本地编写项目)
启动的时候我们将/usr/local/apache-tomcat-8.5.69/webapps/test
t挂载到了 本地的 /home/build/tomcat/test
,所以我们可以直接在本地的test下创建WEB-INF和web.xml
[root@node01 test]# mkdir WEB-INF
[root@node01 test]# ls
WEB-INF
[root@node01 test]# cd WEB-INF
[root@node01 WEB-INF]# vim web.xml
[root@node01 WEB-INF]# cat web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
</web-app>
在编写一个index.jsp页面,测试Tomcat是否能正常访问
[root@node01 test]# vim index.jsp
[root@node01 test]# vim index.jsp
[root@node01 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>测试</title>
</head>
<body>
Hello World<br>
<%
System.out.println("--------------------我们启动成功了-------------------");
out.println("你的ip地址是"+request.getRemoteAddr());
%>
%</body>
%</html>
[root@node01 test]#
项目部署成功,可以直接访问ok!推测,我们自己项目通过Dockerfile的编写,构建成镜像,再通过容器启动,按前面的步骤
6 .发布镜像到阿里云与DockerHub
1 . DockerHub
- 登录以后提交自己的镜像 , 账号需要自己注册!!!
[root@node01 ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: sasasasa66666
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
- 提交镜像
docker push 自定义名字/镜像名:版本号
尽量带上版本号,提交的时候也是按照镜像的层级进行提交的
如果重复提交了 可以使用 命令复制一个新的镜像pushdocker tag 镜像名 新的镜像名
[root@node01 ~]# docker push climber/diytomcat:1.0
The push refers to repository [docker.io/library/diytomcat]
e4bf18345347: Preparing
f718edf4aac9: Preparing
bfb95ac10b58: Preparing
2a0507c30f2d: Preparing
74ddd0ec08fa: Preparing
denied: requested access to the resource is denied
#如果存在此镜像则不能重复提交
[root@node01 ~]# docker push climber/diytomcat:1.0
The push refers to repository [docker.io/climber/diytomcat]
An image does not exist locally with the tag: climber/diytomcat
2. 阿里云镜像服务
-
登录阿里云
-
找到镜像容器服务
-
创建一个命名空间
很对人的都看不到创建命名空间的地方,是因为没有创建个人实例或企业版的实例,创建好了以后就可以看到命名空间和镜像仓库了
-
创建容器镜像 ,填写好信息以后直接下一步,再选择本地仓库即可
创建好了以后可以再镜像仓库查看:
-
浏览阿里云(直接点击刚创建的镜像仓库),查看如何登录阿里云Docker Registry,并发布镜像
先登录
$ docker login --username=*********** registry.cn-hangzhou.aliyuncs.com
再push
[root@node01 ~]# docker push mysql:5.7
The push refers to repository [docker.io/library/mysql]
ab3bfc52aeb6: Layer already exists
cf0cf35ea5aa: Preparing
5a3aaf958a91: Preparing
7b963bc4ebf4: Waiting
f8389e4e632e: Waiting
b58f3b77172b: Waiting
17e5430d2956: Waiting
e050d4242497: Waiting
8b73ecde66c0: Waiting
90e0289c2b06: Waiting
e81bff2725db: Waiting
denied: requested access to the resource is denied
阿里云镜像发布到这就结束了,其实在第4步以后, 就可以直接点击创建好的容器查看发布镜像的文档了,就是第四步的图。
希望本篇文章可以给您带来帮助(* ^ _^ *)!!!
更多推荐
所有评论(0)