07|实战演练:玩转Docker
容器技术要点回顾
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了Docker容器技术的基本原理和实践操作。通过搭建私有镜像仓库和创建一个复杂的WordPress网站的实例,读者可以快速了解容器技术的应用。文章首先回顾了容器技术的重要性和核心概念,包括容器、镜像和镜像仓库。随后详细介绍了如何搭建私有镜像仓库,使用Docker Registry实现镜像的拉取、端口映射、打标签和推送等操作。接着,通过实际操作演示了如何搭建一个包括WordPress、MariaDB和Nginx的复杂网站,展示了容器化对后端开发带来的巨大改变。同时,文章也指出了容器技术存在的一些遗憾,如手动运行命令启动应用、运行多个容器组成的应用比较麻烦等问题,并提出了容器编排的概念。最后,给出了两个思考题,引发读者对容器技术的深入思考和讨论。整体而言,本文以简洁清晰的语言介绍了Docker容器技术的基本原理和实践操作,适合读者快速了解和上手实践。
《Kubernetes 入门实战课》,新⼈⾸单¥59
全部留言(42)
- 最新
- 精选
- lesserror之前对docker的了解很杂乱,知识点很细碎、分散,没有一个整体、清晰的认知。 看过中文互联网上面别人的一些教程,要么照本宣科,要么浅尝辄止。 老师的课程虽然没有做到知识点的面面俱到,当然也不可能做到。但是,算是整体上帮我又重新梳理了一遍docker的整体架构,让我对其认识更加清晰了一些。
作者回复: 建议自己再用思维导图或者其他形式把知识体系梳理一下,这样才能真正掌握。
2022-07-06313 - 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-108 - 柳成荫1. 刚开始学容器的时候觉得容器就是一个小的虚拟机,部署一套应用应该可以把中间件和应用都部署到同一个容器中,每个容器都应该对外暴露端口才能被访问,现在觉得有些应用可以不用暴露端口,反而更加安全 2. 容器编排应该会解决容器启动、维护的麻烦,应用集群等问题 请教一个问题,部署一个java应用,jdk应该安装在宿主机还是应用的容器里面呢?
作者回复: 1.理解的很不错。 2.应该用jdk的镜像作为基础镜像,然后再打包应用,这样多个Java容器就可以复用底层的jdk了。 3.有了容器环境,宿主机上除了容器,就不需要再安装其他东西了。
2022-07-065 - 朱雯q1: 容器编排技术是有价值的,我之前以为价值不大,只是改变启动和使用方式,增加一些命令。 q2: 容器编排解决的问题是:一些非自动化,而是需要强人工干预的东西,比如网络交互需要知道对方ip地址的情况,虽然可以写自动化脚本,但这个并不通用,所以是一套通用的自动化方案。另外多台机器,自动创建负载均衡,创建路由的配置问题。这些是编排的范围。
作者回复: great!
2022-07-065 - 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 - henry2022/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-2524 - lesserror老师,有几个小问题: Q1:k8s应该算是容易编排技术吧?如果学会了k8s的日常操作,关于docker的使用是不是就可以减少了。了解一个大概就好了,很多操作应该逐渐偏向对k8s的操作? Q2: 对于容器化的应用来说,如果想从外部访问对应的服务,是不是必须要做端口映射这一步?宿主机的端口需要唯一性,容器应用的端口随意指定,即使多个容器应用有相同的端口。
作者回复: 1.这个要看实际工作需求,目前来说docker了解基本就足够了,Kubernetes要投入更多精力。 2.对的,容器用namespace把内外网络隔离了,所以外界要访问就必须要有映射这个动作,到了宿主机端口号也同样不能冲突。
2022-07-064 - 蔡晓慧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