Docker-Dockerfile讲解(一)

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:

Docker基本情况

Docker基本命令

Dockerfile(本小节属于)

Docker镜像

Docker仓库

Docker原理

Docker网络&存储&日志

Docker-Compose

Docker番外篇

我们前面讲解了很多docker的操作命令,也使用了几个镜像,但是这些镜像都是我们从仓库里面下载的,具有通用性。如果要满足自己的业务需求,所以我们需要根据自己的需要制作自己的镜像,下面我将讲解下如何制作自己的镜像。

Docker可以通过读取Dockerfile中的指令自动构建镜像。Dockerfile是一个文本文档,它包含用户可以在命令行上调用来组装镜像的所有命令。下面先通过一个最简单的案例来体验这个功能。

Dockerfile案例

1.新建Dockerfile文件

touch Dockerfile

2.写入Dockerfile内容

#编辑文件,具体使用的镜像需要可用的nginx镜像才可以
#没有可以私信我提供
vi Dockerfile

FROM 192.168.31.43:5000/nginx
RUN echo 'build nginx is successful' > /usr/share/nginx/html/index.html

3.构建镜像

# 需要在Dockerfile文件里面对应的目录,末尾有个点

[root@localhost test]# docker build -t nginx:v1.2.3 .
[+] Building 0.2s (6/6) FINISHED                                                                                               docker:default
 => [internal] load .dockerignore                                                                                                        0.0s
 => => transferring context: 2B                                                                                                          0.0s
 => [internal] load build definition from Dockerfile                                                                                     0.0s
 => => transferring dockerfile: 139B                                                                                                     0.0s
 => [internal] load metadata for 192.168.31.43:5000/nginx:latest                                                                         0.0s
 => CACHED [1/2] FROM 192.168.31.43:5000/nginx                                                                                           0.0s
 => [2/2] RUN echo 'build nginx is successful' > /usr/share/nginx/html/index.html                                                        0.1s
 => exporting to image                                                                                                                   0.1s
 => => exporting layers                                                                                                                  0.0s
 => => writing image sha256:5032c471e1b6c75cf588dfd2ce68f9ffe24dd38dbe598f23ac30b145df874213                                             0.0s
 => => naming to docker.io/library/nginx:v1.2.3                                                                                          0.0s

4、查看镜像

[root@localhost test]# docker images
REPOSITORY                              TAG       IMAGE ID       CREATED         SIZE
nginx                                   v1.2.3    5032c471e1b6   8 seconds ago   192MB

5、运行容器

[root@localhost test]# docker run -p 3456:80 -d nginx:v1.2.3
f5df75a75a0b7081d18a52673a724b4ae225a057c1c0b8ff194cc60854fda265

6、访问验证

#访问的内容就是我们刚才手工注入到容器里面的,功能已经符合预期
[root@localhost test]# curl localhost:3456
build nginx is successful

通过以上案例,我们把这个nginx的容器输入了自己的网页内容,然后访问这个镜像创建的容器就可以访问到我们注入的内容,当然这里只是功能演示,下面我们将详细讲解这里涉及到的参数。

参数讲解

FROM

构建镜像都是基于 FROM 的镜像,这里的 centos 就是我们的基础镜像,后续的操作都会基于这个基础镜像。

FROM centos:7

MAINTAINER

作者,一般用户告诉别人这个镜像是谁在维护,私有镜像一般都不写,如果你想发布到公网让其他人使用,则可以填写。

MAINTAINER xxx@xxx.com

RUN

用于执行后面跟着的命令行命令。比如我们可以用这个命令安装软件等linux的基本操作(容器的基础镜像是裁剪过的,所以基本的命令都有,复制的命令则没有)。

有以下俩种格式:

•shell 格式:RUN <命令行命令>        

# <命令行命令> 等同于,在终端操作的 shell 命令。

RUN  yum install -y nginx

•exec 格式:RUN [“可执行文件”,“参数1”, “参数2”]  

# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

RUN ["yum", "install", "-y", "nginx"]

大多数时候没有区别,前者等于是封装在一个shell脚本里面执行,如果有信号则被shell接受,不会被命令接受;而exec等于没有shell这一层,可以接收到信号。

EXPOSE

仅仅只是声明端口。

帮助镜像使用者理解这个镜像服务的守护端口,只起指导作用。

在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

#默认不写协议是tcp
EXPOSE 8080/tcp 53/udp

WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,后续指令都基于该目录,也是运行容器以后通过exec进入以后的默认目录。

可以简单理解后续操作和命令就会以此目录为当前目录,如果不指定则这个默认是根目录"/"。

#如果不指定这个目录则会创建到/abc
#如果指定则这个目录会/root/abc
WORKDIR /root
RUN mkdir A
#这个就只指定了工作目录是WORKDIR /A
#另外一个用途是通过exec 进入以后默认的目录
#如果没指定也默认就在根分区'/'
[root@localhost test]# docker run -it centos 
[root@833fb159565f A]# pwd
/A

​​​​​​​​​​​​USER

用于指定执行后续命令的用户和用户组(和WORKDIR类似)账号必须存在,否则后续无法操作,还有就是exec进入以后的默认账号。默认不指定都是容器里面的root,无论我们在里面安装软件及启动服务还是exec默认都是使用root。

