Dockerfile是用来构建镜像的文件;
很多官方镜像都是基础包,仅包含基础功能,我们通常会搭建自己的镜像;
下面的90%是99%!
dockerfile是面向开发的,我们以后要发布项目,做镜像,需要编写dockerfile文件,这很简单!
Dockerfile逐渐成为企业交付的标准,必须要掌握!
步骤:开发、部署、运维,缺一不可!
Dockerfile:构建文件,定义了一切的步骤,源代码;
DockerImages:通过Dockerfile文件生成的镜像,最终要发布和运行的产品;
Docker容器:容器就是镜像运行起来提供服务的;
CMD # 指定容器启动的时候要运行的命令,多个CMD,只有最后一个会生效
ENTRYPOINT # 指定容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 Dockerfile 的时候,这个时候会运行 ONBUILD 指令
COPY # 类似ADD,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
以前我们都是使用别人的,现在我们自己构建镜像!
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
CMD # 指定容器启动的时候要运行的命令,多个CMD,只有最后一个会生效
ENTRYPOINT # 指定容器启动的时候要运行的命令,可以追加命令
# 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
# 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中很多命令都非常相似,我们需要了解他们的区别,并对比测试!
# 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!
<?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>
<%@ 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>
# 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、推送结果[见图:推送结果]