docker+k8s 随记

文章目录

展开

参考《Docker从入门到实践》,仅供学习使用,严禁搬运。

记录一些docker和k8s的用法,方便查找。

也有一些小demo供实战参考。

docker入门

1. 安装docker

  1. centos安装Docker:yum install docker
  2. 开启docker服务:systemctl start docker
  3. 开机自启动:systemctl enable docker
  4. docker版本信息:docker --version
  5. docker详细信息:docker info
  6. 查看内核信息:uname -a
  7. 查看centos版本号:cat /etc/redhat-release
  8. 跑一个nginx测试:docker run -d -p XX:80 --name webserver nginx

2. docker基本操作

  1. 进入容器内部查看信息:dcker attach <Id>
  2. 构建镜像:docker build
  3. 提交容器:docker commit
  4. 将容器中的文件移动复制到宿主机:docker cp <Id>:/file /host/file
  5. 创建容器但不启动:docker create
  6. 查看容器变化:docker diff <Id>
  7. 查看事件:docker events
  8. 进入容器:docker exec
  9. 导出容器:docker export containerName > containerName.tar
  10. 查看镜像历史:docker history
  11. 查看本地镜像:docker images
  12. 导入容器:docker import /etc/XX.tgz
  13. 查看docker信息:docker info
  14. 查看各项详细信息:docker inspect
  15. 杀死容器:docker kill
  16. 导入镜像:docker load < XX.tar.gz
  17. 登录仓库:docker login
  18. 登出仓库:docker logout
  19. 查看容器日志:docker logs
  20. 管理网络:docker network
  21. 管理节点:docker node
  22. 暂停容器:docker pause
  23. 查看容器端口:docker port
  24. 查看本地容器信息:docker ps
  25. 拉取镜像:docker pull
  26. 推送镜像:docker push
  27. 重命名容器:docker rename <旧容器名><新容器名>
  28. 重启容器:docker restart
  29. 删除容器:docker rm [-f(停止)]
  30. 删除镜像:docker rmi
  31. 运行容器:docker run [-d(后台运行)] [-p(指定端口)] [-restart] [-rm(退出时删除)] [-it(创建一个可交互的终端)]
  32. 导出镜像:docker save ubuntu:14.04 > ubuntu.tar
  33. 搜索镜像:docker search
  34. 管理服务:docker service
  35. 启动容器:docker start
  36. 查看容器状态:docker stats
  37. 停止容器:docker stop
  38. 管理集群:docker swarm
  39. 设置镜像标签:docker tag
  40. 查看容器进程:docker top <Id>
  41. 恢复暂停容器:docker unpause
  42. 更新容器:docker update
  43. 查看docker版本:docker version
  44. 管理数据卷:docker volume
  45. 设置等待(容器监控、异常捕捉):docker wait

3. 第一个docker例程

3.1 运行一个docker镜像

docker run --rm hello-world--rm表示容器退出后自动删除该容器

3.2 构建一个自己的镜像

创建一个文件夹,文件夹内新建文件Dockerfile,内容如下:

然后 docker buile -t hello .-t表示给镜像打标签

最后 docker run --rm hello 即可

4. docker镜像

4.1 配置加速器

https://cr.console.aliyun.com/cn-wulanchabu/instances/mirrors

4.2 搜索并下载镜像

搜索: docker search <imagesName>

下载: docker pull <imagesName:tag>

查看镜像信息: docker images <imagesName>docker inspect [-f '镜像创建时间:{{.Created}}'] <imagesName>

4.3 创建镜像
  1. 通过Dockerfile创建镜像

    docker build -t hello .

  2. 提交容器为镜像

    运行一个ubuntu容器:docker run -itd --name=test ubuntu:14.04

    进入容器:docker exec -it test bash

    创建文件并退出:echo "Text" > test.txt && exit

    提交容器为镜像:docker commit test username/test

    使用新的镜像运行容器:docker run -dit --rm --name=new username/test bash

    进入新的容器:docker exec -it new bash

    查看文件:cat test.txt

    docker commit 的参数如下:

    • -a:添加作者信息,方便维护
    • -c:修改Dockerfile指令
    • -m:类似git commit -m,提交修改信息
    • -p:暂停正在提交的操作
