DockerFile介绍

dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 命令 运行镜像
  4. docker push 发布镜像(docker hub 、阿里云镜像仓库)

查看一下官方是怎么做的

image.png
点击后跳到一个Dockerfile
image.png
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!

DockerFile构建过程

基础知识

  1. 每个保留关键字(指令)都是必须是大写字母
  2. 执行从上到下顺序
  3. 表示注释

  4. 每一个指令都会创建提交一个新的镜像层,并提交!

image.png
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。

DockerFile的指令

  1. FROM # 基础镜像,一切从这里开始构建
  2. MAINTAINER # 镜像是谁写的, 姓名+邮箱
  3. RUN # 镜像构建的时候需要运行的命令
  4. ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
  5. WORKDIR # 镜像的工作目录
  6. VOLUME # 挂载的目录
  7. EXPOSE # 保留端口配置
  8. CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
  9. ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
  10. ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。
  11. COPY # 类似ADD,将我们文件拷贝到镜像中
  12. ENV # 构建的时候设置环境变量!

src=http___seo-1255598498.file.myqcloud.com_full_4455082961bc017cb7c87a3463bb326e021013ce.jpg&refer=http___seo-1255598498.file.myqcloud.jpg

实战测试

Docker Hub 中99%的镜像都是从这个基础镜像过来的 FROM scratch 然后配置需要的软件和配置来进行构建

