Docker 容器管理
Docker常用的容器管理命令
-
docker run –name={your_name} –d {image_name} (运行容器)
-
docker ps -s -a {查看当前所有容器}
-
docker stop {container_name} (停止容器)
-
docker kill (container_name) {杀死容器}
-
docker rm -f {container_name} (删除容器)
-
docker logs -f {容器名称} (查看容器日志)
-
docker inspect {容器名称} (查看容器的元数据/属性)
-
docker exec -it {容器名称} bash 进入容器,exec的意思是在容器中运行一个命令。 如果是bash 并且指定了-it 就会打开容器的shell 交互
展示所有处于运行状态的容器
Docker 镜像管理
Docker常用的镜像管理命令
- docker pull {image_name} (拉取镜像)
- docker push {image_name} (推送镜像)
- docker images (查看当前机器的所有镜像)
- docker rmi {image_name} (删除当前机器的一个镜像)
- docker tag {source_images_name:tag your_image_name:tag} 为一个镜像打tag
- docker save busybox > busybox.tar
- docker load < busybox.tar.gz
搭建 Web 服务器 Nginx
一行命令启动nignx
-
docker container run -d -p 5003:80 --name mynginx nginx
(最简模式) -
docker container run -d -p 5003:80 -v "$PWD/html":/usr/share/nginx/html --name mynginx nginx
(映射文件)
本地虚拟机启动成功后,访问页面:IP+端口 192.168.15.128:5003
持久化命令:
搭建数据库服务 MySQL
一行命令启动mysql
docker run --name some-mysql -v /home/gaofei/test/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1qaz9ol. -p 8888:3306 -d mysql
docker exec -it some-mysql bash
mysql -uroot -p
Docker与虚拟机解析
架构区别
docker的容器是秒级启动,因为没有内核,不需要操作系统。
虚拟机没有docker快,因为虚拟机带内核。
docker没有虚拟化内核
Docker 和虚拟机的使用场景
容器与虚拟机使用场景
Docker 与容器网络
网桥模式
host 模式
host模式:不构建自己的网络,使用宿主机的网络。在K8S中适合做路由
启动容器的网络模式:
container模式
自动化测试用例在2-3k条左右,需要放到服务器上去运行,放在一台服务器上也不行,单机会有性能瓶颈,pytest有并发执行的机制。一台机器能启动的浏览器数量任然是有限的,浏览器是非常消耗cpu资源的。需要把浏览器分布在不同的机型上执行测试用例才能满足日益增长的测试用例规模的需求
也适合做浏览器的兼容性测试方案:
浏览器集群的主节点:Selenium Hub,接收用户请求的
nodes节点:是真正注册浏览器的地方
部署分布式 UI 自动化测试环境
- docker run --name hub -d -p 5442-5444:4442-4444 selenium/hub:4.0.0-rc-2-prerelease-20210923
- docker run --name node -p 5902:5900 -d -e SE_EVENT_BUS_HOST=ke.hogwarts.ceshiren.com -e SE_NODE_MAX_SESSIONS=20 -e SE_NODE_OVERRIDE_MAX_SESSIONS=true -e SE_EVENT_BUS_PUBLISH_PORT=5442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=5443 -v /dev/shm:/dev/shm selenium/node-chrome:4.0.0-rc-2-prerelease-20210923
- vnc密码:secret
连接grid的代码
from selene.support.shared import browser, config
from selenium.webdriver import Chrome
import selenium.webdriver
if __name__ == '__main__':
config.browser_name = 'chrome'
config.base_url = "http://ke.hogwarts.ceshiren.com:5444"
config.timeout = 10
config.save_screenshot_on_failure = False
option = selenium.webdriver.ChromeOptions()
option.add_argument("--disable-infobars")
option.add_argument("--disable-dev-shm-usage")
option.add_argument("--no-sandbox")
option.add_argument("--disable-extensions")
option.add_argument("--ignore-ssl-errors")
option.add_argument("--ignore-certificate-errors")
option.add_argument('--disable-gpu')
prefs = {'download.default_directory': '/home/seluser/Downloads/'}
option.add_experimental_option('prefs', prefs)
option.add_experimental_option('w3c', False)
option.add_experimental_option('perfLoggingPrefs', {
'enableNetwork': True,
'enablePage': False,
})
caps = option.to_capabilities()
caps['goog:loggingPrefs'] = {'performance': 'ALL'}
config.driver = selenium.webdriver.Remote(
command_executor="http://47.93.32.161:5444",
desired_capabilities=caps,
keep_alive=True,
options=option)
config.driver.set_page_load_timeout(10)
browser.open('/')
browser.driver.maximize_window()
Docker-compose 使用
Docker-compose 简介
- Docker-compose 是用于定义和运行多容器的 Docker 应用程序的工具。通过Compose,可以使用 YAML 文件来配置应用程序的服务。
- Compose 的使用一般分为三步:
- 使用 Dockerfile 定义应用程序的环境,以便可以在任何地方复制它。
- 在 docker-compose.yml 中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。
- 运行 docker-compose up,然后 Compose 启动并运行您的整个应用程序。
删除容器:
作用:为了让用户维护容器更方便,但是使用场景少,能力比较弱。容器数量可能有大几百个甚至上千个,了解一下就行。如果团队规模不大,不会有k8s集群这种东西,单机的,用compose去管理容器也比较的方便,一个命令就可以启动或者删除容器
Docker-compose 安装
- macOS、Windows 系统使用的 Docker Desktop 默认已经安装。
- Linux 系统:
curl "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 更改权限:
chmod +x /usr/local/bin/docker-compose
- 查看版本:
docker-compose version
Docker-compose 演示
- 通过一个 Python web 小实例来演示 Docker-compose 的功能。
启动容器在后台运行,日志不会打印在前台
Docker-compose 常用命令
查看配置:docker-compose config
后台启动:docker-compose up -d
构建镜像:docker-compose build
下载镜像:docker-compose pull
运行的:docker-compose ps
进程:docker-compose top
启动:docker-compose start
停止:docker-compose stop
在Docker 容器中制作镜像
Docker 容器镜像制作命令
- docker commit {容器名称} {镜像名称}
- dockerfile
dockerfile指令详解
- FROM (指定继承自哪个基础镜像)
- RUN (运行shell命令)
- ADD/COPY (复制文件)
- USER (指定运行用户)
- ENTRYPOINT (指定容器启动命令)
- ENV (指定环境变量)
dockerfile
FROM centos:7
ADD entrypoint.sh /root
USER root
RUN yum install -y wget vim
RUN yum install -y vim wget
RUN yum install -y wget vim git
RUN yum install -y wget
RUN yum install -y openssh-server openssl
RUN yum install wget vim
RUN yum install git vim
USER jenkins
WORKDIR /root
ENTRYPOINT ["/bin/bash", "/root/entrypoint.sh"]
制作新的镜像:不推荐这种方法。不方便维护
一旦镜像丢了就丢了,想复现镜像很困难。推荐使用docker file
查看启动的容器:
docker file:
docker file文件内容:
根据dockerfile文件的指令一步一步的执行:
【实战】Docker 制作容器镜像实战
【实战】Docker 私有镜像仓库实战
目标:能在测试环境维护一个镜像仓库就好
部署到私有仓库并做验证:
镜像仓库信息:
Docker 容器隔离 namespace
虚拟机是有独立的内核,容器都是共享的宿主机的内核。
容器的隔离手段和虚拟机不一样,容器需要在同一个内核下把这些进程进行隔离,隔离手段就是:namespace,进程相当于对讲机,namespace相当于频道。
容器其实就是一个进程
proc:是一个虚拟的文件系统,名称空间作用:故障注入
linux namespace
- namespace是linux中用来隔离进程的手段。容器就是使用该技术来进行隔离的
- 可以把进程当做是对讲机,而namespace就是频段。两个对讲机(进程)要互相通信就需要调整到相同的频段上(namespace)
Docker 资源限制 cgroups
每启动一个容器的时候都会在cgroups下创建一个文件夹
看剩余的内存:
cgroups
- cgroups是linux用来限制进程使用资源的手段。容器也是利用这个技术进行资源的隔离
- mount -t cgroups 查看当前系统的cgroups
【实战】容器故障注入实战
docker可以根据用户的需要打磨隔离边界的
没有权限/没有故障注入的工具,去宿主机上去操作就相对应的权限了
查看容器的原信息:
查找PID:
启动容器就是启动一个进程,启动进程的时候设置了不同的名称空间
切换到容器网络:
容器的故障注入
- 使用docker inspect命令查询当前容器的PID
- 使用nsenter -t pid -n 切换到容器的网络名称空间
- 使用iptables/tc等命令进行故障注入
Docker 镜像分层设计
镜像分层设计
- 每个镜像都是由多个层组成的,每一层都可以复用。
- 编写docker时可以利用分层缓存的特点加速镜像开发的过程
但是容器过多会影响镜像启动后的IO性能
Docker 联合文件系统详解
联合文件系统
层数越多性能越差
如果有七八十个run指令,就需要考虑把多个run指令合并成一个指令了,来减少层数
docker镜像是什么?就是一堆目录和文件。用了名称空间中的Mount namespace(管文件挂载的),把镜像规定的目录挂载到容器的root。登录到容器上面,看到的都是镜像里面的目录。
容器是个进程,用了不同名称空间的进程
【实战】Docker 镜像设计方法实战
合理的设计镜像层
k8s 容器技术介绍
K8S:容器集群
K8S需要把容器包装一下,来完成更上层的封装目的
控制K8S集群:
K8S最小的调度单位:pod
pod里面可以运行多个容器,容器和业务强相关的,可以共享网络和目录
K8S无法调度容器
一个deployment下可关联多个pod,可以维护pod的数量,监控pod的数量情况。
负载均衡、高可用模式
保证起三个一样的pod:
线上用户的请求是先发给service,然后再随机的分配给下面的Apiserver,service是接管pod的网络
健康检查:
使用 k8s 批量运行测试用例
浏览器集群,把浏览器部署到服务器上
会有一个浏览器主节点:grid hub
k8s就是容器集群,把浏览器集群部署到k8s里面,部署到不同的节点进行分担压力
grid hub使用Deproyment进行部署,Deproyment可以做一些自动化运维的操作。