4.4 导出和导入镜像

导出:docker save -o <imagesName>.tar <imagesName:tag>docker save <imagesName:tag> > <imagesName>.tar

导入:docker load -i <imagesName>.tardocker load < <imagesName>.tar

4.5 发布镜像

登录docker hub:docker login

给镜像打标签,内容不变,只是名称变了:docker tag <imagesId> username/imagesName

发布镜像(要求镜像名为 username/imagesName):docker push username/imagesName

4.6 删除镜像

最基础的操作为:docker rmi <镜像名/镜像ID>,要确保没有容器在使用该镜像。

删除所有未打dangling标签的镜像:docker rmi $(docker images -q -f dangling=true)

删除所有镜像:docker rmi $(docker images -q)

5. Dockerfile

5.1 基础命令
  1. 指定基础镜像:FROM <imagesName:tag>

  2. 设置维护者信息:MAINTAINER Name <Email>

  3. 执行构建命令:RUN XXX,会在shell或者exec的环境下执行命令

  4. 设置镜像环境变量:ENV <key> <value>,例如ENV TARGER_DIR /app

  5. 复制文件(将本地的文件或文件夹复制到镜像中):COPY /Local/Path/File /Images/Path/File

  6. 添加文件(与COPY类似,但可以解压缩和从URL下载):ADD File /Images/Path/FileADD latest.tar.gz /var/www/

  7. 指定端口暴露:EXPOSE <端口> [<端口> ...]

  8. 设置镜像启动命令:CMD ["executable","param1","param2"],CMD指令可以通过docker run覆盖。

    构建并运行容器docker run test,结果为Hello Ubuntu

    如果运行容器为docker run test echo "Hello Docker",结果为Hello Docker

  9. 设置接入点:ENTRYPOINT

    构建并运行容器docker run test "Hello Docker",结果为Hello Docker

  10. 设置数据卷:VOLUME ["/data","/data2"],也可以运行容器时指定:docker run -v 宿主机路径:容器内路径

  11. 设置构建用户,指定运行容器时的用户名或UID,后续的RUN也会使用指定用户:

    创建用户:RUN groupadd -r newuser && useradd -r -g newuser newuser

    可以运行容器时指定用户:docker run -u username

  12. 设置工作目录:WORKDIR /path/to/workdir,也可以运行容器时指定docker run -w /workdir

    可以使用多个WORKDIR指令,后续命令参数如果是相对路径,则会基于之前命令指定的路径。例如:

    最终路径为/a/b/c。

  13. 设置二次构建指令(在构建镜像时不执行,而是在子镜像中执行):ONBUILD

  14. 设置元数据:LABEL multi.lable1="value1" multi.lable2="value2" multi.lable3="value3"

  15. 设置构建变量(与ENV不同,只在构建时起作用):AGE <varname>=<name>,也可以构建镜像时指定docker build --build-arg <varname>=<value>

  16. 设置停止信号(停止时容器发出的信号):STOPSIGNAL SIGKILL

  17. 检查镜像状态(检测容器启动运行时是否正常):HEALTHCHECK [OPTIONS] CMD command

    例如:

  18. 设置命令执行环境(有时需要在其他shell环境中执行RUN的内容):SHELL ["powershell","-command"]

5.2 实战1:部署nginx服务

5.3 实验2:利用python的flask包部署网站

步骤:

访问 主机IP:90/hello 即可。

如要修改网站内容,可以docker exec -it my_flask_web1 bash进入容器,vi my_flask.py修改输出内容,exit退出,docker restart my_flask_web1重启即可。

my_flask.py

Dockerfile

6. 容器互联

启动mysql容器:docker run -d -e MYSQL_ROOT_PASSWORD=password --name db mysql:5.6

启动web服务容器:docker run -d -p 8000:80 --name php --link db:mysql abiosoft/caddy:php bash

--link db:mysql左边表示的是刚才启动的容器名称,右边表示的是后来运行的php容器。

