Docker介绍
dockerfile 是用来构建docker镜像文件的命令参数脚本
构建步骤
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run运行镜像
- docker push 发布镜像 (dockerHub\阿里云镜像仓库)
看一下官方是怎么做的
FROM scratchADD centos-7-x86_64-docker.tar.xz /LABEL \org.label-schema.schema-version="1.0" \org.label-schema.name="CentOS Base Image" \org.label-schema.vendor="CentOS" \org.label-schema.license="GPLv2" \org.label-schema.build-date="20201113" \org.opencontainers.image.title="CentOS Base Image" \org.opencontainers.image.vendor="CentOS" \org.opencontainers.image.licenses="GPL-2.0-only" \org.opencontainers.image.created="2020-11-13 00:00:00+00:00"CMD ["/bin/bash"]
很多官方的镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
官方既然可以制作镜像,那我们也可以
DockerFile的构建过程
基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序
- #表示注释
- 每一个指令都会创建提交一个新的镜像层并提交

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件 ,这个文件十分简单
docker 镜像 成为了企业交付的标准,必须要掌握!
步骤循序:开发,部署,运维 缺一不可
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages: 通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务的
DockerFile指令
FROM #基础镜像,一切从这里开始
MAINTAINER #镜像是谁写的:姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤,比如要搭建一个含有tomcat的镜像,这个tomcat的压缩包就是需要ADD进去的 添加项
WORKDIR #DIR目录是镜像的工作目录
VOLUME #容器卷的挂载位置
EXPOSE #指定暴露端口
CMD #指定这个容器运行的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器运行的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承的DockerFile 的时候就会运行ONBUILD的指令 是一个触发指令
COPY #类似ADD ,将我们的文件拷贝到镜像中
ENV #构建的时候设置环境变量

