【Docker】008-Dockerfile制作镜像

目录

八、Dockerfile制作镜像

1、概述

构建步骤

Centos的Dockerfile

2、Dockerfile构建过程

基础知识

3、Dockerfile的指令

参考

补充

4、实战:构建自己的centos

5、CMD和ENTRYPOINT区别

命令说明

CMD代码实践

ENTRYPOINT代码实践

6、实战:Tomcat镜像

步骤

访问测试

web.xml

index.jsp

访问项目测试

7、发布自己的镜像

发布到DockerHub

发布到阿里云镜像仓库

阿里云推送结果

8、小结


八、Dockerfile制作镜像

1、概述

Dockerfile是用来构建镜像的文件;

构建步骤

  1. 编写dockerfile文件;

  2. docker build 构建成为一个镜像;

  3. docker run 运行镜像;

  4. docker push 发布镜像(DockerHub,阿里云镜像仓库);

Centos的Dockerfile

很多官方镜像都是基础包,仅包含基础功能,我们通常会搭建自己的镜像;

下面的90%是99%!

2、Dockerfile构建过程

基础知识

  1. 每一个保留关键字(指令)都必须大写;

  2. 指令按从上到下的顺序执行;

  3. #表示注释;

  4. 每一行命令都会创建并提交一个新的镜像层;

dockerfile是面向开发的,我们以后要发布项目,做镜像,需要编写dockerfile文件,这很简单!

Dockerfile逐渐成为企业交付的标准,必须要掌握!

步骤:开发、部署、运维,缺一不可!

Dockerfile:构建文件,定义了一切的步骤,源代码;

DockerImages:通过Dockerfile文件生成的镜像,最终要发布和运行的产品;

Docker容器:容器就是镜像运行起来提供服务的;

3、Dockerfile的指令

参考

补充

CMD # 指定容器启动的时候要运行的命令,多个CMD,只有最后一个会生效
ENTRYPOINT # 指定容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 Dockerfile 的时候,这个时候会运行 ONBUILD 指令
COPY # 类似ADD,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量

以前我们都是使用别人的,现在我们自己构建镜像!

4、实战:构建自己的centos

DockerHub99%的镜像都是从scratch开始的;

# 1、编写dockerfile文件
[root@zibo dockerfile]# vim df-centos # 编写文件,ESC -> :wq保存
[root@zibo dockerfile]# cat df-centos  # 查看文件
FROM centos
MAINTAINER zibo<709570094@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

# 2、构建镜像

# 构建镜像,别忘了点(.)代表当前目录
docker build -f df-centos -t zb-centos .

# 构建成功
……
Successfully built 65e37968fdd4
Successfully tagged zb-centos:latest
[root@zibo dockerfile]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
zb-centos                latest    65e37968fdd4   28 seconds ago   291MB
……

# 3、测试运行
docker run -it zb-centos

# 控制台
[root@zibo ~]# docker run -it zb-centos
[root@cfa58936b5eb local]# pwd  
/usr/local # 直接到了我们的工作目录
[root@cfa58936b5eb local]# ifconfig  # 更多的命令也可以用了!!!
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.8  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:08  txqueuelen 0  (Ethernet)
        RX packets 15  bytes 1248 (1.2 KiB)
        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

# 查看docker镜像生成历史
docker history 镜像id

# 控制台
[root@zibo ~]# docker history 65e37968fdd4 # zb-centos
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
65e37968fdd4   9 minutes ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
ae5b285264f7   9 minutes ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
011dce051915   9 minutes ago    /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
bbb461175bbc   9 minutes ago    /bin/sh -c #(nop)  EXPOSE 80                    0B        
2d919e6d4e30   9 minutes ago    /bin/sh -c yum -y install net-tools             23.3MB    
9acb8f704d25   9 minutes ago    /bin/sh -c yum -y install vim                   58MB      
38c67894dcfa   12 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
0b1fe9bca817   12 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
a7b614b9a9df   12 minutes ago   /bin/sh -c #(nop)  MAINTAINER zibo<709570094…   0B        
300e315adb2f   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:bd7a2aed6ede423b7…   209MB

5、CMD和ENTRYPOINT区别

命令说明

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

CMD代码实践

# 1、测试CMD

# 1.1 编写一个新的dockerfile文件
vim df-cmd

# 文件内容
FROM centos
CMD ["ls","-a"]

# 1.2 构建镜像
docker build -f df-cmd -t cmd-centos .

# 控制台
[root@zibo dockerfile]# docker build -f df-cmd -t cmd-centos .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"]
 ---> Running in f9838fc7c893
Removing intermediate container f9838fc7c893
 ---> aad31a58526c
Successfully built aad31a58526c
Successfully tagged cmd-centos:latest

# 1.3 根据镜像创建并运行容器
docker run aad31a58526c

