IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Docker系列六:Dockerfile构建镜像 -> 正文阅读

[系统运维]Docker系列六:Dockerfile构建镜像

目录

一:Dockerfile是什么

1.1:介绍

1.2:构建三步骤

二:Dockerfile构建过程解析

2.1:Dockerfile内容基础知识

2.2:Docker执行dockerfile的大致流程

2.3:Dockerfile构建过程总结

三:Dockerfile保留字指令

FROM

MAINTAINER

RUN

EXPOSE

WORKDIR

ENV

ADD

COPY

VOLUNE

CMD

ENTRYPOINT

ONBUILD

四:docker build构建镜像命令

演示案例docker 安装 mysql5.6 并提交到阿里云

阿里云创建命名空间

?阿里云创建仓库

本地推送到阿里云

测试案例一:对比CMD与ENTRYPOINT的区别

测试案例二 - 构建自定义镜像-mycentos


一:Dockerfile是什么

1.1:介绍

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

1.2:构建三步骤

编写Dockerfile文件 --> docker build --> docker run

二:Dockerfile构建过程解析

2.1:Dockerfile内容基础知识

  1. 每条保留字指令都必须为大写且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

2.2:Docker执行dockerfile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚刚提交的镜像运行一个新的容器
  5. 执行Dockerfile中的下一条指令直到所有指令都执行完成

2.3:Dockerfile构建过程总结

????????Dockerfile,Docker镜像,Docker容器分别代表三个不同的阶段。

  1. Dockerfile是软件的原材料
  2. Docker镜像是软件的交付品
  3. Docker容器是软件的运行态

????????Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力完成Docker体系的基石

三:Dockerfile保留字指令

  1. FROM

    1. 基础镜像,当前镜像是基于哪个镜像
  2. MAINTAINER

    1. 镜像维护者的姓名和邮箱地址
  3. RUN

    1. 容器构建需要运行的命令
      RUN set -x; buildDeps='gcc libc6-dev make wget' \
          && apt-get update \
          && apt-get install -y $buildDeps \
          && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
          && mkdir -p /usr/src/redis \
  4. EXPOSE

    1. 当前容器对外暴露的端口
  5. WORKDIR

    1. 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
  6. ENV

    1. 用来在构建镜像过程中设置环境变量
    2. ENV MY_PATH /usr/mypath 这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样,也可以在其他指令中直接使用这些环境变量。?
  7. ADD

    1. 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理url和解压tar压缩包
  8. COPY

    1. 类似ADD拷贝文件和目录到镜像中,从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内<目标路径>
    2. COPY src dest 或者 COPY ["src", "dest"]
      COPY [--chown=<user>:<group>] <源路径>... <目标路径>
      
      COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
  9. VOLUNE

    1. 容器数据卷,用于数据保存和持久化工作
  10. CMD

    1. 指定一个容器启动时要运行的命令
    2. Dockerfile中可以有多个CMD指令
    3. 容器启动命令
      推荐使用exec格式
      
      shell 格式:CMD <命令>
      
      exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
      
      CMD ["nginx", "-g", "daemon off;"]
  11. ENTRYPOINT

    1. 指定一个容器启动时要运行的命令
    2. ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序与参数
  12. ONBUILD

    1. 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

四:docker build构建镜像命令

