Docker 镜像的创建 【docker (四)】

目录

1.基于现有镜像创建

[1.1 启动容器并做修改](#1.1 启动容器并做修改)

[1. 首先,通过 docker create 启动一个容器并进入其 bash 环境:](#1. 首先,通过 docker create 启动一个容器并进入其 bash 环境:)

[2. 查看当前容器的状态:](#2. 查看当前容器的状态:)

[3. 修改容器内部的环境(例如安装软件包、修改配置文件等),然后退出容器。](#3. 修改容器内部的环境(例如安装软件包、修改配置文件等),然后退出容器。)

[1.2 提交容器为新的镜像](#1.2 提交容器为新的镜像)

[2 基于本地模板创建](#2 基于本地模板创建)

[2.1 下载操作系统模板](#2.1 下载操作系统模板)

[3 基于 Dockerfile 创建](#3 基于 Dockerfile 创建)

[3.1 Docker 镜像的分层结构](#3.1 Docker 镜像的分层结构)

[3.2 Dockerfile 操作常用指令](#3.2 Dockerfile 操作常用指令)

[3.3 Dockerfile 示例](#3.3 Dockerfile 示例)

[3.4 构建镜像](#3.4 构建镜像)

[3.5 镜像的分层和缓存](#3.5 镜像的分层和缓存)

[4 总结](#4 总结)

[5.Docker Compose 编排](#5.Docker Compose 编排)

[1 简介](#1 简介)

[2 项目结构](#2 项目结构)

[2.1 Docker Compose 环境安装](#2.1 Docker Compose 环境安装)

[3 YAML 文件格式及编写注意事项](#3 YAML 文件格式及编写注意事项)

[3.1 YAML 基本语法](#3.1 YAML 基本语法)

[3.2 Docker Compose配置常用字段](#3.2 Docker Compose配置常用字段)

[3.3 Docker Compose 常用命令](#3.3 Docker Compose 常用命令)

[3.5 YAML 示例](#3.5 YAML 示例)

[4 准备 Nginx 配置](#4 准备 Nginx 配置)

[5 编写 docker-compose.yml](#5 编写 docker-compose.yml)

[6 启动服务](#6 启动服务)


Docker 提供了多种方式来创建镜像,常见的有三种方法:基于已有镜像创建、基于本地模板创建和基于 Dockerfile 创建。以下是这三种方法的详细介绍。

1.基于现有镜像创建

1.1 启动容器并做修改

1. 首先,通过 docker create 启动一个容器并进入其 bash 环境:

docker create -it centos:7 /bin/bash

docker create -it centos:7 /bin/bash

2. 查看当前容器的状态:

docker ps -a

3. 修改容器内部的环境(例如安装软件包、修改配置文件等),然后退出容器。

1.2 提交容器为新的镜像

完成容器内的修改后,可以通过 docker commit 命令将容器提交为新的镜像:

docker commit -m "new" -a "centos" 000550eb36da centos:test

  • -m: 提交说明。
  • -a: 作者信息。
  • 000550eb36da: 容器 ID。
  • centos:test: 创建的新镜像名称。

查看创建的新镜像:

docker images

2 基于本地模板创建

通过导入模板文件,可以创建一个新的镜像。模板通常可以从开源项目(如 OPENVZ)中获取。

2.1 下载操作系统模板

例如,下载 Debian 模板:

下载地址为 http://openvz.org/Download/template/precreated

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

也可以使用 curl 下载:

curl -L 下载路径 -o 保存路径

wget

这里 debian:test 是新创建的镜像名称。

3 基于 Dockerfile 创建

Dockerfile 是一个文本文件,其中包含了一系列的指令,每个指令创建一个新的镜像层。通过 Dockerfile,我们可以实现镜像的自动化构建。

3.1 Docker 镜像的分层结构

  • **镜像分层:**Docker 镜像不是单一文件,而是由多层文件系统组成。每执行一条 Dockerfile 指令,都会生成新的镜像层。容器启动时会在镜像的只读层上添加一层可读写层。
  • **镜像缓存:**Docker 会缓存每一层的镜像,如果某一层的内容没有变化,则会复用缓存层,以提高构建效率。

3.2 Dockerfile 操作常用指令

以下是 Dockerfile 中常用的指令:

1. FROM

指定新镜像基于的基础镜像,Dockerfile 的第一条指令必须为 FROM

FROM centos:7

2. MAINTAINER

指定镜像的维护者信息:

MAINTAINER "John Doe <johndoe@example.com>"

3. RUN

执行命令并将结果提交到镜像中。常用来安装软件包、修改配置等。

RUN yum install -y httpd

包括系统内的所有的基础命令

4. ENTRYPOINT

设置容器启动时默认执行的命令:

ENTRYPOINT ["httpd"]

5. CMD

容器启动时执行的默认命令。CMD 指令会被 docker run 命令后指定的命令覆盖。

CMD ["httpd", "-D", "FOREGROUND"]

6. EXPOSE

声明容器内的端口:

EXPOSE 80

7. ENV

设置环境变量:

ENV MY_VAR=my_value

8. ADD

将文件或目录从宿主机复制到镜像中,支持从 URL 下载文件,并能自动解压归档文件:

ADD myfile.tar.gz /app

9. COPY

将本地文件或目录复制到镜像中:

COPY . /app

10. VOLUME

在容器中创建挂载点:

VOLUME ["/data"]

11. USER

设置容器内运行命令时的用户:

USER root

12. WORKDIR

WORKDIR /app

13. ONBUILD

设置当该镜像作为基础镜像时,后续 Dockerfile 执行的命令:

ONBUILD RUN echo "Building from base image"

14. HEALTHCHECK

设置容器的健康检查:

HEALTHCHECK CMD curl --fail http://localhost:8080 || exit 1

3.3 Dockerfile 示例

以下是一个简单的 Dockerfile 示例:

3.4 构建镜像

使用以下命令构建镜像:

docker build -t my-web-server .

这将根据当前目录下的 Dockerfile 构建一个名为 my-web-server 的镜像。

3.5 镜像的分层和缓存

  • 每一条 Dockerfile 指令都会创建一个新的镜像层。
  • Docker 会缓存每一层的镜像,只有在指令或文件发生变化时,才会重新构建该层及其之后的层。
  • 镜像层是不可变的,删除容器时只会删除其上面的读写层,底层的镜像层不会丢失。

4 总结

  • **基于现有镜像创建:**通过修改容器并提交为新的镜像。
  • **基于本地模板创建:**从模板文件导入创建镜像。
  • **基于 Dockerfile 创建:**通过编写 Dockerfile 来定制镜像,支持自动化构建。

5.Docker Compose 编排

1 简介

2 项目结构

2.1 Docker Compose 环境安装

3 YAML 文件格式及编写注意事项

YAML(YAML Ain't Markup Language)是一种简洁的数据序列化格式,常用于配置文件。它比 JSON 更加简洁易读,并且支持更复杂的数据结构。使用 YAML 编写 Docker Compose 配置文件时,有几个注意事项:

3.1 YAML 基本语法
  • **大小写敏感:**YAML 是大小写敏感的,所以一定要注意区分大小写。
  • **缩进:**YAML 使用空格进行缩进,不支持 TAB 缩进。通常推荐使用两个空格作为一个层级的缩进。
  • **列表:**列表项使用 -(短横线)表示。
  • **字典:**字典使用 :(冒号)连接键值对,冒号后面需要加一个空格。
  • **注释:**使用 # 来添加注释。
  • **字符串:**如果字符串包含特殊字符,可以使用单引号 ' 或双引号 " 来包裹。
3.2 Docker Compose配置常用字段
3.3 Docker Compose 常用命令

Docker-Compose文件架构

3.5 YAML 示例

① 准备依赖文件

② 编写配置文件docker-compose.yml

4 准备 Nginx 配置

在 nginx/nginx.conf 中,配置 Nginx 作为反向代理,转发请求到 Tomcat 服务:

  • proxy_pass http://tomcat:8080 表示将请求转发到名为 tomcat 的服务(在 Compose 中,这个名称会自动解析为 Tomcat 容器的名称)。
  • 配置 proxy_set_header 是为了确保转发请求时,Nginx 会把客户端的 IP 和请求头传递给后端服务器。

5 编写 docker-compose.yml

接下来,我们编写 docker-compose.yml 配置文件,定义 Nginx 和 Tomcat 两个服务。以下是一个完整的示例:

  • depends_on 确保 Nginx 服务启动时,Tomcat 服务已启动并运行。
  • networks 部分将两个服务连接到同一个 Docker 网络 app_network,保证它们之间可以相互通信。

6 启动服务

完成以上配置后,可以通过 docker-compose 启动项目:

cd /opt/compose_nginx_tomcat

docker-compose up -d

相关推荐
张某人的胡思乱想2 小时前
周末随笔-整理ubuntu环境
linux·运维·ubuntu
翔云 OCR API2 小时前
智能发票查验接口在财务自动化中的技术实现与应用价值
linux·运维·自动化
盛世宏博北京2 小时前
从服务器机房到 IDC 集群:网口温湿度变送器的全场景适配监控
运维·服务器
RPA机器人就选八爪鱼2 小时前
RPA在银行IT运维领域的应用场景与价值分析
大数据·运维·数据库·人工智能·机器人·rpa
心无旁骛~3 小时前
ModelEngine Nexent 智能体从创建到部署全流程深度体验:自动化利器让 AI 开发效率拉满!
运维·人工智能·自动化
G_H_S_3_3 小时前
【网络运维】OpenStack镜像管理:Glance篇
linux·运维·openstack
Muscleheng3 小时前
Linux安装LibreOffice
linux·运维·服务器
广东大榕树信息科技有限公司4 小时前
如何利用机房动环监控系统提升运维效率与安全性?
运维·网络·物联网·国产动环监控系统·动环监控系统
幺零九零零4 小时前
Docker底层-Namespaces
运维·docker·容器