K8S+DevOps架构师实战课 | 核心要素及常用操作详解

视频来源:B站《Docker&k8s教程天花板,绝对是B站讲的最好的,这一套学会k8s搞定Docker 全部核心知识都在这里》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:K8S+DevOps架构师实战课 | 汇总_热爱编程的通信人的博客-CSDN博客


三大核心要素:镜像(Image)、容器(Container)、仓库(Registry)

镜像(Image)

打包了业务代码及运行环境的包,是静态的文件,不能直接对外提供服务。

容器(Container)

镜像的运行时,可以对外提供服务。

仓库(Registry)

存放镜像的地方

  • 公有仓库,Docker Hub,阿里,网易...
  • 私有仓库,企业内部搭建Docker Registry,Docker官方提供的镜像仓库存储服务Harbor,是Docker Registry的更高级封装,它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能
  • 镜像访问地址形式http://registry.devops.com/demo/hello:latest,若没有前面的url地址,则默认寻找Docker Hub中的镜像,若没有tag标签,则使用latest作为标签。比如,docker pull nginx,会被解析成http://docker.io/library/nginx:latest
  • 公有的仓库中,一般存在这么几类镜像操作系统基础镜像(centos,ubuntu,suse,alpine)中间件(nginx,redis,mysql,tomcat)语言编译环境(python,java,golang)

容器和仓库不会直接交互,都是以镜像为载体来操作。

  1. 查看镜像列表
$ docker images
  1. 如何获取镜像从远程仓库拉取$ docker pull nginx:alpine $ docker images本地构建$ docker build . -t my-nginx:ubuntu -f Dockerfile
  2. 如何通过镜像启动容器
$ docker run --name my-nginx-alpine -d nginx:alpine
  1. 如何知道容器内部运行了什么程序?
# 进入容器内部,分配一个tty终端
$ docker exec -ti my-nginx-alpine /bin/sh
# ps aux
  1. docker怎么知道容器启动后该执行什么命令?
  • 通过docker build来模拟构建一个nginx的镜像,
    • 创建Dockerfile
  • # 告诉docker使用哪个基础镜像作为模板,后续命令都以这个镜像为基础 FROM ubuntu # RUN命令会在上面指定的镜像里执行命令 RUN apt-get update && apt install -y nginx # 告诉docker,启动容器时执行如下命令 CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
    • 构建本地镜像
  • $ docker build . -t my-nginx:ubuntu -f Dockerfile
    • 使用新镜像启动容器
  • $ docker run --name my-nginx-ubuntu -d my-nginx:ubuntu
    • 进入容器查看进程
  • $ docker exec -ti my-nginx-ubuntu /bin/sh # ps aux
  1. 如何访问容器内服务
# 进入容器内部
$ docker exec -ti my-nginx-alpine /bin/sh
# ps aux | grep nginx
# curl localhost:80
  1. 宿主机中如何访问容器服务
# 删掉旧服务,重新启动
$ docker rm -f my-nginx-alpine
$ docker run --name my-nginx-alpine -d -p 8080:80 nginx:alpine
$ curl 172.21.51.67:8080

操作演示

  1. 查看所有镜像:
$ docker images
  1. 拉取镜像:
$ docker pull nginx:alpine
  1. 如何唯一确定镜像:
  • image_id
  • repository:tag
$ docker images
REPOSITORY   TAG       IMAGE ID        CREATED          SIZE
nginx        alpine    377c0837328f    2 weeks ago      19.7MB
  1. 导出镜像到文件中
$ docker save -o nginx-alpine.tar nginx:alpine
  1. 从文件中加载镜像
$ docker load -i nginx-alpine.tar
  1. 部署镜像仓库

https://docs.docker.com/registry/

## 使用docker镜像启动镜像仓库服务
$ docker run -d -p 5000:5000 --restart always --name registry registry:2

## 默认仓库不带认证,若需要认证,参考
https://docs.docker.com/registry/deploying/#restricting-access
  1. 推送本地镜像到镜像仓库中
