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

相关推荐
XIAOHEZIcode19 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220701 天前
如何搭建本地yum源(上)
运维
武子康1 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn864 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_5 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化