实战测试:centos
Docker Hub中99%的镜像都是从这个基础镜像过来的 FROM scatch .然后配置需要的文件和软件
#创建一个自己的centos
#编写DockerFile 的文件
[root@VM-24-6-centos dockerfile]# vim mydockerfile-centos
FROM centos:7
MAINTAINER houyifan<1614397071@qq.com>
ENV MYPATH /
WORKDIR $MYPATH
RUN yum install -y vim
RUN yum install -y net-tools
RUN yun install -y ll
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
#2.通过这个文件构建镜像
# docker build -f dockerfile文件路径 -t[镜像名] .
Successfully built 09b8aba0c521
Successfully tagged mycentos0.1:latest
#测试运行
我们自己增加之后的镜像!
进入容器默认进入/目录
ifconfig 和 vim 命令
我可以列出本地镜像的变更历史
docker history 命令
[root@VM-24-6-centos dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 5 months ago 448MB
[root@VM-24-6-centos dockerfile]# docker history mysql:5.7
IMAGE CREATED CREATED BY SIZE COMMENT
c20987f18b13 5 months ago /bin/sh -c #(nop) CMD ["mysqld"] 0B
<missing> 5 months ago /bin/sh -c #(nop) EXPOSE 3306 33060 0B
<missing> 5 months ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 5 months ago /bin/sh -c ln -s usr/local/bin/docker-entryp… 34B
<missing> 5 months ago /bin/sh -c #(nop) COPY file:345a22fe55d3e678… 14.5kB
<missing> 5 months ago /bin/sh -c #(nop) VOLUME [/var/lib/mysql] 0B
<missing> 5 months ago /bin/sh -c { echo mysql-community-server m… 313MB
<missing> 5 months ago /bin/sh -c echo 'deb http://repo.mysql.com/a… 55B
<missing> 5 months ago /bin/sh -c #(nop) ENV MYSQL_VERSION=5.7.36-… 0B
<missing> 5 months ago /bin/sh -c #(nop) ENV MYSQL_MAJOR=5.7 0B
<missing> 5 months ago /bin/sh -c set -ex; key='A4A9406876FCBD3C45… 1.84kB
<missing> 5 months ago /bin/sh -c apt-get update && apt-get install… 52.2MB
<missing> 5 months ago /bin/sh -c mkdir /docker-entrypoint-initdb.d 0B
<missing> 5 months ago /bin/sh -c set -eux; savedAptMark="$(apt-ma… 4.17MB
<missing> 5 months ago /bin/sh -c #(nop) ENV GOSU_VERSION=1.12 0B
<missing> 5 months ago /bin/sh -c apt-get update && apt-get install… 9.34MB
<missing> 5 months ago /bin/sh -c groupadd -r mysql && useradd -r -… 329kB
<missing> 5 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 5 months ago /bin/sh -c #(nop) ADD file:bd5c9e0e0145fe33b… 69.3MB
可以通过这个命令看到镜像构建时都做了什么,拿到一个镜像的时候可以研究一些他是怎么做的?
CMD 和 ENTRYPOINT的区别
测试CMD
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
#CMD测试
#编写 dockerfile文件
[root@VM-24-6-centos dockerfile]# vim dockerfile-cmd
FROM centos
CMD ["ls","-a"]
#通过docker build 命令构建dockerfile文件
[root@VM-24-6-centos dockerfile]# docker build -f dockerfile-cmd -t cmdtest .
#启动容器,发现启动时按照dockerfile文件中所写 ls -a命令生效
[root@VM-24-6-centos dockerfile]# docker run b1a5331e95fa
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
#想在启动时追加一个命令 -l ls -al
[root@VM-24-6-centos dockerfile]# docker run b1a5331e95fa -l
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
#报错是因为在CMD的情况下 -l 替换了 ["ls","-a"]命令 -l并不是命令所以报错!
#如果要在这里使用ls -al命令必须要
docker run 容器ID ls -al
测试:ENTRYOOINT
#编写dockerfile文件
[root@VM-24-6-centos dockerfile]# vim dockerfile-entorypoint
#docker build 构建
[root@VM-24-6-centos dockerfile]# docker build -f dockerfile-entorypoint -t entorypoint_test .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in eda40af64760
Removing intermediate container eda40af64760
---> ecbab266023c
Successfully built ecbab266023c
Successfully tagged entorypoint_test:latest
#启动容器
[root@VM-24-6-centos dockerfile]# docker run ecbab266023c
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
#这时候可以发现和CMD不同的是,我们的追加命令是直接拼接在ENTRYPOINT后面的
[root@VM-24-6-centos dockerfile]# docker run ecbab266023c -l
total 56
drwxr-xr-x 1 root root 4096 Jun 17 06:28 .
drwxr-xr-x 1 root root 4096 Jun 17 06:28 ..
-rwxr-xr-x 1 root root 0 Jun 17 06:28 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Jun 17 06:28 dev
drwxr-xr-x 1 root root 4096 Jun 17 06:28 etc
drwxr-xr-x 2 root root 4096 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 4096 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 132 root root 0 Jun 17 06:28 proc
dr-xr-x--- 2 root root 4096 Sep 15 2021 root
drwxr-xr-x 11 root root 4096 Sep 15 2021 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Jun 16 05:21 sys
drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15 2021 usr
drwxr-xr-x 20 root root 4096 Sep 15 2021 var
在Docker中很多命令都十分的相似,我们需要了解他们的区别,我们最好的学习方式就是对比他们然后测试效果
实战测试:Tomcat镜像
- 准备镜像文件tomcat压缩包,JDK压缩包

编写dockerfile文件 官方命名Dockerfile ,bulid会自动寻找这个文件,就不需要-f来寻找了
#FROM以centos7为基础 FROM centos:7 #MAINTAINER 设置编写人和邮箱 MAINTAINER houyifan<16143970701@qq.com> #复制 test目录下的readme.txt到 容器内/usr/local/中 COPY readme.txt /usr/local/readme.txt #复制并解压当前目录中的jdk文件和tomcat文件到/usr/local中 ADD jdk-8u331-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.22.tar.gz /usr/local/ #启动时执行yum -y install vim 安装vim RUN yum -y install vim #设置MYPATH变量 ENV MYPATH /usr/local #将上面的环境变量引用为进入的工作目录 WORKDIR $MYPATH #配置JAVA变量和tomcat变量 ENV JAVA_HOME /usr/local/jdk1.8.0_331 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin # -p 暴露8080端口 EXPOSE 8080 #通过ENTRYPOINT启动tomcat ENTRYPOINT /usr/local/apache-tomcat-9.0.22/bin/startup.sh #通过ENTRYPOINT 将日志打印在以下目录 ENTRYPOINT tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out构建镜像 :::info docker run -d -p 3360:8080 —name hyftomcat2 -v /home/tomcat/test/:/usr/local/apache-tomcat-9.0.64/webapps/test -v /home/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.64/logs diytomcat :::
启动镜像 :::info docker exec -it 镜像id :::
访问测试 :::info
本地测试
curl localhost:3360
网页测试:::
发布项目 ```xml
在挂载的test目录下(也就是在的tomcat/usr/local/apache-tomcat-9.0.22/webapps/test/WEB-INF)新建/WEB-INF/web.xml文件
```xml
#在挂载的test目录下也就是(/usr/local/apache-tomcat-9.0.22/webapps/test)新建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/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>
项目部署成功.可以访问
以后的开发步骤:需要掌握Dockerfile的编写,我们之后的一切都是使用docker镜像来发布运行
发布自己的镜像
发布到docker hub
- 地址https://hub.docker.com/注册自己的账户
- 确定这个账号可以登录
- 在我们服务器上提交自己的镜像 ```shell [root@VM-24-6-centos tomcat]# 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
4. 登录完毕之后就可以提交镜像了,就是docker push
```shell
#push 自己的镜像到docker hub上面
#格式是docker push (用户名)/(文件名):版本号
#最好是在提交之前给自己的镜像重新起名 docker tag 镜像名/镜像ID:版本号 新的镜像名:版本号 格式必须是userNAME/iageNAME
[root@VM-24-6-centos tomcat]# docker push 1614397071pain/tomcat:1.0
The push refers to repository [docker.io/1614397071pain/tomcat]
62d35dd0272d: Pushed
11d1edb723d2: Pushing [=====================================>] 15.41MB/15.41MB
b56685164584: Pushing [====================================> ] 365.7MB/369.1MB
01ec176f1082: Pushed
174f56854903: Pushed
可以发现提交的时候也是按照层级来提交的
发布到阿里云镜像
阿里云镜像容器参考官方镜像地址即可
https://cr.console.aliyun.com/repository/cn-hangzhou/hyfimage/1614397071pain/details
小结

