Docker介绍

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

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

看一下官方是怎么做的
image.png

  1. FROM scratch
  2. ADD centos-7-x86_64-docker.tar.xz /
  3. LABEL \
  4. org.label-schema.schema-version="1.0" \
  5. org.label-schema.name="CentOS Base Image" \
  6. org.label-schema.vendor="CentOS" \
  7. org.label-schema.license="GPLv2" \
  8. org.label-schema.build-date="20201113" \
  9. org.opencontainers.image.title="CentOS Base Image" \
  10. org.opencontainers.image.vendor="CentOS" \
  11. org.opencontainers.image.licenses="GPL-2.0-only" \
  12. org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
  13. CMD ["/bin/bash"]

很多官方的镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
官方既然可以制作镜像,那我们也可以

DockerFile的构建过程

基础知识:

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层并提交

image.png
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                    #构建的时候设置环境变量

R-C.jpg

实战测试: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 命令
image.png
我可以列出本地镜像的变更历史
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镜像

  1. 准备镜像文件tomcat压缩包,JDK压缩包

image.png

  1. 编写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
    
  2. 构建镜像 :::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 :::

  3. 启动镜像 :::info docker exec -it 镜像id :::

  4. 访问测试 :::info

    本地测试
    curl localhost:3360
    网页测试

    :::

  5. 发布项目 ```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

  1. 地址https://hub.docker.com/注册自己的账户
  2. 确定这个账号可以登录
  3. 在我们服务器上提交自己的镜像 ```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

小结

image.png