{"id":19866079,"url":"https://github.com/zhenye-na/devops-with-docker-k8s","last_synced_at":"2026-04-07T20:31:34.269Z","repository":{"id":94156157,"uuid":"231726044","full_name":"Zhenye-Na/devops-with-docker-k8s","owner":"Zhenye-Na","description":"🐳 DevOps Best Practice with Docker and Kubernetes","archived":false,"fork":false,"pushed_at":"2020-01-26T05:13:48.000Z","size":4958,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-01T00:35:10.881Z","etag":null,"topics":["devops","docker","kubernetes","vagrant"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Zhenye-Na.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-01-04T07:28:38.000Z","updated_at":"2020-02-13T22:40:18.000Z","dependencies_parsed_at":"2023-05-24T07:15:53.250Z","dependency_job_id":null,"html_url":"https://github.com/Zhenye-Na/devops-with-docker-k8s","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Zhenye-Na/devops-with-docker-k8s","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Zhenye-Na%2Fdevops-with-docker-k8s","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Zhenye-Na%2Fdevops-with-docker-k8s/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Zhenye-Na%2Fdevops-with-docker-k8s/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Zhenye-Na%2Fdevops-with-docker-k8s/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Zhenye-Na","download_url":"https://codeload.github.com/Zhenye-Na/devops-with-docker-k8s/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Zhenye-Na%2Fdevops-with-docker-k8s/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31528286,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["devops","docker","kubernetes","vagrant"],"created_at":"2024-11-12T15:24:56.285Z","updated_at":"2026-04-07T20:31:34.220Z","avatar_url":"https://github.com/Zhenye-Na.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 慕课网: 系统学习 Docker 践行 DevOps 理念 - 课程学习笔记\n\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./assets/2020-01-04_225040.png\" width=\"80%\"\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./assets/2020-01-04_225106.png\" width=\"80%\"\u003e\n  \u003cp\u003e经典的 CI/CD 流程\u003c/p\u003e\n\u003c/div\u003e\n\n\n\n[TOC]\n\n**目录**\n\n1. 容器技术和 Docker 简介\n1. Docker 的镜像和容器\n1. Docker 的网络\n1. Docker 的持久化存储和数据共享\n1. Docker Compose 多容器部署\n1. 容器编排 Docker Swarm\n1. DevOps 初体验 - Docker Cloud 和 Docker 企业版\n1. 容器编排 Kubernetes\n1. 容器运维和监控\n1. Docker DevOps 实战 - 过程以及工具\n1. 总结\n\n\n\n\u003e 建议先阅读我写的[这篇](https://zhenye-na.github.io/2019/09/29/docker-practical-guide.html)笔记, 不然会不知所云\n\u003e\n\u003e https://zhenye-na.github.io/2019/09/29/docker-practical-guide.html\n\n\n\n## 1. 容器技术和 Docker 简介\n\n虚拟化技术的优点\n\n- 资源池 - 一个物理机的资源被分配到不同的虚拟机里\n- 易扩展 - 直接增加物理机或者虚拟机即可\n- 易上云 - AWS, GCP, 阿里云等\n\n\n但是虚拟化具有一定的局限性: 虚拟机是一个完整的操作系统, 需要分配资源, 当虚拟机数量增多时, 操作系统本身消耗的资源势必增多\n\n那么使用容器解决了什么问题呢?\n\n\n- 解决了开发和运维的矛盾\n- 在开发和运维之间搭建桥梁, 帮助实现 DevOps\n\n\n容器的定义:\n\n- 对软件和其依赖的标准化打包\n- 应用之间的相互隔离\n- 共享同一个 OS Kernel\n- 可以运行在很多主流 OS 上\n\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://www.docker.com/sites/default/files/d8/2018-11/docker-containerized-and-vm-transparent-bg.png\" width=\"70%\"\u003e\n\u003c/div\u003e\n\n\u003e Docker Machine: 自动在虚拟机上安装 Docker 环境的工具\n\n\n\n## 2. Docker 的架构和底层技术\n\n\n### Docker Image 概述\n\n什么是 Docker Image?\n\n- 文件和 meta data 的集合 (root filesystem)\n- 文件分层. 并且每一层都可以添加改变删除文件, 成为一个新的 image\n- 不同的 image 可以共享相同的 layer\n- Image 是 **read only** 的\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"http://crishantha.com/wp/wp-content/uploads/2015/05/docker12.png\" width=\"70%\"\u003e\n\u003c/div\u003e\n\n\n\n### Image 获取方式\n\n1. Dockerfile\n2. Pull from Registry / DockerHub\n\n\n```sh\n$ docker version\n# 查看 docker version\n\n$ docker image ls\n# 列出 docker 里的镜像\n\n$ docker pull \u003cimage_name\u003e\n# 拉取 docker 镜像\n```\n\n\n\n#### 如何制作一个镜像\n\n```sh\n# 添加账号进入用户组, 否则需要一直 sudo\n\n# 重启 docker 进程\n$ sudo service docker restart\n```\n\n```dockerfile\nFROM scratch\nADD hello /\nCMD [\"/hello\"]\n```\n\n构件一个 Image\n\n```sh\n$ docker build -t \u003ctag_name\u003e .\n```\n\n查看 docker image 命令记录\n\n```sh\n$ docker history \u003cimage_id\u003e\n```\n\n运行\n\n```sh\n$ docker run \u003ctag_name\u003e\n```\n\n\n\n### Docker Container 概述\n\n- 通过 Docker Image 创建 Container\n- 在 Image Layer 之上建立一个可以读写的 Container Layer\n- Image 负责 app 的存储和分发, Container 负责运行 app\n\n\n```sh\n$ docker container ls -a\n\n$ docker run centos -it\n# -i : interactive\n# -t : tty, allocate a pseudo-TTY\n```\n\n其他的一些命令\n\n- management commands\n- commands\n\n```sh\n$ docker container rm \u003ccontainer_id\u003e\n\n$ docker rm \u003ccontainer_id\u003e\n\n$ docker rmi \u003cimage_id\u003e\n```\n\n\n\n#### 构建一个 Container\n\n相关命令\n\n```sh\n$ docker conatiner commit \u003carg\u003e\n# commit 一个 container\n\n$ docker image build \u003carg\u003e\n# Build an image from a Dockerfile\n```\n\n\n比较简单但是不安全的做法就是, 比如你想发布一个带有 `vim` 的 centos 镜像. 你可以直接 pull 一个 centos 在里面安装 vim 然后发布, 但是怕就怕在一但讲什么重要的文件也发布出去就尴尬了, 所以我们可以用 `dockerfile` 来直接制作\n\n```dockerfile\nFROM centos\nRUN yum install -y vim\n```\n\n```sh\n$ docker build -t \u003cname\u003e\n```\n\n\n### Dockerfile 语法梳理及最佳实践\n\n\n**`FROM`**\n\n- `FROM scratch` # 制作 base image\n- `FROM centos`  # 使用 base image\n- `FROM ubuntu:14.04`\n\n\u003e 当然 尽量使用官方的 image 作为 base image\n\n\n\n**`LABEL`**\n\n描述一些 metadata 的信息\n\n- `LABEL maintainer=\"\"`\n- `LABEL version=`\n- `LABEL description=`\n\n\n\n**`RUN`**\n\n运行命令\n\n```dockerfile\nRUN yum update \u0026\u0026 yum install -y vim \\\n    python-dev\n```\n\n\n\n**`WORKDIR`**\n\n工作目录\n\n```\nWORKDIR /root\n\nWORKDIR /test # 如果没有会创建 test 目录\nRUN pwd\n# 结果就是 /test\n```\n\n\n\n**`ADD` 和 `COPY`**\n\n```\nADD hello /\n\nADD test.tar.gz / # 添加并且解压\n```\n\n对于 ADD 和 COPY, 大部分情况, COPY 优于 ADD, ADD 除了 COPY 还有**解压**这个功能, 添加远程文件/目录, 尽量使用 `curl` 或者 `wget`\n\n\n\n**`ENV`**\n\n```dockerfile\nENV MYSQL_VERSION 5.6\nRUN apt-get install -y mysql-server=\"${MYSQL_VERSION}\" \\\n    \u0026\u0026 rm -rf /var/lib/apt/lists/*   # 引用常量\n```\n\n\n\n**`VOLUME` 和 `EXPOSE`**\n\n\n\n### RUN vs CMD vs ENTRYPOINT\n\n\n- `RUN` 执行命令并创建新的 `Image Layer`\n- `CMD` 设置容器启动后默认执行的命令和参数\n- `ENTRYPOINT` 设置容器启动时运行的命令\n\n\n\n#### shell 和 exec 格式\n\n\n\n- shell 格式\n\n  - ```dockerfile\n    RUN apt-get install -y vim\n    CMD echo \"hello docker\"\n    ENTRYPOINT echo \"bye\"\n    ```\n\n- exec 格式\n\n  - ```dockerfile\n    RUN [\"apt-get\", \"install\", \"-y\", \"vim\" ]\n    CMD [\"/bin/echo\", \"hello docker\" ]\n    ENTRYPOINT [ \"/bin/echo\", \"bye\" ]\n    ```\n\n  - ```dockerfile\n    FROM centos\n    ENV NAME Docker\n    ENTRYPOINT [ \"/bin/bash\", \"-c\", \"echo hello $NAME\" ]\n    ```\n\n\n\n#### CMD\n\n\n\n1. 容器启动时默认执行的命令\n2. 如果 `docker run` 制定了其他的命令, 那么 `CMD` 会被忽略\n3. 如果定义了多个 `CMD` 只有最后一个会执行\n\n\n\n#### ENTRYPOINT\n\n\n1. 让容器以应用程序或者服务的形式运行\n2. 不会被忽略, 一定会执行\n3. 最佳实践: 写一个 shell 脚本\n\n\u003e 使用较多\n\n\n\n### 发布镜像\n\n\n- 带着自己的 dockerhub username\n- `docker login`\n- `docker push \u003cimage_name\u003e`\n\n- dockerhub -\u003e automated build\n\n\n\n### 容器的相关操作\n\n\n\n进入到 Container 里面操作\n\n```bash\n$ docker exec -it \u003ccontainer_id\u003e /bin/bash\n```\n\n\n\n停止 Container 运行\n\n```shell\n$ docker stop \u003ccontainer_id\u003e\n```\n\n\n\n返回 json 形式的 docker container 信息\n\n```shell\n$ docker inspect \u003ccontainer_id\u003e\n```\n\n\n\n返回 container 运行中产生的 logs\n\n```bash\n$ docker logs \u003ccontainer_id\u003e\n```\n\n\n\n### Dockerfile 小实践\n\n\n\n```dockerfile\nFROM ubuntu\nRUN apt-get update \u0026\u0026 apt-get upgrade \u0026\u0026 apt-get install -y stress\nENTRYPOINT [\"/usr/bin/stress\"]\nCMD []\n```\n\n\n这样在使用的时候, vm 等的参数可以被传入 (相当于添加到 CMD)\n\n\n\n### 容器的资源限制\n\n\n\u003e 比如说限制 container 内存的大小等\n\n\n限制内存\n\n```\n- memory\n- memory-swap\n\n设置了 memory 但是没有设置 swap-memory -\u003e swap memory 大小和设置的 memory 大小相等\n```\n\n\n限制 CPU\n\n```\n- cpu-shares   (relative weight)\n```\n\n\n\n## 3. Docker 的网络\n\n- 单机\n  - Bridge Network\n  - Host Network\n  - None Network\n- 多机\n  - Overlay Network\n\n\n\n### 基础网络概念\n\n基于数据包的通信方式\n\n网络分层\n\n\n\u003cimg src=\"/Users/macbookpro/Desktop/website/_posts/2019-12-31-devops-with-docker-and-k8s.assets/764050-20150904095142060-1017190812.gif\" style=\"zoom:67%;\" /\u003e\n\n\n\n#### 一些概念和工具\n\n\n\n公有IP 和 私有 IP\n\n- Public IP: 互联网上的唯一标识, 可以访问互联网\n- Private IP: 不可以在互联网上使用, 仅供内部使用\n\n\n\nping 和 telnet\n\n- ping 检查 IP 的可达性\n- tenet 检查服务的可用性\n\n\n\n#### Linux 的网络命名空间\n\n\n\n```bash\n$ ip a\n```\n\n\n创建 container 会生成 name space\n\n\n#### Docker Bridge 网络\n\n\n```bash\n$ docker network ls\n```\n\n两个可以通信的 container 可以通过 `veth` 对 通过 `docker0` 链接.\n\n\n##### 针对单个 docker container 是如何访问网络的\n\n通过 NAT 技术 链接 eth0 , 形成 linux 主机数据包, 链接外网\n\n\n\n#### Docker 之间的 link\n\n\u003e 例子: 给数据库容器起一个名字, 然后直接用名字访问该容器\n\n```bash\n$ docker run -d --name test2 --link test1 busybox /bin/sh -c \"while true; do sleep; done\"\n\n$ docker exec -it test2 /bin/sh\n\n$ ping test1 # 可以 ping 通\n# 只需要知道名字, 不需要知道 ip 地址\n```\n\n创建一个 bridge 并将新的容器连接\n\n```bash\n$ docker network create -d bridge my-bridge\n\n$ docker network ls\n\n$ docker run -d --name test2 --network my-bridge busybox /bin/sh -c \"while true; do sleep; done\"\n\n$ docker network inspect \u003cnetwork_id\u003e\n```\n\n\n如何将之前已经创建好的容器连接到新创建的 bridge 呢?\n\n```bash\n$ docker network connect\n\"docker network connect\" requires exactly 2 arguments.\nSee 'docker network connect --help'.\n\nUsage:  docker network connect [OPTIONS] NETWORK CONTAINER\n\nConnect a container to a network\n\n$ docker network connect my-bridge test1\n```\n\n\n\n`test1` 和 `test2` 都连接到用户自己创建的 bridge, 那么在 test1 中可以通过 `ping test2` , 相当于已经做好了 `--link test2` 这个操作\n\n\n\n### 容器网络 host 和 none\n\n#### none\n\n```bash\n$ docker run -d --name test2 --network none busybox /bin/sh -c \"while true; do sleep; done\"\n```\n\n孤立的 network namespace\n\n\n\n一个模块一个容器\n\n\n### 多机器通信\n\n\n在不同 Linux 宿主机的 docker 容器通信\n\n\n## Docker 持久化存储和数据共享\n\n容器是临时存储和保存数据, 一旦删除, 数据都会被删除\n\n\n**Docker 持久化数据的方案**\n\n1. \u003cu\u003e基于本地文件系统的 Volume\u003c/u\u003e. 可以执行 `Docker create` 或者 `Docker run` 时, 通过 `-v` 参数将主机的目录作为容器的数据卷. 这部分功能便是基于本地文件系统的 volume 管理\n2. \u003cu\u003e基于 plugin 的 Volume\u003c/u\u003e. 支持第三方的存储方案, 比如 AWS\n\n\nVolume 的类型\n\n1. 受管理的 data volume, 由 docker 后台自动创建\n2. 绑定挂载的 volume, 具体挂载位置可以由用户指定\n\n\n\n### 数据持久化: Data Volume\n\n举例\n\n```bash\n$ docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql\n\n$ docker volume ls\n\n$ odcker volume inspect\n\n$ docker volume rm \u003cvolume_id\u003e\n```\n\n\n\n在 Dockerfile 中指定\n\n```bash\nVOLUME [\"/var/lib/mysql\"]\n```\n\n\n\n在命令行中 (推荐)\n\n```bash\n$ docker run -v mysql:/var/lib/mysql\n#               宿主机:docker 容器内\n```\n\n\n\n### 数据持久化: Bind Mounting\n\n修改会同步, 双向\n\n```bash\n$ docker run -v /home/aaa:/root/aaa\n```\n\n将容器内的文件映射到宿主机上, 并且双向同步\n\n\n\n## Docker compose 介绍\n\n多容器的 APP 部署十分繁琐\n\n- docker build image 或者 从 dockerhub 拉取\n- 创建多个 container\n- 要管理这些 container (启动停止删除等)\n\n\n\nDocker compose 就类似于 \"批处理\"\n\n- 是一个基于命令行的批处理工具\n- 可以通过一个 yml 文件定义多容器的 docker 应用\n- 通过一条命令节可以根据 yml 文件的定义去创建或者管理多个容器\n\n\n\n`docker-compose.yml`\n\n- Services\n- Networks\n- Volumes\n\n\n\n#### Services\n\n- 一个 service 代表一个 container, 这个 container 可以从 dockerhub 的 image 创建, 或者从本地的 Dockerfile build 出来的 image 来创建\n- Service 启动类似于 docker run, 我们可以给其指定 network 和 volume, 所以可以 service 指定 network 和 volume 的引用\n\n\n\n举个简单的例子\n\n```yml\nservices:\n  db:\n    image: postgres:9.4\n    volumes:\n      - \"db-data:/var/lib/postgresql/data\"\n    networks:\n      - back-tier\n```\n\n作用等同于下面这条命令\n\n```bash\n$ docker run -d --network back-tier -v db-data:/var/lib/postgresql/data postgres:9.4\n```\n\n\n```bash\n$ docker-compose up --scale\n\n# scale SERVICES to NUM instances\n```\n\n\n## Docker Swarm 容器编排\n\n\n\nService 和 Replicas\n\n\n\n\n服务创建和调度流程\n\n\n\n\n\n### 实践: 创建一个三节点的 Docker Swarm 集群\n\n\n\n创建宿主机环境的方法\n\n- Vagrant + Virtual Box\n- Docker Machine + Virtual Box\n- Play with Docker\n\n\n\n```bash\n$ docker swarm init --advertise-addr\n# 要在 manager 机器上运行, 运行完事后 就变成了 manager 节点\n\n$ docker swarm join --token \u003ctoken\u003e \u003cadvertise-addr:port\u003e\n# 上一步操作会生成一段命令, 复制在 worker 机器上运行即可\n\n$ docker node ls\n# list nodes in the swarm\n```\n\n\n\n### Service 的创建维护和水平扩展\n\n\n```bash\n$ docker service scale SERVICE=REPLICAS\n\n$ docker service ls\n```\n\n### Swarm 集群通过 Service 进行部署\n\n\n```bash\n$ docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root \\\n    --env MYSQL_DATABASE=wordpress \\\n    --network demo \\\n    --mount type=volume,source=mysql-data,destination=/var/lib/mysql \\\n    mysql\n```\n\n\n```bash\n$ docker service create --name wordpress -p 80:80 \\\n    --env WORKDPRESS_DB_PASSWORD=root \\\n    --env WORDPRESS_DB_HOST=mysql \\\n    --network demo \\\n    wordpress\n```\n\n\n```bash\n$ docker service ps wordpress\n```\n\n\n### 集群服务间通信之 Routing Mesh\n\n\nDNS 服务发现\n\n\n\n使用 `whoami` 镜像来举例讲解\n\n```bash\n$ docker service create --name whoami -p 8000:8000 --network demo -d jwilder/whoami\n\n$ docker service ls\n\n$ docker service ps whoami\n\n$ ping whoami\n\n# 将服务 scale 成 2 份\n$ docker service scale whoami=2\n$ ping whoami\n```\n\n\n\n会生成 `virtual ip address` (vip), ping 两次返回的地址是相通的. 不管它 host 在哪台机器. 虚拟 ip 不会更改\n\n\n\n**Routing Mesh 的两种体现**\n\n- `Internal` - Container 和 Container 之间的访问, 通过 `overlay`  网络 (通过虚拟 IP)\n- `Ingress` - 如果服务有绑定接口, 则此服务可以通过任意 swarm 节点的相应接口访问\n\n\n\nIngress Network\n\n- 外部访问的负载均衡\n- 服务端口被暴露到各个 swarm 节点\n- 内部通过 IPVS 进行负载均衡\n\n\n\nInternal Load Balancing\n\n\n### Docker Stack 进行部署\n\n\n`docker-compose.yml`\n\n```yaml\nservices:\n\n  mysql:\n    image:\n    ....\n    \n    deploy:\n      mode: global # no replicas\n      placement:\n        constraints:\n          - node.role == manager\n```\n\n\n\n```bash\n$ docker stack deploy \n```\n\n\n\n### Docker Secret 管理和使用\n\n\u003e 比如数据库密码啦, 什么 token 啦, 用来保密的\n\n\n\n- 用户名密码\n- SSH Key\n- TLS 认证\n- Data\n\n\n\nSecret Management\n\n1. 所有的 secrets 都存储在 Swarm Manager 节点的 Raft Database 里面\n2. Secret 可以 assign 给一个 service, 这个 service 就能看到存储的 secret\n3. 在 containers 内部 Secret 看起来像文件, 但是实际是在**内存**中\n\n\n\n```bash\n$ docker secret create\n\"docker secret create\" requires at least 1 and at most 2 arguments.\nSee 'docker secret create --help'.\n\nUsage:  docker secret create [OPTIONS] SECRET [file|-]\n\nCreate a secret from a file or STDIN as content\n\n\n$ docker secret ls\n```\n\n\n\n## Kubernetes 实战容器编排\n\n\u003cimg src=\"/Users/macbookpro/Desktop/website/_posts/2019-12-31-devops-with-docker-and-k8s.assets/Chart_02_Kubernetes-Architecture.png\" style=\"zoom: 67%;\" /\u003e\n\n\n\u003cimg src=\"/Users/macbookpro/Desktop/website/_posts/2019-12-31-devops-with-docker-and-k8s.assets/Chart_03_Kubernetes-Master.png\" style=\"zoom:67%;\" /\u003e\n\n\n\u003cimg src=\"/Users/macbookpro/Desktop/website/_posts/2019-12-31-devops-with-docker-and-k8s.assets/Chart_04_Kubernetes-Node.png\" style=\"zoom:67%;\" /\u003e\n\n\n### K8s 最小调度单位 - Pod\n\n\u003e 不对容器进行直接操作\n\nPod: 容器调度的\u003cu\u003e最小单位\u003c/u\u003e. 具有相同 namespace 的 container 组合, 单个/多个容器, 如果多个, 则共享 network\n\n\n\n- 一个 Pod 共享一个 namespace (user, network ...)\n- 可以包含多个或者单个容器\n\n\n\n举个栗子, nginx 相关的 yaml 文件`pod_nginx.yml`\n\n```yaml\napiVersion: v1\nkind: pod\nmetadata:\n  name: nginx\n  labels:\n    app: nginx\nspec:\n  containers:\n  - name: nginx\n    image: nginx\n    ports:\n    - containerPort: 80\n```\n\n\n\n```bash\n# create a new pod\n$ kubectl create -f \u003cfilename\u003e\n\n# delete pod\n$ kubectl delete -f \u003cfilename\u003e\n\n# list all pods\n$ kubectl get pods -o wide\n\n$ kubectl exec -it nginx sh\n\n# 返回描述信息\n$ kubectl decribe pods nginx\n```\n\n直接进入到容器中进行操作\n\n```bash\n$ kubectl get pods -o wide\n\n$ kubectl exec -it nginx sh\n# (in shell)\n# ls\nbin dev home ...\n```\n\n```bash\n$ minikube ssh\n```\n\n\n## References\n\n- Vagrant下载 https://www.vagrantup.com/downloads.html\n- Virtualbox 5.1下载 https://www.virtualbox.org/wiki/Download_Old_Builds_5_1\n- Docker国内源安装 https://get.daocloud.io/#install-docker\n- Docker官方网站 https://www.docker.com/\n- Docker官方文档中心 https://docs.docker.com/\n- DockerHub https://hub.docker.com/","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhenye-na%2Fdevops-with-docker-k8s","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhenye-na%2Fdevops-with-docker-k8s","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhenye-na%2Fdevops-with-docker-k8s/lists"}