Stf Docker部署记录1
docker 基础
好好学习下 docker,推荐docker 入门与实战.
一些零碎的知识网上找找也有很多:
Dockfile
Dockfile 通过from
继承。继承那些内容?EXPOSE 的端口会,但是启动命令 CMD 不会.
docker tag
docker tag latest 标签
docker 数据卷
可以在 docker 容器内,docker 容器之间,或者 docker 主机和容器之间创建数据卷,有点类似 mount.
# 容器内创建/webapp的卷,(和直接shell容器内 mkdir /webapp有何区别?)
sudo docker run -ti -d --name web -v /webapp some_web_image python app.py
#本地/src/webapp 挂载到docker container /webapp下,并且attr为ro,read only
sudo docker run -ti -d -P --name web -v src/webapp:/webapp:ro some_web_image python app.py
#先创建专门的数据卷容器
sudo docker run -ti -d --name dbdata -v /dbdata ubuntu
#然后创建新的容器挂载已创建好的数据容器的数据,db1,db2, dbdata任一改变, 其他方都立即同步.
sudo docker run -ti -d --name db1 --volumefrom dbdata ubuntu
sudo docker run -ti -d --name db2 --volumefrom dbdata ubuntu
docker ubuntu18 安装
按官网就可以了https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-from-a-package
另外要用到 docker-compose.它可以理解多个 docker container 联合部署,绝大部分应用都是这么个场景的.
STF demo
stf 是一个功能强大的 web 端 Android 测试平台https://github.com/openstf/stf
早知道有这货,我就不用写什么 pylink 了.可能前面几面的 link,都可以在这基础上做的.
提供了 docker 的安装方式.
介绍 STF+Docker 的文章
https://testerhome.com/topics/10406
https://blog.csdn.net/yorkz0909/article/details/76523271
pull 相关镜像
sudo docker pull openstf/stf:latest # STF镜像
sudo docker pull sorccu/adb:latest # android adb 镜像
sudo docker pull rethinkdb:latest # rethinkdb 镜像
sudo docker pull openstf/ambassador:latest
sudo docker pull nginx:latest # nginx 代理镜像
查看已经拉去好的镜像 sudo docker images
➜ lib sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 52b10959e8aa 11 days ago 115MB
openstf/stf latest 97d4df9c936a 2 weeks ago 777MB
rethinkdb latest be18969e519f 6 weeks ago 182MB
hello-world latest 2cb0d9787c4d 7 weeks ago 1.85kB
sorccu/adb latest 7123ee61b746 5 months ago 30.5MB
openstf/ambassador latest b1f0eb8297cf 2 years ago 6.46MB
运行:
sudo docker run -d --name rethinkdb -v /srv/rethinkdb:/data --net host rethinkdb rethinkdb --bind all --cache-size 2048 --http-port 8090
sudo docker run -d --name adbd --privileged -v /dev/bus/usb:/dev/bus/usb --net host sorccu/adb:latest
sudo docker run -d --name stf --net host openstf/stf stf local
注意--net host
的意思是,访问到宿主机的端口,直接 forward 到 container 上,比如访问本机 xxx:736 时,直接就能访问 contrainer 的 736, 省事,不需要额外的端口映射,但是多个 container 相同时,只有 1 个 container 能用,后面的相同 port 是already used
的状态,并不适用.
浏览器运行:localhost:7100
直接就很愉快的跑起来了.
生产环境部署
ubuntu 18
之前的stf local
仅是在单机上的 demo,实际 stf 要强大的多,server 肯定是可以远端登录的
部署也复杂的多,作者用的systemd+docker
来完成部署及开机运行.
看作者的 deployment.md:https://github.com/openstf/stf/blob/master/doc/DEPLOYMENT.md
实现框架蛮复杂的,要弄懂其原理,恐怕要花些时间.
找到了个用 docker-compose 直接部署的 stf-poc,https://github.com/nikosch86/stf-poc
ubuntu 下直接改下.env 下的 ip 就完成部署了,略吊
2 次开发的 STF 部署
如果 2 次开发 STF,又该如何部署?上面都没有改动任何 container. 进入 stf 容器里查看运行文件:
sudo docker run -it --user root --name stf-sh openstf/stf /bin/bash
按我的理解,将开发修改后的源码拷贝到这个环境下,然后重新编译,运行就可以了.
# 查询上面打开的container id
sudo docker ps -a |grep stf-sh
# cp res
sudo docker cp /home/bravo/WinProjects/STF/res 943a7e87fcb5:/app
# commit new image
sudo docker commit -m "dev v1 test" -a "xxx" 943a7e87fcb5 openstf/sft:dev_v1
# stop all containers
sudo docker kill $(sudo docker ps -a -q)
# 修改docker-compose里 openstf tag 为 opestf/stf:dev_v1
# restart
sudo docker-compose up -d --build
不过太复杂了 来个简单的 Dockfile 方法,在 tmp 里直接基于 openstf/stf:latest 新建
mkdir tmp
cd tmp
# res copy 到tmp下
cp xxx/res tmp -rf
touch Dockerfile
sudo docker build -t="openstf/stf:dev_v1" .
Dockfile 内容就很简单了,只做一件事,就是把 res 放到 container 的 app 下,这里采取解压的方式, 并注意下权限的问题.
FROM openstf/stf:latest
MAINTAINER ding.yang ding.yang@ff.com
USER root
COPY res.tar.gz /tmp
RUN tar zxvf /tmp/res.tar.gz -C/app
RUN chown -R stf-build:stf-build /app/res
RUN rm /tmp/res.tar.gz
USER stf
CMD echo "Build new image done"
kill 和删除所有的 container:
sudo docker kill $(sudo docker ps -a -q)
sudo docker rm $(sudo docker ps -a -q )
遇到的问题是,即便 chown 了,运行起来还是有的 static images 提示 no permission? 最终找到原因了…是因为图片本身就只有 owner 权限,没有 group 权限.chmod 一下,再重新来吧
-rw------- 1 stf-build stf-build 5738 Sep 3 06:46 STF-128.png
chmod 666 xxx
还可以怎么给别人用
一种是 container 层面的 export/import or image 层面的 save/load 保存为本地压缩文件.
export:
sudo docker export xxx > xxx_stf.tar
import
cat xxx_stf.rar | sudo docker import - respository:tag
注意容器和镜像的区别.import 是容器 snapshot,只有当时的 export 的 meta 信息,而镜像的 save/load 讲保存完整记录,体积较大.
另外就是 commit 为 image,然后 push 到仓库,用的人从仓库下好了,这里的仓库可以是自己搭的 docker hub,也可以是公共的那个 docker hub.
# 将a404xxx容器保存为image, repository:tag = mymysql:v1
sudo docker commit -a "xxx" -m "my commit" a404c6c174a2 mymysql:v1
win10
为何还要 win10?因为 other team 用 win10 的最多..
目前遇到了问题 adb 不能跑,/dev/bus/usb 这是标准的 unix 设备总线,在 windows 下压根没有,所以 adb docker 是不能用的.
可能还需要 vm 搭一层,再用 docker,有点繁琐了.