Docker自娱—6.Dockerfile

Dockerfile是用来构建docker镜像的构建文件,是命令脚本!

可通过脚本一步步生成镜像。镜像是一层层的,对应脚本就是一个个命令


 

基本使用

--- 通过编写dockerfile构建镜像,加深volume的了解 ---

[root@wg ~]# mkdir /home/docker_test  // 本地路径需自建
[root@wg ~]# docker images
REPOSITORY        TAG  IMAGE ID      CREATED       SIZE
docker.io/centos  6    5bf9684f4720  4 months ago  194 MB
docker.io/centos  7    eeb6ee3f44bd  4 months ago  204 MB
docker.io/centos  8    5d0da3dc9764  4 months ago  231 MB
docker.io/centos  5    1ae98b2c895d  5 years ago   285 MB

[root@wg ~]# vi docker_file           // 编写dockerfile
| from docker.io/centos:7             // 要求大写,测试小写
| volume ["volume01", "volume02"]     // 挂载两个目录
| cmd echo "---end---"                // 结束
| cmd /bin/bash

[root@wg docker_test]# docker build -f ./docker_file -t wg/centos .
# 执行镜像生成命令,用刚刚编写的dockerfile创建镜像
# 1.基础镜像来源centos7;在其上有构建了一层。
# 2.-f后边跟的是本地路径,相对路径和绝对路径都可以
# 3.-t后边跟的是给镜像起的名字
# 4..的作用指的是在引擎的当前目录

[root@wg docker_test]# docker images
REPOSITORY       TAG     IMAGE ID      CREATED        SIZE
wg/centos        latest  4ad8458e5d13  2 minutes ago  204 MB
docker.io/centos 7       eeb6ee3f44bd  4 months ago   204 MB

[root@wg ~]# docker run -it --name d01 wg/centos   // 生成容器
# 登入会看到在根目录下有volume01和02两个目录
# 注意,如用-v挂载路径,两个目录挂两次
# 这里只是试验1,实现volume

[root@wg ~]# docker run -it --name d02 -v test1:/volume01 -v test2:/volume02 wg/centos
# 和上边命令有变化,增加了-v挂载;两次
# 这时候可以exit登出后查看volume的变化

[root@wg ~]# docker volume ls              // 查看卷,已经存在
[root@wg ~]# docker volume inspect test1   // 查看卷具体信息 路径有了 图1
[root@wg ~]# docker ps                         // 再用容器id查看
[root@wg ~]# docker container inspect 容器id   // 路径也有了 图2



--- 把新容器目录挂到旧容器目录上,实现数据共享 ---

- d02关于volume;下边的d03关于共享;两种实验

[root@wg ~]# docker run -it --name d03 --volumes-from d01 wg/centos
# volumes-from:数据卷容器——容器间传递共享
# docker默认工作路径在/var/lib/docker,volumes目录就其下
# 实现本地volumes目录下,随机长名称/_data同d01、d03数据共享
# 既d03挂载到d01, d01就是数据卷容器;共享的目录volume01 volume02

# 进入d03或01创建文件,或者本地目录删除文件,都可以同步
# 继续升级,把02的挂载到本地指定位置,再创建04并共享目录

- 总结: 
| 实现容器间配置信息的传递;
| 数据全容器的生命周期一致,持续到没有容器使用为止
| 一旦持久化存储到本地,本地的数据是不会被删除的

[root@wg ~]# docker volume rm -f $(docker volume ls -q)  // 删除所有卷
[root@wg ~]# docker rmi -f 镜像名:tag            // 删不掉镜像要加版本号

commit命令

- commit是通过容器构建镜像
| docker commit -m="提交的表述信息" -a="作者" 容器id 目标镜像名:tag

- dockerfile是通过镜像构建镜像

 

构建解读

1、基本概念

- dockerfile是面向开发的。发布项目、做镜像,就编写dockerfile,这是交付标准。

- dockerfile   构建文件,定义了一切步骤,源代码
- images       通过dockerfile构成镜像,是最终发布和运行产品
- container    容器就是运行起来的镜像,提供服务
- 步骤:开发 部署 运维 缺一不可

