GVKun编程网logo

docker-4-Dockerfile 配置文件详解(docker的配置文件)

26

对于docker-4-Dockerfile配置文件详解感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍docker的配置文件,并为您提供关于Docker04应用部署与迁移备份Dockerfile

对于docker-4-Dockerfile 配置文件详解感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍docker的配置文件,并为您提供关于Docker 04 应用部署与迁移备份 Dockerfile 与 Docker 私有仓库、Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose、Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析、Docker | 使用dockerfile生成镜像,清理docker空间的有用信息。

本文目录一览:

docker-4-Dockerfile 配置文件详解(docker的配置文件)

docker-4-Dockerfile 配置文件详解(docker的配置文件)

<div> <div><p>​ Dockerfile 简单一点就是描述你这个镜像安装了哪些软件包,有哪些操作,创建了什么东西。有些人喜欢用 docker commit 命令去打包镜像,这样是不好的,首先 commit 出来的镜像比你使用 Dockerfile 构建出来的体积大,而且 commit 出来的镜像属于黑盒镜像,除了制作者,谁都不知道你在里面干了什么,属于不安全的镜像,很少会有人使用,最后就是不便于你最终的管理和更新。所以推荐使用 Dockerfile 去管理你的镜像,下面将简单介绍 Dockerfile 常见的指令和注意事项:</p> <p><a href="https://docs.docker.com/engine/reference/builder/" rel="nofollow">dockerfile 官方文档 </a></p> <p><img src="https://s1.51cto.com/images/blog/201712/28/77a4e3901c99bcff42f368943adc8668.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" alt="docker-4-Dockerfile 配置文件详解"><br > 注意:一行注释一行命令,不要乱注释,否则可能出现命令无效的情况,详情看 dockerfile 官方文档 </p> <p><strong > 文中加粗的是常用命令,一个命令可能有多种格式,注意!!</strong></p> <blockquote> <p># escape=\</p> </blockquote> <p > 指定转译符,默认为 \,可以使用任意符号 < br><img src="https://s1.51cto.com/images/blog/201712/28/178b7a02911a3d281407db2d94ecc148.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" alt="docker-4-Dockerfile 配置文件详解"></p> <h2>FROM</h2> <blockquote> <p><strong>FROM &lt;image&gt;<br>FROM &lt;image&gt;:&lt;tag&gt;<br>FROM &lt;image&gt;:&lt;digest&gt; <br></strong></p> </blockquote> <p>FROM 命令定义构建镜像的基础镜像,该条必须是 dockerfile 的首个命令。<br > 对于官方没给出 Dockerfile 的软件想 Docker 化,那么引用的镜像一般是 debian:jessie、alpine、ubuntu,如果官方已经有了,比如 nginx、php、mysql 这写,那么基本直接引用即可。</p> <h2>MAINTAINER</h2> <blockquote> <p><strong>MAINTAINER &lt;messages&gt;</strong></p> </blockquote> <p><img src="https://s1.51cto.com/images/blog/201712/28/cf2a24bbd411a751d711b86e63ff6288.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" alt="docker-4-Dockerfile 配置文件详解"></p> <p > 声明作者信息,可以放在文件任何位置,建议放在 FROM 后面 </p> <blockquote> <p>LABEL &lt;key&gt;=&lt;value&gt; &lt;key&gt;=&lt;value&gt; &lt;key&gt;=&lt;value&gt; ...</p> </blockquote> <p > 标签,将后面的元数据添加到镜像中,可以用 docker inspect 查看 < br><img src="https://s1.51cto.com/images/blog/201712/28/bef3cff5de807de24870283ebdca32b0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" alt="docker-4-Dockerfile 配置文件详解"></p> <h2>RUN</h2> <blockquote> <p><strong>RUN &lt;commands&gt;</strong><br>RUN ["executable", "param1", "param2"] (exec form)</p> </blockquote> <p > 在基础镜像上创建新的镜像执行命令,并提交结果,生成的新的镜像将作为 dockerfile 中接下来的命令基础(建议一个 dockerfile 中只要一个 RUN 命令,如果要执行多条命令请用连接符)(因为 docker 镜像使用的是分层结构,一个指令就是一层,三个 RUN 就会有三层)<br><img src="<br/>https://s1.51cto.com/images/blog/201712/28/ebf68134078208b6dde4e600dceb7858.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" alt="docker-4-Dockerfile 配置文件详解"><br><img src="https://s1.51cto.com/images/blog/201712/28/5b46f9fc32085ec7feddc1876427cf77.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" alt="docker-4-Dockerfile 配置文件详解"></p> <h2>EXPOSE</h2> <blockquote> <p><strong>EXPOSE &lt;port&gt;[&lt;port&gt;/&lt;protocol&gt;...]</strong></p> </blockquote> <p > 容器暴露的端口(会直接绑定容器和 docker 宿主机的该端口,可以指定连接协议,默认为 tcp 协议)</p> <h2>CMD</h2> <blockquote> <p><strong>CMD &lt;commands&gt;</strong></p> </blockquote> <p > 容器启动时执行操作,如果一个 Dockerfile 中有多个 CMD 命令,那么只有最后一个 CMD 命令生效。CMD 的指令可以在 docker run 的时候覆盖。</p> <h2>ENTRYPOINT</h2> <blockquote> <p><strong> ENTRYPOINT</strong></p> </blockquote> <p>Dockerfile 是用来构建镜像,而 ENTRYPOINT 则是用来启动镜像,它会将 CMD 作为参数传递进去运行。<br > 启动时的默认命令,此命令设置不可被修改。如果一个 Dockerfile 中有多个 ENTRYPOINT,那么只有最后一个生效。<br > 详情请看 < a href="https://blog.lab99.org/post/docker-2016-07-14-faq.html#entrypoint-he-cmd-dao-di-you-shi-me-bu-tong" rel="nofollow">docker 问答录 </a > 和 < a href="https://docs.docker.com/engine/reference/builder/#entrypoint" rel="nofollow"> 官方文档 </a><br><img src="https://s1.51cto.com/images/blog/201712/28/37dcc2f6f9abce3277bca170d9aa4538.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" alt="docker-4-Dockerfile 配置文件详解"></p> <pre><code><span>eg:</span> ENTRYPOINT [<span>"nginx"</span>] CMD [<span>"-g"</span>,<span>"daemon off;"</span>]</code></pre> <p > 如上,如果执行 docker run -d --name nginx -P nginx 则最终容器内执行的命令是 nginx -g daemon off; ,如果你执行的命令是 docker run -d --name nginx -P nginx bash 则最终容器内执行的命令是 nginx bash 注意区别。</p> <h2>USER</h2> <blockquote> <p><strong> USER &lt;user&gt;[:&lt;group&gt;]</strong><br>USER &lt;UID&gt;[:&lt;GID&gt;]</p> </blockquote> <p > 指定 docker 构建,运行使用的用户,如果不设置,将使用 root 的用户和组来构建。前提是用户要存在。</p> <blockquote> <p><strong>WORKDIR /path/to/workdir</strong></p> </blockquote> <p>docker 构建、复制、运行等的工作目录,一个 dockerfile 中可以指定多次,如果没有指定将会自动创建,默认 /,如果使用相对路径,将在之前的路径下。</p> <h2>ENV</h2> <blockquote> <p><strong> ENV &lt;key&gt; &lt;value&gt;</strong><br>ENV &lt;key&gt;=&lt;value&gt; ...</p> </blockquote> <p > 设置 docker 镜像的环境变量,可以在构建镜像时使用,也可以在运行的容器中使用,使用键值对的形式,可以一次指定多个。<br><img src="https://s1.51cto.com/images/blog/201712/28/cea7fae8e191a528582a64491c998b50.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" alt="docker-4-Dockerfile 配置文件详解"></p> <h2>ADD</h2> <blockquote> <p><strong>ADD &lt;src&gt;... &lt;dest&gt;</strong><br>ADD ["&lt;src&gt;",... "&lt;dest&gt;"]</p> </blockquote> <p>The ADD instruction copies new files, directories or remote file URLs from &lt;src&gt; and adds them to the filesystem of the image at the path &lt;dest&gt;.<br > 这个命令将会把 src(源)目录、文件、远程文件 URL 复制到镜像的文件系统中,存放目录为 dest(目标)目录。如果 src 是压缩文件会帮你解压出来。</p> <h2>COPY</h2> <blockquote> <p>COPY &lt;src&gt;... &lt;dest&gt;<br>COPY ["&lt;src&gt;",... "&lt;dest&gt;"]</p> </blockquote> <p>The COPY instruction copies new files or directories from &lt;src&gt; and adds them to the filesystem of the container at the path &lt;dest&gt;.<br>src 只能是本地文件或目录,压缩文件不会解压。。。</p> <h2>VOLUME</h2> <blockquote> <p><strong>VOLUME ["/data"]</strong></p> </blockquote> <p > 卷,由于 docker 容器不能持久化存储数据,因此将会发生变化的数据使用卷来管理,卷分为宿主目录、数据卷、容器卷。<br>VOLUME 命令会设置你的卷,在启动容器的时候 Docker 会在 /var/lib/docker/ 的下一级目录下创建一个卷,以保存你在容器中产生的数据。若没有申明则不会创建。<br>eg:<br>VOLUME ["/data"]<br>VOLUME ["/data","/opt"]</p> <h2>WORKDIR</h2> <p > 指定容器中的工作目录,可以在构建时使用,也可以在启动容器时使用,构建使用就是通过 WORKDIR 将当前目录切换到指定的目录中,容器中使用的意思则是在你使用 docker run 命令启动容器时,默认进入的目录是 WORKDIR 指定的,下面的 example 中我使用环境变量。<br>eg:<br>WORKDIR /app</p> <h4>ARG</h4> <blockquote> <p>ARG &lt;name&gt;[=&lt;default value&gt;]</p> </blockquote> <p > 变量,可以有值,也可以没有。可以在构建时使用 --build-arg 定义。详情请看 < a href="https://docs.docker.com/engine/reference/builder/#arg" rel="nofollow"> 官方文档 </a></p> <h4>ONBUILD</h4> <blockquote> <p>ONBUILD [INSTRUCTION]</p> </blockquote> <p>ONBUILD 命令在容器中添加一个触发器,在将该镜像作为基础镜像构建其他镜像是触发。会在下个容器 FROM 一调用就执行。</p> <blockquote> <p>STOPSIGNAL signal</p> </blockquote> <p > 停止信号 </p> <blockquote> <p>HEALTHCHECK [OPTIONS] CMD command</p> </blockquote> <p > 用于检测容器是否有效 </p> <blockquote> <p>SHELL ["executable", "parameters"]</p> </blockquote> <p > 使用命令的 shell 窗口来覆盖默认的 shell 窗口,应该就是用容器的 shell 窗口覆盖宿主机的 shell 窗口吧,没用过。</p> <h1 > 参考 </h1> <p > 官方文档:<a href="https://docs.docker.com/engine/reference/builder/" rel="nofollow">https://docs.docker.com/engine/reference/builder/</a><br>docker 问答录:<a href="https://blog.lab99.org/post/docker-2016-07-14-faq.html" rel="nofollow">https://blog.lab99.org/post/docker-2016-07-14-faq.html</a><br > 感谢小沫大佬的指导 </p></div> 原文地址:https://blog.51cto.com/13323775/2055561 </div>