构建镜像 - 在 Dockerfile 文件所在目录执行:
docker build -f /home/docker/myip/DockerfileCmd -t nginx:v3 .
    -f Dockerfile文件的绝对路径
    -t 仓库name:tag
    后面的. 标识<上下文路径/URL/->
      
  一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。  
 所有需要的文件都放到当前目录下(镜像构建上下文(Context)
 如果该目录下没有所需文件,那么应该把所需文件复制一份过来
 docker build 命令会将该目录下的内容打包交给 Docker 引擎以帮助构建镜像
 如果目录下有些东西确实不希望构建时传给 Docker 引擎,
 那么可以用 .gitignore 一样的语法写一个 .dockerignore,
 该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。
 
实例解读- build的过程
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM nginx
 ---> e43d811ce2f4
Step 2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
 ---> Running in 9cdc27646c7b
 ---> 44aa4490ce2c
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c

解读过程:
Step 1: 表明根镜像
Step 2 RUN 指令启动了一个容器 9cdc27646c7b,执行了所要求的命令,
并最后提交了这一层 44aa4490ce2c,随后删除了所用到的这个容器 9cdc27646c7b

演示案例docker 安装 mysql5.6 并提交到阿里云

docker search mysql
docker pull mysql:5.6
运行容器
docker run -p 12345:3306 --name mysql5.6 \
--mount type=bind,source=/home/docker/mysql5.6/conf,target=/etc/mysql/conf.d \
--mount type=bind,source=/home/docker/mysql5.6/logs,target=/logs \
--mount type=bind,source=/home/docker/mysql5.6/data,target=/var/lib/mysql \
# -v /home/docker/mysql5.6/conf:/etc/mysql/conf.d \
# -v /home/docker/mysql5.6/logs:/logs \
# -v /home/docker/mysql5.6/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.6

使用:
 docker exec -it bc42425282a8 /bin/bash
 mysql -u root -p
备份数据:
docker exec bc42425282a8 sh -c 'exec mysqldump --all-databases -uroot -p "12345"' > /tmp/database.sql
 
 提交容器到阿里云
 1: 在阿里云后台创建好命名空间,与镜像仓库 - 见下图
 2: 提交生成新的镜像 commit -a 作者信息 -m '描述'
 docker container commit -a iwester -m 'my mysql5.6' bc42425282a8 my_mysql:1.0
3: docker login --username=180****0076 registry.cn-hangzhou.aliyuncs.com
4:docker tag 镜像ID registry.cn-hangzhou.aliyuncs.com/iwester-test/my_mysql:[镜像版本号]
5:docker push registry.cn-hangzhou.aliyuncs.com/iwester-test/my_mysql:[镜像版本号]

阿里云创建命名空间

?阿里云创建仓库

本地推送到阿里云

测试案例一:对比CMD与ENTRYPOINT的区别

镜像名后面的是command,运行时会替换CMD的默认值,但是会追加在ENTRYPOINT的后面

-- 利用curl -s -i 命令演示

# cmd镜像 Dockerfile
mkdir mycentos
cd mycentos

vim DockerfileCmd
FROM centos
RUN yum install -y curl
CMD ["curl", "-s", "http://icanhazip.com"]

# 构建cmd镜像
docker build -f /home/docker/myip/DockerfileCmd -t iwester/myip:1.1 .

# docker run -it iwester/myip:1.1  -> 正常输出ip
# 如果想达到 curl -s http://icanhazip.com -i
带参数执行 docker run -it iwester/myip:1.1 -i
--- 报错 exec: "-i": executable file not found in $PATH: unknown.
    因为跟在镜像名后面的是command,运行时会替换CMD的默认值
    因此这里的-i替换了原来的CMD,而不是添加在原来的curl -s 的后面,
    而-i不是一个命令, 所以会报错
    真正执行的是:curl -i
# ENTRYPOINT镜像 Dockerfile
mkdir mycentos
cd mycentos

vim DockerfileEnt
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl", "-s", "http://icanhazip.com"]

# 构建ENTRYPOINT镜像
docker build -f /home/docker/myip/DockerfileEnt -t iwester/myip:1.2 .

# docker run -it iwester/myip:1.2  -> 正常输出ip
#如果想达到 curl -s -i http://icanhazip.com
带参数执行:docker run -it iwester/myip:1.2 -i   -> 正常输出 
HTTP/1.1 200 OK
....

真正执行的是:curl -s http://icanhazip.com -i

测试案例二 - 构建自定义镜像-mycentos

?????? --- 构建一个拥有vim与ifconfig镜像,工作目录/usr/local

基础版的centos是简洁的没有vim与ifconfig命令,
mkdir mycentos
cd mycentos
vim Dockerfile
FROM centos
MAINTAINER iwester<iwester@163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success -- "
CMD /bin/bash
开始使用Dockerfile构建镜像
docker build -f /home/docker/mycentos/Dockerfile -t iwester/mycentos:1.1 .
    Sending build context to Docker daemon  2.048kB
    Step 1/9 : FROM centos
    Step 2/9 : MAINTAINER iwester<iwester@163.com>
    Step 3/9 : ENV MYPATH /usr/local
    Step 4/9 : WORKDIR $MYPATH
    Step 5/9 : RUN yum -y install vim net-tools
    Step 6/9 : EXPOSE 80
    Step 7/9 : CMD echo $MYPATH
    Step 8/9 : CMD echo "success -- "
    Step 9/9 : CMD /bin/bash
    Successfully built 4475f3cfa400
    Successfully tagged iwester/mycentos:1.1
查看我们构建的镜像
docker history iwester/mycentos:1.1

运行镜像可以查看工作目录与vim,ifconfig 都可以使用

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:39:50  更:2021-10-09 16:40:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:29:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码