# 控制台:运行之后执行了ls -a
[root@zibo dockerfile]# docker run aad31a58526c
.
..
.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@zibo dockerfile]# docker run aad31a58526c -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

# CMD情况下,-l【替换】了CMD["ls","-a"]命令,-l部署命令,因此报错!
# 那我们该怎么做?
docker run aad31a58526c ls -al # 

# 控制台
[root@zibo dockerfile]# docker run aad31a58526c ls -al # 需要写完整的命令
total 0
drwxr-xr-x   1 root root   6 Apr  5 01:35 .
drwxr-xr-x   1 root root   6 Apr  5 01:35 ..
-rwxr-xr-x   1 root root   0 Apr  5 01:35 .dockerenv
lrwxrwxrwx   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root 340 Apr  5 01:35 dev
drwxr-xr-x   1 root root  66 Apr  5 01:35 etc
drwxr-xr-x   2 root root   6 Nov  3 15:22 home
lrwxrwxrwx   1 root root   7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx   1 root root   9 Nov  3 15:22 lib64 -> usr/lib64
drwx------   2 root root   6 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root   6 Nov  3 15:22 media
drwxr-xr-x   2 root root   6 Nov  3 15:22 mnt
drwxr-xr-x   2 root root   6 Nov  3 15:22 opt
dr-xr-xr-x 177 root root   0 Apr  5 01:35 proc
dr-xr-x---   2 root root 162 Dec  4 17:37 root
drwxr-xr-x  11 root root 163 Dec  4 17:37 run
lrwxrwxrwx   1 root root   8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root   6 Nov  3 15:22 srv
dr-xr-xr-x  13 root root   0 Apr  5 01:35 sys
drwxrwxrwt   7 root root 145 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 144 Dec  4 17:37 usr
drwxr-xr-x  20 root root 262 Dec  4 17:37 var

ENTRYPOINT代码实践

# 2、测试ENTRYPOINT

# 2.1 编写一个新的dockerfile文件
vim df-entrypoint

# 文件内容
FROM centos
ENTRYPOINT ["ls","-a"]

# 2.2 构建镜像
[root@zibo dockerfile]# docker build -f df-entrypoint -t df-ep .
Sending build context to Docker daemon   5.12kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 62914ea6fc8f
Removing intermediate container 62914ea6fc8f
 ---> 6d49aa176415
Successfully built 6d49aa176415
Successfully tagged df-ep:latest

# 2.3 根据镜像创建并允许容器
[root@zibo dockerfile]# docker run 6d49aa176415
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 2.4 想追加一个命令 -l		ls -al
[root@zibo dockerfile]# docker run 6d49aa176415 -l
total 0
drwxr-xr-x   1 root root   6 Apr  5 01:45 .
drwxr-xr-x   1 root root   6 Apr  5 01:45 ..
-rwxr-xr-x   1 root root   0 Apr  5 01:45 .dockerenv
lrwxrwxrwx   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root 340 Apr  5 01:45 dev
drwxr-xr-x   1 root root  66 Apr  5 01:45 etc
drwxr-xr-x   2 root root   6 Nov  3 15:22 home
lrwxrwxrwx   1 root root   7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx   1 root root   9 Nov  3 15:22 lib64 -> usr/lib64
drwx------   2 root root   6 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root   6 Nov  3 15:22 media
drwxr-xr-x   2 root root   6 Nov  3 15:22 mnt
drwxr-xr-x   2 root root   6 Nov  3 15:22 opt
dr-xr-xr-x 178 root root   0 Apr  5 01:45 proc
dr-xr-x---   2 root root 162 Dec  4 17:37 root
drwxr-xr-x  11 root root 163 Dec  4 17:37 run
lrwxrwxrwx   1 root root   8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root   6 Nov  3 15:22 srv
dr-xr-xr-x  13 root root   0 Apr  5 01:45 sys
drwxrwxrwt   7 root root 145 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 144 Dec  4 17:37 usr
drwxr-xr-x  20 root root 262 Dec  4 17:37 var

# 区别是什么?entrypoint 可以对命令在原有基础上进行【追加】,而CMD是【替换】!

# Dockerfile中很多命令都非常相似,我们需要了解他们的区别,并对比测试!

6、实战:Tomcat镜像

步骤

# 1、准备镜像文件 tomcat 压缩包,jdk压缩包;
[root@zibo softs]# ls # 搞了一会儿,终于搞过来了
apache-tomcat-9.0.44.tar.gz  jdk-8u281-linux-x64.tar.gz

# 2、编写dockerfile,官方命名是Dockerfile,构建镜像的时候会自动寻找此文件,不需要-f指定了
[root@zibo softs]# vim Dockerfile

FROM centos

MAINTAINER zibo<709570094@qq.com>

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

ADD jdk-8u281-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.44.tar.gz /usr/local/

