Docker--镜像结构

本文围绕Docker展开,介绍了Docker镜像,它是只读模板,是启动容器的基础,具有分层结构,可共享资源。还说明了如何使用镜像开启并运行容器,在容器层进行修改操作。最后讲解了将创建的容器重新打包为镜像的方法,如ubuntu:v2就是在ubuntu镜像基础上多添加一层生成的。

一.Docker镜像的简单概述

Docker镜像是一个只读的Docker容器模板,含有启动Docker容器所需的文件系统结构及其内容,因此是启动一个Docker容器的基础。

Docker镜像的文件内容以及一些运行Docker容器的配置文件组成了Docker容器的静态文件系统运行环境–rootfs。可以这么理解,Docker镜像是Docker容器的静态视角,Docker容器是Docker镜像的运行状态
二.镜像的分层结构
特点

  • 1.共享宿主机的内核
  • 2.base镜像提供的是最小的linux发行版
  • 其实就是linux的根/文件系统
  • 3.同一docker主机支持运行多种linux发行版
  • 4.采用分层结构的做大好处是“共享资源”
    不同的镜像使用同一个镜像层的时候,文件系统便可以实现资源共享,只需要备份一次,节省空间。

在这里插入图片描述
查看分层结构的命令

docker load -i 镜像名 #拉取镜像

[root@lucky1 ~]# docker load -i ubuntu.tar        拉取本地镜像
56abdd66ba31: Loading layer  196.8MB/196.8MB
9468150a390c: Loading layer  208.9kB/208.9kB
11083b444c90: Loading layer  4.608kB/4.608kB
5f70bf18a086: Loading layer  1.024kB/1.024kB
Loaded image: ubuntu:latest
[root@lucky1 ~]# docker load -i rhel7.tar
e1f5733f050b: Loading layer  147.1MB/147.1MB
[root@lucky1 ~]# docker load -i busybox.tar
8a788232037e: Loading layer   1.37MB/1.37MB
Loaded image: busybox:latest

docker images #查看所有已经拉取的镜像

