Docker进阶

Dockerfile是应用一系列自定义的命令和格式构成文本文件从而简化构建镜像的过程。

尽量将Dockerfile放在空目录中,防止向docker deamon 发送过多无用大文件。不方便的话就写个.dockerignore文件。

一个容器配置一个运行环境,完成一件特定的工作。可以类比函数的思想,一个函数只实现一个功能。这样做可以使镜像更小,逻辑性更强,有利于可读性。尽量最小化镜像的层数。

CMD和ENTRYPOINT指令都是用来指定开始运行的程序,他们都有两种语法:

CMD  <command>
CMD [“executable”,”param1”,”param2”]
CMD [“param1”,”param2”]

对于第一种语法,docker会自动加入“/bin/sh-c”到命令中,

优化apt-get 操作

在执行指令RUN时,最好将多个apt-get操作合成一个,这样既能减少layer数,又能保证不会重复安装,提高效率,在apt-getinstall之前,最好使用apt-getupdate,保证安装的程序时最新版本,安装完成后使用apt-get clean来清理中间结果。例如:

RUN apt_get update && apt-get install -y
\package-bar\package-baz\package-command &&\apt-get clean

需要安装的软件最好按字母顺序排列,便于查找和新增新软件。

RUN命令优化

每执行一条RUN指令,就会在当前镜像上创建一个新的镜像层,后面的指令会在新的镜像层上继续执行。

RUN apt-get update
RUN ["apt-get","update"]

第一种形式是在/bin/sh环境中执行指定命令,第二种是使用exec系统调用来执行,为了节省开销,可以使用&&符号将多条命令连接在同一句RUN指令中执行,

RUN apt-get update && apt-get install sqlite3 && ...

通过熟悉Dockerfile的语法和书写技巧,可以根据业务的需求创建出镜像,在部署容器时就能极大地提高效率。

容器的打包与导入

通过配置运行中的容器然后重定向到tar文件来导出容器到本地文件系统,也可以将导出的容器放到docker服务上运行。

①export

在完成了容器的配置和修改之后,可以通过export命令将容器导出保存到本地。

$ sudo docker export ubuntu > myubuntu.tar

其中 > 是文件重定向命令,docker export 命令会将容器的文件系统以tar的格式导出到标准输出,并重定向到tar目标文件。

②import

将本地的tar容器包导入到镜像。

$ cat myubuntu.tar | sudo docker import - myubuntu:latest

import从标准输入读取容器内容,并生成镜像。

③save

保存镜像到本地。

$ docker save <images-name> -o  /home/name.tar

④load

加载镜像,可以在任何安装了docker的地方加载本地打包的镜像。

$ docker load -i /home/name.tar

注:以上两种方法中建议使用save和load,以便保证在不同环境配置中都能正常保存和加载。

文件系统特点

一个操作系统可以抽象为:引导程序、内核、文件系统。

Bootfs:(Boot File System)

主要包含 bootloader 和 kernel, bootloader主要是引导加载kernel, 当boot成功后 kernel 被加载到内存中后 bootfs就被卸载了.

Rootfs:(Root File System)

rootfs包含的就是典型 Linux 系统中的 /dev(外设访问接口信息),/proc(系统设备信息),/bin(系统工具集), /etc(APP配置信息) 等标准目录和文件。

​ 对于不同的linux发行版, bootfs基本是一致的, 但rootfs会有差别, 因此不同的发行版可以公用bootfs。比如 Ubuntu 14.04 使用 upstart 管理服务,apt 管理软件包;而 CentOS 7 使用 systemd 和 yum。这些都是用户空间上的区别,Linux kernel 差别不大。

​ base 镜像只是在用户空间与发行版一致,kernel 版本与发型版是不同的。例如,CentOS 7 使用 3.x.x 的 kernel,如果 Docker Host 是 Ubuntu 16.04,那么在 CentOS 容器中使用的实际是是 Host 4.x.x 的 kernel。

