Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

07|实战演练:玩转Docker

你好,我是 Chrono。
学到今天的这次课,我们的“入门篇”就算是告一段落了,有这些容器知识作为基础,很快我们就要正式开始学习 Kubernetes。不过在那之前,来对前面的课程做一个回顾和实践,把基础再夯实一下。
要提醒你的是,Docker 相关的内容很多很广,在入门篇中,我只从中挑选出了一些最基本最有用的介绍给你。而且在我看来,我们不需要完全了解 Docker 的所有功能,我也不建议你对 Docker 的内部架构细节和具体的命令行参数做过多的了解,太浪费精力,只要会用够用,需要的时候能够查找官方手册就行。
毕竟我们这门课程的目标是 Kubernetes,而 Docker 只不过是众多容器运行时(Container Runtime)中最出名的一款而已。当然,如果你当前的工作是与 Docker 深度绑定,那就另当别论了。
好下面我先把容器技术做一个简要的总结,然后演示两个实战项目:使用 Docker 部署 Registry 和 WordPress。

容器技术要点回顾

容器技术是后端应用领域的一项重大创新,它彻底变革了应用的开发、交付与部署方式,是“云原生”的根本(01 讲)。
容器基于 Linux 底层的 namespace、cgroup、chroot 等功能,虽然它们很早就出现了,但直到 Docker“横空出世”,把它们整合在一起,容器才真正走近了大众的视野,逐渐为广大开发者所熟知(02 讲)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了Docker容器技术的基本原理和实践操作。通过搭建私有镜像仓库和创建一个复杂的WordPress网站的实例,读者可以快速了解容器技术的应用。文章首先回顾了容器技术的重要性和核心概念,包括容器、镜像和镜像仓库。随后详细介绍了如何搭建私有镜像仓库,使用Docker Registry实现镜像的拉取、端口映射、打标签和推送等操作。接着,通过实际操作演示了如何搭建一个包括WordPress、MariaDB和Nginx的复杂网站,展示了容器化对后端开发带来的巨大改变。同时,文章也指出了容器技术存在的一些遗憾,如手动运行命令启动应用、运行多个容器组成的应用比较麻烦等问题,并提出了容器编排的概念。最后,给出了两个思考题,引发读者对容器技术的深入思考和讨论。整体而言,本文以简洁清晰的语言介绍了Docker容器技术的基本原理和实践操作,适合读者快速了解和上手实践。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 入门实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(42)

  • 最新
  • 精选
  • lesserror
    之前对docker的了解很杂乱,知识点很细碎、分散,没有一个整体、清晰的认知。 看过中文互联网上面别人的一些教程,要么照本宣科,要么浅尝辄止。 老师的课程虽然没有做到知识点的面面俱到,当然也不可能做到。但是,算是整体上帮我又重新梳理了一遍docker的整体架构,让我对其认识更加清晰了一些。

    作者回复: 建议自己再用思维导图或者其他形式把知识体系梳理一下,这样才能真正掌握。

    2022-07-06
    3
    13
  • pyhhou
    思考题: 1. 相较于之前只知道容器是用来环境隔离,看完入门篇后,对容器技术有了一个比较宏观和基本的了解,列出来如下: 1)知道了什么是镜像,以及镜像和容器的关系 2)知道了 DockerHub 这样的镜像仓库 3)明白了容器和虚拟机的不同 4)懂得如何通过 Dockerfile 来构建自己的镜像 5)理解了 Docker 的整体内部框架 docker client -> docker daemon -> registry 6) 知道了,也实际操作了一些常用的镜像以及容器相关的指令 。。。 感觉学习到的这些东西可以覆盖工作中大多数的场景了,但是这些知识只能说是运用于小规模的东西。想要把容器技术玩的得心应手,还需了解一些容器应用的最佳实践,和一些工程化的理念和工具 2. 感觉容器编排主要应用于大规模集成应用。可以类比分布式系统,入门篇中讲的知识用在单机应用上是没有问题的,但是规模一旦变大到系统层面,就会出现一些问题,比如如何保证数据一致性?如何保证负载均衡?如何尽可能减少网络故障所带来的影响?如何能保证数据(容器)的持久化等等。。。这些问题需要运用容器编排来解决 另外想请教老师 2 个问题 文章一开始提到容器运行时(Container Runtime)这个概念,该如何理解?这是和容器绑定的一门技术吗? 还有就是,我看你在 curl 指令中直接将本地 IP 127.0.0.1 简写成 127.1,是说 curl 中允许这样的简写,还是说这本身就是一个惯例? 谢谢老师 🙏

    作者回复: 总结的很好。 1. 运行时是一个计算机里比较通用的概念,比如Java运行时,可以理解成是一个底层支持库。 2.“127.0.0.1 ”简写成“127.1”,这是通用的,因为中间的“0”可以“压缩”,其实ipv6里也是这么用的。

    2022-07-10
    8
  • 柳成荫
    1. 刚开始学容器的时候觉得容器就是一个小的虚拟机,部署一套应用应该可以把中间件和应用都部署到同一个容器中,每个容器都应该对外暴露端口才能被访问,现在觉得有些应用可以不用暴露端口,反而更加安全 2. 容器编排应该会解决容器启动、维护的麻烦,应用集群等问题 请教一个问题,部署一个java应用,jdk应该安装在宿主机还是应用的容器里面呢?

    作者回复: 1.理解的很不错。 2.应该用jdk的镜像作为基础镜像,然后再打包应用,这样多个Java容器就可以复用底层的jdk了。 3.有了容器环境,宿主机上除了容器,就不需要再安装其他东西了。

    2022-07-06
    5
  • 朱雯
    q1: 容器编排技术是有价值的,我之前以为价值不大,只是改变启动和使用方式,增加一些命令。 q2: 容器编排解决的问题是:一些非自动化,而是需要强人工干预的东西,比如网络交互需要知道对方ip地址的情况,虽然可以写自动化脚本,但这个并不通用,所以是一套通用的自动化方案。另外多台机器,自动创建负载均衡,创建路由的配置问题。这些是编排的范围。

    作者回复: great!

    2022-07-06
    5
  • mj4ever
    老师的教程中,ng → wp → db,相互之间是通过容器的 IP 地址来访问,尝试以下两种方法,可以不指定 IP 地址,通过容器名: 1、启动容器时加入了自定义的网络 my_network,类型是 bridge;其原理是容器之间的互联是通过 Docker DNS Server;代码如下 docker run -d --rm --name db1 \ --network my_network \ --env MARIADB_DATABASE=db \ --env MARIADB_USER=wp \ --env MARIADB_PASSWORD=123 \ --env MARIADB_ROOT_PASSWORD=123 \ mariadb:10 docker run -d --rm --name wp1 \ --network my_network \ --env WORDPRESS_DB_HOST=db1 \ --env WORDPRESS_DB_USER=wp \ --env WORDPRESS_DB_PASSWORD=123 \ --env WORDPRESS_DB_NAME=db \ wordpress:5 vi wp.conf server { listen 80; default_type text/html; location / { proxy_http_version 1.1; proxy_set_header Host $host; proxy_pass http://wp1; } } docker run -d --rm --name ng1 \ --network my_network \ -p 80:80 \ -v `pwd`/wp.conf:/etc/nginx/conf.d/default.conf \ nginx:alpine 2、启动 WordPress wp1 时,link 到 db1,即--link db1:db1, 启动 Nginx ng1 时,link 到 wp1,即--link wp1:wp1;其原理是容器之间的互联是通过容器里的 /etc/hosts;代码如下 docker run -d --rm --name db1 \ --env MARIADB_DATABASE=db \ --env MARIADB_USER=wp \ --env MARIADB_PASSWORD=123 \ --env MARIADB_ROOT_PASSWORD=123 \ mariadb:10 docker run -d --rm --name wp1 \ --link db1:db1 \ --env WORDPRESS_DB_HOST=db1 \ --env WORDPRESS_DB_USER=wp \ --env WORDPRESS_DB_PASSWORD=123 \ --env WORDPRESS_DB_NAME=db \ wordpress:5 vi wp.conf server { listen 80; default_type text/html; location / { proxy_http_version 1.1; proxy_set_header Host $host; proxy_pass http://wp1; } } docker run -d --rm --name ng1 \ --link wp1:wp1 \ -p 80:80 \ -v `pwd`/wp.conf:/etc/nginx/conf.d/default.conf \ nginx:alpine

    作者回复: 是的,docker里也可以自定义网络,用起来比IP地址要方便,但我特意没有讲,觉得容易和后面的Kubernetes混淆。 如果理解了Kubernetes的Service机制,再回头来学docker的自定义网络应该会比较容易。

    2022-09-17归属地:北京
    4
  • henry
    2022/08/16,docker pull mariadb:10,会有问题,docker run 时报错:[ERROR] [Entrypoint]: mariadbd failed while attempting to check config,Can't initialize timers. docker pull mariadb:10.8.2 解决问题,参考如下: https://github.com/MariaDB/mariadb-docker/issues/434

    作者回复: good

    2022-08-16归属地:北京
    4
  • 怀草诗
    docker run -d --rm \ -p 80:80 \ -v `pwd`/wp.conf:/etc/nginx/conf.d/default.conf \ nginx:alpine 老师,这个命令中 -v 后面跟的 'pwd' 什么意思?

    作者回复: `pwd`是shell命令,意思是获取当前目录,注意它用的是反引号,就是“1”左边的那个键。 如果不熟悉用法可以改用绝对路径,比如/home/xxx/.../wp.conf。

    2022-07-25
    2
    4
  • lesserror
    老师,有几个小问题: Q1:k8s应该算是容易编排技术吧?如果学会了k8s的日常操作,关于docker的使用是不是就可以减少了。了解一个大概就好了,很多操作应该逐渐偏向对k8s的操作? Q2: 对于容器化的应用来说,如果想从外部访问对应的服务,是不是必须要做端口映射这一步?宿主机的端口需要唯一性,容器应用的端口随意指定,即使多个容器应用有相同的端口。

    作者回复: 1.这个要看实际工作需求,目前来说docker了解基本就足够了,Kubernetes要投入更多精力。 2.对的,容器用namespace把内外网络隔离了,所以外界要访问就必须要有映射这个动作,到了宿主机端口号也同样不能冲突。

    2022-07-06
    4
  • 蔡晓慧
    1.之前没有容器技术的时候,部署应用各种环境会存在各种的问题,尤其是我司有C++的项目,需要安装依赖,光调试环境就搞得很头疼,现在有了容器技术,打包成镜像,随处可用,很方便; 2.感觉容器编排就是为了大型应用服务的。我们目前有十几个镜像,是用docker-compose用来做项目交付,应对一般场景足够用。但很多公司要求HA,这时候感觉上k8s感觉好一点,可扩展性好,快速扩容,我们也在往这个方向发展,所以自己有空来学习学习。

    作者回复: great!

    2023-03-02归属地:北京
    2
  • 可可
    当我对wp.conf文件做了修改之后,执行nginx -t成功,但执行nginx -s reload却提示nginx 29#29: signal process started,发现修改并未生效。请问老师和其他同学遇到过这种情况吗? 我的解决办法是只能删除nginx容器后重新创建,这时候wp.conf就是生效的。但总不可能每次修改配置文件都重新创建nginx容器吧,寻求答案中……

    作者回复: 可以在容器里向Nginx master进程发送HUP信号。

    2022-10-19归属地:上海
    1
收起评论
显示
设置
留言
42
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部