08 视频:入门篇实操总结
你好,我是Chrono。
今天的课程和前面的不太一样,变成了视频的形式。之前也讲过很多次学习Kubernetes要以动手实操为主,加上专栏里单纯的文字配图的形式还是不太直观,所以每到一个学习阶段,我们就会来一个视频总结,把之前学习的内容以视频的形式展现出来,这样也许会让学习的效果更好。
这次视频课程的主要内容和第7讲差不多,是对“入门篇”的回顾与总结,但侧重点是对Docker的实际操作,不会再重复讲那些理论知识。每个视频后都会附上操作要点,供你快速定位和做笔记。
好了,我们正式开始吧。
一. 熟悉Docker的使用
视频操作要点:
首先来操作一下Docker Engine。
(有了[课前准备]的基础)在这台机器上,Docker已经安装好了,我给你用 docker version
和 docker info
看一下它的信息。
docker version
显示的是Docker Engine 20.10.12,系统是Linux,硬件架构是arm64,也就是Apple M1。
docker info
显示的是当前系统相关的信息,例如CPU、内存、容器数量、镜像数量、容器运行时、存储文件系统等等。这里存储用的文件系统是overlay2,Linux内核是5.13,操作系统是Ubuntu 22.04 Jammy Jellyfish,硬件是aarch64,两个CPU,内存4G。
现在我们用 docker ps
看一下容器列表,应该是空的。
然后用 docker pull
拉取busybox镜像,再用 docker images
看镜像列表。
使用 docker run
启动busybox镜像,执行最简单的hello world:
docker run busybox echo hello world
然后再用 docker ps -a
查看已经结束的容器列表,应该可以看到刚刚运行完毕的Busybox容器,可以用 docker rm
再加上容器ID删除它。
二. 镜像和容器
视频操作要点:
我们再来拉取另一个镜像,操作系统Alpine:
docker pull alpine
然后用 docker run
,加上it参数,运行它里面的shell:
docker run -it alpine sh
这样就暂时离开当前的Ubuntu操作系统,进入了容器内部的Alpine系统,可以在里面执行任意的命令,比如 cat /etc/os-release
。
这个容器环境与外面是完全隔离的,进程、文件系统都独立,不过也有没有隔离的部分,比如时间和内核。
使用exit退出容器,然后在宿主机环境执行date、uname -a,你就可以看到它与容器里是一致的。
让我们再运行一个容器:
docker run -d --rm nginx:alpine
在宿主机里用 ps -ef|grep nginx
可以看到有3个Nginx进程,它们其实就是容器里的Nginx进程,用docker stop停止后再用ps,就能发现它们已经消失了。
这就证明,容器其实就是操作系统里的进程,只是被容器运行环境加上了namespace、cgroup、chroot的限制,所以容器和普通进程在资源的使用方面是没有什么区别的,也因为没有虚拟机的成本,启动更迅速,资源利用率也就更高。
三. 构建自己的镜像
视频操作要点:
现在让我们来尝试编写Dockerfile,构建一个自己的镜像。
这个Dockerfile先用arg指令定义了IMAGE_BASE、IMAGE_TAG两个变量,然后使用from指令指定了构建的基础镜像,把这两个变量结合起来就是 nginx:1.21-alpine
。
后面的两个env指令定义了PATH和DEBUG两个环境变量。arg指令定义的变量只能在构建镜像的时候使用,而env定义的变量则会在容器运行的时候以环境变量的形式出现,让进程运行时使用。
接下来是copy指令,它会把构建上下文里的./default.conf拷贝到镜像的/etc/nginx/conf.d/,注意copy指令不能使用绝对路径,必须是构建上下文的相对路径,而且Docker会把构建上下文里的所有文件打包传递给docker daemon,所有尽量只包含必要的文件。
run指令就是构建镜像时要执行的shell命令,可以是安装软件、创建目录、编译程序等等,这里只是简单地用echo命令生成了一个文本文件。
最后两条指令是 expose
和 workdir
,expose
是声明容器对外服务的端口号,而 workdir
是容器的工作目录。
了解了Dockerfile的内容之后,我们就要用 docker build
来构建镜像了,使用 -t
打上标签,再加上构建上下文路径,当前目录就用一个点号 .
:
docker build -t ngx-app:1.0 .
构建完成,生成镜像文件,我们可以用 docker run
从镜像启动容器,验证镜像里的文件是否正确生成:
docker run -it --rm ngx-app:1.0 sh
然后我们还可以用 docker save/load
命令把它导出成压缩包,方便保存和传输:
docker save ngx-app:1.0 -o ngx.tar
docker load -i ngx.tar
四. 与外部系统互通的操作
视频操作要点:
接下来我们看看容器与外部系统互通的一些操作。
首先是 docker cp
命令。让我们先启动一个Redis容器:
docker run -d --rm redis
然后用 echo
命令生成一个简单的文本文件:
echo 'aaa' > a.txt
用 docker ps
命令看看容器的ID,就可以使用 docker cp
命令把这个文件拷贝进容器里了:
docker cp a.txt 062:/tmp
使用 docker exec
可以进入容器内部,查看文件是否已经正确拷贝:
docker exec -it 062 sh
ls /tmp
退出容器,我们再把这个文件改个名字,拷贝出来:
docker cp 062:/tmp/a.txt ./b.txt
现在我们再看看用 -v
参数直接挂载本地目录,把文件直接映射到容器内部:
docker run -d --rm -v /tmp:/tmp redis
用 docker exec
进入容器,查看一下容器内的“/tmp”目录,应该就可以看到文件与宿主机是完全一致的。
docker exec -it b5a sh # b5a是容器ID
-p
参数是映射本机端口到容器端口,我们启动一个Nginx容器,把本机的80端口映射到容器的80端口:
docker run -d -p 80:80 --rm nginx:alpine
docker ps
可以看到端口的映射情况,我们也可以使用curl直接访问容器里的Nginx服务:
curl 127.1:80 -I
再使用exec就可以看到容器里的网卡情况:
docker exec xxx ip addr
可以发现容器里的网卡设置与宿主机完全不同,eth0是一个虚拟网卡,IP地址是B类私有地址“172.17.0.2”。
五. 搭建WordPress
视频操作要点:
最后演示一下使用Docker搭建WordPress的过程。
因为在Docker命令里写环境变量很麻烦,命令很长,所以我把搭建的过程写成了一个脚本。
一共有三条命令,首先启动MariaDB,设置数据库名、用户名、密码等环境变量,然后启动WordPress,使用刚才的MariaDB的用户名、密码,db_host必须是MariaDB的IP地址,然后再启动Nginx,它需要在配置文件里指定WordPress的地址,然后用-v参数挂载进容器里。
执行这个脚本之后,我们用 docker ps
看一下容器的状态。
确认容器都运行正常,我们就可以在浏览器里输入IP地址,访问WordPress网站了。
课下作业
今天是动手操作课,作业就是一定记得让自己实际上手操作一遍哦。
欢迎在留言区分享自己的实操感受,如果有什么疑问也欢迎留言分享参与讨论。我们下节课初级篇见。