极客时间 《Kubernetes 入门实战课》 by 罗剑锋
github上的配套学习项目

《01|初识容器:万事开头难》

安装Docker Engine:

sudo apt install -y docker.io #安装Docker Engine
sudo service docker start         #启动docker服务
sudo usermod -aG docker ${USER}   #当前用户加入docker组

现在可以使用命令 docker versiondocker info来验证 Docker 是否安装成功了。

但这时pull image会失败,需要配置docker镜像源:

sudo vim /etc/docker/daemon.json
{
 "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.mirrors.ustc.edu.cn",         
    "https://hub-mirror.c.163.com"
  ]
}
systemctl daemon-reload
systemctl restart docker

这里按阿里云镜像加速器文档配过镜像地址但是没用,拉镜像时会报403 Forbidden错误

《02|被隔离的进程:一起来看看容器的本质》

容器的基本实现技术是 Linux 系统里的 namespace、cgroup、chroot
豆包:容器本质就是宿主机上一组被限制、被隔离的普通Linux进程

《03|容器化的应用:会了这些你就是Docker高手》

docker run -d nginx:alpine 后台运行Nginx
docker run -d --name red_srv redis 后台运行Redis
docker run -it --name ubuntu 2e6 sh 使用IMAGE ID,登录Ubuntu

在这里插入图片描述
–rm的例子:docker run -d --rm nginx:alpine

docker exec命令可用来进入运行中的容器内部执行程序,和docker run的区别是它不会创建新的容器。
它最常见的用法是使用 -it 参数打开一个 Shell,从而进入容器内部,如:docker exec -it red_srv sh

《04|创建容器镜像:如何编写正确、高效的Dockerfile》

  • 镜像的内部机制是什么
    容器镜像内部并不是一个平坦的结构,而是由许多的镜像层组成的,每层都是只读的一组文件,相同的层可以在镜像之间共享,然后多个层像搭积木一样堆叠起来,再使用一种叫“Union FS 联合文件系统”的技术把它们合并在一起,就形成了容器最终看到的文件系统。

一个最简单的 Dockerfile 实例:

# Dockerfile.busybox
FROM busybox
CMD echo "hello world"

这里第一条指令表示选择构建使用的基础镜像,
第二条指令CMD,指定启动容器时默认运行的命令。

docker build -f Dockerfile.busybox . 这里的.表示构建上下文为当前目录,-f参数用来指定Dockerfile,如果不指定就使用当前目录下名字是Dockerfile的文件。因为没有带-t参数,创建出来的镜像没有名字,docker images命令要带上-a参数才能看到:在这里插入图片描述

COPY指令,可用于从docker build命令里指定的构建上下文目录,向镜像拷贝文件。
.dockerignore文件,语法与 .gitignore 类似,排除那些不需要的文件。

RUN通常会是Dockerfile里最复杂的指令,会包含很多的Shell命令,但 Dockerfile里一条指令只能是一行,所以有的RUN指令会在每行的末尾使用续行符\,命令之间也会用&&来连接。
为此可以采用一种变通的技巧:把这些Shell命令集中到一个脚本文件里,用 COPY 命令拷贝进去再用 RUN 来执行。

Dockerfile里可以使用指令ARG和ENV创建变量。

EXPOSE指令,用来声明容器对外服务的端口号。
在这里插入图片描述
上图中这种PORTS里没有成对出现的端口,都是Dockerfile里声明了暴露端口, 创建容器时却没有对其进行映射(见下文)。

《05|镜像仓库:该怎样用好Docker Hub这个宝藏》

Docker默认的镜像仓库,也就是大名鼎鼎的Docker Hub,目前需要科学上网。

Docker 提供了 save 和 load 这两个镜像归档命令,可以把镜像导出成压缩包,或者从压缩包导入 Docker

离线环境可以自己搭建私有镜像仓库, 已经有很多成熟的解决方案,比如 Docker Registry,还有 CNCF Harbor

《06|打破次元壁:容器该如何与外界互联互通》

Docker cp 命令可以在宿主机和容器之间拷贝文件。

docker run 命令启动容器的时候使用-v 参数(具体的格式是“宿主机路径:容器内路径”),把宿主机的指定目录挂载到容器里,实现宿主机与容器之间的共享。

  • 如何实现网络互通
    Docker提供了三种网络模式,分别是 null、host 和 bridge(默认)。
    bridge模式的一大优点,在于通过端口映射解决了潜在的端口冲突问题。
    端口号映射需要使用 bridge 模式,并且在 docker run 启动容器时使用 -p 参数,形式和共享目录的 -v 参数很类似,用:分隔本机端口和容器端口。比如启动两个Nginx容器,分别跑在宿主机的 80 和 8080 端口上:
docker run -d -p 80:80 --rm nginx:alpine
docker run -d -p 8080:80 --rm nginx:alpine

bridge模式下的容器和宿主机通过虚拟网卡接入同一个软件网桥。(我:一般是172.17.0.x 这个私有地址的网段)

《07|实战演练:玩转Docker》

  • 搭建私有镜像仓库,有很多现成的解决方案,今天选择最简单的Docker Registry :

docker pull registry 下载Docker Registry

使用 docker tag 命令给镜像打标签。因为不是上传到默认的 Docker Hub,而是本地的私有仓库,所以镜像的名字前面加上仓库的地址,比如docker tag nginx:alpine 127.0.0.1:5000/nginx:alpine

运行Docker Registry : docker run -d -p 5000:5000 registry

此时就可以把nginx镜像上传至本地私有仓库了:docker push 127.0.0.1:5000/nginx:alpine

从本地私有仓库拉镜像:docker pull 127.0.0.1:5000/nginx:alpine

Docker Registry没有图形界面,提供了RESTful API,比如:

curl 127.1:5000/v2/_catalog
curl 127.1:5000/v2/nginx/tags/list

《08|视频:入门篇实操总结》

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