RUN yum -y install vim

ENY MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.44/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.44/bin/logs/catalina.out

# 3、构建镜像
docker build -t zb-tomcat .

# 4、启动镜像
docker run -d -p 8004:8080 --name zbtomcat -v /home/zibo/tomcat/webapps/test:/usr/local/apache-tomcat-9.0.44/webapps/test -v /home/zibo/tomcat/logs:/usr/local/apache-tomcat-9.0.44/logs zb-tomcat

# 5、访问测试[见图:访问测试]
http://公网ip:8004/
# 别忘记开阿里云安全组端口,如果不行就开宝塔面板的端口,还有Dockerfile文件别写错!

# 6、发布项目,上面我们挂载了test目录,只需要在test目录下部署即可
[root@ZiBo test]# mkdir WEB-INF # 创建WEB-INF文件夹
[root@ZiBo WEB-INF]# vim web.xml # 编写web.xml文件[见代码web.xml]
[root@ZiBo WEB-INF]# cd ..
[root@ZiBo test]# ls
WEB-INF
[root@ZiBo test]# vim index.jsp # 编写index.jsp文件[见代码index.jsp]

# 7、访问测试[见图:访问项目测试]
http://公网ip:8004/test

# 8、查看日志
[root@ZiBo test]# ls
index.jsp  WEB-INF
[root@ZiBo test]# cd ..
[root@ZiBo webapps]# ls
test
[root@ZiBo webapps]# cd ..
[root@ZiBo tomcat]# ls
logs  webapps
[root@ZiBo tomcat]# cd logs/
[root@ZiBo logs]# ls
catalina.2021-04-10.log  catalina.out  host-manager.2021-04-10.log  localhost.2021-04-10.log  localhost_access_log.2021-04-10.txt  manager.2021-04-10.log
[root@ZiBo logs]# cat catalina.out 
……
10-Apr-2021 07:22:49.875 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.reload Reloading context [/test]
10-Apr-2021 07:22:49.876 INFO [Catalina-utility-1] org.apache.catalina.core.StandardContext.reload Reloading Context with name [/test] has started
10-Apr-2021 07:22:49.895 INFO [Catalina-utility-1] org.apache.catalina.core.StandardContext.reload Reloading Context with name [/test] is completed
Hello World!
Hello World!
Hello World!

访问测试

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" 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>訾博正在学Docker</title>
</head>
<body>
	Hello This World!<br/>
<%
	System.out.println("Hello World!");
%>
</body>
</html>

访问项目测试

7、发布自己的镜像

发布到DockerHub

# 1、注册https://hub.docker.com/账号;
# 2、在自己的服务器上登录并提交自己的镜像

# 控制台登录
[root@ZiBo logs]# docker login -u zibo1996 
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

# 3、push镜像
[root@ZiBo logs]# docker push zb-tomcat
Using default tag: latest
The push refers to repository [docker.io/library/zb-tomcat]
074e6a04b3b3: Preparing 
b5dc79d32441: Preparing 
54710f6e0a8b: Preparing 
bd3c90357c74: Preparing 
2653d992f4ef: Preparing 
denied: requested access to the resource is denied # 被拒绝

# 4、docker push镜像的格式
docker push 注册用户名/镜像名

# 自己的镜像名字要是:注册用户名/镜像名,因此需要规范镜像名字,要不然找不到
# tag命令修改为规范的镜像:
docker tag 镜像名 注册用户名/镜像名

# 然后再push
[root@ZiBo ~]# docker tag zb-tomcat zibo1996/zb-tomcat
[root@ZiBo ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
zb-tomcat                latest    2029e892c6b2   2 hours ago    640MB
zibo1996/zb-tomcat       latest    2029e892c6b2   2 hours ago    640MB
[root@ZiBo ~]# docker push zibo1996/zb-tomcat # 这个时候就可以push了,速度比较慢
# push中……,速度慢!
Using default tag: latest
The push refers to repository [docker.io/zibo1996/zb-tomcat]
074e6a04b3b3: Pushing [========================>                          ]  28.11MB/58.03MB
b5dc79d32441: Pushing [================================>                  ]  10.18MB/15.9MB
54710f6e0a8b: Pushing [=>                                                 ]  14.23MB/356.6MB
bd3c90357c74: Pushed 
2653d992f4ef: Pushing [=====>                                             ]  22.38MB/209.3MB
# 提交的时候也是分层提交的!

发布到阿里云镜像仓库

# 1、登录阿里云——容器镜像服务——创建个人实例——设置密码——创建命名空间——创建镜像仓库——根据提示填写相关信息——本地仓库;

# 2、进入镜像仓库,就可以看到操作指南,根据操作指南执行即可!

# 3、速度慢的话注意看第4条和第5条说明!

# 4、推送结果[见图:推送结果]

阿里云推送结果

8、小结

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值