用sh进入php容器,ping db或者新建php文件测试能否链接mysql容器。

7. 编排工具Compose

7.1 安装Docker Compose

安装python:yum install python -y

安装pip:curl https://bootstrap.pypa.io/pip/3.6/get-pip.py | python3

安装Docker Compose:sudo pip install -U docker-compose

查看是否安装成功:docker-compose -v

7.2 Compose命令基础

git clone https://github.com.vegasbrianc/docker-compose-demo.git

  1. Docker Compose默认解析当前目录的docker-compose.yml文件。
  2. -f参数用来指定配置文件,可以使用多次,如果有同名的服务,只会解析执行后面的配置文件。
  3. Docker Compose启动容器时会默认把当前的目录名称设置为容器名称前缀,可以使用-p参数指定容器项目名称。
  4. Docker Compose中有一个环境配置文件.env,可以设置环境变量。
  5. 构建服务镜像(只想构建某个容器):docker-compose build <容器名称>
  6. 检查配置语法:docker-compose config [-q(不会输出信息,除非有语法问题)] [--service(输出服务名称)]
  7. 创建服务容器(创建但不运行):docker-compose create
  8. 清理项目(停止容器并删除容器、网络、数据卷,其他服务使用的会被跳过):docker-compose down [-v(指定数据卷)] [-rmi(指定镜像)]
  9. 查看事件:docker-compose events
  10. 进入服务:docker-compose exec <服务名称>
  11. 杀死服务容器:docker-compose kill <服务名称>
  12. 查看服务容器日志:docker-compose logs <服务名称>
  13. 暂停服务容器:docker-compose pause <服务名称>,不能用kill杀死,只能unpause
  14. 查看服务容器端口状态:docker-compose port <服务名称>
  15. 查看项目容器信息:docker-compose ps [-q(只输出容器ID)]
  16. 拉取项目镜像:docker-compose pull [--ignore-pull-failures(忽略拉取失败,继续拉取其他)]
  17. 推送项目镜像:docker-compose push [--ignore-pull-failures(忽略推送失败,继续推送其他)]
  18. 重启服务容器:docker-compose restart <服务名称>
  19. 删除服务容器:docker-compose rm <服务名称>
  20. 执行一次性命令(对一个服务容器运行一次一次性的命令):docker-compose run
  21. 设置服务容器数量:docker-compose scale <服务名称>=<启动个数>
  22. 启动服务容器:docker-compose start <服务名称>
  23. 停止服务容器:docker-compose stop <服务名称>
  24. 取消暂停:docker-compose unpause <服务名称>
  25. 启动项目:docker-compose up
7.3 Compose配置文件

一份标准配置文件应该包含version、services、networks这3大部分。

  1. 指定服务使用的镜像:image

    在services标签下的第二级标签是服务名称

  2. 指定构建上下文:build

    服务除了可以基于指定的镜像,还可以基于一份Dockerfile。

    可以指定绝对路径、相对路径,也可以如下设定上下文根目录。需要指定文件也要如下使用子级标签。

    如果同时指定了image和build两个标签,会构建镜像并命名为image后面的名字。

    也支持arg设定环境变量。

  3. 指定服务镜像启动命令:command

    使用command可以覆盖容器启动后默认执行的命令。

  4. 指定运行服务的容器名称:container_name

    Compose默认的容器名称格式为<项目名称>_ <服务名称>_ <序号>,但也可以完全控制容器名称:

    container_name: app

  5. 指定服务依赖关系:depends_on

    下面容器会先启动redis和db两个服务,最后再启动web服务:

    如果只启动web服务docker-compose up web,也会启动redis和db,因为有依赖关系。

  6. 指定服务的DNS配置:dns

  7. 挂载临时目录:tmpfs

  8. 指定服务镜像的接入点:entrypoint

    可以覆盖Dockerfile中的定义:

  9. 设置compose变量:env_file

    仅针对宿主机,不会进入构建过程。

  10. 设置环境变量:environment

    保存变量到镜像中,启动的容器也会包含这些变量

  11. 指定端口暴露:expose

    用的多的还是posts标签

  12. 选择项目外的容器:external_links

    前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里。

  13. 扩展链接服务器的hosts列表:extra_hosts

    向容器内的/etc/hosts添加一些记录。

  14. 添加元数据:labels

  15. 设置容器互联:links

    使用的别名将会自动在服务容器中的/etc/hosts里创建,相应的环境变量也将被创建。

  16. 配置服务日志:logging

  17. 指定进程空间:pid

    pid: "host"。与主机系统共享进程命名空间。容器使用pid标签将能够访问和操纵其他容器和宿主机的名称空间、

  18. 设置服务容器的端口映射:ports

  19. 设置容器安全选项:security_opt

  20. 设置容器停止信息:stop_signal

  21. 设置容器数据卷:

    [HOST:CONTAINER]或者[HOST:CONTAINER:ro],后者是只读的。

  22. 挂载数据卷容器:volumes_from

    从其他容器或者服务挂载数据卷。

  23. 修改内核功能:cap_add,cap_drop

  24. 指定父级Cgroup:cgroup_parent

  25. 配置服务的设备映射:devices

  26. 设置服务扩展:extends

  27. 设置服务网络模式:network_mode

  28. 设置服务容器的网络:networks

  29. 其它标签

  30. 网络配置

