赞
踩
dockerfile是用来构建docker镜像的文件!: 命令参数脚本
构建步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push发布镜像 (DockerHup、阿里云镜像仓库!)
查看官方是怎么做的:以centos为例
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那么我们也可以!
基础知识:
1、每个保留关键字(指令)都必须保存大写
2、执行从上到下顺序执行
3、# 代表注释
4、每一个指令都会创建提交一个新的镜像层并提交!
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
步骤:开发、部署、运维
DockerFile:构建文件,定义了一切的步骤,好比源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务器
# FROM : 基础镜像,一切从这里开始构建
# MAINTAINER : 镜像是谁写的,姓名+邮箱
# RUN : 镜像构建的时候需要运行的命令
# ADD : 例如:步骤:tomcat镜像,这个tomcat压缩包!添加内容
# WORKDIR : 镜像的工作目录
# VOLUME : 容器需要挂载的目录
# EXPOSE : 暴露端口配置,如果没有写,需要 -v 指定
# CMD : 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
# ENTRYPOINT : 指定这个容器启动的时候要运行的命令,可以追加命令
# ONBUILD : 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令
# COPY : 类似ADD命令,将我们的文件拷贝到镜像中
# ENV : 构建的时候设置环境变量
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
我们来对比一下原生的centos和我们刚刚自己生成的centos
原生的:
我们自己的:
我们可以列出本地进行的变更历史:
docker history xxx
# CMD : 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
# ENTRYPOINT : 指定这个容器启动的时候要运行的命令,可以追加命令
测试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
测试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、准备镜像文件: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
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
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
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
# 重启容器再次访问即可
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、地址: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]#
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、创建镜像仓库(对应docker里面的镜像名比较好)
5、修改镜像服务密码
6、按照阿里云的push命令修改tag
#当你在阿里云创建一个镜像仓库的时候,会有一个仓库的使用说明
# 其中就有一个阿里的专门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:[镜像版本号]
出现下面的即可,慢慢的等待即可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。