虽然容器里面的root权限是受限的root,并不等于宿主机的root权限。但是由于docker的隔离性本来就相对较弱,如果出现了逃逸,则存在安全风险,所以对应容器里面应该用什么用户一直都存在争议。

[root@localhost test]# docker run -it centos 
docker: Error response from daemon: unable to find user abc: no matching entries in passwd file.

由于这里面参数较多,而且有些参数比较抽象,所以我们多节来讲解,下小节我们继续讲解其他参数。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

<think>好的,我现在要解决用户关于docker-compose build命令的用法和功能的询问。首先,我需要回忆自己对这个命令的了解。docker-compose build主要用于根据docker-compose.yml中的配置构建或重新构建服务对应的镜像。用户可能在使用docker-compose时,需要自定义镜像或者修改了Dockerfile后重新构建,这时候就会用到build命令。 接下来,我需要确认用户的需求。他们想要详细的教程和功能详解。这意味着我需要分步骤解释如何使用这个命令,同时说明它的各个选项和适用场景。根据提供的引用内容,用户可能已经了解了docker-compose的基础知识,比如up -d和scale命令,但需要更深入build的具体信息。 我需要查阅相关的资料,确保信息的准确性。例如,docker-compose build命令的基本用法是构建服务,但有哪些参数可以使用?比如--no-cache选项可以避免使用缓存,这在需要全新构建时很有用。还有--pull参数可以拉取最新的基础镜像。这些参数的功能需要详细说明。 同时,用户可能想知道什么时候应该使用build命令。比如,当修改了Dockerfile或者项目文件后,需要重新构建镜像才能应用这些更改。这时候运行docker-compose build,再运行up命令就会使用新的镜像启动容器。 还要注意,docker-compose build默认只会构建那些在配置文件中指定了build上下文的服务。如果服务使用的是预构建的镜像(比如image: nginx),则不会触发构建过程。这点需要明确说明,避免用户混淆。 另外,结合用户提供的引用内容,引用[2]提到Dockerfile的作用,而引用[3]和[4]涉及docker-compose的部署和命令使用,这可以帮助用户理解build在整个流程中的位置。比如,构建镜像是部署的前置步骤,之后才能通过up命令启动服务。 可能用户还会遇到常见问题,比如构建时缓存导致的问题,这时候需要指导他们使用--no-cache选项。或者如何同时构建多个服务,这时候需要指定服务名称作为参数。 最后,生成相关问题的时候,要考虑用户可能进步询问的内容,比如优化构建时间、多阶段构建,或者如何结合其他命令如up起使用。这些相关问题可以帮助用户更全面地掌握docker-compose build的应用场景和高级用法。</think>### Docker Compose Build 命令详解 #### **功能概述** `docker-compose build` 用于根据 `docker-compose.yml` 文件中定义的配置,构建或重新构建服务的镜像。此命令适用于以下场景: 1. 修改了服务的 `Dockerfile` 或构建上下文文件后,需要重新生成镜像。 2. 需要强制重新构建镜像(跳过缓存)。 3. 在部署前手动构建镜像,而非依赖远程仓库的预构建镜像[^2][^3]。 --- #### **基础用法** 1. **构建所有服务镜像**: ```bash docker-compose build ``` 默认会构建 `docker-compose.yml` 中所有包含 `build` 字段的服务。 2. **构建指定服务镜像**: ```bash docker-compose build [服务名1] [服务名2] ``` 例如 `docker-compose build web database`,仅构建 `web` 和 `database` 服务。 --- #### **核心参数详解** | 参数 | 功能描述 | |-------------------|------------------------------------------------------------------------------------------| | `--no-cache` | 构建时忽略缓存,强制重新执行所有步骤(例如修改了 `Dockerfile` 的中间步骤时使用)。 | | `--pull` | 在构建前拉取基础镜像的最新版本(确保使用最新的 `FROM` 镜像)。 | | `--build-arg` | 传递构建参数到 `Dockerfile`,格式为 `--build-arg KEY=VALUE`。 | | `--force-rm` | 构建完成后删除中间容器(优化存储空间)。 | --- #### **典型使用场景** 1. **修改代码后重新构建镜像** 假设 `web` 服务的镜像依赖项目代码: ```bash # 修改代码后执行 docker-compose build web docker-compose up -d # 重新启动服务以应用新镜像[^4] ``` 2. **多阶段构建优化** 若 `Dockerfile` 使用多阶段构建(如分离编译环境和运行环境),可通过 `build` 确保生成最小化镜像: ```dockerfile # Dockerfile 示例 FROM golang:1.19 AS builder WORKDIR /app COPY . . RUN go build -o myapp FROM alpine:latest COPY --from=builder /app/myapp /usr/local/bin/ CMD ["myapp"] ``` 执行 `docker-compose build` 后,会按阶段生成最终镜像。 --- #### **注意事项** 1. **与 `docker-compose up` 的关系** - 若直接运行 `docker-compose up`,默认会自动构建缺失的镜像。 - 使用 `docker-compose up --build` 可合并构建和启动步骤(等价于 `build` + `up`)。 2. **镜像命名规则** 若 `docker-compose.yml` 中未指定 `image` 字段,生成的镜像名称格式为 `[项目名]_[服务名]:latest`。 例如项目名为 `myapp`,服务名为 `web`,则镜像为 `myapp_web:latest`[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值