docker与kubernetes(k8s)入门与实战

docker简介

  Docker 是基于Go 语言实现的开源容器项目。它诞生于2013 年年初,最初发起者是dotCloud 公司。现在主流的操作系统包括Linux 各大发行版、macOS , Windows 等都已经支持Docker 。如Redhat RHEL 6.5 /CentOS 6 . 5 、Ubuntu 16.04 以及更新的版本,都已经在官方软件源中默认带有Docker 软件包。

容器与虚拟机、LXC、cgroup

  早期的Docker 代码实现是直接基于LXC 的。自0.9 版本开始, Docker 开发了libcontainer项目作为更广泛的容器驱动实现,从而替换掉了LXC 的实现。读者可以将Docker 容器理解为一种轻量级的沙盒( sandbox ) 。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。

  作为一种轻量级的虚拟化方式, Docker 在运行应用上跟传统的虚拟机方式相比具有如下显著优势:

  • Docker 容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多;
  • Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个Docker 容器(在IBM 服务器上已经实现了同时运行! OK 量级的容器实例);
  • Dock er 通过类似Git 设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新;
  • Docker 通过Dockerfile 支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程。

  docker不能控制的资源可参见https://zhidao.baidu.com/question/652501881560192845.html

  Docker 容器除了运行其中的应用外,基本不消耗额外的系统资源,在保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N 个不同的应用就要启用N 个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker 只需要启动N 个隔离得“很薄的”容器,并将应用放进容器内即可。应用获得的是接近原生的运行性能。
  当然,在隔离性方面,传统的虚拟机方式提供的是相对封闭的隔离。docker则存在一定的风险。概述起来如下:

  

  可参见http://t.zoukankan.com/doublegi-p-5923898.html,几乎无消耗,2022更新。

  docker虚拟化和传统虚拟化的对比如下:

  

 

 

   一开始Docker、LXC、Cgroup三者的关系是:Cgroup在最底层落实资源管理(为了纯隔离,我们也可以直接使用cgroup,我们之前在托管部署的时候就是这么做的),LXC在cgroup上封装了一层,Docker又在LXC封装了一层,如下所示(现在使用):

  

 

   具体可见https://blog.51cto.com/speakingbaicai/1359825。

容器的价值

  Docker 的构想是要实现“ Build , Ship and Run Any App, Anywhere ”,即通过对应用的封装( Packaging )、分发( Distribution )、部署( Deployment )、运行( Runtime )生命周期进行管理,达到应用组件级别的“ 一次封装,到处运行” 。这里的应用组件, 既可以是一个Web 应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群,对,你甚至可以测试操作系统的特性比如ubutntu。

  但是很标准化的应用、基本上不依赖于三方环境如java应用,以及持久化很重的应用如数据库,采用容器的价值不大,也难以普及。但是环境折腾比较复杂的应用或需要yum安装依赖的应用如nginx/couchbase/rabbitmq/redis/pmm会好一些。另外这些应用通常内外部交互都通过网络进行,否则作为守护进程自包含运行意义就不大。就当前我们应用来看,由于很多传统企业仍然运行物理机跑微服务(因为ISV都是微服务架构),因此为了控制某些服务资源消耗失控,docker最大的价值之一在于保障服务的稳定性,实现和vm一样的效果。

docker核心概念

  Docker有三大核心概念,只有理解了这三个核心概念,才能顺利地理解Docker 容器的整个生命周期。

镜像

  Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。镜像是创建Docker 容器的基础。通过版本管理和增量的文件系统, Docker 提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并直接使用,跟spring boot应用一样,不再依赖外置servlet容器。

