Docker学习之dockerfile

Docker学习之dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

基础知识

指令语句

指令语句可以大致分为两种:配置指令和操作指令

指令不区分大小写。但是,使用中我们约定大写,以便更轻松地将它们与参数区分开。

这些指令基本上都可以在 docker run命令中使用用相关参数来覆盖掉 Dockerfile相关的值,docker run 的参数优先级高

  • 指令语句的基础知识:
    • 每条保留字指令都必须是大写字母并且后面要跟随至少一个参数
    • 指令按照从上到下,顺序执行
    • # 表示注释
    • 每条指令的执行都会创建一个新的镜像层,注意:过多无意义的层,会造成镜像膨胀过大。

上下文路径

上下文路径:指 docker 在构建镜像时,如果需要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将该路径下的所有内容打包

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

制作dockerfile

基于已有的镜像创建

**docker commit 😗*从容器创建一个新的镜像
#语法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]

常用参数:

  • -a :提交的镜像作者;
  • -c :使用Dockerfile指令来创建镜像;
  • -m :提交时的说明文字;
  • -p :在commit时,将容器暂停。

例如:结合docker cp命令自定义nginx的index页面

docker run -itd --name nginx -p 80:80 192.168.1.214:5000/zhsl/nginx:v1
cd /data
echo "laowan" > /data/index.html
docker cp /data/index.html nginx:/usr/share/nginx/html/index.html
curl localhost
docker container commit -m "update index.html file" -a "laowan" nginx
192.168.1.214:5000/zhsl/nginx:v2
docker images
docker rm -f nginx
docker run -itd --name nginx -p 80:80 192.168.1.214:5000/zhsl/nginx:v2
curl localhost
docker push 192.168.1.214:5000/zhsl/nginx:v2

官网地址

https://docs.docker.com/engine/reference/builder/

Dockerfile其实就是我们用来构建Docker镜像的源码,当然这不是所谓的编程源码,而是一些命令的集 合,只要理解它的逻辑和语法格式,就可以很容易的编写Dockerfile。简单点说,Dockerfile可以让用户 个性化定制Docker镜像。因为工作环境中的需求各式各样,网络上的镜像很难满足实际的需求。

Dockerfile的基本结构

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通
过读取Dockerfile中的指令自动生成映像

docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用 -f 标志指向文件系统中任
何位置的Dockerfile。

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行

Dockerfile分为四部分:基础镜像信息、维护者信息、 镜像操作指令和容器启动时执行指令

Dockerfile文件说明

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声 明以 # 字符开头则被视为注释。可以在Docker文件中使用 RUN , CMD , FROM , EXPOSE , ENV 等指 令。

Dockerfile常见命令

命令解释
FROM指定基础镜像,必须为第一个命令
MAINTAINER维护者(作者)信息
ENV设置环境变量
RUN构建镜像时执行的命令
CMD构建容器后调用,也就是在容器启动时才进行调用
ENTRYPOINT指定运行容器启动过程执行命令,覆盖CMD参数 ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖 ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递 给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆 盖前面的设置,而只执行最后的ENTRYPOINT指令。
ADD将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压), 可以访问网络资源,类似wget
COPY功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
WORKDIR工作目录,类似于cd命令
ARG用于指定传递给构建运行时的变量
VOLUMN用于指定持久化目录
EXPOSE指定于外界交互的端口
USER指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指 定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理 员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

我最近在做canal同步就遇到一个问题,需要同步一个UTC时区的数据到我的数据库中来,所以需要修改mysql官网镜像时区

FROM mysql:8.0.28
# 作者信息
MAINTAINER mysql from date Asia/Shanghai by UTC "laowan" 
ENV TZ UTC

build命令

docker build 命令用于使用 Dockerfile 创建镜像。

docker build [OPTIONS] PATH | URL | -
常用参数

build命令参数特别多。这里只给大家介绍几个常用的参数,如果小伙伴们想了解更多内容,请参考 docker官网手册。

  • –build-arg=[] :设置镜像创建时的变量;
  • -f :指定要使用的Dockerfile路径;
  • –rm :设置镜像成功后删除中间容器;
  • –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置 多个标签。
制作镜像
docker build --rm -t 192.168.1.214:5000/zhsl/mysql:8.0.28
docker images
运行镜像
docker run -itd --name mysql --restart always -p 3306:3306 -e
MYSQL_ROOT_PASSWORD=123456 192.168.1.214:5000/zhsl/mysql:8.0.28
docker logs -f mysql
docker exec -it mysql bash
date
测试mysql连接
docker exec -it mysql bash

制作镜像

#创建目录
mkdir -p /data/mp-user-center
cd /data/mp-user-center
#从项目包中拷贝jar
cp /Users/wanping/IdeaProjects/zhihui/coding/mp-user-center/target/mp-user-center-0.0.1.jar .
#创建dockerfile
touch Dockerfile
vi Dockerfile

dockerfile

FROM openjdk:8-alpine3.9
# 作者信息
MAINTAINER laowan Docker springboot "laowan" 
# 修改源
RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" >/etc/apk/repositories && \
echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >>/etc/apk/repositories
# 安装需要的软件,解决时区问题
RUN apk --update add curl bash tzdata \
    rm -rf /var/cache/apk/*
#修改镜像为美国时区
ENV TZ UST
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 8090
ENTRYPOINT ["java","-jar","/app.jar"]

生成测试镜像

docker build --rm -t zhsl/mp-user-center:0.0.1 --build-arg JAR_FILE=mp-user-center-0.0.1.jar  .

测试、删除镜像

docker run -itd --name mp-user-center -p 8089:8089 zhsl/mp-user-center:0.0.1
docker logs -f mp-user-center
docker stop mp-user-center
docker rm mp-user-center
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值