$ docker tag nginx:alpine localhost:5000/nginx:alpine 
$ docker push localhost:5000/nginx:alpine

## 查看仓库内镜像元数据
$ curl -X GET http://172.21.51.67:5000/v2/_catalog
$ curl -X GET http://172.21.51.67:5000/v2/nginx/tags/list

## 镜像仓库给外部访问,不能通过localhost,尝试使用内网地址172.21.51.67:5000/nginx:alpine 
$ docker tag nginx:alpine 172.21.51.67:5000/nginx:alpine 
$ docker push 172.21.51.67:5000/nginx:alpine
The push refers to repository [172.21.51.67:5000/nginx]
Get https://172.21.51.67:5000/v2/: http: server gave HTTP response to HTTPS client 
## docker默认不允许向http的仓库地址推送,如何做成https的,参考:
https://docs.docker.com/registry/deploying/#run-an-externally-accessible-registry 
## 我们没有可信证书机构颁发的证书和域名,自签名证书需要在每个节点中拷贝证书文件,比较麻烦,因此我们通过配置daemon的方式,来跳过证书的验证:
$ cat /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://8xpk5wnt.mirror.aliyuncs.com"
  ],
  "insecure-registries": [
    "172.21.51.67:5000"
  ]
}
$ systemctl restart docker 
$ docker push 172.21.51.67:5000/nginx:alpine 
$ docker images # IMAGE ID相同,等于起别名或者加快捷方式
REPOSITORY                  TAG        IMAGEID        CREATED         SIZE
172.21.51.67:5000/nginx     alpine     377c0837328f   4 weeks ago
nginx                       alpine     377c0837328f   4 weeks ago
localhost:5000/nginx        alpine     377c0837328f   4 weeks ago
registry                    2          708bc6af7e5e   2 months ago
  1. 删除镜像
docker rmi nginx:alpine
  1. 查看容器列表
## 查看运行状态的容器列表
$ docker ps

## 查看全部状态的容器列表
$ docker ps -a
  1. 启动容器
## 后台启动
$ docker run --name nginx -d nginx:alpine

## 映射端口,把容器的端口映射到宿主机中,-p <host_port>:<container_port>
$ docker run --name nginx -d -p 8080:80 nginx:alpine
## 资源限制,最大可用内存500M
$ docker run --memory=500m nginx:alpine
  1. 容器数据持久化
## 挂载主机目录
$ docker run --name nginx -d -v /opt:/opt -v /var/log:/var/log nginx:alpine 
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -v /opt/mysql/:/var/lib/mysql mysql:5.7

## 使用volumes卷
$ docker volume ls 
$ docker volume create my-vol
$ docker run --name nginx -d -v my-vol:/opt/my-vol nginx:alpine 
$ docker exec -ti nginx touch /opt/my-vol/a.txt

## 验证数据共享
$ docker run --name nginx2 -d -v my-vol:/opt/hh nginx:alpine 
$ docker exec -ti nginx2 ls /opt/hh/
a.txt
  1. 进入容器或者执行容器内的命令
$ docker exec -ti <container_id_or_name> /bin/sh 
$ docker exec <container_id_or_name> hostname
  1. 主机与容器之间拷贝数据
## 主机拷贝到容器
$ echo '123'>/tmp/test.txt
$ docker cp /tmp/test.txt nginx:/tmp 
$ docker exec -ti nginx cat /tmp/test.txt 
123

## 容器拷贝到主机
$ docker cp nginx:/tmp/test.txt ./
  1. 挂载已有的数据,重新创建镜像仓库容器
## 解压离线镜像文件
$ tar zxf registry.tar.gz -C /opt

## 删除当前镜像仓库容器
$ docker rm -f registry
## 使用docker镜像启动镜像仓库服务
$ docker run -d -p 5000:5000 --restart always -v /opt/registry:/var/lib/registry --name registry registry:2

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/131158516