​ 容器只能使用 Host 的 kernel,并且不能修改。所有容器都共用 host 的 kernel,在容器中没办法对 kernel 升级。如果容器对 kernel 版本有要求(比如应用只能在某个 kernel 版本下运行),则不建议用容器,这种场景虚拟机可能更合适。

/usr/bin /usr/local/bin /usr/sbin

/usr/bin下面的都是系统预装的可执行程序,会随着系统升级而改变 。

/usr/local/bin目录是给用户放置自己的可执行程序的地方,推荐放在这里,不会被系统升级而覆盖同名文件 。

如果两个目录下有相同的可执行程序,谁优先执行受到PATH环境变量的影响 。

/usr/sbin

linux内核基础镜像

容器共享宿主操作系统的内核,所以容器基础系统镜像包就是标准的linux rootfs + 用户自定义的工具。

大概流程:构建基础的 rootfs —> 配置基础系统参数 —> 部署用户自定义软件 —> 清理系统 —> 打包为容器镜像 —> 测试镜像 —> 发布仓库

<linux内核镜像格式>

linux内核有很多格式的镜像,包括vmlinux、Image、zImage、bzImage、uImage、xipImage、bootpImage.等。

①kernel镜像格式: vmlinux

​ vmlinux是可引导的、未压缩的内核镜像,支持vm虚拟内存,由用户对内核源码编译得到的最原始的内核文件,本质是elf格式的文件,未压缩。

注:elf(Executable and Linkable Format )可执行可链接格式文件,可作为应用程序二进制接口。

​ vmlinuz是vmlinux的压缩文件,可执行的linux内核,是一个软链接,比如在Ubuntu中就是vmlinuz-4.4.0-21-generic. 在目录/boot/vmlinuz中,vmlinuz的建立有两种方式:

一是编译内核时通过“make zImage”创建;

​ zImage适用于小内核,它的存在是为了向下兼容性。

二是内核编译时通过命令“make bzImage”创建。

​ bzImage(big zImage )是压缩的内核映像 。

zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。 内核文件中包含一个微型的gzip用于解压缩内核并引导它。 zImage解压缩内核到低端内存(第一个640K) ,bzImage解压缩内核到高端内存(1M以上) 。

zImage  是ARM Linux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。

②kernel镜像格式: Image

Image是经过objcopy处理的只包含二进制数据的内核代码,是一个还未压缩的镜像。

基于busybox构建linux最小系统镜像

​ BusyBox将许多常见UNIX实用程序的微小版本组合到一个小的可执行文件中,BusyBox为任何小型或嵌入式系统提供了相当完整的环境。 busybox集成了100多个最常用linux命令和工具,大小为1M左右。在编译时可以很轻松地包含或排除一些命令(或功能)。这样可以定制嵌入式系统。要创建一个工作系统,只需在/ dev中添加一些设备节点,在/ etc中添加一些配置文件,再添加一个Linux内核。

​ 可执行文件busybox在需要制作文件系统映像烧入板子的情况下,busybox应放在根文件系统目录下的bin中,其他的都是指向他的符号链接。BusyBox 使用了符号链接以便使一个可执行程序看起来像很多程序一样。对于 BusyBox 中包含的每个工具来说,都会这样创建一个符号链接,这样就可以使用这些符号链接来调用 BusyBox 了。

​ 最常用的用法是建立指向busybox的链接,不同的链接名完成不同的功能。

​ busybox支持ash、hush、msh三种shell,但是不支持bash ,可以手动修改 login源码,改为sh执行。

​ 以版本busybox-1.28.1 为例:
源码路径为 busybox-1.28.1/loginutils/login.c
执行login 动作在 int login_main(int argc UNUSED_PARAM, char **argv) 函数中,源码如下

/* Exec login shell with no additional parameters */run_shell(pw->pw_shell, 1, NULL, NULL);/* return EXIT_FAILURE; - not reached */

修改后

