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镜像并发布镜像

  1. 准备镜像文件tomcat、jdk压缩包
[root@node01 tomcat]# ls
apache-tomcat-8.5.69.tar.gz  jdk-8u271-linux-x64.tar.gz
  1. 编写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

  1. 使用该Dockerfile构建镜像
[root@node01 tomcat]#  docker build -t diytomcat:1.0 .
  1. 启动镜像(注意后面的文件没有会自动创建)
[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]# 

在这里插入图片描述

  1. 访问测试(成功以后可以通过本机使用 ip:9090访问)
[root@bb871fac3364 apache-tomcat-8.5.69]# curl localhost:9090
curl: (7) Failed to connect to localhost port 9090: Connection refused
  1. 发布项目(由于做了卷挂载,我们可以直接在本地编写项目)

启动的时候我们将/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

  1. 登录以后提交自己的镜像 , 账号需要自己注册!!!
[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
  1. 提交镜像 docker push 自定义名字/镜像名:版本号 尽量带上版本号,提交的时候也是按照镜像的层级进行提交的
    如果重复提交了 可以使用 命令复制一个新的镜像push docker 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. 阿里云镜像服务

  1. 登录阿里云

  2. 找到镜像容器服务
    在这里插入图片描述

  3. 创建一个命名空间
    很对人的都看不到创建命名空间的地方,是因为没有创建个人实例或企业版的实例,创建好了以后就可以看到命名空间和镜像仓库了
    在这里插入图片描述在这里插入图片描述

  4. 创建容器镜像 ,填写好信息以后直接下一步,再选择本地仓库即可
    在这里插入图片描述
    创建好了以后可以再镜像仓库查看:
    在这里插入图片描述

  5. 浏览阿里云(直接点击刚创建的镜像仓库),查看如何登录阿里云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步以后, 就可以直接点击创建好的容器查看发布镜像的文档了,就是第四步的图。

希望本篇文章可以给您带来帮助(* ^ _^ *)!!!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