容器

  Docker 容器类似于一个轻量级的沙箱,类似于虚拟机运行时实例, Docker 利用容器来运行和隔离应用,从镜像创建而来。可以把容器看作一个简易版的Linux 系统环境(包括root 用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。

  容器从镜像启动的时候,会在镜像的最上层创建一个可写层。

仓库

  Docker 仓库类似于代码仓库,是Docker 集中存放镜像文件的场所。类似于maven仓库、npm仓库、yum仓库。

  有时候我们会将Docker 仓库和仓库注册服务器( Register)混为一谈(就跟yum源、maven镜像一样,只不过在默认仓库有镜像时,我们不需要配置注册服务器而已。当然,很多时候默认仓库没有及时更新导致缺某些版本的镜像,此时就要了解了,DL经常被和谐,懂的),并不严格区分。实际上,仓库注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签( tag )来进行区分。例如存放Ubuntu 操作系统镜像的仓库,被称为Ubuntu 仓库,其中可能包括16.04 、18 . 04 等不同版本的镜像。

   

  最大的公开仓库是官方提供的Docker Hub,跟maven中央仓库一样,其中存放着数量庞大的镜像供用户下载。国内不少云服务提供商(如腾讯云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访问,大的企业一般也都有自己的私服。

  注:Docker 利用仓库管理镜像的设计理念与Git 代码仓库的概念非常相似,实际上Docker 设计上借鉴了Git 的很多优秀思想。

Docker 引擎及安装

  Docker 引擎是使用Docker 容器的核心组件,可以在主流的操作系统和云平台上使用,包括Linux 操作系统(如Ubuntu 、Debian , CentOS 、Red.hat 等), macOS 和Windows 操作系统,以及IBM 、亚马逊、微软等知名云平台。docker引擎可从https: //www.docker.com/get-docker下载。社区版本每个月会发布一次尝鲜( Edge )版本,每个季度( 3 、6 、9 、12 月)会发行一次稳定( Stable )版本。版本号命名格式为“年份.月份”,如2018 年6 月发布的版本号为vl8.06 。

  centos下docker安装Docker 目前支持CentOS 7 及以后的版本。系统的要求跟Ubuntu 情况类似, 64 位操作系统,内核版本至少为3.10 。

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.corn/linux/centos/docker-ce.repo
yum update
yum install -y docker-ce
systernctl start docker

  Docker 服务启动时实际上是调用了dockerd 命令,支持多种启动参数,可保存在/etc/docker/daemon.json中。因此,用户可以直接通过执行dockerd 命令来启动Docker 服务。

  对于CentOS 、RedHat 等系统,服务通过systemd 来管理,配置文件路径为/etc/systemd/system/docker.service.d/docker.conf。更新配置后需要通过systemctl 命令来管理Docker服务:
$ sudo systemctl daemon-reload
$ sudo systemctl start docker.service

  注:如果要开启防火墙,一定要在firewalld配置里面加上docker网段,否则docker内部无法访问主机的,运行时可能会出现“dial tcp 192.168.22.249:8443: connect: no route to host”。

 

# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected inco
ming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <rule family="ipv4">
       <source address="172.17.0.1/16"/>
       <accept/>
  </rule>
</zone>

 

  如果服务工作不正常,可以通过查看Docker 服务的日志信息来确定问题,例如在RedHat 系统上日志文件可能为/var/log/messages。

  每次重启Docker 服务后,可以通过查看Docker 信息( docker info 命令),确保服务已经正常运行。

镜像下载

  可以使用命令docker pull [OPTIONS] NAME[:TAG|@DIGEST] [flags]下载镜像,例如下载couchbase镜像的命令如下:

  

  如果不指定TAG,则为latest。镜像名均为小写。每个版本的docker引擎支持的镜像的TAG可从https://hub.docker.com/查询,也可以通过docker search image-name模糊搜索。从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的latest 标记的镜像。不想从默认仓库下载的话,可以在镜像名之前加上仓库名/,如registry.hub.docker.com/ubuntu:18.04。

[root@dbserver1 ~]# docker search pmm-serv
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
percona/pmm-server                Percona Monitoring and Management - PMM Serv…   74                                      
perconalab/pmm-server             PMM Server dev repo                             6                                       
perconalab/pmm-server-fb                                                          1                                       
perconalab/pmm-server-openshift                                                   1                                       
manjots/pmm-server-orchestrator                                                   0                                       
zytek/pmm-server-ecs              pmm-server ready to be deployed to ECS with …   0                                       
dreambeam/pmm-server                                                              0                                       
ignatev/pmm-server                                                                0                                       
eason2403/pmm-server                                                              0                                       
gywndi/pmm-server-kkb                                                             0                                       
salrin/pmm-server                                                                 0                                       
nlpsecure/pmm-server-aio                                                          0                                       
pdawn/pmm-server                  pmm server                                      0                                       [OK]
aleksi/pmm-server-alertmanager                                                    0                                       
gywndi/pmm-server                                                                 0                                       
flyer103/pmm-server                                                               0                                       
yinjie/pmm-server1.7                                                              0                                       
avinashgudapati/pmm-server                                                        0                                       
sahilguptaaaa/pmm-server                                                          0                                       
729414559/pmm-server                                                              0                                       
dockerhernan/pmm-sever            pmm-server Container : to the tdp2 course's …   0                                       
michaelcoburn1/pmm-server                                                         0                                       
hfadhloun/pmm                     percona/pmm-server:latest                       0                                       
[root@dbserver1 ~]# 

  可以输入docker --help,或docker command --help查看详细帮助手册。

[root@dbserver1 ~]# docker --help

Usage:    docker COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/root/.docker")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  config      Manage Docker configs
  container   Manage containers
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images (experimental)
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.
[root@dbserver1 ~]# docker pull --help

Usage:    docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Pull an image or a repository from a registry

Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)

查看本地镜像

[root@dbserver1 ~]# docker images   # 也可以docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
pmm-server           2.1.0               e31d9a94999b        11 days ago         1.52GB
<none>               <none>              839dc180f674        11 days ago         1.52GB
couchbase            latest              4deec10b265e        2 weeks ago         965MB
ubuntu               18.04               549b9b86cb8d        2 weeks ago         64.2MB
percona/pmm-server   1                   cc8e60d34a15        2 months ago        1.2GB
percona/pmm-server   latest              cc8e60d34a15        2 months ago        1.2GB
hello-world          latest              fce289e99eb9        12 months ago       1.84kB

  其实docker pull NAME的NAME也称为仓库,是有点不太合理的,称为坐标更合适。这里的创建时间是镜像的创建时间,而非本地下载时间。

为本地镜像设置别名

  之所以有这个必要,是因为这样的话,基于docker只做自动化的发布包就可以对最后的使用方透明(标准化流程需要,很多用户的IT水平太弱)。

[root@dbserver1 ~]# docker tag percona/pmm-server:latest ta/percona/pmm-server:latest
[root@dbserver1 ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
pmm-server              2.1.0               e31d9a94999b        11 days ago         1.52GB
<none>                  <none>              839dc180f674        11 days ago         1.52GB
couchbase               latest              4deec10b265e        2 weeks ago         965MB
ubuntu                  18.04               549b9b86cb8d        2 weeks ago         64.2MB
percona/pmm-server      1                   cc8e60d34a15        2 months ago        1.2GB
percona/pmm-server      latest              cc8e60d34a15        2 months ago        1.2GB
ta/percona/pmm-server   latest              cc8e60d34a15        2 months ago        1.2GB
hello-world             latest              fce289e99eb9        12 months ago       1.84kB

  这样以后就可以使用ta/percona/pmm-server这个镜像,而不用管底层到底是哪个。那如何判断它是基于谁呢,根据IMAGE ID判断。

删除镜像

  可以使用docker rmi 或docker image rm删除镜像,当仅剩下最后一个镜像标签时,会一并删除底层文件。

[root@dbserver1 ~]# docker image rm hello-world     # 删除最后一个镜像
Untagged: hello-world:latest
Untagged: hello-world@sha256:4fe721ccc2e8dc7362278a29dc660d833570ec2682f4e4194f4ee23e415e1064
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3
[root@dbserver1 ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
pmm-server              2.1.0               e31d9a94999b        11 days ago         1.52GB
<none>                  <none>              839dc180f674        11 days ago         1.52GB
couchbase               latest              4deec10b265e        2 weeks ago         965MB
ubuntu                  18.04               549b9b86cb8d        2 weeks ago         64.2MB
percona/pmm-server      1                   cc8e60d34a15        2 months ago        1.2GB
percona/pmm-server      latest              cc8e60d34a15        2 months ago        1.2GB
ta/percona/pmm-server   latest              cc8e60d34a15        2 months ago        1.2GB
[root@dbserver1 ~]# docker image rm ta/percona/pmm-server    # 删除一个标签的,只是去标签而已
Untagged: ta/percona/pmm-server:latest

  也可以通过id删除,如果某个镜像的名称和TAG均为<none>,这样就只能通过镜像id删除了,如下:

[root@dbserver1 ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
<none>               <none>              839dc180f674        11 days ago         1.52GB
couchbase            latest              4deec10b265e        2 weeks ago         965MB
ubuntu               18.04               549b9b86cb8d        2 weeks ago         64.2MB
percona/pmm-server   1                   cc8e60d34a15        2 months ago        1.2GB
percona/pmm-server   latest              cc8e60d34a15        2 months ago        1.2GB
[root@dbserver1 ~]# docker image rm <none>:<none>
-bash: 未预期的符号 `newline' 附近有语法错误
[root@dbserver1 ~]# docker image rm 839dc180f674
Deleted: sha256:839dc180f674d46954e1b5b5468c142dd33bfd66e25227016d40329dfc8e7a31
Deleted: sha256:6edf455087be42dee43b9b64fefa5f3ca1b2adbde0856bbef0b98a9606c93eb5
[root@dbserver1 ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
couchbase            latest              4deec10b265e        2 weeks ago         965MB
ubuntu               18.04               549b9b86cb8d        2 weeks ago         64.2MB
percona/pmm-server   1                   cc8e60d34a15        2 months ago        1.2GB
percona/pmm-server   latest              cc8e60d34a15        2 months ago        1.2GB
[root@dbserver1 ~]# docker image rm couchbase
Untagged: couchbase:latest
Untagged: couchbase@sha256:dbe7ed71c3cff6a867cb40a350874469a8bf9b233a8f71c7b55244d184df9fcb
Deleted: sha256:4deec10b265ebab6e829fe139078ee212977c3b7803716b30827e84507ebafbc
Deleted: sha256:1e3f99065f4cb3c09548d29161ada69445a108aa474179774f92749fce7a2646
Deleted: sha256:421e791c8f142ca23ff2d4a985ef91dfb83bb68221717f691d8fbdd2ce9ac501
Deleted: sha256:80426dfd30b03cb5ab23c68909e72a281ed38c7d3be7b4423bfdca2222800489
Deleted: sha256:6704e34d10959820ee034e860f5ad4d37772228c01441dd9d0c0308044611d02
Deleted: sha256:a945f6a6821b3767e4c44f082c779ac29511ac98e5414a30b5328019a6a348e2
Deleted: sha256:e6af45b653cc3d4ef19b43f9a5ef3800db0b1833153b9cb2217f6ce64f394c9c
Deleted: sha256:779400518a12faaef5cacf63f3290184c57daba9367df1693577b93af03a7b98
Deleted: sha256:8c449cde94c2d19d0594961fd0cd47dc561539c961eb54d944dc406073b1608a
Deleted: sha256:2c82ed5026bd6155e014bfdf8f6cad0d4c1b23192c187c68b40c670f8e81a77f
Deleted: sha256:7cdf8968022e5ad1324543c5d43db8442cb4b6371393d1749875a680ff61c0f3
Deleted: sha256:a2427c33a3d31bc0eb341b83f535db40e0a87692cdc16a94e3f538f21b90f345
Deleted: sha256:631b71568d5b1b433e4395f6f748d9095794975743ab17d1fb927e8a21914302
Deleted: sha256:91d23cf5425acce8ca4402d83139cec63a5547d1a704af63478df008f9b2e4e0
[root@dbserver1 ~]# docker image rm couchbase
Error: No such image: couchbase
[root@dbserver1 ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
ubuntu               18.04               549b9b86cb8d        2 weeks ago         64.2MB
percona/pmm-server   1                   cc8e60d34a15        2 months ago        1.2GB
percona/pmm-server   latest              cc8e60d34a15        2 months ago        1.2GB
[root@dbserver1 ~]# docker image rm ubuntu
Error: No such image: ubuntu
[root@dbserver1 ~]# docker image rm ubuntu:18.04
Error response from daemon: conflict: unable to remove repository reference "ubuntu:18.04" (must force) - container e86f9a0782a8 is using its referenced image 549b9b86cb8d
[root@dbserver1 ~]# docker image rm percona/pmm-server:1
Untagged: percona/pmm-server:1
[root@dbserver1 ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
ubuntu               18.04               549b9b86cb8d        2 weeks ago         64.2MB
percona/pmm-server   latest              cc8e60d34a15        2 months ago        1.2GB
[root@dbserver1 ~]# docker image rm percona/pmm-server
Untagged: percona/pmm-server:latest
Untagged: percona/pmm-server@sha256:ea4eea4b6c758702c2727c07148a2514812ec0c2200b3101aaf0849fe3bb1df9
Deleted: sha256:cc8e60d34a15882682b5012ed69ad2ed234a38c5e4ae0beb4a4526f02ca02ce4
Deleted: sha256:a60632f109c9bc2a4ab396d06fc665b7dab41e7e68f2b868901a23f6cb8bddae
Deleted: sha256:877b494a9f30e74e61b441ed84bb74b14e66fb9cc321d83f3a8a19c60d078654
[root@dbserver1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               549b9b86cb8d        2 weeks ago         64.2MB

  至于<none>的镜像怎么产生的,还未细细研究。

操作docker容器

  简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。

创建容器

  docker create命令提供了大量的选项(create/start/run子项很多,需要花时间和经验总结)来设置docker容器的行为,包括cpu、内存限制,网络相关设置等。

[root@dbserver1 ~]# docker create --help

Usage:    docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

Create a new container

Options:
      --add-host list                  Add a custom host-to-IP mapping (host:ip)
  -a, --attach list                    Attach to STDIN, STDOUT or STDERR
      --blkio-weight uint16            Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
      --blkio-weight-device list       Block IO weight (relative device weight) (default [])
      --cap-add list                   Add Linux capabilities
[root@dbserver1 ~]# docker create -it ubuntu:18.04
0e95d6ebf991238b4cf9af8cfc42cdcebcdb3c19edcf4078422323a413268c2b
[root@dbserver1 ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS              PORTS                         NAMES
0e95d6ebf991        ubuntu:18.04           "/bin/bash"            13 seconds ago      Created                                           elastic_stonebraker
c107166c6c32        percona/pmm-server:1   "/opt/entrypoint.sh"   11 days ago         Up 11 days          0.0.0.0:80->80/tcp, 443/tcp   pmm-server
6180b5cc8d27        percona/pmm-server:1   "/bin/true"            11 days ago         Created                                           pmm-data

  默认情况下,新创建的docker容器不会自动运行,可以使用start命令启动。

[root@dbserver1 ~]# docker start 0e95d6ebf991
0e95d6ebf991
[root@dbserver1 ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS              PORTS                         NAMES
0e95d6ebf991        ubuntu:18.04           "/bin/bash"            3 minutes ago       Up 7 seconds                                      elastic_stonebraker
c107166c6c32        percona/pmm-server:1   "/opt/entrypoint.sh"   11 days ago         Up 11 days          0.0.0.0:80->80/tcp, 443/tcp   pmm-server
6180b5cc8d27        percona/pmm-server:1   "/bin/true"            11 days ago         Created                                           pmm-data

  docker run等价于docker create + docker start。

  注:docker run需要有至少一个前台进程才能留存,否则启动后就退出了,典型的是redis。要想让docker本身在后台模式运行,可以使用-d或--detach模式运行。此时要查看日志的话,可以使用docker logs container-id,如下:

 

[root@linux-dev ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
e29b2dbc9767        hs/redis            "docker-entrypoint..."   About an hour ago   Up About an hour    6379/tcp, 0.0.0.0:16379->16379/tcp   optimistic_raman
[root@linux-dev ~]# docker logs e29b2dbc9767
1:C 13 Sep 2020 12:51:06.548 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 13 Sep 2020 12:51:06.548 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 13 Sep 2020 12:51:06.548 # Configuration loaded

 加-f或--follow选项可以达到和tail -f一样的滚动效果。

进入容器

  使用start或run -d启动容器后,容器将进入后台模式,如果需要进入容器进行操作,推荐使用官方的attach(老版本) 或exec(新版本) 命令。

[root@dbserver1 ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS              PORTS                         NAMES
0e95d6ebf991        ubuntu:18.04           "/bin/bash"            11 minutes ago      Up 8 minutes                                      elastic_stonebraker
c107166c6c32        percona/pmm-server:1   "/opt/entrypoint.sh"   11 days ago         Up 11 days          0.0.0.0:80->80/tcp, 443/tcp   pmm-server
6180b5cc8d27        percona/pmm-server:1   "/bin/true"            11 days ago         Created                                           pmm-data
[root@dbserver1 ~]# docker attach elastic_stonebraker   # 可以使用容器名
root@0e95d6ebf991:/usr/local# cat /etc/issue    # 可见跑的是Ubuntu
Ubuntu 18.04.3 LTS \n \l

root@0e95d6ebf991:/usr/local# ls
bin  etc  games  include  lib  man  sbin  share  src
root@0e95d6ebf991:/usr/local# uname -a    # 系统名称为容器id,内核为el 7的3.10
Linux 0e95d6ebf991 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
root@0e95d6ebf991:/usr/local# uname
Linux
root@0e95d6ebf991:/usr/local# read escape sequence    # ctrl p && ctrl q退出docker容器
[root@dbserver1 ~]# uname -a
Linux dbserver1 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

  从Docker 的1.3.0 版本起, Docker 提供了一个更加方便的工具exec 命令,可以在运行中容器内直接执行任意命令,它不同于attch,必须指定进入容器后要启动的命令,一般为/bin/bash。

[root@dbserver1 ~]# docker exec -it elastic_stonebraker /bin/bash
root@0e95d6ebf991:/# w
 10:46:42 up 1 day,  8:18,  0 users,  load average: 0.09, 0.21, 0.69
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root@0e95d6ebf991:/# ifconfig
bash: ifconfig: command not found
root@0e95d6ebf991:/# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0  18496  2116 pts/0    Ss+  10:31   0:00 /bin/bash
root         22  0.0  0.0  18496  2020 pts/1    Ss   10:45   0:00 /bin/bash
root         32  0.0  0.0  34388  1460 pts/1    R+   10:46   0:00 ps aux

停止容器

  可以使用docker stop停止容器,使用docker pause暂停容器。

[root@dbserver1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0e95d6ebf991        ubuntu:18.04        "/bin/bash"         30 minutes ago      Up 27 minutes                           elastic_stonebraker
[root@dbserver1 ~]# docker stop elastic_stonebraker
elastic_stonebraker
[root@dbserver1 ~]# docker ps  # -a选项可以列出所有状态的容器,不带选项的ps仅会列出活动状态的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@dbserver1 ~]# docker ps -as
CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS                     PORTS               NAMES                 SIZE
0e95d6ebf991        ubuntu:18.04           "/bin/bash"            33 minutes ago      Exited (0) 2 minutes ago                       elastic_stonebraker   117B (virtual 64.2MB)
c107166c6c32        percona/pmm-server:1   "/opt/entrypoint.sh"   11 days ago         Exited (0) 3 minutes ago                       pmm-server            26MB (virtual 1.23GB)
6180b5cc8d27        percona/pmm-server:1   "/bin/true"            11 days ago         Created                                        pmm-data              0B (virtual 1.2GB)

  注:当Docker 容器中指定的应用终结时,容器也会自动终止。

删除容器

  docker rm 命令可用来删除已经处于终止或退出状态的容器。如果要直接删除一个运行中的容器,可以添加-f参数。Docker 会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。

[root@dbserver1 ~]# docker rm 0e9
0e9
[root@dbserver1 ~]# docker rm c10
c10
[root@dbserver1 ~]# docker rm 618
618
[root@dbserver1 ~]# docker ps -as
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES               SIZE

 资源使用与限制

  docker update命令可以更新容器的一些运行时配置,主要是一些资源限制份额。

  docker port可以查看端口映射情况。

  docker diff可以查看容器内数据变化情况。

  docker cp可以在容器和主机之间复制文件。如将本地的路径data 复制到test 容器的/tmp 路径下:

[root@dbserver1 ~]# docker cp initial-setup-ks.cfg focused_torvalds:/tmp
[root@dbserver1 ~]# docker attach e86f
root@e86f9a0782a8:/tmp# head -3 initial-setup-ks.cfg 
#version=DEVEL
# X Window System configuration information
xconfig  --startxonboot
root@e86f9a0782a8:/tmp# 

  docker stats可以查看CPU 、内存、存储、网络等使用情况的统计信息。

[root@dbserver1 ~]# docker stats e86f

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
e86f9a0782a8        focused_torvalds    0.00%               424KiB / 3.683GiB   0.01%               656B / 0B           303kB / 0B          1

  docker top可以查看容器内进程。

  docker inspect可以查看容器详情。

创建镜像

  dockdr镜像使用dockerfile构建,其流程如下:

   第一次build或者docker compose运行的时候,如果本地无镜像,会到镜像仓库自动拉取。

Docker镜像制作之基础镜像

  docker是容器不同于虚拟机,运行之后只有应用程序在里面运行,但是应用通常需要依赖于操作系统环境才能运行。该环境可大可小,因此在docker中,环境被称为基础镜像,为应用程序提供依赖包,如spring boot应用需要依赖于jdk/jre,couchbase依赖于erlang。因此选择的基础镜像越高级,我们要做的底层工作就越少。如果构建一个Java应用的镜像,选择一个openjdk的镜像作为基础镜像比选择一个alpine镜像作为基础镜像要简单地多(后面讲解dockerfile的时候会进一步深入阐述)。主流的镜像环境包括busybox/centos/alpine/ubuntu/debian,各自大小和适用场景如下:

   

  Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。

  在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件。

  目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu(官方用得最多) 做为基础镜像环境。注:如果使用 Alpine 镜像替换 Ubuntu 基础镜像,安装软件包时需要用 apk 包管理器替换 apt 工具。

  虽然Alpine发力比较厉害,但是如果在一台机子上部署 N 个服务的话,alpine 便没有多少优势了,因为docker 镜像是共享的,也就是所有底层是 ubuntu1804 的 nginx、php 镜像共用一个 ubuntu1804,单个看着空间占用大,但是平均起来并没有多少。如下:

  

 

  参考https://vitalflux.com/docker-images-containers-internals-for-beginners/。

   只要还有一个依赖于 ubuntu或其它基础镜像,那么其他的即使换成 alpine 并不会减小总空间占用,还会增加 alpine 的占用,意义就不是很大了。

  各基础镜像的介绍参见:https://blog.csdn.net/nklinsirui/article/details/80967677,https://www.v2ex.com/t/581888也有网友进行专门讨论优缺点和坑。

数据管理

  容器中的管理数据主要有两种方式:

  • 数据卷( Data Volumes ) : 容器内数据直接映射到本地主机环境,跟直接mount类似,好处是对数据卷的更新不会影响镜像,解摘开应用和数据。对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作。
  • 数据卷容器( Data Volume Containers ) : 使用特定容器维护数据卷。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载,多个应用容器可以指向一个数据卷容器。pmm就是这么干的。
docker run it -v /dbdata --name dbdata ubuntu  # 数据卷本身的容器不需要运行
docker run -it --volumes-from dbdata -name db1 ubuntu
docker run -it --volumes-from dbdata -name db2 ubuntu

  可以多次使用--volumes-from 参数来从多个容器挂载多个数据卷。

  参见:https://blog.csdn.net/felaim/article/details/105240539,直接映射和数据卷都包含。

  注:在生产环境中,推荐使用数据卷或数据卷容器,同时定期将主机的本地数据进行备份。

端口映射

1、创建容器是指定

docker run -p <host_port1>:<container_port1> -p <host_port2>:<container_port2>

2、修改dockerfile expose所需要的端口,这样可以免去-p参数。

Dockerfile之镜像制作

1、创建工作目录,比如docker-images

mkdir docker-images

2、创建Dockerfile

vim Dockerfile

FROM openjdk:8-jdk-alpine   # 基础镜像,相比linux iso镜像,docker/maven/go mod国内可不稳定了,经常换
ARG JAR_FILE=dist/*
RUN mkdir /dist
COPY ${JAR_FILE} /dist/   # 拷贝多个文件必须/结尾。原始文件必须在当前上下文,否则会报错lstat /usr/local/xxx/xxx.conf文件不存在,文件实际存在
WORKDIR /dist/  # 指定docker容器运行时的默认工作目录,exec进入容器后的默认工作目录,也会自动,创建
ENTRYPOINT ["java -Dfile.encoding=UTF-8","-jar","./sqlcompchecker-0.0.2-SNAPSHOT.jar"]

  dockerfile指令清单可参考https://docs.docker.com/engine/reference/builder/。

  RUN/CMD/ENTRYPOINT三个都是执行命令,但是有所区别,如下:

  •   RUN 是在dockerfile镜像打包的时候运行
  •   CMD 在镜像打包好了,使用docker run的时候运行的命令
  •   ENTRYPOINT用于接手docker run输入的命令行参数。和CMD成对使用,且此时CMD后面的参数作为ENTRYPOINT命令的默认值。如下:

  CMD ["this is a echo test"]
  ENTRYPOINT echo

  这是时候如果你直接运行"docker run test",会输出this is a echo test。

  如果你带上参数运行"docker run test 巴拉巴拉",会输出"巴拉巴拉"。

3、构建镜像

[root@linux-dev docker-images]# docker build -t hs/sqlcompchecker .    # -t 指定镜像的名字及标签,也就是作为后续引用如运行的标识符
Sending build context to Docker daemon 39.22 MB
Step 1/6 : FROM openjdk:8-jdk-alpine
 ---> a3562aa0b991
Step 2/6 : ARG JAR_FILE=dist/*
 ---> Using cache
 ---> 6e8799a24d36
Step 3/6 : RUN mkdir /dist
 ---> Using cache
 ---> 536571d815d7
Step 4/6 : COPY ${JAR_FILE} /dist/
 ---> cbe14a7ccee0
Removing intermediate container 1a9611ce3f57
Step 5/6 : WORKDIR /dist/
 ---> 303bb9b793e5
Removing intermediate container 21bbd683dc47
Step 6/6 : ENTRYPOINT java -Dfile.encoding=UTF-8 -jar /sqlcompchecker-0.0.2-SNAPSHOT.jar
 ---> Running in af4b8f989eda
 ---> a5cc3e9d366d
Removing intermediate container af4b8f989eda
Successfully built a5cc3e9d366d

FROM的所有镜像列表来自于各种仓库,可以参考https://www.jianshu.com/p/6e8a0a99b85f,FROM <image>或FROM <image:tag>的格式,tag一般用于指定版本,默认为latest。和yum、spring starter的依赖引入类似概念。

首先确保docker守护进程在运行。否则会报"Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?",可通过systemctl启动,如下:

systemctl restart docker.service

初次构建的时候,会从中央仓库下载依赖,如下:

  该命令会读取指定路径下(包括子目录)的Dockerfile文件,并将该路径下所有数据作为上下文(Context)发送给Docker服务端。Docker服务端在校验Dockerfile格式通过后,逐条执行其中定义的指令,碰到ADD、COPY和RUN指令会生产一层新的镜像。最终如果创建镜像成功,会返回最终镜像的id。

  在docker中,dockerfile中的每个命令都会增加一层。

  docker文件的分层可参考https://www.cnblogs.com/edisonchou/p/dockerfile_inside_introduction.html,总结的很形象。

   以下列命令为例。
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py

  该Dockerfile包含四个命令,每个命令都会新创建一个层。FROM语句会从ubuntu:18.04镜像创建一个层。COPY指令会从Docker客户端的当前目录下添加一些文件。RUN指令使用了make指令来构建。最后CMD是☞在容器中运行什么命令。

  对于Docker来说,创建新容器时,每一层都会彼此堆叠,可以在基础层的基础上添加新的可写容器层。对容器的所做的所有更改都将写入到该可写容器层中。下图显示了基于Ubuntu 15.04 的容器。Image layers都是Read Only的,dockerfile中的命令构建的层位于container layer。

   每个容器都会有自己的可写层,所有的改变都存储在该容器层中。
  如果要查看一个镜像包含了多少个层,可以通过docker history imageid或docker history repo:tagid查看,如下:

  

   要减少层次,应该尽可能把多个命令合并。

  所以,搞docker的,和基于maven开发一样,正规的一定会有私服镜像仓库。 

4、启动

[root@linux-dev docker-images]# docker run -p 8080:8080 hs/sqlcompchecker
container_linux.go:235: starting container process caused "exec: \"java -Dfile.encoding=UTF-8\": executable file not found in $PATH"
/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:235: starting container process caused "exec: \"java -Dfile.encoding=UTF-8\": executable file not found in $PATH".

springboot的制作可参考https://spring.io/guides/topicals/spring-boot-docker

4.1、启动有问题后重新制作

  上面的启动有问题,是因为ENTRYPOINT的风格问题,一定要一个参数一个项,不能合到一起,参见https://www.jianshu.com/p/54cfa5721d5f。调整Dockerfile的ENTRYPOINT为"ENTRYPOINT ["java -Dfile.encoding=UTF-8","-jar","./sqlcompchecker-0.0.2-SNAPSHOT.jar"]",再次运行即可,不用特殊处理。如下:

[root@linux-dev docker-images]# docker run -p 8080:8080 hs/sqlcompchecker

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.7.RELEASE)

2020-09-13 06:40:17.737  INFO 1 --- [           main] c.h.s.SqlCompCheckerApplication          : Starting SqlCompCheckerApplication v0.0.2-SNAPSHOT on 5aa49d7a887b with PID 1 (/dist/sqlcompchecker-0.0.2-SNAPSHOT.jar started by root in /dist)

5、查看和分发创建的镜像文件

 默认情况下,docker拉下来和创建的镜像文件在/var/lib/docker目录下,如下:

 config.v2.json里面包含了该镜像的id,如下:

 5.1、离线docker制作

 一般来说,我们不会直接操作镜像文件的原始格式。如果要线下分发,比如一般开源软件都提供镜像下载包,可以通过docker commit和docker save制作,如下:

[root@linux-dev ~]# docker commit 0091d6a40c3d072df3b0d36d36690e46a5cc61b68bf51b62b63b3f6f9645e662 hs/sqlcompchecker
sha256:4eae04f80e07083e074dede5565b7c5cf9373ef5c8db1459c140d78e4ae20726
[root@linux-dev ~]# docker save -o sqlcompchecker.tar hs/sqlcompchecker
[root@linux-dev ~]# ll
drwxr-xr-x  3 root root        36 9月  13 14:39 docker-images、
-rw-------  1 root root 145282048 9月  13 16:57 sqlcompchecker.tar

  然后使用方通过docker load导入离线镜像到本地即可,可以参考https://blog.csdn.net/qq_35433926/article/details/95978498

6、主机目录(配置文件、公共依赖、日志)映射

   目录和端口一样,可以通过多个-v指定多个映射,具体细则可以参见https://www.oschina.net/question/2976815_2245172https://blog.csdn.net/whatday/article/details/86764211

        和非容器化一样,日志输出大小的管理通常是一个问题。不应该让其在控制台输出,依赖宿主机的卷挂载,否则只要docker进程在,会越来越大。

7、总结

  对于各种复杂的docker镜像包比如PMM来说,可以分多个阶段执行(更加推荐的是基于docker compose进行单机编排,参见下文),这样可以在包大小和灵活性之间折中。docker的作用可以说是把原来基础设施由运维干的活提前到了开发干,但是好处是只要操作系统docker安装了且是要求版本以上,就没有环境问题了,尤其是对于c/c++的应用,环境依赖差异太大。缺点是,包可能会更大,特别是通过WAN交付时。

应用部署实战

  一般来说I/O密集型的不建议使用docker部署、而且他们的变更相比应用而言频率低得多,应该主要用于微服务部署为主。真的部署,也主要用于开发、测试目的。

redis

rabbitmq

nginx

mysql

oracle

docker desktop

除了使用docker cli外,商业版还可以使用docker desktop(对标vmware管理界面)。

Parameter

Docker CLI

Docker Desktop

Interface

Command Line Interface

Graphical User Interface

Ease of Use

Requires knowledge of command line syntax

User friendly

Fully Compatible Operating Systems

Linux, MacOS, and Windows

Windows, MacOS

Updates

Manually

Automatic

Cost

Free

Free & Paid Versions

Additional Tools

Only Docker

Includes Docker Swarm, Compose, Engine, CLI and Kubernetes

Resource Intensivity

Lightweight

Heavier

生产单机容器编排平台-docker compose

  Docker Compose是一个基于Docker的单主机容器编排工具。可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。有些小型应用会使用docker compose部署,比如监控运维、堡垒机等。

  docker compose的适用场景可以参见https://blog.csdn.net/qq_36426699/article/details/129414262。

  就测试和开发微服务而言,docker compose确实是是一个非常好的自动化手段,不需要人工管理一堆进程,一下子拉起来就完事。

  https://docs.docker.com/compose/

  docker compose文件的规格参见https://docs.docker.com/compose/compose-file/,总体来说分服务、网络、卷、配置、秘钥这几类,还是比较简单。

生产分布式容器集群平台之Kubernetes

  之前两年,docker的管理、部署工具还包括docker compose、docker swarm,这俩都败下来了,只剩下apache mesos还在支撑,大概率也要被吃掉。跟spring cloud之前的netflix系列一样。没事练基本功,别瞎折腾。虽然docker compose和k8s deployment都是编排工具,但是k8s不支持支持调度docker compose部署文件,需要改写为deployment部署文件。

监控工具在docker下的部署

zipkin

redis-stat(https://www.cnblogs.com/felixzh/p/11170143.html)

percona pmm

docker的风险

docker常见错误

docker: Error response from daemon: Conflict. The name "/mycontainer" is already in use by another container.

问题解决
步骤 1:检查现有容器
使用命令docker ps -a来列出所有容器,包括非活动的。

docker ps -a
步骤 2:删除冲突的容器
如果发现有和你想要使用的名字相同的容器,可以使用docker rm来移除它。

docker rm /mycontainer
或者,如果你不想删除旧容器,可以为新容器选择一个新的名字。

步骤 3:重新启动容器
现在,没有名字冲突了,你就可以安全地启动你的容器。

docker run --name mycontainer myimage

Docker容器无法启动 Cannot find /usr/local/tomcat/bin/setclasspath.sh

报错信息如下

解决办法

权限不够
加上--privileged 获取最大权限

docker run --privileged --name lenglianerqi -p 9266:8080 -v /opt/docker/lenglianerqi/webapps:/usr/local/tomcat/webapps/ -v /opt/docker/lenglianerqi/webapps/userfile:/usr/local/tomcat/webapps/userfile -d 351c5696aa10

找不到各种命令如ip,ifconfig等

参见https://blog.51cto.com/u_16175437/7450125

性能问题

/usr/libexec/docker/docker-proxy-current cpu很高,如下:

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                  
 87064 root      20   0  389600   9952   1476 S  79.8  0.3   1:13.42 /usr/libexec/docker/docker-proxy-current -proto tcp -host-ip 0.0.0.0 -host-port 16379 -container-ip 172.17.0.2 -containe+
 87499 root      20   0   17064   2992    960 R  44.0  0.1   0:06.47 redis-benchmark -h 127.0.0.1 -p 16379                                                                                    
 87094 polkitd   20   0   30900   3588   1092 S  39.4  0.1   0:37.64 redis-server /usr/local/redis/redis.conf      

 docker容器管理平台

  如果真的要跑docker,纯靠cli肯定不现实,需要统一的容器管理平台,如果未上K8S,推荐开源主流Portainer,可让您轻松构建和管理 Docker、Docker Swarm、Kubernetes 和 Azure ACI 中的容器。参见https://www.zhihu.com/question/31639608

image

 

K8S架构

 

 

 

 

 

上面两张图少了service/endpoint。为什么对外访问通过service呢?

原因之一是k8s中pod不是持久性的,宕机重建默认将获得新的IP(可以通过网络插件calico在deployment中通过属性固定IP),客户端通过变更IP来访问显然不合理。二是需要多个副本间的负载均衡。

Service 是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。如果我们使用 Deployment 部署 pod,则可以以 Deployment 为对象创建 Service。

在 K8S 中,每个 Pod 都有其自己唯一的 ip 地址,而 Service 可以为多个 Pod(一组)提供相同的 DNS 名,并且可以在他们直接进行负载均衡

service提供的4层负载均衡。

假如一组 pod 称为前端,如 web 服务,另一组 pod 称为后端,例如 mysql。那么 前端 如何查找并跟踪要连接的 ip 地址,以便前端可以使用工作负载的后端部分?

这正是 Service 要解决的问题。Kubernetes Service 定义了一种抽象:逻辑上的一组 Pod,一种可以访问它们的策略 —— 通常称为微服务。当使用 Service 为一组 pod (Deployment 的方式创建的)创建服务时,无论我们创建了多少个 pod 副本,这些 pod 怎么变化,前端不需要关心它们调用了哪个后端副本,而且不需要知道后端 pod 的状态也不需要跟踪 pod。Service 把前后端的这种关联抽象化,把它们解耦了。

service和endpoint的区别见https://www.jianshu.com/p/755f6d8a51b4,主要跟微服务中注册中心的角色类似,有了endpoint和service,只要知道名称、不关心具体的IP和负载均衡。如下:

 

k8s的三个主要发行版

microk8s,minikube,k3s

 

管理命令

k8s服务及网络、端口

 

 

 

  

  • Service
    • ClusterIP:k8s内部ロードバランサー
    • ExternalIP(ClusterIPに属する):指定のNodeのIPを使って、外部と通信可能なClusterIP
    • NodePort:任意NodeのIPを使って、外部からk8s内部への通信を可能にするリソース
    • LoadBalancer:外部ロードバランサー + NodePort + ClusterIP
    • Headless(None)(ClusterIPに属する):主にStatefulSetのためのClusterIP
    • ServiceName
    • ExternalName:k8sのCNAME変換用リソース
    • None-Selector(ClusterIPに属する):Endpointsをカスタマイズ可能なClusterIP

 

k8s存储

 

 

 

 

 

 

 

 

 

 

 

 volumn和pvc一一对应,一个pod可以有多个容器、有多个pvc。pv/pvc是k8s native/ready storage,所以不建议volumn直接挂在外部存储。

k8s operator

 https://download.pingcap.com/images/docs-cn/tidb-operator-overview.png

 

k8s有状态资源StatefulSet解析

operator vs statefulset,简单的说,operator是一种给高级用户/专家的管理方式,statefulset是k8s管理有状态应用/pod的原因。一个是工具,一个是菜谱。https://www.cnblogs.com/dai-zhe/p/14906527.htmlhttps://cloud.tencent.com/developer/article/1706583https://juejin.cn/post/6997227333757173768https://www.cnblogs.com/you-men/p/13234975.html

operator vs crd https://blog.csdn.net/xingyunyang/article/details/125706985http://hw.yidianzixun.com/article/0keBX2am?s=hwbrowser&appid=hwbrowser&s_real=hwbrowser&ctype=news&from_related=1https://developers.redhat.com/articles/2021/06/22/kubernetes-operators-101-part-2-how-operators-work#deploying_workloads_in_kuberneteshttps://www.cncf.io/blog/2022/06/15/kubernetes-operators-what-are-they-some-examples/

云原生应用设计模式之Operator模式详解

亲历者说:Kubernetes API 与 Operator,不为人知的开发者战争

K8S发布周期

  和很多开源软件一样,k8s的发布周期大约为三个月,每个版本的维护周期大约为一年左右。https://kubernetes.io/releases/

  https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG

  https://kubernetes.io/releases/release/

K8S存储

  K8s之存储基础

  k8s配置默认存储类

  k8s如何设置sc为默认的存储类型

 K8S CSI

  https://www.yisu.com/zixun/510930.html

  https://blog.51cto.com/u_15077536/4227943

  https://heiqu.com/zgzjdg.html

  https://blog.csdn.net/qiaotl/article/details/125665388

  http://yun.jinre.com/newsinfo/1369308.html

  https://zhuanlan.zhihu.com/p/51757577

  https://www.yangguanjun.com/2019/02/14/kubernetes-csi-intro/

  https://www.velotio.com/engineering-blog/kubernetes-csi-in-action-explained-with-features-and-use-cases

  https://bluexp.netapp.com/blog/cvo-blg-kubernetes-csi-basics-of-csi-volumes-and-how-to-build-a-csi-driver

  https://knowledge.hitachivantara.com/Documents/Storage/Content_Software_for_File/3.9.x/Configure/13_Container_storage_interface_(CSI)_plugin

常见问题

kubectl---如何正确彻底删除pod

K8s的Pod出现Init:ImagePullBackOff问题的解决(以calico为例)

Percona Operator for MySQL based on Percona XtraDB Cluster

https://www.percona.com/blog/exploring-mysql-on-kubernetes-with-minkube/

https://www.kindsonthegenius.com/setup-kubernetes-locally-deploy-springboot-application-step-by-step-tutorial/

https://www.kindsonthegenius.com/deploy-springboot-with-mysql-to-kubernetes-minikube-step-by-step-tutorial/

Helm

  Helm是Kubernetes 应用的包管理工具,主要用来管理 Charts,类似Linux系统的apt、yum。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。对于应用发布者而言,可以通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。对于使用者而言,使用 Helm 后不用需要编写复杂的应用部署文件,可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序。

  

   https://blog.csdn.net/nk298120/article/details/115247660

  https://helm.sh/zh/docs/intro/quickstart/

  https://zhuanlan.zhihu.com/p/268098337 玩K8S不得不会的HELM

最后,附一个roadmap

 

 

参考

docker技术入门与实战 

十本你不容错过的Docker入门到精通书籍推荐

https://yeasy.gitbook.io/docker_practice/basic_concept/container

使用类总结 https://zhuanlan.zhihu.com/p/85528062

openshift vs k8s https://www.redhat.com/zh/topics/containers/red-hat-openshift-kubernetes  中小厂vmware+openshift,大厂k8s。

openshit vs k8s,openshift使用k8s的调度,https://www.cnblogs.com/xiaohaoge/p/16512130.html

vmware收购pivotal来看,公有云是注定k8s+云原生服务,私有云虚拟化/openshift/容器+服务,具体服务粒度,电商等业务简单但并发大走微服务、金融&传统等业务复杂但并发低走宏服务。k8s和openshift是为了解决虚拟化后vmware原来的调度问题。

docker run无法启动 https://blog.csdn.net/weixin_45496075/article/details/109123709

k8s operator介绍:https://www.leidianyun.cn/index.php/news/content/516.html

https://www.redhat.com/zh/topics/containers/what-is-a-kubernetes-operator

https://zhuanlan.zhihu.com/p/246550722 10分钟搞懂operator制作

 https://mp.weixin.qq.com/s/I4Wey-HpZOe9gOPN1j2rPw 截止2025年4月13日,docker仍然是最先进的完整体,podman、containerd等仅在某一方面比较强而已,无法平替docker。

Kubernetes核心概念,什么是 Kubernetes?

https://kubernetes.io/zh-cn/docs/setup/

Operator 是一种特别的 Controller

Kubernetes 架构基础 核心控制平面组件

 kubeadm、kubelet 和 kubectl的区别和用途

VMware Workstation Pro & Oracle VM VirtualBox实现Kubernetes&Docker最小化集群

https://cloud.tencent.com/developer/article/2259807 docker compose入门

posted @ 2025-04-13 11:10  zhjh256  阅读(38)  评论(0)    收藏  举报