/* Exec login shell with no additional parameters *///run_shell(pw->pw_shell, 1, NULL, NULL);// modified by houfei, use the "/bin/sh" exec login, default "pw->pw_shell" is "/bin/bash"run_shell("/bin/sh", 1, NULL, NULL);/* return EXIT_FAILURE; - not reached */

下载busybox可执行文件

wget命令用来从指定的URL下载文件。wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

$ wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64

将下载的busybox-x86_64移动到/usr/local/bin 中。并更名busybox

编写shell脚本建立软链接,将busybox指令集连接到当前目录。使用for循环将busybox --list中每个命令放入根文件系统子目录中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NQntZkpj-1592469698492)(C:\Users\HUANGX~1\AppData\Local\Temp\1534418185835.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1MWptPS1-1592469698503)(C:\Users\HUANGX~1\AppData\Local\Temp\1534418792952.png)]

用busybox制作linux根文件文件系统时,根文件系统目录下有linuxrc,作为内核运行起来的第一个init程序 。“rc”,它是“runcomm”的缩写――即名词“run command”(运行命令)的简写。 "rc”是任何脚本类文件的后缀,这些脚本通常在程序的启动阶段被调用,通常是Linux系统启动时。如/linuxrc是Linux启动的主脚本,而.bashrc是当Linux的bash shell启动后所运行的脚本。

创建rootfs的归档文件

tar cpf rootfs.tar . 将当前目录和子目录归档打包为tar文件

编写Dockerfile.

从空镜像scratch开始,添加归档文件到当前路径,运行bash。因为容器至少需要一个守护后台进程保持运行才能启动,一般运行bash。

FROM scratch
ADD rootfs.tar /
CMD ["/bin/bash"]
$ docker build -t busybox:08.16 .
$ docker run -it busybox:08.16 /bin/sh

设置开机启动项

systemctl enable docker

硬连接与软连接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nawsTg2t-1592469698505)(C:\Users\HUANGX~1\AppData\Local\Temp\1534295129090.png)]

​ 对于每个进程,系统会建立一个进程控制块(PCB)来保存相关的信息,而这个PCB在内核中的表现其实就是一个称为task_struct的结构体,这个结构体的成员用来保存与此进程有关的相关信息,其中一个成员是struct file_struct  *files,它用来找到此进程所有打开的文件列表,files变量指向的是struct file_struct类型的结构体,这个结构体中有一个成员是一个指针数组struct file *fd_array[ ],这个数组中的每个元素会指向一个struct file的结构体,这个结构体是用来描述一个打开的文件的,有很多的成员,其中有个成员是指向struct file_operation的指针变量,而struct file_operation结构体中包括了很多的函数指针,也就是open,write,realease,read等等对文件进行操作的函数,具体这些函数的实现就是驱动开发需要做的事情。

文件夹建立软链接

-s 是代号(symbolic)的意思。这里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的链接又软链接和硬链接两种,软链接就是ln –s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。如果你用ls察看一个目录时,发现有的文件后面有一个@的符号,那就是一个用ln命令生成的文件,用ls –l命令去察看,就可以看到显示的link的路径了。指令详细说明指令名称 : ln使用权限 : 所有使用者使用方式 : ln [options] source dist,其中 option 的格式为 :[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}][--help] [--version] [--]说明 : Linux/Unix 档案系统中,有所谓的连结(link),我们可以将其视为档案的别名,而连结又可分为两种 : 硬连结(hard link)与软连结(symbolic link),硬连结的意思是一个档案可以有多个名称,而软连结的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中,而软连结却可以跨越不同的档案系统。ln source dist 是产生一个连结(dist)到 source,至于使用硬连结或软链结则由参数决定。不论是硬连结或软链结都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。-f : 链结时先将与 dist 同档名的档案删除-d : 允许系统管理者硬链结自己的目录-i : 在删除与 dist 同档名的档案时先进行询问-n : 在进行软连结时,将 dist 视为一般的档案-s : 进行软链结(symbolic link)-v : 在连结之前显示其档名-b : 将在链结时会被覆写或删除的档案进行备份-S SUFFIX : 将备份的档案都加上 SUFFIX 的字尾-V METHOD : 指定备份的方式--help : 显示辅助说明--version : 显示版本范例 :将档案 yy 产生一个 symbolic link : zzln -s yy zz将档案 yy 产生一个 hard link : zzln yy xx