[root@lucky1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              59788edf1f3e        9 months ago        1.15MB
game2048            latest              19299002fdbe        2 years ago         55.5MB
ubuntu              latest              07c86167cdc4        3 years ago         188MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

dcoker history 镜像名称 # 查看特定进行的构造,一层一层

[root@lucky1 ~]# docker history  ubuntu:latest
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
07c86167cdc4        3 years ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0B                  
<missing>           3 years ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   1.9kB               
<missing>           3 years ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli…   195kB               
<missing>           3 years ago         /bin/sh -c #(nop) ADD file:b9504126dc5590898…   188MB  
使用镜像开启并运行一个容器

镜像作为开启容器的模板。使用镜像创建并且运行一个容器,就是在镜像层的最上层添加一层容器层。所有的镜像层都是只读的容器层是可写的,容器开启之后,所有的修改该作都保存在可写的容器层。

容器以下所有镜像曾都是只读的,docker查找文件时是从上往下依次查找;容器层用来保存镜像变化的部分,并不会对镜像本身进行任何修改;一个镜像最多可以有127层

docker容器进行可写时,是在可写容器层进行可写动作,经底层镜像层的文件会先复制到可写层再执行删除、创建等动作

在这里插入图片描述

使用镜像创建并运行一个容器:

[root@lucky1 ~]# docker run -it --name vm1 ubuntu
#-it  交互式   --name 容器名称   
root@927ae4d1dca7:/# uname -r  # 查看容器的内核版本
3.10.0-514.el7.x86_64   # 显示
root@927ae4d1dca7:/# touch /mnt/file{1..5}    # 在容器中创建文件。写入内容
root@927ae4d1dca7:/# ls /mnt/
file1  file2  file3  file4  file5   #成功创建5个文件

退出该容器查看系统的内核版本

[root@lucky1 ~]# uname -r
3.10.0-514.el7.x86_64           容器使用的是该宿主机的内核

清除非活跃的容器:
docker container prune

[root@lucky1 ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
90899407c41e9a8e7f2378e8deb7e3edb9134ab82f99ef779a80a42ef378192f

Total reclaimed space: 41B

再次使用上次使用镜像创建并运行一个容器

[root@lucky1 ~]# docker run -it --name vm2 ubuntu
root@0121cb49341b:/# ls /mnt/
root@0121cb49341b:/#
  # 这里并没有上次创建的文件,是因为上次的操作全部写在容器层,镜像层的内容只读。
  当上次的容器释放之后,写在容器层的内容也会随之消失。

将创建的容器重新打包为一个镜像

在容器中进行创建文件

root@0121cb49341b:/# touch /mnt/file{1..5}
root@0121cb49341b:/# ls /mnt/
file1  file2  file3  file4  file5

将该容器重新打包成一个镜像:

[root@lucky1 ~]# docker ps -a          查看容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                         NAMES
0121cb49341b        ubuntu              "/bin/bash"              2 minutes ago       Exited (0) 3 seconds ago                                 vm2
cfa701051e0d        game2048            "/bin/sh -c 'sed -i …"   19 minutes ago      Up 19 minutes              0.0.0.0:80->80/tcp, 443/tcp   vm1
[root@lucky1 ~]# docker commit vm2 ubuntu:v2          将该容器打包成一个新的镜像
sha256:d0db373a10fbae6fbdd75c9b077ef68de3d7fdf14fa6ea5823e1fdf4b42487d3
[root@lucky1 ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              v2                  d0db373a10fb        8 seconds ago       188MB         新生成的镜像
busybox             latest              59788edf1f3e        9 months ago        1.15MB
game2048            latest              19299002fdbe        2 years ago         55.5MB
ubuntu              latest              07c86167cdc4        3 years ago         188MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

使用容器创建镜像。容器就是在镜像层的最上方存在一个可写的容器层。将容器打包镜像,就是将该可写的容器层,变成一个只读的镜像层,和下层的所有镜像层一起作为新镜像的镜像层。

以上例子中镜像ubuntu:v2 是在ubuntu镜像打开容器的基础上生成的。查看他们的镜像分层。

[root@lucky1 ~]# docker history ubuntu:v2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
d0db373a10fb        3 minutes ago       /bin/bash                                       43B                 
07c86167cdc4        3 years ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0B                  
<missing>           3 years ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   1.9kB               
<missing>           3 years ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli…   195kB               
<missing>           3 years ago         /bin/sh -c #(nop) ADD file:b9504126dc5590898…   188MB 

[root@lucky1 ~]# docker history ubuntu
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
07c86167cdc4        3 years ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0B                  
<missing>           3 years ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   1.9kB               
<missing>           3 years ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli…   195kB               
<missing>           3 years ago         /bin/sh -c #(nop) ADD file:b9504126dc5590898…   188MB  
ubuntu:v2 是在ubuntu镜像基础上多添加了一层

删除容器:

[root@lucky1 ~]# docker rm vm2
vm2

删除镜像:

[root@lucky1 ~]# docker image rm ubuntu:v2
Untagged: ubuntu:v2
Deleted: sha256:d0db373a10fbae6fbdd75c9b077ef68de3d7fdf14fa6ea5823e1fdf4b42487d3
Deleted: sha256:350460dc71227e1829308eb921ce0a1fe78a05498103727bbc4739c37a38af26
<think>首先,用户询问使用docker-compose构建镜像的方法。我需要根据提供的引用内容来回答。让我回顾一下系统级指令: - 所有行内数学表达式必须使用$...$格式,但在这个上下文中,似乎没有数学表达式,所以我可能不需要使用它。 - 独立公式必须使用$$...$$并单独成段,同样,这里没有公式。 - LaTeX语法正确:确保代码块或数学公式正确。 - 使用中文回答:整个回答必须是中文。 - 生成相关问题:在回答末尾生成相关问题。 - 引用标识:在引用的段落末尾自然地添加引用标识,如[^1]。 用户提供了引用内容: - 引用[1]:列出了docker-compose的命令行操作,包括docker-compose build构建或重新构建服务镜像[^1]。 - 引用[2]:讨论了dockerfile-maven-plugin调用docker build命令来构建镜像[^2]。 - 引用[3]:提到docker load -i 镜像.tar.gz来加载镜像[^3]。 - 引用[4]:Dockerfile + docker-compose构建java镜像并运行服务[^4]。 用户的问题是:"我想查找使用docker-compose构建镜像的方法 请问使用docker-compose构建镜像的方法" 所以,焦点是使用docker-compose构建镜像。我需要参考这些引用来构建回答。 从引用[1]中,docker-compose build构建或重新构建服务镜像[^1]。 引用[2]提到dockerfile-maven-plugin调用docker build[^2],但它不是直接关于docker-compose构建。 引用[3]是关于加载镜像[^3],不太相关。 引用[4]涉及Dockerfile + docker-compose构建java镜像[^4]。 核心方法是使用docker-compose build命令。 在docker-compose中,构建镜像是通过指定build指令在docker-compose.yml文件中实现的。 比如,在docker-compose.yml中,你需要定义一个服务,并指定build上下文,比如路径到Dockerfile。 例如: ```yaml services: web: build: ./dir ``` 然后运行docker-compose build来构建镜像。 引用[1]确认了docker-compose build命令[^1]。 引用[4]提到使用Dockerfile和docker-compose构建镜像[^4]。 所以,我应该解释步骤: 1. 编写Dockerfile:定义如何构建镜像。 2. 创建docker-compose.yml文件:在其中指定服务使用build指令指向Dockerfile的上下文。 3. 运行docker-compose build命令来构建镜像。 另外,引用[2]提到了dockerfile-maven-plugin,但它似乎是针对Maven项目的,可能不是直接相关,但可以作为额外信息。 回答结构应该清晰: - 解释什么是docker-compose和使用它构建镜像的方法。 - 提供一些示例代码块。 - 引用相关部分。 最后,生成相关问题。 确保使用中文。 在末尾添加引用标识。 生成相关问题:基于主题,如优化、常见问题等。 相关问题思路: 1. 如何优化docker-compose构建过程? 2. docker-compose build与其他命令的区别? 3. 如何处理多阶段构建? 4. 常见错误和解决方案。 现在,草拟回答: 标题或直接进入内容。 开始: 要使用docker-compose构建镜像,你需要通过docker-compose.yml文件配置服务的构建方式,然后执行docker-compose build命令。 具体步骤: 1. **创建Dockerfile**:首先,为你的应用程序创建一个Dockerfile,定义镜像的构建步骤。例如: ```dockerfile FROM openjdk:11 COPY . /app WORKDIR /app RUN javac Main.java CMD ["java", "Main"] ``` 2. **配置docker-compose.yml**:在docker-compose.yml文件中,使用build指令指定Dockerfile的路径。例如: ```yaml version: '3.8' services: app: build: context: . dockerfile: Dockerfile ``` 3. **运行构建命令**:在命令行中运行docker-compose build来构建镜像。构建完成后,可以使用docker-compose up启动服务。 docker-compose build命令会构建指定服务的镜像[^1]。如果镜像已经存在,docker-compose build会重新构建它。 此外,dockerfile-maven-plugin等工具可以集成到构建流程中,但核心仍是基于Docker CLI[^2]。 在构建过程中,你可能需要管理镜像版本或加载现有镜像,如docker load命令[^3]。 确保防火墙设置允许端口访问,如果涉及网络服务[^4]。 引用: - docker-compose build命令[^1] - dockerfile-maven-plugin的使用[^2] - docker load操作[^3] - 防火墙配置[^4] 最后,生成相关问题。 相关问题: 1. docker-compose build和docker build有什么区别? 2. 如何优化docker-compose构建速度? 3. docker-compose中如何处理多容器构建依赖? 4. 常见docker-compose构建错误如何解决? 确保代码块使用正确的格式。 </think>### 使用docker-compose构建镜像的方法 要使用docker-compose构建Docker镜像,核心是通过`docker-compose.yml`文件配置服务的构建指令,并执行`docker-compose build`命令。这种方法允许你定义多服务环境下的镜像构建规则,适合管理复杂应用。以下是详细步骤和说明,基于您的引用内容整理而成: #### 1. **创建Dockerfile** - Dockerfile 定义了镜像的构建步骤(如基础镜像、文件复制、命令执行等)。这是构建的基础。 - 示例Dockerfile(构建一个简单的Java应用): ```dockerfile FROM openjdk:11 # 使用OpenJDK 11作为基础镜像 COPY . /app # 复制当前目录所有文件到容器内的/app目录 WORKDIR /app # 设置工作目录 RUN javac Main.java # 编译Java代码 CMD ["java", "Main"] # 容器启动时运行主类 ``` - 确保Dockerfile语法正确,避免构建错误[^4]。 #### 2. **配置docker-compose.yml** - 在`docker-compose.yml`文件中,使用`build`指令指定Dockerfile的路径和构建上下文。`build`指令支持自定义Dockerfile位置或构建参数。 - 示例配置(基于引用[1]和[4]): ```yaml version: '3.8' # Compose文件格式版本 services: app: # 服务名称 build: context: . # 构建上下文路径(当前目录) dockerfile: Dockerfile # Dockerfile文件名 ports: - "8080:8080" # 端口映射(宿主机:容器) restart: always # 容器重启策略 volumes: # 定义数据卷(根级别) app-data: ``` - **关键点**: - `context`: 指定包含Dockerfile的目录路径。 - `dockerfile`: 如果Dockerfile文件名非默认(如`CustomDockerfile`),需显式指定。 - `docker-compose build`命令会根据此配置构建镜像[^1]。 #### 3. **执行构建命令** - 运行`docker-compose build`命令来构建镜像: ```bash docker-compose build ``` - 此命令会构建`docker-compose.yml`中定义的所有服务的镜像。如果镜像已存在,它会重新构建(如引用[1]所述)。 - **常用选项**: - `--no-cache`: 禁用缓存,强制重新构建所有层(例如:`docker-compose build --no-cache`)。 - `--pull`: 始终拉取基础镜像的新版本。 - 构建成功后,控制台会输出镜像ID和标签。 #### 4. **验证和管理镜像** - 构建完成后,使用`docker-compose up -d`启动服务。 - 检查镜像状态: - `docker images`: 列出所有本地镜像。 - `docker-compose ps`: 查看运行服务状态[^1]。 - 如果需要加载外部镜像(如`.tar.gz`包),使用`docker load -i 镜像.tar.gz`命令(如引用[3]所述)。 #### 注意事项 - **集成工具**:docker-compose构建本质是调用本机Docker CLI(如`docker build`),依赖Docker守护进程(如引用[2]所述)。确保Docker环境已安装并运行。 - **性能优化**:构建大项目时,使用`.dockerignore`文件忽略无关文件,减少构建上下文大小。 - **网络和安全**:如果服务暴露端口,需配置防火墙(如CentOS的`firewall-cmd`),确保端口可访问(如引用[4]建议)。 - **版本管理**:镜像标签可通过`image`指令在`docker-compose.yml`中指定(如`image: myapp:v1`),方便版本控制。 使用docker-compose构建镜像的优势在于统一管理多服务环境,简化开发和部署流程[^1][^4]。如果构建失败,检查Dockerfile语法和路径配置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值