Docker 04 应用部署与迁移备份 Dockerfile 与 Docker 私有仓库

Docker 04 应用部署与迁移备份 Dockerfile 与 Docker 私有仓库

MySQL 部署   

    拉取 mysql 镜像    docker pull centos/mysql-57-centos7

    创建 MySQL 容器    docker run -di --name=mysql01 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=320512 centos/mysql-57-centos7

    -p 代表端口映射,格式为 宿主机映射端口:容器运行端口
    -e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是 root 用户的登录密码

Tomcat 部署

    拉取镜像 docker pull tomcat:7-jre7

    创建容器 创建容器 -p 表示地址映射

    docker run ‐di ‐‐name=mytomcat ‐p 9000:8080

    ‐v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7‐jre7

Nginx 部署

    拉取镜像    docker pull nginx

    创建容器    docker run ‐di ‐‐name=mynginx ‐p 80:80 nginx

Redis 部署

    拉取镜像    docker pull redis

    创建容器    docker run ‐di ‐‐name=myredis ‐p 6379:6379 redis

 

 

迁移与备份

    容器保存为镜像

    我们可以通过以下命令将容器保存为镜像

    docker commit 容器名称 镜像名称

镜像备份

    我们可以通过以下命令将镜像保存为 tar 文件

    docker save -o tar 文件名称 镜像名称

