现在非常痛恨新浪博客,之前我写老长一段笔记,竟然因插入图片控价没有缓冲出来,整个都没有了。还经常出问题,真是无语了。


好了牢骚发完了,正式写书笔记。我写笔记的目的就是为了自己将来的复习和回顾,以及对渴望学习docker的后来者提供帮助。


上面说到了docker的安装与使用,但是此处我仅仅讲解docker的使用,暂且不讲解docker的安装,因为网上有一大堆相关docker安装的教程。我写使用的目的是因为学习docker是遇到的各种使用问题。


一. Docker基础知识总结:
Docker至少有以下的应用场景
1. 测试:docker很适用于测试发布,将docker封装后可以直接提供给测试人员进行运行,不需要测试人员与运维、开发进行配合,进行环境搭建与部署。
2. 测试数据分离:在测试中,由于经常的场景变换,需要修改依赖项的数据库数据或者清空变动memcache、redis中的缓存数据。Docker相对于传统的虚拟机,更轻量级与方便。可以很容易的将这些数据分离到不同的镜像中,根据不同需要随时进行切换。
3. 开发:开发人员共同使用同一个docker镜像,同时修改的源代码都被挂载到本地磁盘。不再因为环境的不同而造成的不同程序行为而伤透脑筋,同时新人到岗时也能快速建立开发、编译环境。
4. PaaS云服务:Docker可以支持命令行封装和编程,通过自动加载与服务自发现,可以很方便的将分装与docker镜像中的服务扩展成云服务。类似像doc转换预览这样的服务封装与镜像中,根据业务请求的情况随时增加或减少容器的运行数量,随需应变。


具体到docker技术在测试领域的应用
1)快速搭建测试环境
从docker的镜像技术和容器特点技术可以预见,当被测应用要求在各类web服务器、中间件、数据库的组合环境中得到充分验证时,可以快速地利用docker镜像创建各种容器,装载相应的技术组件并快速的启动运行,测试人员省去了大量花在测试环境搭建上的时间。
2)快速搭建环境分布测试环境
Docker的轻量虚拟化特点决定了他可以在一台机器上轻松搭建出成百上千个分布式节点的容积环境,从而模拟以前需要消耗大量时间和机器资源才能搭建出来的分布式复杂测试环境。
3)持续集成
Docker可以快速创建和撤销容器,在持续集成的环境中,可以频繁和快速地进行部署和验证工作。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker说白了就是一个轻量级的虚拟机,把所有的服务都在容器中运行,并且容器之间是完全封闭的,不存在任何接口。

Docker在各个平台下安装与使用教程:http://www.runoob.com/docker/docker-exec-command.html



二. 常用命令

总结一下常用命令:

其中<>阔起来的参数为必选,[]阔起来为可选

· docker version 查看docker的版本号,包括客户端、服务端、依赖的Go等

· docker info 查看系统(docker)层面信息,包括管理的images, containers数等

· docker search <image> 在docker index中搜索image

· docker pull <image> 从docker registry server 中下拉image

· docker push <image|repository> 推送一个image或repository到registry

· docker push <image|repository>:TAG 同上,指定tag

· docker inspect <image|container> 查看image或container的底层信息

· docker images TODO filter out the intermediate image layers (intermediate image layers 是什么)

· docker images -a 列出所有的images

· docker ps 默认显示正在运行中的container

· docker ps -l 显示最后一次创建的container,包括未运行的

· docker ps -a 显示所有的container,包括未运行的

· docker logs <container> 查看container的日志,也就是执行命令的一些输出

· docker rm <container...> 删除一个或多个container

· docker rm `docker ps -a -q` 删除所有的container

· docker ps -a -q | xargs docker rm 同上, 删除所有的container

· docker rmi <image...> 删除一个或多个image

· docker start/stop/restart <container> 开启/停止/重启container

· docker start -i <container> 启动一个container并进入交互模式

· docker attach <container> attach一个运行中的container

· docker run <image> <command> 使用image创建container并执行相应命令,然后停止

· docker run -i -t <image> /bin/bash 使用image创建container并进入交互模式, login shell是/bin/bash

· docker run -i -t -p <host_port:contain_port> 将container的端口映射到宿主机的端口

· docker commit <container> [repo:tag] 将一个container固化为一个新的image,后面的repo:tag可选

· docker build <path> 寻找path路径下名为的Dockerfile的配置文件,使用此配置生成新的image

· docker build -t repo[:tag] 同上,可以指定repo和可选的tag

· docker build - < <dockerfile> 使用指定的dockerfile配置文件,docker以stdin方式获取内容,使用此配置生成新的image

· docker port <container> <container port> 查看本地哪个端口映射到container的指定端口,其实用docker ps 也可以看到

对上面这么多命令的总结:

· 容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]

· 容器操作运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port]

· 容器rootfs命令 — docker [commit|cp|diff]

· 镜像仓库 — docker [login|pull|push|search]

· 本地镜像管理 — docker [images|rmi|tag|build|history|save|import]

· 其他命令 — docker [info|version]


针对以上的命令,我们将会在下面进行简要的讲解,以及举一些实际的例子作为佐证。


三. docker的安装说明

1. 安装docker包
首先我们创建一个docker文件夹,把需要的包rpm.zip包和ubuntu_docker.tar统一放到该文件夹下。
输入命令:
mkdir docker
把rpm.zip和ubuntu_docker.tar放到docker文件夹下

然后解压rpm.zip压缩包到指定的文件夹中,比如都统一解压到docker/rpm文件夹下。
输入命令:
cd docker
mkdir -p ./rpm
unzip rpm.zip -d ./rpm/

接着安装rpm文件夹下所有的rpm包。
输入命令:
rpm -Uvh ./rpm/*.rpm --nodeps --force

2. docker挂载cgroup
docker挂载cgroup是使其虚拟化的基础,需要把如下内容添加到/etc/fstab文件中。
输入命令:
echo "none                    /sys/fs/cgropu          cgroup  defaults        0 0" >> /etc/fstab

3. 重启服务器生效,启动docker服务
重启服务器,输入命令:reboot
稍等服务器启动后,启动docker服务:service docker start
把docker启用到后台:docker -d &

4. 导入docker镜像文件
我们所在目录为docker下,
输入命令:docker load < ubuntu_docker.tar
注意:查看具体的镜像的tar包名称,写对应的tar包即可。


针对以上步骤已经写好了一个名为docker.sh的脚本文件:
内容为;

#!/bin/sh


if [ ! -d "rpm" ]; then
        unzip rpm.zip
fi

cd rpm

rpm -Uvh *.rpm --nodeps --force

echo -e "\nAdd infomation to /etc/fstab"
if cat /etc/fstab | grep -r "none                    /sys/fs/cgroup          cgroup  defaults        0 0" ; then
        echo -e "\"none                    /sys/fs/cgroup          cgroup  defaults        0 0\" already exists."
else
        echo "none                    /sys/fs/cgroup          cgroup  defaults        0 0" >> /etc/fstab
fi
echo -e "Add complete\n"


echo -e "Startup service"
service docker start
#docker -d &
cd ..

echo -e "\nLoad ubuntu_docker..."
docker load < ubuntu_docker.tar
echo -e "Load successfully\n"

docker images
echo "Already completed!!!"

然后添加该shell脚本的执行权限:
输入命令:chmod +x docker.sh


5. 启动docker容器
启动docker容器时,
输入命令:
docker run -ti --net="host" ubuntu_docker

6. 部署xtts以及合成服务
进入/home/iflytek目录,部署xtts以及合成服务
输入命令:cd /home/iflytek
针对xtts和合成服务的部署,请详细参考ttss和xtts部署文档和合成服务文档。


7. 针对已经部署好的xtts和合成服务的启动问题
针对已经部署好的xtts和合成服务后,我们可以在宿主机中启动容器中的服务,可以直接操作命令,也可以使用shell脚本进行操作,使用shell脚本将会提高工作效率。
假如我们在/home/iflytek下存在一个xttsShell.sh文件,该文件内保存对xtts或者合成服务操作的相关服务执行。我们在宿主机中就可以执行该容器中的shell脚本,实现宿主机直接控制容器,操作容器的效果。
输入命令:
docker exec -ti ubuntu_docker:v1.0.0 /bin/sh /home/iflytek/xttsShell.sh
即可在宿主机中完成容器内所有xtts的所有相关服务。


四. docker的使用说明


1. 查看docker的帮助文档,可以帮我们快速的使用docker。

输入命令:sudo docker
或者
输入命令:sudo docker  --help

注意我们尽量使用根用户权限这样就会省去每一次都需要输入密码的麻烦了。


2. 启用docker服务相关的命令

启动docker输入命名:sudo service docker start
停止docker服务输入命令:sudo service docker stop
重启docker服务输入命令:sudo service docker restart
查看docker服务当前的状态:sudo service docker status


3. 查看docker当前的版本
输入命令:sudo docker version
但是前提你需要启动docker服务否则有可能出现docker的服务器启动失败的情况。


4. 查看docker当前有多少镜像
输入命令:sudo docker images
该命令会列出所有的镜像文件,显示对应镜像文件的详细信息,比如名字,tag,镜像ID,创建时间,大小等信息。


5. 如果感觉当前的镜像文件比较少,我们还可以采用以下命令从镜像仓库中添加镜像文件。
输入命令:sudo docker pull ubuntu
这个是我们从仓库中获取ubuntu镜像文件。

输入命令:sudo docker pull centos
这个是我们从仓库中获取centos的镜像文件。

输入命令:sudo docker pull debian
这个是我们从仓库中获取debian的镜像文件。

输入命令:sudo docker pull 32bit/debian
这个我们从仓库中获取32bit/debian的镜像文件。


注:当然我们还是可以从仓库中获取其他的各种镜像文件,具体的所需要的镜像文件大家可以通过上网找对应的镜像。


6. 显示容器相关的信息

如果我们想要查看所有容器(包括沉睡的容器,终止的容器等)
输入命令:sudo docker ps -a


如果我们仅仅想查看当前最新的一个容器
输入命令:sudo docker ps -l

如果要查看某几个容器呢?
输入命令:sudo docker ps -n=4
表示显示最新创建的4个容器,想看几个容器就写数字几,超过实际容器的个数,显示实际容器个数。


如果要显示容器大小
输入命令:sudo docker ps -s

如果要列出容器ID
输入命令:sudo docker ps -d


当然这里面还有其他的操作命令,大家可以自己学习。


注意上面的:sudo docker image,sudo docker pull等命令也有相应的操作。


7. 通过上面的sudo docker ps -a命令显示所有的容器相关信息,比如容器ID,容器名等信息。我们可以通过这些信息操作对应的容器。此处我们将会使用容器ID操作容器。

比如有一个容器ID是:f04c60d8b336
启用一个容器:sudo docker start f04c60d8b336
停止一个容器:sudo docker stop f04c60d8b336
显示一个容器状态:sudo docker status f04c60d8b336


如果我们已经使用命令sudo docker start f04c60d8b336启用一个容器,那么我们就可以进入这个容器中,输入命令:sudo docker attach f04c60d8b336
进入这个容器后,他也是一个系统,可能是ubuntu系统,或者redhat系统,或者centos系统等各种系统,还是主要看你自己拉去的这个容器对应的系统名。
通过我们之前的命令:sudo docker ps -a 找到对应容器ID对应的镜像名称即可。


8. 当然我们也可以进入一个镜像

首先通过命令:sudo docker images,查看有多少镜像文件。这里面有对应的镜像文件信息。比如镜像文件名,镜像ID等信息。
root@ubuntu:/home/stf/docker# sudo docker images
REPOSITORY    TAG           IMAGE ID      CREATED        VIRTUAL SIZE
32bit/debian   latest       e31bfc2a061e    2.565861 years ago   272 MB


输入命令:sudo docker run -t -i 镜像名或者镜像ID /bin/bash
比如:sudo docker run -t -i 32bit/debian /bin/bash
或者:sudo docker run -t -i e31bfc2a061e /bin/bash
这两个命令执行的效果是完全一致的。


9. 假如我们想要在宿主机上访问容器中的数据,我们可以通过以下命令

假如我们有如下容器ID。
root@ubuntu:/home/stf/docker# sudo docker ps -l
CONTAINER ID     IMAGE      COMMAND   CREATED   STATUS  PORTS        NAMES
f04c60d8b336  e31bfc2a061e:latest "/bin/bash"  23 hours ago Exited (0) 11 minutes ago        

输入命令:sudo docker exec -t -i 容器ID 在容器执行的命令
比如:sudo docker exec -t -i f04c60d8b336 ls
这个命令的理解是docker exec在容器f04c60d8b336中执行命令ls,ls现实的是容器中的内容。但是该命令不会使终端进入容器中,只是使操作命令进入到容器中执行。

-i :即使没有附加也保持STDIN 打开。
-t :分配一个伪终端
-d :分离模式: 在后台运行


10. 删除一个镜像
输入命令:sudo docker rmi -f 32bit/debian
这样删除的就是上面我们的镜像文件。

 

11. 如何导出导入一个镜像文件

镜像文件一般的保存形式是**.tar的格式,我们之前重仓库中使用命令docker pull 下载了一些镜像文件,如果我们想要把这些镜像文件进行本地保存的话,就可以使用命令,不过前提需要先看看都有哪些镜像。

首先输入命令查看要保存的镜像名称或者镜像ID:sudo docker images

root@ubuntu:/home/stf/docker# sudo docker images
REPOSITORY    TAG           IMAGE ID      CREATED        VIRTUAL SIZE
32bit/debian   latest       e31bfc2a061e    2.565861 years ago   272 MB

然后保存对应的镜像文件:sudo docker save -o debian.tar 32bit/debian
最后输入命令:ls  
即可查看已经保存再当前文件夹下的debian.tar文件。

当然如果要加载一个已经存在的镜像就可以使用如下命令了
输入命令:sudo docker load < debian.tar


12. 如何在宿主机中执行容器中的系统命令
很多时候我们不需要进入容器,而去执行容器中的命令,那么docker有一个自带的命令可以直接执行容器中的系统命令,而终端还是会保持在当前终端而不是进入容器终端。
输入命令:sudo docker exec -ti f04c60d8b336 ls
该命令表示在容器f04c60d8b336中执行ls命令,但是终端界面不会进入容器。ls的内容就是容器根目录下的文件。
如果我们要显示容器home下的内容,我们可以输入如下命令
输入命令:sudo docker exec -ti f04c60d8b336 ls /home/


当然最重要的是如何使用shell访问。
比如我们在容器中的/home/tfsong/文件夹下有dockerShell.sh文件,那么我们如何执行该容器下的shell文件呢?
输入命令:sudo docker exec -ti f04c60d8b336 /bin/sh /home/tfsong/dockerShell.sh
该命令表示在容器f04c60d8b336中执行shell脚本,该脚本的名字市dockerShell.sh,存放的文件路径是/home/tfsong/


当然我们也可以把该命令在宿主机写成shell脚本的形式,这样只需要执行shell命令,即可实现从宿主机shell访问容器shell脚本。
命令shell文件名为:mainShell.sh
内容为:sudo docker exec -ti f04c60d8b336 /bin/sh /home/tfsong/dockerShell.sh
保存退出
添加执行权限:chmod +x mainShell.sh
运行该脚本:./mainShell.sh
即可实现和单独执行shell脚本形同的功效。


12. 实现容器数据复制到宿主机中
假设我们容器中有一个名为1.txt的文件,在容器的/home/tfsong/下面,然后复制到宿主机中的/mnt文件夹下
执行命令:docker cp f04c60d8b336:/home/tfsong/1.txt /mnt/

该命令即可总结为:docker cp 容器ID:/容器路径/文件名 /宿主机路径/


13. 实现宿主机文件系统挂载到容器中。
假如我们宿主机中有一个文件夹/dev/mapper/tmp,需要把它挂载到容器的/mnt/img下,前提是存在img文件夹。

输入命令:docker run -ti -v /dev/mapper/tmp:/mnt/img ubuntu_docker:v1.0.0 /bin/bash

该命令表示把本地磁盘中的/dev/mapper/tmp挂载到镜像文件ubuntu_docker:v1.0.0中的/mnt/img下。


卸载已经挂载的该文件,
输入命令: docker exec -ti f04c60d8b336 umount /mnt/img


当然还是有从宿主机到容器的文件复制:

输入命令:docker cp /宿主机路径/宿主机文件 容器ID:/容器路径/

但是我发现,该命令我没有执行成功,希望大家多测试一下,看看结果。下面这几句没有测试,感觉可以。

# docker inspect -f '{{.Id}}' a77a72ac178c

a77a72ac178c1e35708d2af446197c10239b0b1bd8932104578e334b83eb93a2

# cp docker/docker-start.sh /var/lib/docker/aufs/mnt/a77a72ac178c1e35708d2af446197c10239b0b1bd8932104578e334b83eb93a2/root/

# docker-enter a77a72ac178c

# pwd/root

# lsdocker-start.sh






14. 从容器中退出到宿主机中

无论我们使用docker run命令,还是使用docker attach 命令进入容器中,我们都可以通过命令退出该容器。

输入命令:docker attach f04c60d8b336

注意:

1.  前提是先启动该容器,启动该容器的命令:docker start  f04c60d8b336。

2.  docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞。


在容器中输入命令:exit
表示从容器中退出,并停止该容器。

或者输入命令:ctrl+d
表示从容器中退出,并停止该容器。功能和exit一样。

或者输入命令:ctrl+p+q
表示从容器中退出,但是并不停止该容器,该容器保存运行状态。注意命令输入的先后顺序。


15. 查找相应的容器
输入命令:docker search 镜像名或者镜像ID


会在后面进行补充。




Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