从零开始 - Docker部署前后端分离项目(二)

简介: 从零开始 - Docker部署前后端分离项目(二)

从零开始 - Docker部署前后端分离项目(二)

一、docker中的网络

– network

bridge

桥接

image.png网桥中的容器会独立分发ip地址,和宿主机隔离,如果需要在暴露容器,需要做端口映射。

host

不会给容器分配单独的ip,直接暴露在宿主机对应的端口。

这时不需要做端口映射,把容器直接理解为一个简单的进程。

none

没有任何网络,单机

删除网络

docker network rm NETWORKID
docker network inspect xz  查看xz这个网络下有多少个连接的容器
docker network list  查看网桥

二、dockerfile

1. 镜像与容器的关系

image.png

docker中镜像是层级结构的,我们可以通过命令docker history 查看镜像中的每一层的大小和内容。镜像是readonly的。容器从镜像启动时,docker会在镜像的最上层创建一个可写层,镜像本身保持不变。删除容器只是删除容器创建的可写层,因此创建和删除容器都很快。


所以我们在创建应用时会利用Dockerfile将只读文件提前构建在镜像中来提高容器的效率。


2. 什么是Dockerfile

Dockerfile 是一个文本文档,其中包含组装 Docker 映像的指令。当我们通过执行docker build 命令告诉 Docker 构建我们的镜像时,Docker 会读取这些指令,执行它们,并因此创建一个 Docker 镜像。

三、Dockerfile指令详解

Dockerfile的指令不区分大小写。但是,约定是将它们大写,以便更容易地将它们与参数区分开来。

FROM

Docker按顺序运行Dockerfile指令。一个Dockerfile 必须以**FROM**指令开始。FROM指令指定我们从哪个父镜像开始构建。例如:

  FROM python:3.8-slim-buster

表示构建需要的基础镜像是python:3.8-slim-buster,后续的操作都是基于它。

RUN

RUN用于执行命令行命令,有以下两种格式:

shell命令行格式

RUN <command>
# <command>等价于直接在终端执行shell命令

exec格式

注意exec格式会以json数组的形式解析,所以必须使用双引号。

RUN ["executable", "param1", "param2"]
# 例如
# RUN ["python3", "app.py"] 等价于 RUN python3 app.py

两种格式的主要区别是shell命令行格式默认调用命令shell,所以原生的shell命令最好使用这种格式。当有外部可执行文件时,使用exec格式。

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行。
  • RUN 是在 docker build 时运行

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

CMD命令有三种格式:

  • CMD ["executable","param1","param2"] (exec 格式,推荐使用)
  • CMD ["param1","param2"] (该写法是为 ENTRYPOINT 指令指定的程序提供默认参数)
  • CMD command param1 param2 (shell 格式)

ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。


但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。


优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。


注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。


格式:

  ENTRYPOINT ["<executeable>","<param1>","<param2>",...]


可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。

示例:

假设已通过 Dockerfile 构建了 python-docker:test 镜像:

# syntax=docker/dockerfile:1
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
ENTRYPOINT ["python3", "-m" , "flask", "run"] # 定参
CMD ["--host=0.0.0.0", "--port=5000"] # 变参
  1. 不传参运行
  docker run python-docker:test

容器内会默认运行以下命令,启动主进程。

  python3 -m flask run --host=0.0.0.0 --port=5000

2.传参运行

  docker run python-docker:test --host=0.0.0.0 --port=5001

容器内部会运行一下命令,启动主进程。

  python3 -m flask run --host=0.0.0.0 --port=5001

注意:一个Dockerfile中至少要要有一个CMD或ENTRYPOINT命令。

EXPOSE

仅仅只是声明端口。

作用:

  • 帮助镜像使用者理解这个镜像服务的监听端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

格式:

  EXPOSE <端口1> [<端口2>...]

ENV

设置环境变量,定义了环境变量,那么在后续构建的指令中,就可以使用这个环境变量。

格式:

  ENV <key1>=<value1> <key2>=<value2>...

注意ENV设置的环境变量会一致存在于容器中,因此在某些情况下它会产生副作业,所以如果只是在构建过程中使用的环境变量可以使用ARG。


ARG

ARG也可以设置环境变量,不过与ENV的作用于不同,ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。


构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。


格式:

  ARG <参数名>[=<默认值>]

ADD

ADD指令从上下文目录中拷贝文件,目录到镜像中。格式如下:

  ADD [--chown=<user>:<group>] <源路径>... <目标路径>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

ADD遵守如下规则:


  1. 源路径如果不是URL则必须在构建上下文目录下
  2. 如果源路径是可识别的压缩格式(identity、gzip、bzip2或xz)的本地tar归档文件,则会自动将其解压缩为一个目录。
  3. 如果目标路径以/结尾,目标路径被识别为目录,源路径内容会被拷贝到其中
  4. 当源路径有多个时,目标路径必须以/结尾
  5. 目标路径不以/结尾,它会被识别为普通文件
  6. 目标路径不存在时,它会自动创建