2、基本步骤

- 1、编写dockerfile文件
- 2、docker build 构建镜像
- 3、docker run 运行镜像
- 4、docker push 发布镜像(dockerhub、阿里云仓库)

3、步骤事项

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

4、构建指令

FROM              # 基础镜像,一切从这里开始
MAINTAINER        # 镜像是谁写的,姓名+邮箱
RUN               # 镜像构建的时候需要运行的命令
ADD               # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR           # 镜像的工作目录
VOLUME            # 挂载的目录
EXPOSE            # 保留端口配置
CMD               # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT        # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD           # 当构建一个被继承 dockerfile 这个时候就会运行 onbuild 的指令 触发指令
COPY              # 类似ADD 将我们的文件拷贝到镜像中
ENV               # 构建的时候设置环境变量

 

简单示例

1、编写dockerfile

[root@wg test]# vi docker_file_centos.sh
| FROM docker.io/centos:7             // 从centos镜像开始
| MAINTAINER wg<m18610609135@163.com> // 作者及邮箱
|
| ENV MYPATH /usr/local               // 构建环境,mypath和/usr/local是键值对
| WORKDIR $MYPATH                     // cd到/usr/local
|
| RUN yum -y install vim              // 执行下载任务
| RUN yum -y install net-tools        // ipconfig命令在这里边
| 
| EXPOSE 80                           // 暴露80端口 通过-p指定
| 
| ADD https://....                    // 下载,但不能解压
| ADD mysql.5.7.35.tar.gz             // 拷贝进去并解压,可以指定解压目录
| WORKDIR mysql                       // 可以用相对路径,相对的是/usr/local
| COPY my.cnf                         // 把文件拷贝进去
|
| CMD echo $MYPATH                    // echo是在脚本执行过程中输出的
| CMD ehco "---end---"
| CMD /bin/bash

2、创建镜像

[root@wg ~]# docker build -f dockerfile_centos -t my_centos .
# 1. -f 是指定路径,相对路径和绝对路径都可以
# 2. -t 创建的新镜像名和tag
# 3. . 简单说,执行文件所需都上传到一个目录,在这目录里找文件执行

3、生成容器

[root@wg ~]# docker run -it my_centos
# 进入以后检查ifconfig命令
# 查看当前目录  都无问题

4、查看过程

[root@wg ~]# docker images           // 找到镜像的Id
[root@wg ~]# docker history imageid  // 查看镜像的构建过程

 

构建示例


 

指令详解

1、cmd和entrypoint

[root@wg ~]# vi dockerfile_cmd.sh    
| FROM centos
| CMD ["ls","/opt"]

[root@wg ~]# docker build -f dockerfile_cmd -t cmdtest .
[root@wg ~]# dokcer run -it cmdtest         // ls /data命令正常执行
[root@wg ~]# docker run -it cmdtest ls /    // 执行ls /
- 结果:命令被替换了

[root@wg ~]# docker run cmdtest /bin/bash -c "ls -al"  // 写法2

# 总结:运行容器时,cmd指令会被覆盖

[root@wg ~]# vi dockerfile_cmd.sh
| FROM centos
| ENTRYPOINT ["ls","/data"]

[root@wg ~]# docker run cmdtest ls /   // 结果为 执行了 ls / 和 ls data
[root@wg ~]# docker run cmdtest /      // 替换 只执行了 ls /  # 这里有问题,是追加还是替换回头看一下

# 总结:运行容器时,entrypoint,是追加指令;也能完成命令的替换,格式不一样
# 总结:其实替换执行的指令   docker run --entrypoint=ls cmdtest / 
# 示例: docker run mycentos:01 sh -c "ls /"

- 在使用的时候,一般是结合使用
| ENTRYPOINT ["ls"]
| CMD ["/data"]

# 总结:entrypoint一般写固定指令 cmd用来传递参数 必须使用json数组格式

2、WORKDIR和RUN cd

- WORKDIR改变的是环境,登入后在WORKDIR指定路径
- RUN cd 是改变临时工作路径,登入时在WORKDIR路径

3、ADD和COPY