7.4 Compose实战:部署wordpress

步骤:

访问 主机IP:8080 即可。

image-20230905132131264

docker-compose.yml

7.5 Compose实战:部署Django

步骤:

docker-compose.yml

访问 主机IP:8000即可。

Dockerfile

requirements.txt

修改compose_example/settings.py

k8s入门

1. k8s集群部署全流程

部署全流程参考 博客

这次是在第一次部署失败后的再次部署,总结出一些经验,主要为:

  1. 由于我们是用阿里云的三台ECS,走公网IP,且三台ECS不在同一个VPC下,所以我们需要格外注意部署中需要IP的地方。
  2. 同上原因,ECS服务器的eth0网卡走的是内网IP,所以我们需要建立虚拟网卡。
1.1 修改hosts文件

由于ECS服务器自动生成的主机名不好记,所以我们修改主机的名称。

同时修改三台主机的hosts文件,建立主机名和IP的对应关系。注意,使用公网IP

1.2 创建虚拟网卡

由于ECS服务器的eth0网卡走的是内网IP,所以我们需要建立虚拟网卡映射公网IP

可以看到新建的虚拟网卡已经生效。

image-20230907210516898

1.3 云服务器安全组设置

我们需要开放一些端口,否则服务无法访问。

对于master节点:

协议 端口 作用
TCP 2379~2380 etcd 客户端 API
TCP 6443 api-server API
UDP 8472 VxLan Overlay 网络通信
TCP 10250 kubelet API
TCP 10251 kube-scheduler
TCP 10252 kube-controller-manager

对于node节点:

协议 端口 作用
UDP 8472 VxLan Overlay 网络通信
TCP 10250 kubelet API
TCP 30000~32767 NodePort 服务
1.4 一些基础配置(不用理解,执行即可)

1.5 安装Docker

1.6 安装k8s集群所需组件

1.7 修改 kubelet 启动参数

1.8 从阿里云拉取镜像

只有master主机执行,写一个拉取脚本kubeadm_image.sh,内容如下:

执行脚本 sh ./kubeadm_image.sh

1.9 用kubeadm初始化master节点

安装成功后会弹出如下信息:

image-20230907214249346

1.10 集群健康检查

1.11 修改kube-apiserver 配置

1.12 将node节点加入集群

1.13 配置node节点

将master节点中的 /etc/kubernetes/admin.conf 文件拷贝到两个node节点相同目录下,然后配置环境变量:

1.14 安装flannel插件

github下载包并通过ftp等方式上传到master服务器(主要是因为服务器无法访问github)。

对于Xshell可以 yum install lrzsz 后拖拽上传。

然后 yum install unzip ,并 unzip flannel-master.zip 解压。

1.15 配置k8s命令补全

1.16 跑一个nginx pod

1.17 如果要重装,可以从1.7-1.9(跳过1.8)重装kubeadm开始

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注