COPY

COPY指令与ADD命令格式完全一致,最主要的区别是:


  1. ADD 中的源路径可以是url(制定一个远程的文件或文件夹)这在Dockerfile是从标准输入中接收的时候非常有用。
  2. COPY中的源路径必须是在构建上下文路径中。
  3. COPY不会自动解压压缩文件

虽然ADD和COPY在功能上相似,但一般来说,COPY是首选。这是因为它比ADD更透明。 COPY仅支持将本地文件基本复制到容器中,而ADD有一些特性(如仅本地的tar提取和远程URL支持)不是很明显。因此,ADD的最佳用途是将本地tar文件自动提取到映像中,如ADD rootfs.tar.xz /。


如果您有多个Dockerfile步骤,它们使用来自您的上下文中不同的文件,请分别复制它们,而不是一次复制所有文件。这确保了只有当特定要求的文件发生更改时,每个步骤的构建缓存才会失效(强制重新运行该步骤)。


VOLUME

创建挂着点。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

  • 避免重要的数据,因容器重启而丢失。
  • 避免容器不断变大。

格式:

  VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

在启动容器 docker run 的时候,我们可以通过 -v 参数指定卷。


WORKDIR

WORKDIR指令为Dockerfile中跟随它的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使没有在任何后续Dockerfile指令中使用它,也会创建它。WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则它将相对于上一个WORKDIR指令的路径。For example:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

这个Dockerfile中最后一个pwd命令的输出是/a/b/c。

更多命令见https://docs.docker.com/engine/reference/builder/?utm_source=testingpai.com#usage



相关文章
|
4天前
|
JSON JavaScript 开发者
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
【8月更文挑战第7天】Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
|
1天前
|
运维 Java Devops
阿里云云效操作报错合集之部署docker时遇到报错,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
4天前
|
Java Nacos Docker
"揭秘!Docker部署Seata遇上Nacos,注册成功却报错?这些坑你不得不防!一网打尽解决秘籍,让你的分布式事务稳如老狗!"
【8月更文挑战第15天】在微服务架构中,Nacos搭配Seata确保数据一致性时,Docker部署Seata后可能出现客户端连接错误,如“can not connect to services-server”。此问题多由网络配置不当、配置文件错误或版本不兼容引起。解决策略包括:调整Docker网络设置确保可达性;检查并修正`file.conf`和`registry.conf`中的Nacos地址和端口;验证Seata与Nacos版本兼容性;修改配置后重启服务;参考官方文档和最佳实践进行配置。通过这些步骤,能有效排除故障,保障服务稳定运行。
13 0
|
4天前
|
存储 Ubuntu Linux
如何在 Ubuntu 上使用 Docker 容器化和部署多个 WordPress 应用程序
如何在 Ubuntu 上使用 Docker 容器化和部署多个 WordPress 应用程序
11 0
|
4天前
|
存储 Shell API
G6VP 与 GraphScope部署问题之拉取并启动 GraphScope 的 Docker 镜像如何解决
G6VP 与 GraphScope部署问题之拉取并启动 GraphScope 的 Docker 镜像如何解决
|
5天前
|
Linux Docker 异构计算
模型部署 — PaddleNLP 基于 Paddle Serving 快速使用(服务化部署 - Docker)— 图像识别 + 信息抽取(UIE-X)
模型部署 — PaddleNLP 基于 Paddle Serving 快速使用(服务化部署 - Docker)— 图像识别 + 信息抽取(UIE-X)
9 0
|
5天前
|
JSON 文字识别 Linux
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 基于 Paddle Serving快速使用(服务化部署 - Docker)
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 基于 Paddle Serving快速使用(服务化部署 - Docker)
14 0
|
8天前
|
Docker 容器
Docker cp 将宿主机上的文件复制到容器中
Docker cp 将宿主机上的文件复制到容器中
10 0
|
1天前
|
Docker 容器
|
1天前
|
网络协议 Linux 网络安全
遇到Docker容器网络隔断?揭秘六种超级实用解决方案,轻松让Docker容器畅游互联网!
【8月更文挑战第18天】Docker容器内网络不通是开发者常遇问题,可能因网络配置错、Docker服务异常或防火墙阻碍等原因引起。本文提供六种解决策略:确认Docker服务运行状态、重启Docker服务、检查与自定义Docker网络设置、验证宿主机网络连接、临时禁用宿主机IPv6及检查防火墙规则。通过这些步骤,多数网络问题可得以解决,确保容器正常联网。
9 1