- ADD 能将上传的压缩文件解压,能指定路径
- ADD 后边跟网址能执行下载操作,同样能指定路径

- COPY 仅能上传文件,可指定路径

 

导入导出

- docker镜像导出方式有两种:
| docker save id(name)
| docker export id(name)

- save和export的区别:
| save会保存该镜像的所有历史记录;export不会保留历史记录,即没有commit历史
| save保存的是镜像(image);export保存的是容器(container)
| load用来载入镜像包,import用来载入容器包,但两者都会恢复为镜像;
| load不能对载入的镜像重命名;import可以为镜像指定新名称。

save命令

- 命令格式:docker save [options] images [images...]

[root@wg ~]# docker save -o nginx.tar nginx:latest 
[root@wg ~]# docker save > nginx.tar nginx:latest
 
- -o和>表示输出到文件
- nginx.tar为目标文件
- nginx:latest是源镜像名(name:tag)

load命令

- 命令格式:docker load [options]

[root@wg ~]# docker load -i nginx.tar 
[root@wg ~]# docker load < nginx.tar 

- -i和<表示从文件输入
- 导入镜像及相关元数据,包括tag信息

export命令

- 命令格式:docker export [options] container

[root@wg ~]# docker export -o nginx-test.tar nginx-test
[root@wg ~]# docker export nginx:latest > /home/export.tar

- 导出为tar格式
- -o表示输出到文件
- nginx-test.tar为目标文件
- nginx-test是源容器名(name)
- 也可以是源容器id

import命令

- 命令格式:docker import [options] file|URL|- [REPOSITORY[:TAG]]

[root@wg ~]# docker import nginx-test.tar nginx:imp
[root@wg ~]# cat nginx-test.tar | docker import - nginx:imp

 

上传下载

步骤

- 1.在docker官网注册账号
- 2.开通账号的仓库
- 3.在本地登录自己的注册账号
- 4.确认自己镜像名格式为 注册账号/镜像名:tag
- 5.执行上传

操作

[root@wg ~]# docker login -u xiaorenwudashuju
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@wg ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mysql         test1     e74a7965445b   2 hours ago     448MB

[root@wg ~]# docker tag e74a7965445b xiaorenwudashuju/mysql:test1
[root@wg ~]# docker push xiaorenwudashuju/mysql:test1
[root@wg ~]# docker pull xiaorenwudashuju/mysql:test1

 

Tomcat

1、准备工作

[root@wg dockerfile]# ls         // tomcat jdk 说明文档
apache-tomcat-9.0.56.tar.gz  jdk-8u202-linux-x64.tar.gz  readme.txt

2、编写dockerfile文件

[root@wg dockerfile]# vi Dockerfile  // 用Dockerfile命名可直接识别,不用-f指定

FROM centos:xx
MAINTAINER smitty<m186xxxx@163.com>

COPY readme.txt /usr/local/readme.txt                   // 把文件拷贝进容器内部
ADD jdk-8u202-linux-x64.tar.gz /usr/local/              // ADD可以自动解压
ADD apache-tomcat-9.0.56.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_202
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.56
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.56

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

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.56/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.56/bin/logs/catalina.out

3、构建镜像;生成容器;进入容器

[root@wg dockerfile]# docker build -t diytomcat .

[root@wg dockerfile]# docker run -d -p 9090:8080 --name smitty_tomcat -v /home/smitty/build/tomcat/test:/usr/local/apache-tomcat-9.0.56/webapps/test -v /home/smitty/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.56/logs diytomcat

[root@wg dockerfile]# docker ps

[root@wg dockerfile]# docker exec -it 容器id /bin/bash

 

示例升级

mkdir /home/smitty/build/tomcat/test/WEB-INF

创建两个文件 index.jsp  web.xml 并编辑相关网页内容
## 问题应该出在两个文件上了,前端呀。。买马匹。。。
-----------------------------

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
Hello World!<br/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>

-------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                           http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
       version="2.5">

</web-app>

--------------------------------

# 访问localhost:9090/test 就能查看到自己生成的网页
# 和之前的实验一样,没搞明白哪里有坑,这回做到第三遍才成功
posted @   梵高de画笔  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示