问题:

  • dockerfile中写了 RUN /bin/sh -c echo hello

    • RUN 执行的命令都是基于FROM中的镜像开始,scratch中几乎为空,只有少量元数据。在scratch中只能运行无依赖的可执行文件,或者添加文件。原本以为RUN 后面的命令是利用宿主机的内核来完成,但其实是利用FROM 中的镜像的功能。
Step 1/4 : FROM scratch--->
Step 2/4 : RUN /bin/sh -c echo hello---> Running in f7c34025ebc6
OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown
  • 从scratch中可以创建ubuntu基础镜像,但是运行镜像时报错缺少bin/sh,若从busybox开始创建,则可以正常运行。
$ docker run -it ubuntu:la /bin/sh
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown.

bash功能

  • 记录历史命令:bash可以记录曾经的命令,保持在~/.bash_history文件中,只保存上次注销登录之后的命令;
  • tab键自动补全:使用tab见可以自动不全命令或者目录i;
  • alias命令别名:可以使用alias ll='ls -al'来设置命令的别名;
  • 工作控制:可以将某些任务放在后台去运行;
  • 程序脚本:可以执行shell脚本文件;
  • 通配符:在查找相关文件或者执行相关命令时,可以使用通配符*
  • 内建命令type:可以使用type 命令来查看某个命令是否为内建在bash当中的命令;

dockerfile中配置镜像上下文

​ 与busybox软链接不同,若直接ADD ubuntu.tar 归档文件到镜像中,可能导致容器无法启动,此时需要在dockerfile中配置好上下文。以github上的一个dockerfile为例:

https://github.com/tianon/docker-brew-ubuntu-core/blob/1637ff264a1654f77807ce53522eff7f6a57b773/xenial/Dockerfile

FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
# a few minor docker-specific tweaks
#运行了set -xe后所有的命令会显示详细信息,并且出错后会退出shell,防止产生更多坏的影响;
RUN set -xe \&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
#添加错误码101便于故障诊断,追加重定向到policy-rc.d文件中,网上有说用exit 0&& echo 'exit 101' >> /usr/sbin/policy-rc.d \&& chmod +x /usr/sbin/policy-rc.d \
#相当于自定义安装路径&& dpkg-divert --local --rename --add /sbin/initctl \&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \#在build阶段就启动服务,使镜像中配置生效&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
#删除镜像中的安装包,减小镜像大小;&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \&& echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests
# delete all the apt list files since they're big and get stale quickly
RUN rm -rf /var/lib/apt/lists/*
# this forces "apt-get update" in dependent images, which is also good
# enable the universe
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
# make systemd-detect-virt return "docker"
# See: https://github.com/systemd/systemd/blob/aa0c34279ee40bce2f9681b496922dedbadfca19/src/basic/virt.c#L434
RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container
# overwrite this with 'CMD []' in a dependent Dockerfile
CMD ["/bin/bash"]

​ 大多数linux发行版不会包含 /usr/sbin/policy-rc.d 文件,因为这个文件是用于帮助管理员控制哪些包可以在安装、卸载、更新时执行脚本。

​ 在docker容器中,大多数 apt-get install 发生在 docker build 阶段,这个阶段如果去启动/停止服务,可能因为一些意外而无法成功并且也没有必要。大多数服务都是在 docker run 或 docker start 时启动/停止。 如果你一定要启动/停止服务,可以将 /usr/sbin/policy-rc.d 文件中的退出码改为0。

​ /var/cache/apt/archives文件夹中的文件是使用 sudo apt-get install 时下载的安装文件,这些文件是可以清理的,若你的系统空间不足的时候,可以想到从此处进行清理而获得空间。 *.deb是Debian软件包格式的文件扩展名,跟Debian的命名一样 。

set命令

shell中的set 命令主要作用是显示shell中已存在的shell变量,以及设置shell新变量的值。(注:set命令并不能定义新的shell变量,declare命令可以,用格式declare <var name> = value来实现)使用set更改shell特性时,符号 ‘+’ 和 ‘-’ 的作用分别是打开和关闭指定的模式。

$ set -<选项> [参数]-a:标示已修改的变量,以供输出至环境变量。
-b:使被中止的后台程序立刻回报执行状态。
-C:转向所产生的文件无法覆盖已存在的文件。
-d:Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。
-e:若指令传回值不等于0,则立即退出shell。
-f:取消使用通配符。
-h:自动记录函数的所在位置。
-H Shell:可利用"!"加<指令编号>的方式来执行history中记录的指令。
-k:指令所给的参数都会被视为此指令的环境变量。
-l:记录for循环的变量名称。
-m:使用监视模式。
-n:只读取指令,而不实际执行。
-p:启动优先顺序模式。
-P:启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
-t:执行完随后的指令,即退出shell。
-u:当执行时使用到未定义过的变量,则显示错误信息。
-v:显示shell所读取的输入值。
-x:执行指令后,会先显示该指令及所下的参数。

exit退出码

退出码的值 含义
0 成功
1 通用错误
2 shell内建命令使用错误
126 命令调用不能执行
127 找不到命令
128 exit的参数错误
128+n 信号’n’的致命错误
130 用Ctrl+C 结束脚本
255* 超出范围的退出状态

退出码的范围是[0,256] ,类比C中的返回值,避免使用特殊含义的退出码,建议使用100附近和200附近的作为退出码。

dpkg命令

dpkg命令是Debian Linux系统用来安装、创建和管理软件包的实用工具。

-i:安装软件包;
-r:删除软件包;
-P:删除软件包的同时删除其配置文件;
-L:显示于软件包关联的文件;
-l:显示已安装软件包列表;
--unpack:解开软件包;
-c:显示软件包内文件列表;
--confiugre:配置软件包。

dpkg-divert命令

dpkg-divert是Debian Linux中创建并管理一个转向(diversion)列表,其使得安装文件的默认位置失效的工具。

用法:dpkg-divert [<选项> ...] <命令>
命令:[--add] <文件名>         添加一个转移项。--remove <文件名>        删除这个转移项。--list [<glob 模式>]     列出各文件转移项。--listpackage <文件>     显示哪个软件包转移了指定文件。--truename <文件名>      返回被本地转移的原始文件。
选项:--package <软件包名>     该软件包中的 <文件名> 副本将不会被转移。--local                  所有软件包的版本均会被转移。--divert <转移目标名>    其它软件包版本将转而使用的文件名。--rename                 实际上把该文件挪开(或是还原)。--admindir <目录名>      设置转移文件所在的目录。--test                   仅仅演示要进行的操作,而不是真正的执行它们。--quiet                  安静模式,输出尽可能少的信息。<--help                   显示本帮助信息。--version                显示版本信息。
当添加本地转移项的时候,默认的选项是 --local 和 --divert <原始文件名>.distrib。
在删除本地转移项的时候,--package 或 --local 选项和 --divert 选项必须一致。
软件包的 preinst 和 postrm 脚本通常应当指定 --package 和 --divert 选项。

sed 命令

[root@~]# sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

sed -i 就是直接对文本文件进行操作的 ,最后的g选项是对每一个字符都做替换,如下例子:

#cat 1.txt
d
ddd
#ff
# sed -i 's/原字符串/新字符串/' /1.txt
sed -i 's/d/7523' /1.txt
7523
7523dd
#ff
#sed -i 's/原字符串/新字符串/g' /1.txt
sed -i 's/d/7523/g' /1.txt
7523
752375237523
#ff的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

sed -i 就是直接对文本文件进行操作的 ,最后的g选项是对每一个字符都做替换,如下例子:

#cat 1.txt
d
ddd
#ff
# sed -i 's/原字符串/新字符串/' /1.txt
sed -i 's/d/7523' /1.txt
7523
7523dd
#ff
#sed -i 's/原字符串/新字符串/g' /1.txt
sed -i 's/d/7523/g' /1.txt
7523
752375237523
#ff

Docker学习(二)进阶相关推荐

  1. Docker 学习笔记 - 进阶四 Docker网络和 Docker compose

    Docker 学习笔记 - 进阶四 Docker网络和 Docker compose 4. docker 网络 4.1 docker network是什么 4.1.1 docker不启动,默认网络情况 ...

  2. Docker学习二:Docker镜像与容器

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  3. Docker学习七:使用docker搭建Hadoop集群

    本博客简单分享了如何在Docker上搭建Hadoop集群,我的电脑是Ubuntu20,听同学说wsl2有些命令不对,所以建议在虚拟机里按照Ubuntu或者直接安装双系统吧 Docker学习一:Dock ...

  4. Docker学习六:综合实践

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  5. Docker学习五:Docker 数据管理

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  6. Docker学习四:Docker 网络

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  7. Docker学习三:Docker 数据管理

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  8. Docker学习一:Docker简介与安装

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  9. Docker基础、进阶笔记,为k8s的学习预预热

    标题 Docker基础.进阶笔记,为k8s的学习预预热 笔记来源于视频: 狂神docker基础篇 狂神docker进阶篇 笔记中图片有些取自于:这位博主的两篇docker笔记中的一些图片 百度云笔记工 ...

  10. docker学习笔记(二)docker常用命令

    参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(三)镜像 docker学习笔记(四)使用docker搭建环境 docker学习 ...

最新文章

  1. mac svn 返回svn upgrade等出错
  2. 查找数据挖掘的相关资料
  3. 如何用python进行量化交易_从零开始学习Python和量化交易
  4. 中国为何难学欧盟反垄断
  5. 构件开发常见问题和错误的解决方案和处理方法
  6. 腾讯机器狗,站起来了!
  7. Django基础11(Django中form表单)
  8. 解决报错: Connecting to Kong on http ... Could not reach Kong on http://xxx.xxx.xxx.xxx:8001
  9. HP-Socket v5.4.4 发布,高性能跨平台网络通信框架
  10. Mybatis的逆向工程,MySQL8的数据库,8.0.11驱动的逆向工程的坑的解决方法
  11. 微信小程序图片上传并展示
  12. 用ssl.ca自制证书
  13. 全国道路运输管理人员考试多选练习题库
  14. linux 网络通信框架,Linux下 C++ HPSocket通信框架的简单使用
  15. linux中怎么卸载桌面图标,如何从Ubuntu 18.04桌面上删除垃圾桶图标
  16. Ubuntu管理员密码
  17. 青云QingCloud推出CDN加速服务 动态选择最优节点
  18. win10清理c盘_只需十步,C盘轻松腾出30G!使用win10自带工具清理系统垃圾,让电脑重获新生...
  19. “No input file specified “问题的处理
  20. 卷积神经网络中全连接层、softmax与softmax loss理解

热门文章

  1. 第一P2P收购中国典当联盟发力供应链金融模式
  2. 将时间序列转成图像——格拉姆角场方法 Matlab实现
  3. 【Ablation Studies 理解】深度学习模型组件的对比实验/性能分析
  4. 矩阵分析与应用-1.2-向量空间_内积空间与线性映射
  5. elementUI环形进度条设置渐变色和修改底色
  6. 嚼一嚼 class 文件结构
  7. druid监控页面 关闭_druid-springboot-starter默认启用监控页面,公网项目可能外泄DB信息...
  8. SQL and NOSQL
  9. teensy 制作键盘 linux,kbfirmware使用教程——以制作小太刀TEX Kodachi键盘为例
  10. 计算机毕业设计Python+Django的医院排队叫号系统(源码+系统+mysql数据库+Lw文档)