创建一个自己的centos镜像

  1. # 编写dockerfile文件
  2. FROM centos
  3. MAINTAINER chang<1036428339@qq.com>
  4. ENV MYPATH /usr/local
  5. WORKDIR $MYPATH
  6. RUN yum -y install vim
  7. RUN yum -y install net-tools
  8. EXPOSE 80
  9. CMD echo $MYPATH
  10. CMD echo "---end----"
  11. CMD /bin/bash
  12. # 通过这个文件构建镜像
  13. # 命令 docker build -f dockerfile文件路径 -t 镜像名:[TAG]
  14. [root@localhost dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .
  15. Sending build context to Docker daemon 2.048kB
  16. ...
  17. Successfully built f0a2090c930c
  18. Successfully tagged mycentos:0.1
  19. # 测试运行
  20. # 官方原版
  21. [root@localhost docker-test-volume]# docker run -it centos
  22. [root@c78c04e29031 /]# pwd
  23. /
  24. [root@c78c04e29031 /]# vim
  25. bash: vim: command not found
  26. [root@c78c04e29031 /]# ifconfig
  27. bash: ifconfig: command not found
  28. [root@c78c04e29031 /]# exit
  29. exit
  30. # 我们自定义的版本
  31. [root@localhost dockerfile]# docker run -it mycentos:0.1
  32. [root@bbf8be2ad8be local]# pwd
  33. /usr/local
  34. [root@bbf8be2ad8be local]# ifconfig
  35. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  36. inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
  37. ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
  38. RX packets 8 bytes 648 (648.0 B)
  39. RX errors 0 dropped 0 overruns 0 frame 0
  40. TX packets 0 bytes 0 (0.0 B)
  41. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  42. lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
  43. inet 127.0.0.1 netmask 255.0.0.0
  44. loop txqueuelen 1 (Local Loopback)
  45. RX packets 0 bytes 0 (0.0 B)
  46. RX errors 0 dropped 0 overruns 0 frame 0
  47. TX packets 0 bytes 0 (0.0 B)
  48. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  49. [root@bbf8be2ad8be local]# vim test
  50. # 工作命令修改成功,ifconfig vim 命令都加上了

我们可以列出本地进行的变更历史

# docker history  镜像id
[root@localhost docker-test-volume]# docker history f0a2090c930c
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
f0a2090c930c   10 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
1d6d75be627b   10 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
d258784fae69   10 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
44f098d40541   10 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
e28e5279d833   10 minutes ago   /bin/sh -c yum -y install net-tools             24.8MB    
5f54939c0bda   11 minutes ago   /bin/sh -c yum -y install vim                   60.4MB    
e4edc3a07ad4   12 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
0dbf0262b5f4   12 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
5bbb14a3715d   12 minutes ago   /bin/sh -c #(nop)  MAINTAINER chang<10364283…   0B        
300e315adb2f   6 months ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      6 months ago     /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      6 months ago     /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB

我们平时拿到镜像,可以研究一下它是怎么做的。

CMD 与 ENTRYPOINT的区别

CMD                        # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT            # 指定这个容器启动的时候要运行的命令,可以追加命令

测试CMD

# 编写 dockerfile文件
[root@localhost dockerfile]# vim docker-cmd-test
[root@localhost dockerfile]# cat docker-cmd-test 
FROM centos
CMD ["ls","-a"]

# 构建镜像
[root@localhost dockerfile]# docker build -f docker-cmd-test -t cmdtest .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"]
 ---> Running in c64016257e17
Removing intermediate container c64016257e17
 ---> 022017435f9b
Successfully built 022017435f9b
Successfully tagged cmdtest:latest

# 启动镜像 发现我们的 ls -a 生效
[root@localhost dockerfile]# docker run 022017435f9b
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 想追加一个命令 -l 组成 ls -al
[root@localhost dockerfile]# docker run 022017435f9b -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.

# cmd 的情况下 -l 替换了 CMD ["ls","-a"] 命令, 而 -l 不是命令所以报错

测试ENTRYPOINT

# 编写dockerfile文件
[root@localhost dockerfile]# vim docker-cmd-entrypoint
[root@localhost dockerfile]# cat docker-cmd-entrypoint 
FROM centos
ENTRYPOINT ["ls","-a"]

# 构建镜像
[root@localhost dockerfile]# docker build -f docker-cmd-entrypoint -t entrypoint-test .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in c57a7ae32002
Removing intermediate container c57a7ae32002
 ---> 4b70eadb3d95
Successfully built 4b70eadb3d95
Successfully tagged entrypoint-test:latest

# 启动镜像 发现我们的 ls -a 生效
[root@localhost dockerfile]# docker run 4b70eadb3d95
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 我们的追加命令,是直接拼接在 ENTRYPOINT 命令之后的
[root@localhost dockerfile]# docker run 4b70eadb3d95 -l
total 0
drwxr-xr-x.   1 root root   6 Jun  9 07:03 .
drwxr-xr-x.   1 root root   6 Jun  9 07:03 ..
-rwxr-xr-x.   1 root root   0 Jun  9 07:03 .dockerenv
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Jun  9 07:03 dev
drwxr-xr-x.   1 root root  66 Jun  9 07:03 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Dec  4  2020 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 105 root root   0 Jun  9 07:03 proc
dr-xr-x---.   2 root root 162 Dec  4  2020 root
drwxr-xr-x.  11 root root 163 Dec  4  2020 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Jun  8 13:19 sys
drwxrwxrwt.   7 root root 145 Dec  4  2020 tmp
drwxr-xr-x.  12 root root 144 Dec  4  2020 usr
drwxr-xr-x.  20 root root 262 Dec  4  2020 var

DockerFile中很多命令都十分相似,我们需要了解他们的区别,我们最好的学习就是对比他们然后测试效果。

构建自己的Tomcat镜像

  1. 准备镜像文件

准备tomcat压缩包,jdk压缩包

# 下载tomcat 

# 去tomcat库查看想要下载的版本
https://mirrors.cnnic.cn/apache/tomcat/
# 选择一个版本下载
[root@localhost docker-tomcat]# wget https://mirrors.cnnic.cn/apache/tomcat/tomcat-9/v9.0.46/bin/apache-tomcat-9.0.46.tar.gz 

# 下载jdk1.8
[root@localhost docker-tomcat]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie"  http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz

准备好的文件夹
image.png

  1. 编写dockerfile文件 ,官方命名 Dockerfile ,build会自动寻找这个文件,就不需要-f 指定了 ``` [root@localhost docker-tomcat]# vim Dockerfile [root@localhost docker-tomcat]# cat Dockerfile FROM centos MAINTAINER chang1036428339@qq.com

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u131-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.46.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_131 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.46 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.46 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.46/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.46/bin/logs/catalina.out [root@localhost docker-tomcat]# ll 总用量 192424 -rw-r—r—. 1 root root 11496577 5月 9 02:06 apache-tomcat-9.0.46.tar.gz -rw-r—r—. 1 root root 633 6月 9 17:41 Dockerfile -rw-r—r—. 1 root root 185540433 3月 16 2017 jdk-8u131-linux-x64.tar.gz -rw-r—r—. 1 root root 0 6月 9 17:22 readme.txt


3. 构建镜像

[root@localhost docker-tomcat]# docker build -t diytomcat . Sending build context to Docker daemon 197MB Step 1/15 : FROM centos … Successfully built 7c14ebd45b68 Successfully tagged diytomcat:latest [root@localhost docker-tomcat]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diytomcat latest 7c14ebd45b68 About a minute ago 662MB


4. run镜像

docker run -d -p 9090:8080 —name mytomcat -v /home/docker-tomcat/test:/usr/local/apache-tomcat-9.0.46/webapps/test -v /home/docker-tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.46/logs diytomcat


5. 访问测试

curl localhost:9090


6. 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)

文件目录

[root@localhost test]# pwd /home/docker-tomcat/test [root@localhost test]# ls index.jsp WEB-INF [root@localhost test]# cd WEB-INF/ [root@localhost WEB-INF]# ls web.xml [root@localhost WEB-INF]#

WEB-INF
```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_2_5.xsd"
           version="2.5">

</web-app>

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test log----");
%>
</body>
</html>

image.png
image.png
发现:项目部署成功,可以直接访问!
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!

发布自己的镜像

发布到DockerHub上

  1. 地址 https://hub.docker.com/ 注册自己的账号
  2. 确定这个账号可以登录
  3. 登录 ``` [root@localhost ~]# 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

登录

[root@localhost ~]# docker login -u 1036428339 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


4. 登录完毕后,提交镜像 `docker push`

直接push 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library

[root@localhost ~]# docker push 1036428339/diytomcat:1.0 The push refers to repository [docker.io/1036428339/diytomcat] An image does not exist locally with the tag: 1036428339/diytomcat

解决方法

第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了

docker build -t dockerhub用户名/镜像名称:版本 .

第二种 使用docker tag 修改镜像名称 然后再push到自己的仓库

docker tag 容器id dockerhub用户名/镜像名称:版本

测试第二种方式

查看镜像

[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 3 months ago 13.3kB

重命名

[root@localhost ~]# docker tag d1165f221234 1036428339/myhelloworld:1.0 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 1036428339/myhelloworld 1.0 d1165f221234 3 months ago 13.3kB hello-world latest d1165f221234 3 months ago 13.3kB

push到dockerhub自己的仓库

[root@localhost ~]# docker push 1036428339/myhelloworld:1.0 The push refers to repository [docker.io/1036428339/myhelloworld] f22b99068db9: Mounted from library/hello-world 1.0: digest: sha256:1b26826f602946860c279fce658f31050cff2c596583af237d971f4629b57792 size: 525

到dockerhub官网上查看<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2608713/1623598567095-3051b1d9-3d5b-4d6b-bb40-8d9b795f04e0.png#clientId=ubb28505e-c505-4&from=paste&height=624&id=u85c92e7d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=624&originWidth=1349&originalType=binary&ratio=1&size=61851&status=done&style=none&taskId=uf48f80f0-e31a-42a9-a162-8dd05143ebd&width=1349)
<a name="aTz3O"></a>
#### 发布到阿里云镜像服务上

1. 登录阿里云[https://cr.console.aliyun.com/cn-hangzhou/instance/repositories](https://cr.console.aliyun.com/cn-hangzhou/instance/repositories)
1. 找到容器镜像服务

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2608713/1623599405961-5e70b3ea-3902-41c5-ae2e-db6786b14e55.png#clientId=ubb28505e-c505-4&from=paste&height=588&id=ua22a3a3c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=588&originWidth=1364&originalType=binary&ratio=1&size=70944&status=done&style=none&taskId=u6e331aea-01ab-408f-8621-065a07bd05f&width=1364)

3. 创建命名空间

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2608713/1623599370000-fc303355-7572-4e73-bf9c-9749a9a869a1.png#clientId=ubb28505e-c505-4&from=paste&height=544&id=ua16eaa25&margin=%5Bobject%20Object%5D&name=image.png&originHeight=544&originWidth=1365&originalType=binary&ratio=1&size=53410&status=done&style=none&taskId=u92063ce9-fe0a-4e94-9f19-e6ba05a38ca&width=1365)

4. 创建容器镜像

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2608713/1623599489109-0d503611-3144-44af-88fa-03e3d17ae010.png#clientId=ubb28505e-c505-4&from=paste&height=620&id=u14f46d56&margin=%5Bobject%20Object%5D&name=image.png&originHeight=620&originWidth=1366&originalType=binary&ratio=1&size=83263&status=done&style=none&taskId=u75f9a353-bb7d-43f9-a443-9901e2cd191&width=1366)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2608713/1623599523071-c71c9f22-c8cf-43ce-8966-f869856acec7.png#clientId=ubb28505e-c505-4&from=paste&height=619&id=u4508d59c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=619&originWidth=1365&originalType=binary&ratio=1&size=73757&status=done&style=none&taskId=u72606d2b-6a51-466e-af08-8b86e41e6cf&width=1365)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2608713/1623599569920-28fd3495-a295-4a6d-970c-f4e93a9faa3a.png#clientId=ubb28505e-c505-4&from=paste&height=216&id=u4513c4e9&margin=%5Bobject%20Object%5D&name=image.png&originHeight=216&originWidth=1177&originalType=binary&ratio=1&size=17044&status=done&style=none&taskId=ubadb7cb0-1314-4ede-bff6-f7c2db94124&width=1177)

5. 具体操作官网写的很详细了

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2608713/1623599752531-bb26c471-d3fe-4403-8b53-e391208cc39e.png#clientId=ubb28505e-c505-4&from=paste&height=624&id=u75a337ab&margin=%5Bobject%20Object%5D&name=image.png&originHeight=624&originWidth=1343&originalType=binary&ratio=1&size=84855&status=done&style=none&taskId=u13a5fca5-30af-499f-aa85-78d77ed039f&width=1343)

如果登录了dockerhub要先退出

[root@localhost ~]# docker logout Removing login credentials for https://index.docker.io/v1/

登录阿里云账号

[root@localhost ~]# docker login —username=雪落书窗 registry.cn-hangzhou.aliyuncs.com 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

修改镜像名称

[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 3 months ago 13.3kB [root@localhost ~]# docker tag d1165f221234 registry.cn-hangzhou.aliyuncs.com/1036428339/test:1.0 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.cn-hangzhou.aliyuncs.com/1036428339/test 1.0 d1165f221234 3 months ago 13.3kB 1036428339/myhelloworld 1.0 d1165f221234 3 months ago 13.3kB

push 本地镜像到阿里云

[root@localhost ~]# docker push registry.cn-hangzhou.aliyuncs.com/1036428339/test:1.0 The push refers to repository [registry.cn-hangzhou.aliyuncs.com/1036428339/test] f22b99068db9: Pushed 1.0: digest: sha256:1b26826f602946860c279fce658f31050cff2c596583af237d971f4629b57792 size: 525 ``` 到阿里云官网上查看版本信息
image.png

小结

image.png