恢复镜像

    docker load -i tar 文件名称

Dockerfile

    Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。

    1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;

    2、对于测试人员:可以直接拿开发时所构建的镜像或者通过 Dockerfile 文件构建一个新的镜像开始工作了;

    3、对于运维人员:在部署时,可以实现应用的无缝移植。

常用命令

命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 (可以写多条)
RUN command 是 Dockerfile 的核心部分 (可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file 和 ADD 相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录

使用脚本创建镜像

步骤:
(1)创建目录

    mkdir –p /usr/local/dockerjdk8

(2)下载 jdk-8u171-linux-x64.tar.gz 并上传到服务器(虚拟机)中的 /usr/local/dockerjdk8 目录

(3)创建文件 Dockerfile vi Dockerfile

#依赖镜像名称和 ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER ITCAST
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径 jar, 把 java 添加到容器中
ADD jdk‐8u171‐linux‐x64.tar.gz /usr/local/java/
#配置 java 环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH
$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

(4)执行命令构建镜像(注意后边的空格和点,不能省略)

docker build ‐t=''jdk1.8'' .

参看镜像是否建立完成

docker images

 

Docker 私有仓库

私有仓库搭建与配置

(1)拉取私有仓库镜像(此步省略)

    docker pull registry

(2)启动私有仓库容器

    docker run ‐di ‐‐name=registry ‐p 5000:5000 registry

  (3)    打开浏览器输入地址 http://ip:5000/v2/_catalog,看到 {"repositories":[]} 表示私有仓库搭建成功并且内容为空。

  (4)    修改 daemon.json    vi /etc/docker/daemon.json

            添加以下内容,保存退出,这是为了让 docker 信任私有仓库地址 {"insecure-registries":["ip:5000"]}

重启 docker 服务

    systemctl restart docker

 

镜像上传到私有仓库

    标记此镜像为私有仓库的镜像    docker tag jdk1.8 ip:5000/jdk1.8    

再次启动私服容器

    docker start registry

上传标记的镜像

    docker push ip:5000/jdk1.8

Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose

Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose

Docker 学习路线 11:Docker命令行

Docker CLI (命令行界面) 是一个强大的工具,可让您与 Docker 容器、映像、卷和网络进行交互和管理。它为用户提供了广泛的命令,用于在其开发和生产工作流中创建、运行和管理 Docker 容器和其他 Docker 资源。

安装

要开始使用 Docker CLI,您需要在计算机上安装 Docker。您可以从 Docker 文档的官方安装指南中按照您所使用的操作系统进行安装。

基本命令

以下是一些基本的 Docker CLI 命令,供您熟悉:

  • docker run:从 Docker 映像创建并启动容器
  • docker container:列出正在运行的容器
  • docker image:列出系统中所有可用的映像
  • docker pull:从 Docker Hub 或其他注册表拉取映像
  • docker push:将映像推送到 Docker Hub 或其他注册表
  • docker build:从 Dockerfile 构建映像
  • docker exec:在正在运行的容器中运行命令
  • docker logs:显示容器的日志

Docker Run 选项

docker run 是 Docker CLI 中最重要的命令之一。您可以使用各种选项自定义容器的行为,例如:

  • d, --detach:在后台运行容器
  • e, --env:为容器设置环境变量
  • v, --volume:绑定挂载卷
  • p, --publish:将容器的端口发布到主机
  • name:为容器指定名称
  • restart:指定容器的重启策略
  • rm:容器退出时自动删除容器

Dockerfile

Dockerfile 是一个包含构建 Docker 映像的指令的脚本。您可以使用 Docker CLI 使用 Dockerfile 构建、更新和管理 Docker 映像。

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

# Set the base image to use
FROM alpine:3.7
# Update the system and install packages
RUN apk update && apk add curl
# Set the working directory
WORKDIR /app
# Copy the application file
COPY app.sh .
# Set the entry point
ENTRYPOINT ["./app.sh"]

要构建映像,请使用以下命令:

docker build -t my-image .

Docker Compose

Docker Compose 是一个 CLI 工具,用于使用 YAML 文件定义和管理多容器 Docker 应用程序。它与 Docker CLI 协作,提供了一种一致的方式来管理多个容器及其依赖项。

使用官方的安装指南安装 Docker Compose,然后您可以创建一个 docker-compose.yml 文件来定义和运行多容器应用程序:

version: ''3''
services:  
web:    
image: webapp-image    
ports:      - "80:80"  
database:    
image: mysql    
environment:      - MYSQL_ROOT_PASSWORD=my-secret-pw

使用以下命令运行应用程序:

docker-compose up

总之,Docker CLI 是管理 Docker 容器和资源的强大而多才多艺的工具。一旦熟悉其命令和功能,您将能够轻松开发、维护和部署使用 Docker 的应用程序。

Docker镜像

Docker镜像是一种轻量级、独立、可执行的软件包,其包含了运行应用程序所需的所有组件。这些组件包括:依赖项、库、运行时、系统工具和代码等,以确保应用程序在不同的环境中可以保持一致地运行。

Docker镜像是使用Dockerfile进行构建和管理的。Dockerfile是一个包含了创建Docker镜像所需指令的脚本,提供了一个逐步设置应用程序环境的指南。

使用Docker镜像

Docker CLI提供了多个命令来管理和使用Docker镜像。其中一些重要的命令包括:

  • docker image ls:列出本地系统上所有可用的镜像。
  • docker build:从Dockerfile构建镜像。
  • docker image rm:删除一个或多个镜像。
  • docker pull:从注册表(如Docker Hub)将镜像拉到本地系统。
  • docker push:将镜像推送到仓库。

例如,要从Docker Hub拉取官方的Ubuntu镜像,可以运行以下命令:

docker pull ubuntu:latest

拉取镜像后,可以使用docker run命令创建和运行一个使用该镜像的容器:

docker run -it ubuntu:latest /bin/bash

这个命令将创建一个新的容器,并使用**/bin/bash** shell在容器内启动一个交互式会话。

共享镜像

Docker镜像可以使用容器注册表(如Docker Hub、Google Container Registry或Amazon Elastic Container Registry(ECR))共享和分发。一旦将您的镜像推送到注册表中,其他人就可以轻松地访问和使用它们。

要共享您的镜像,您首先需要使用适当的命名格式对其进行标记:

docker tag <image-id> <username>/<repository>:<tag>

然后,您可以使用以下命令将标记的镜像推送到注册表中:

docker push <username>/<repository>:<tag>

总之,Docker镜像是Docker生态系统中不可或缺的一部分,允许开发人员打包其应用程序、轻松地共享它们,并在不同的环境中确保一致性。通过理解Docker镜像和管理它们的命令,您可以利用容器化的力量,增强您的开发工作流程。在您的开发过程中使用Docker镜像可以大大提高开发效率,减少开发过程中的问题,让您能够更好地专注于应用程序的核心开发。

容器

容器可以被视为轻量级的、独立的可执行软件包,包括运行所需的所有东西,包括代码、运行时、库、环境变量和配置文件。容器将软件与其环境隔离开来,确保其在不同环境下工作一致。

为什么使用容器?

  • 可移植性:容器确保应用程序在不同平台上一致工作,无论是开发人员的笔记本电脑还是生产服务器。这消除了“它在我的机器上运行”的问题。
  • 效率:容器很轻量级,因为它们使用共享资源,没有完整操作系统的开销。这使得启动时间更快,减少资源使用。
  • 可扩展性:容器可以根据工作量轻松地进行缩放,因此非常适合分布式应用程序和微服务。
  • 一致性:容器使得开发人员、QA 和运维团队在整个应用程序生命周期中拥有一致的环境,从而加快了部署流程。
  • 安全性:容器提供了一定程度的隔离,使其与其他容器和底层主机系统隔离开来,有助于维护应用程序的安全性。

使用 Docker CLI 工作

Docker CLI 提供了多个命令,可帮助您创建、管理和与容器交互。一些常用命令包括:

  • docker run:用于创建和启动新容器。
  • docker container ls:列出运行中的容器。
  • docker container stop:停止运行中的容器。
  • docker container rm:删除已停止的容器。
  • docker exec:在运行中的容器中执行命令。
  • docker logs:获取容器的日志,有助于调试问题。

Docker卷

Docker卷是一种用于存储Docker容器生成和使用的数据的机制。它们允许您将数据与容器本身分开,从而轻松备份、迁移和管理持久性数据。

卷的重要性

Docker容器本质上是暂时的,这意味着它们可以轻松地停止、删除或替换。尽管这对应用程序开发和部署非常有利,但处理持久性数据时会带来挑战。这就是卷的作用。它们提供了一种将数据存储和管理与容器的生命周期分开的方法。

卷的类型

Docker中有三种类型的卷:

  • 主机卷:它们存储在主机机器的文件系统中,通常位于/var/lib/docker/volumes目录中。这些可以很容易地访问,但可能会带来可移植性或文件系统兼容性问题。
  • 匿名卷:这些是在运行容器时没有指定卷时自动生成的。它们的ID由Docker生成,也存储在主机机器的文件系统中。
  • 命名卷:与匿名卷类似,命名卷也存储在主机机器的文件系统中。但是,您可以提供自定义名称,这样在其他容器中引用或备份时更容易。

使用Docker CLI管理卷

Docker CLI提供了各种命令来管理卷:

  • docker volume create: 使用给定的名称创建新卷。
  • docker volume ls: 列出系统中的所有卷。
  • docker volume inspect: 提供有关特定卷的详细信息。
  • docker volume rm: 删除卷。
  • docker volume prune: 删除所有未使用的卷。

要在容器中使用卷,可以在docker run命令期间使用-v--volume标志。例如:

docker run -d --name my-container -v my-named-volume:/var/lib/data my-image

此命令使用“my-image”映像创建一个名为“my-container”的新容器,并在容器内部将“my-named-volume”卷挂载到/var/lib/data路径。

Docker 网络

Docker 网络提供了管理容器通信的重要方法。它允许容器使用各种网络驱动程序相互通信并与主机机器通信。通过理解和利用不同类型的网络驱动程序,您可以设计容器网络以适应特定的场景或应用程序需求。

网络驱动程序

Docker 中有几个可用的网络驱动程序。这里,我们将介绍四个最常见的驱动程序:

  • bridge:容器的默认网络驱动程序。它创建了一个私有网络,容器可以相互通信并与主机机器通信。在此网络上的容器可以通过主机网络访问外部资源。
  • host:该驱动程序取消了网络隔离并允许容器共享主机的网络。在网络性能至关重要的情况下,它非常有用,因为它最小化了容器网络的开销。
  • none:该网络驱动程序禁用容器网络。使用此驱动程序的容器在没有任何网络访问的隔离环境下运行。
  • overlay:该网络驱动程序使部署在不同主机上的容器能够相互通信。它专为 Docker Swarm 设计,并且非常适合多主机或基于集群的容器部署。

管理 Docker 网络

Docker CLI 提供了各种命令来管理网络。以下是一些有用的命令:

  • 列出所有网络:docker network ls
  • 检查网络:docker network inspect <network_name>
  • 创建新网络:docker network create --driver <driver_type> <network_name>
  • 将容器连接到网络:docker network connect <network_name> <container_name>
  • 将容器与网络断开连接:docker network disconnect <network_name> <container_name>
  • 删除网络:docker network rm <network_name>

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析

Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析

图片

什么是Dockerfile?

Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件,可以使用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个新的镜像

如果你想要定制属于自己的镜像Dockerfile是你必不可少的工具。

docker build的使用

想要构建定制化的镜像,可以使用docker build运行Dockerfile构建镜像

命令格式: docker build [参数] PATH | URL

其中:

PATH 是Dockerfile所在路径

URL 是Dockerfile所在的URL

常用参数:

-t 为镜像设置名称和tag(不适用-t参数,创建出来的镜像名称以及版本为none)
-f 指定Dockerfile的路径(这是可以使用其他名称命名Dockerfile)

关于Dockerfile构建过程的浅析

在之前关于Docker镜像与容器的文章中,咸鱼对镜像的文件系统做了一个简单的解释,不熟悉的朋友可以再温习一下。

Docker | Docker技术基础梳理(四) - 深入理解镜像与容器

我们先看下可以直接使用的Dockerfile结构是什么样的:

图片

现在简单讲讲咸鱼对Dockerfile构建过程的理解:

Dockerfile的执行顺序是自上而下进行的,当第一次使用Dockerfile构建镜像时Dockerfile中的全部命令都会执行一遍最后构建为一个完整的镜像。

在构建的过程中,每执行一条命令Docker都会执行一次commit命令,接下来的每一条命令都是在前面所有命令集成的镜像基础上再次执行的。

这样的执行有什么好处呢,假设当你执行过一次的镜像构建后想要在Dockerfile中间部分添加一行Dockerfile的命令,那么在执行新的Dockerfile命令时,Docker只会执行新增命令(包括新增命令)之后的构建命令,大大减少了性能的损耗。

Dockerfile常用命令解析

接下来就是关于Dockerfile命令的介绍更多实例可以参考官方的Dockerfile实例:https://github.com/docker-library/docs

关于Dockerfile命令的介绍也可以参考:https://docs.docker.com/engine/reference/builder/#usage

RUN

构建镜像过程中需要执行的命令,可以执行多条

同时RUN命令后可以使用两种形式输入要执行的命令 exec与shell

当使用exec方式输入执行的命令时,命令格式是json格式的,命令在当前进程执行

当使用shell方式输入执行的命令时,命令在子进程中执行(推荐使用shell方式)

CMD与ENTRYPOINT

CMD是添加启动容器是需要执行的命令,多条命令只有最后一条生效,可以在启动容器事被覆盖和修改。
CMD命令格式有三种,exec、shell、默认提供给ENTRYPOINT的命令

  • 命令格式为shell形式,命令是以子进程的形式执行

  • 命令格式为json形式,命令在当前进程执行(推荐使用)

  • 命令格式为json形式,且所有json内容为参数形式,则默认提供给ENTRYPOINT

ENTRYPOINT的使用CMD与相同,但这个一定会被执行,且不会被覆盖和修改

LABEL与MAINTAINER

LABEL用于为镜像添加对应的数据

添加的数据格式为:LABEL key=value …. Key=value

MAINTAINER:用于表示镜像的作者(即将被遗弃使用)

ENV与ARG

ENV用于设置执行命令时的环境变量,并且在构建完成后,仍然生效

ARG用于设置只在构建过程中使用的环境变量,构建完成后消失

ADD与copY

ADD用于将本地文件或目录拷贝到镜像的文件系统中,且能解压特定格式文件,且能将URL作为要拷贝的文件(会先将URL的文件先下载下来再拷贝)

copY将本地文件或目录拷贝到镜像的文件系统中(推荐使用copY+RUN),因为ADD命令对于需要解压的文件支持的不是非常智能

VOLUME

添加数据卷

命令格式可以为数组格式,也可以直接接上路径,路径为容器或镜像中的路径
常用命令行格式为:

VOLUME [“/XXX”]

VOLUME /XXX

USER与workdir

USER指定以哪个用户的名义执行RUN,CMD和ENTRPOINT等命令

workdir设置工作目录

简单实例构建Kafka工作环境

version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 32181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - 9092:9092
    environment:
      KAFKA_broKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:32181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_Security_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_broKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

这里咸鱼有一个建议,如果当你需要构建某一工作环境但毫无头绪时,在Github上以“xxxt docker”为关键字搜索,希望结果能让你满意。

图片

图片

图片

咸鱼学Python

专注于Python商业化爬虫、Python数据科学的咸鱼

Docker | 使用dockerfile生成镜像,清理docker空间

Docker | 使用dockerfile生成镜像,清理docker空间

dockerfile生成镜像并挂载数据卷

编写dockerfile文件

  1. 创建dockerfile01 文件
# 基础镜像
FROM centos

VOLUME ["volume01", "volume02"]

CMD echo "-----end----"
  1. docker build 构建镜像
docker build -f ./dockerfile01 -t xiao-centos .

  1. 启动镜像
docker run -it 镜像ID /bin/bash

可以看到生成镜像时自动挂载的,数据卷目录

以上dockerfile方式属于匿名挂载数据卷

清理docker使用空间

我个人使用的是单核2G的云服务器,用了快三年了,内存、cpu严重吃紧,所以就尝试了清理docker使用空间,主要是删除未使用过的镜像、容器、数据卷、网络命令,具体如下:

官方文档链接 https://docs.docker.com/config/pruning/

  • 执行如下可以查看 Docker 的磁盘使用情况(类似于 Linux 上的 df 命令)
docker system df
  • 删除所有未使用过的镜像
docker image prune -a
  • 删除所有停止的容器

    docker container prune
    docker rm -f $(docker ps -aq)
  • 仅删除超过 24 小时的停止容器
docker container prune --filter "until=24h"
数据卷永远不会自动删除,因为这样做可能会破坏数据
  • 删除未使用的数据卷
docker volume prune
  • 删除没有使用过的网络
docker network prune
  • 删除所有未使用过的资源
docker system prune

手动删除/var/lib/docker/volumes的问题解决

当时清理docker使用空间的时候,清过头了,一下子把挂载的数据卷也给顺手清理了,真是自己给自己找事做。

错误信息

手动删除了挂载到宿主机上的所有数据卷,在启动容器挂载数据卷的时候就会报错

如下,重新运行容器,原先具名挂载数据卷juming-nginx,报错信息如下

docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx

docker: Error response from daemon: open /var/lib/docker/volumes/juming-nginx/_data: no such file or directory.

尝试方法一(不建议使用):

  1. 删除所有容器
  2. 删除所有镜像
  3. 重新运行一个新的容器并挂载数据卷

    # 1
    docker rm -f $(docker ps -aq)
    
    # 2
    docker rmi -f $(docker images -aq)
    
    # 3.
    docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx
    
    # 还是报错

结论:

无法解决问题,且删除所有容器、镜像存在的风险较大,不建议使用!

尝试方法二(推荐使用):

  1. 停止docker服务
  2. 重新启动docker服务
  3. 再次运行容器
# 1
systemctl stop docker

# 2
systemctl restart docker

# 3
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx

# 没有报错,docker ps查看 成功运行

结论

没有报错,docker ps查看,成功运行

docker volume ls 查看镜像,可以看到具名数据卷juming-nginx已显示出来了

docker volume ls
DRIVER    VOLUME NAME
local     a9b39215509378332ec9dfcdc3e10857b500694ea66efd9c2b7a6a9c55a2f10a
local     juming-nginx

我是 甜点cc

热爱前端,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚,等待着一个创业机会。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。

希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。

我们今天的关于docker-4-Dockerfile 配置文件详解docker的配置文件的分享就到这里,谢谢您的阅读,如果想了解更多关于Docker 04 应用部署与迁移备份 Dockerfile 与 Docker 私有仓库、Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose、Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析、Docker | 使用dockerfile生成镜像,清理docker空间的相关信息,可以在本站进行搜索。

本文标签: