docker 基础

好好学习下 docker,推荐docker 入门与实战.

一些零碎的知识网上找找也有很多:

Dockfile

Dockerfile

Dockfile 通过from继承。继承那些内容?EXPOSE 的端口会,但是启动命令 CMD 不会.

docker tag

docker tag 理解

docker tag latest 标签

latest tag

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 联合部署,绝大部分应用都是这么个场景的.

安装 docker-compose

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的状态,并不适用.

why docker –net host

docker 4 种网络模式

浏览器运行:localhost:7100

直接就很愉快的跑起来了.

生产环境部署

ubuntu 18

之前的stf local仅是在单机上的 demo,实际 stf 要强大的多,server 肯定是可以远端登录的

部署也复杂的多,作者用的systemd+docker来完成部署及开机运行.

看作者的 deployment.md:https://github.com/openstf/stf/blob/master/doc/DEPLOYMENT.md

实现框架蛮复杂的,要弄懂其原理,恐怕要花些时间.

2018-09-05-12-34-42

找到了个用 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,有点繁琐了.