当前位置:   article > 正文

Dockerfile简单的讲解、制作镜像、发布自己的镜像到DockerHup、阿里云镜像服务_镜像的制作和发布过程

镜像的制作和发布过程

DockerFile

DockerFile介绍

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

构建步骤:

1、编写一个dockerfile文件

2、docker build 构建成为一个镜像

3、docker run 运行镜像

4、docker push发布镜像 (DockerHup、阿里云镜像仓库!)

查看官方是怎么做的:以centos为例

在这里插入图片描述
在这里插入图片描述
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

官方既然可以制作镜像,那么我们也可以!

DockerFile制作过程

基础知识:

1、每个保留关键字(指令)都必须保存大写

2、执行从上到下顺序执行

3、# 代表注释

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

在这里插入图片描述
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

步骤:开发、部署、运维

DockerFile:构建文件,定义了一切的步骤,好比源代码

DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品

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

DockerFile指令

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

在这里插入图片描述

实战测试

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

在这里插入图片描述

创建一个自己的centos

# 1、编写dockerfile的配置文件
[root@wulei dockerfile]# cat dockerfile-centos 

FROM centos:7

MAINTAINER wulei<2921625957@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、通过这个文件来构建一个镜像                    文件路径           名字 :版本  . 
[root@wulei dockerfile]# docker build -f dockerfile-centos -t mycentos:1.0 .
...
Successfully built b0b36e43a9f9
Successfully tagged mycentos:1.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

我们来对比一下原生的centos和我们刚刚自己生成的centos

原生的:
在这里插入图片描述
我们自己的:
在这里插入图片描述
我们可以列出本地进行的变更历史:

docker history xxx
  • 1

在这里插入图片描述

CMD 和 ENTRYPOINT的区别

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

测试CMD命令

# 创建文件
[root@wulei dockerfile]# vim dockerfile-cmd-test
[root@wulei dockerfile]# cat dockerfile-cmd-test 
FROM centos:7
CMD ["ls","-a"]
# 构建镜像
[root@wulei dockerfile]# docker build -f dockerfile-cmd-test -t centoscmdtest:1.0 .
    Sending build context to Docker daemon  3.072kB
    Step 1/2 : FROM centos:7
     ---> 8652b9f0cb4c
    Step 2/2 : CMD ["ls","-a"]
     ---> Running in dbd381762480
    Removing intermediate container dbd381762480
     ---> 1e8e0694cd60
    Successfully built 1e8e0694cd60
    Successfully tagged centoscmdtest:1.0
# 运行镜像,发现我们的 ls -a 命令生效了
[root@wulei dockerfile]# docker run -it 1e8e0694cd60
    .   .dockerenv	       bin  etc   lib	 media	opt   root  sbin  sys  usr
    ..  anaconda-post.log  dev  home  lib64  mnt	proc  run   srv   tmp  var
    
# 现在呢,我想追加一个 -l 命令来组成  ls -al
[root@wulei dockerfile]# docker run  1e8e0694cd60 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

# 原因:CMD的情况下 -l 替换了 CMD ["ls","-a"] 命令 ,如果 -l 是命令还好,但是 -l 不是一个命令,所以报错
# 要这样执行才可 
[root@wulei dockerfile]# docker run 1e8e0694cd60 ls -al
total 64
drwxr-xr-x  1 root root  4096 Feb 12 13:26 .
...
drwxr-xr-x 18 root root  4096 Nov 13 01:54 var
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

测试ENTRYPOINT

# 创建文件
[root@wulei dockerfile]# vim dockerfile-entrypoint-test
[root@wulei dockerfile]# cat dockerfile-entrypoint-test 
FROM centos:7

ENTRYPOINT ["ls","-a"]

# 生成镜像
[root@wulei dockerfile]# docker build -f dockerfile-entrypoint-test -t entrypointcentos:1.0 .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos:7
 ---> 8652b9f0cb4c
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 3ae279ce0248
Removing intermediate container 3ae279ce0248
 ---> f0820fd49370
Successfully built f0820fd49370
Successfully tagged entrypointcentos:1.0

# 直接运行:正常
[root@wulei dockerfile]# docker run f0820fd49370
...
var
# 追加参数运行:正常
[root@wulei dockerfile]# docker run f0820fd49370 -l
total 64
drwxr-xr-x  1 root root  4096 Feb 12 13:30 .
...
drwxr-xr-x 18 root root  4096 Nov 13 01:54 var
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

实战:Tomcat镜像

1、准备镜像文件:tomcat压缩包 ,jdk压缩包

在这里插入图片描述
2、编写dockerfile文件,官方命名Dockerfile ,我们去build的时候会自动寻找这个文件,不需要 -f 指定了

FROM centos:7

MAINTAINER wulei<2921625957@qq.com>

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

ADD apache-tomcat-9.0.41.tar.gz /usr/local/

RUN yum -y install vim

ENV 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.41
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.41

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.41/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.41/bin/logs/catalina.out
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

3、通过docker build 构建镜像

[root@wulei tomcatimages]# docker build -t diytomcat:1.0 .
# 构建完毕后查看下镜像
[root@wulei tomcatimages]# docker images diytomcat
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
diytomcat    1.0       e1c085657931   About a minute ago   732MB
  • 1
  • 2
  • 3
  • 4
  • 5

4、启动自己的tomcat镜像

# 因为现在直接运行的话webapps里面为空
# 启动之前在自己的主机的webapps里面拷贝tomcat的webapps里面本来的文件夹,怎么拷贝我就不说了
# 启动
[root@wulei tomcatimages]# docker run -d -p 8081:8080 --name mytomcat \
-v /home/tomcatimages/webapps:/usr/local/apache-tomcat-9.0.41/webapps \
-v /home/tomcatimages/tomcatlogs:/usr/local/apache-tomcat-9.0.41/logs \
diytomcat:1.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5、用浏览器访问即可:ip:8081

在这里插入图片描述

问题:启动非常慢

# 在这里大家或许会遇到一个问题:启动非常慢?几分钟或者十几分钟?
# 那么原因我就不说了,直接上解决办法
# 方法一 : 启动的时候加参数即可
[root@wulei tomcatimages]# docker run -d -p 8081:8080 --name mytomcat \
-e JAVA_OPTS="-Duser.timezone=Asia/Shanghai -Djava.security.egd=file:/dev/./urandom" \
-v /home/tomcatimages/webapps:/usr/local/apache-tomcat-9.0.41/webapps \
-v /home/tomcatimages/tomcatlogs:/usr/local/apache-tomcat-9.0.41/logs \
diytomcat:1.0
# 方法二:运行了自己的tomcat之后,进入容器修改文件(用docker exec -it mytomcat /bin.bash)
# 编辑   $JAVA_PATH/jre/lib/security/java.security 这个文件
# 找到: securerandom.source=file:/dev/random 这一行
# 改为: securerandom.source=file:/dev/./urandom
# 重启容器再次访问即可
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

6、发布一个项目(手动创建)

[root@wulei webapps]# mkdir test
[root@wulei webapps]# cd test
[root@wulei test]# mkdir WEB-INF
[root@wulei test]# vim web.xml
[root@wulei test]# cat web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

</web-app>
[root@wulei test]# vim index.jsp
[root@wulei test]# cat index.jsp 
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

发布自己的镜像

DockerHup

1、地址:https://hub.docker.com/ 需要自己注册一个账号

2、登录

3、在我们的服务器上提交自己的镜像

# 登录指令
[root@wulei tomcatimages]# docker login --help

Usage:  docker login [选项] [服务器]

登录docker仓库
如果没有指定服务器,则由守护进程定义默认服务器。

选项:
  -p, --password string   密码
      --password-stdin    从stdin获取密码
  -u, --username string   用户名
  
# 登录  					 docker login -u dockerhup的用户名
[root@wulei tomcatimages]# docker login -u 2921625957
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@wulei tomcatimages]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

4、登录完毕后就可以提交镜像了,就是一步,docker push

# push到dockerhup
[root@wulei tomcatimages]# docker push diytomcat:1.0
The push refers to repository [docker.io/library/diytomcat]
7ab9366e18cf: Preparing 
a647265dd68e: Preparing 
a20a430b30ac: Preparing 
174f56854903: Preparing 
denied: requested access to the resource is denied  # 报错:原因是没有加上dockerhup的用户名

# 改镜像版本                 docker tag  原来的镜像名:版本  / new原来的镜像名:版本 
[root@wulei tomcatimages]# docker tag diytomcat:1.0 2921625957/diytomcat:1.0

# 再次push
[root@wulei tomcatimages]# docker push 2921625957/diytomcat:1.0
# 我这里就不等了,太慢了,直接截图吧
# 觉得慢的可以提交hello-world的镜像玩玩
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述
在这里插入图片描述

阿里云镜像服务

1、登录阿里云

2、找到容器镜像服务

3、创建命名空间

在这里插入图片描述
4、创建镜像仓库(对应docker里面的镜像名比较好)
在这里插入图片描述
在这里插入图片描述
5、修改镜像服务密码

在这里插入图片描述
6、按照阿里云的push命令修改tag

#当你在阿里云创建一个镜像仓库的时候,会有一个仓库的使用说明
  • 1

在这里插入图片描述

# 其中就有一个阿里的专门push的tag命令(每个人的都不一样)
# 登录前先退出DockerHup仓库
$ docker logout
# 登录
$ docker login --username=xxxx registry.cn-beijing.aliyuncs.com
# 改tag      ImageId 也可以为 镜像名:TAG
$ docker tag [ImageId] registry.cn-beijing.aliyuncs.com/wlstudy/linux-docker:[镜像版本号]
# push
$ docker push registry.cn-beijing.aliyuncs.com/wlstudy/linux-docker:[镜像版本号]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

出现下面的即可,慢慢的等待即可

在这里插入图片描述

小结

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/380094
推荐阅读
相关标签
  

闽ICP备14008679号