docker 高级篇

一、DockerFile

1.1、概述

dockerfile 是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

为什么要有dockerfile呢
在基础篇我们讲过,比如我们下载个 ubuntu镜像里面不包含 vim、ifconfig等组件,这个时候 新增功能后,用 docker commit 命令进行提交。但需要的功能时随时变化的,就需要很多commit。那么可以一次性搞定吗,这个就需要用到 dockerfile,给某个镜像多个list功能清单,dockerfile进行一次提交。

步骤
1、编写dockerFile文件
2、docker build命令构建镜像
3、docker run 运行镜像成容器

1.2、dockerFile 常用的保留字指令

以 tomcat 的dokerFile为例

在这里插入图片描述

1、FROM
指定一个已经存在的镜像作为模板,第一条必须是from

2、MAINTAINER
镜像维护者的姓名和邮箱地址

3、RUN:容器构建时需要运行的命令
两种格式:

  1. shell格式:
    在这里插入图片描述

  2. exec格式:
    在这里插入图片描述

4、EXPOSE:当前容器对外暴露的端口

5、WORKDIR :指定创建容器后,终端默认登陆的进来工作目录。
比如创建一个 ubuntu容器,并打开终端 pwd可以看到当前工作目录是根目录:/ 。WORKDIR 就是指定这个工作目录

6、USER:指定该镜像以什么用户去执行,如果不指定,默认 root (一般不指定)

7、ENV:设置dockerFile脚本中的环境变量
如:ENV MY_PATH /user/mytest :设置环境变量
WORKDIR $MY_PATH 使用这个环境变量

8、VOLUME:容器数据卷,用于数据保存和持久化工作

9、ADD:将宿主机的文件 拷贝进镜像 并自动处理 URL和解压 tar压缩包
如 ADD /APP/JDK8.tar 把jdk压缩包copy进镜像

10、COPY:将宿主机文件 copy到 容器指定路径(不存在自动创建)
COPY src dest

11、CMD:指定容器要做的工作
在这里插入图片描述
注意: 可以有多个CMD指令,但只有最后一个生效,CMD会被 docker run 之后的参数替换
比如 tomcat 的dockerFile 最后一个是 :CMD [“catalina.sh”, “run”] ,表示 容器启动的 运行服务器
如果 我们在 虚拟机执行 docker run -it - p 8080:8080 tomcat /bin/bash 这个命令(正常时不需要加/bin/bash的),那么就相当于在 dockerFile最后又加了 CMD [“/bin/bash”,“run”] ,那个 CMD [“catalina.sh”, “run”] 就会被覆盖掉,导致 tomcat容器运行 但是服务没起来。

12 、ENTRYPOINT:指定容器运行时的命令
类似于CMD,但不会被run后面的命令覆盖,并且会将 run后面的参数 送给ENTRYPOINT 指令指定的程序

ENTRYPOINT 可以和CMD一起使用,但一般变参才会使用到CMD == 给ENTRYPOINT传参
ENTRYPOINT CMD组合,将CMD的内容作为参数传递给ENTRYPOINT 指令
如:

ENTRYPOINT ["nginx","-c"] #定参 -c 是指定配置文件启动
CMD [“/nginx/nginx.conf”] # 变参 配置文件
  1. 当在docker中执行命令 :docker run niginx 就 等于 执行 docker run nginx -c /nginx/nginx.conf
    将CMD 作为参数传给 ENTRYPOINT 的指定程序:-c
  2. 当在docker中执行命令 :docker run niginx -c /nginx.conf 就 等于 执行 docker run nginx -c /nginx.conf
    由于 CMD是会别覆盖的,run命令后 -c 给了参数,就会覆盖 CMD的命令 就会使用 run命令后的配置文件,CMD的参数作废。

1.2.1、CMD和RUN的区别

CMD:是在容器运行时执行
RUN:是在容器构建时运行

1.3、实战

1.3.1、自定义镜像 mycentosjava8

注意:centos 要pull 7 版本,不然会报错。。 :docker pull centos:7,下图是最新版 结果报错了
基础镜像什么都没有,新增java8、vim、ifconfig
在这里插入图片描述
先下载 jdk (这样就不用安装docker了):jdk8下载地址选X64 linux - tar.gz这个

在这里插入图片描述

1、编程Dockerfile

Dockerfile 和tar/jar包在统一目录下才可以直接使用 tar/jar的名字,否则就要用绝对路径。

FROM centos:7
MAINTAINER ls<ls@126.com>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_351
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
2、构建镜像

在myfile目录下

docker build -t centosjava8:1.5 .

在这里插入图片描述运行并进入构建的镜像,发现当前目录正是在 Dockerfile中设置的工作目录
该容器也包含了 需要的 vim 、ifconfig、 java8 的环境
在这里插入图片描述

1.3.2、虚悬镜像

在构建或者删除镜像时出现错误,导致出现镜像仓库 和 tag为 的情况
在这里插入图片描述
查看所有虚悬镜像

 docker image ls -f dangling=true 

一定把它 删除掉!!! : 用这个命令删除

docker image prune # 删除虚悬镜像

注意:如果此时删不掉,先执行下列命令
docker ps -a # 查看历史运行容器
找到虚悬镜像ID 对应的容器id
docker rm -f 容器Id :先将容器删除 再执行 :docker image prune

二、微服务jar部署在容器中

1、win10下文件上传到centos

下载pscp.exe
在这里插入图片描述
安装一下,pscp.exe拷贝到C:\Windows\System32
在这里插入图片描述

然后 win10下cmd命令
pscp 要上传的文件路径 root@虚拟机IP:/虚拟机文件地址

pscp C:\Users\86130\Desktop\仙启产品工具包\响水\demo3\target\demo-0.0.1-SNAPSHOT.jar root@192.168.225.129:/home

已经传到 虚拟机中
在这里插入图片描述

2、编写Dockerfile

Dockerfile 和tar/jar包在统一目录下才可以直接使用 tar/jar的名字,否则就要用绝对路径

FROM java:8
# 作者
MAINTAINER ls
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD hello.jar hello.jar
# 运行jar包
RUN bash -c 'touch /hello.jar'
ENTRYPOINT ["java","-jar","/hello.jar"]
#暴露6001端口作为微服务
EXPOSE 8080

3、构建成镜像

在和 dockerdile 目录下执行

docker build -t lsjava:1.6 .

在这里插入图片描述

4、运行

docker run -d -p 8080:8080 lsjava:1.6

可以把-d换成 -it 可以在看到日志,或者 -d 运行成功后 docker exec -it 容器id 进入容器也可以看到日志
在这里插入图片描述
访问成功
在这里插入图片描述

其他暂时用不到就没学,等有时间再补上!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值