docker学习笔记

参考文档--docker技术入门与实战(杨保华)

安装参考--清华镜像站

系统:Ubuntu16.04 lts 

 1、启动docker-ce(社区版):

sudo systemctl enable docker
sudo systemctl start docker

2、测试docker是否安装成功:

sudo docker run hello-world

有Pull complete以及对应镜像(image)的sha256码就证明成功。

3、docker拉取Ubuntu18.04 lts镜像

3.1 拉取Ubuntu18.04镜像:

sudo docker pull ubuntu:18.04

3.2 进入Ubuntu18.04镜像进行相应的操作:

sudo docker run -it --rm ubuntu:18.04 bash

进入容器之后,即可实现操作Ubuntu的命令。注意:exit命令退出当前容器

4、列出docker下面的所有镜像:

sudo docker image ls

5、docker定制web服务

5.1 用docker定制一个简单的web服务器(80端口,nginx服务器):

sudo docker run --name webserver -d -p 80:80 nginx

浏览器访问http://localhost即可访问

5.2 修改nginx服务器网页内容(-it表示以交互式终端方式进入webserver容器):

sudo docker exec -it webserver bash

root@******:/#    echo '

Hello,girl!

' > /usr/share/nginx/html/index.html

root@******:/#    exit

5.3 查看容器对其存储层的修改情况:

sudo docker diff webserver

显示解释:我们对容器的任何一个修改都会被记录与容器的存储层里。

1)A - Add

2)D - Delete

3)C - Change

6、commit方式生成镜像

6.1 docker commit生成一个新的镜像(不推荐):

sudo docker commit --author "Xin Zhou" --message "将webserver对应的容器存储为一个新的镜像" webserver nginx:v1

6.2 docker history具体查看镜像内的历史记录:

sudo docker history nginx:v1

6.3 前面两步只是做好了nginx:v1的镜像,还需要以容器形式启动(容器名字:web1,对应nginx服务端口为81):

sudo docker run --name web1 -d -p 81:80 nginx:v1

这里的端口应该是理解为:81表示本机的端口,80表示容器nginx的端口。相当于把nginx的80端口映射到本机的81端口。

访问直接通过本机浏览器访问:http://localhost:81

7、运用Dockerfile生成一个新的镜像

7.1 空目录下新建一个Dockerfile文件

mkdir mynginx
sudo vim Dockerfile

Dockerfile文件内容同样写入5.2中的内容,语法如下:

FROM nginx
RUN  echo '

Hello,girl!

' > /usr/share/nginx/html/index.html

7.2 build命令构建镜像:

sudo docker build -t nginx:v2 .

现在通过以下命令可以看到镜像nginx:2已经生成:

sudo docker image ls

镜像nginx:v2创建完成之后,同样可以采取6.3中的方式启动镜像生成容器。(这里可以类比面向对象的概念:镜像--类,容器--类的实例)

8、用docker部署一个flask的web服务:

参考网站:https://www.jianshu.com/p/5b09394bebfe

现在有个问题:将本地路径挂载到docker目录下之后,在docker容器中还是没办法读取文件内容。(第9点中测试了视频和文件都可以读取,这里应该也可读取,后面继续测试)

9、docker深度学习框架

参考网站1:https://devblogs.nvidia.com/gpu-containers-runtime/

参考网站2:http://wiki.ros.org/docker/Tutorials/GUI

参考网站3:https://yeasy.gitbooks.io/docker_practice/content/image/build.html

镜像仓库:https://hub.docker.com/(pull速度较快)

9.1 参考官网中的教程,安装好nvidia-docker,并做好相应的测试;

9.2 在网站中注册一个NGC账户--密码账户计算网站--我的账户及密码:hk[hkKhkFhjChk]hkNhjNhi3hi>hjFhjBhj?hjShkQhkMt,:[?SvHSt+@hkQhkBhk

docker学习笔记_第1张图片

各个深度学习框架 

9.3 在网站中生成API key并登录NGC账户;(以下是登录命令)

docker login nvcr.io

9.4 运行gpu-containers网站中的示例。(两张显卡的例子)

sudo docker run -it --runtime=nvidia --shm-size=1g -e NVIDIA_VISIBLE_DEVICES=0,1 --rm nvcr.io/nvidia/pytorch:18.11-py3

9.5 运行tensorflow的示例

sudo nvidia-docker run -it -v /media/lab/873821cf-d234-44cf-bd63-4372eac823a1/keras-yolo3/:/root/tensorflow  tensorflow/tensorflow:latest-gpu bash

9.6 docker启动X-server(即可以在docker容器里面运行gui程序)

参考网站:http://wiki.ros.org/docker/Tutorials/GUI

这里直接选用X11 unix socket的方式启动X-server

sudo nvidia-docker run -ti --rm -v /tmp/.X11-unix:/tmp/.X11-unix:rw -v /media/lab/873821cf-d234-44cf-bd63-4372eac823a1/keras-yolo3:/root/tf_yolo3 --env="QT_X11_NO_MITSHM=1" --env="DISPLAY" tensorflow/tf_keras_yolo3 bash

当然,我这里采取了一种极不安全的X-server访问,由于我只在本地使用,就不需要考虑那么多了。

ps:若开启失败,可能是因为没有打开X11 unix socket访问控制,以下命令实现:(有的文档local写的localuser)

xhost +local:root

9.7 在docker中使用opencv读取并显示视频:

①读视频常见问题:需要采用最新的opencv,我安装的命令如下

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python==3.4.3.18

②显示视频:重要的是用X11 unix socket连接Ubuntu16.04的X-server--详见6)

测试了一下,速度完全跟的上,测试代码:

import os 
import cv2
vid = cv2.VideoCapture("demo.avi")
print(vid.isOpened())
while True:
    return_value, frame = vid.read()
    cv2.namedWindow("result", cv2.WINDOW_NORMAL)
    cv2.imshow("result", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
vid.release()
cv2.destroyAllWindows()

9.8 在tensorflow/tensorflow:latest-gpu镜像基础上构建keras-yolo3环境

①在一个空文件夹下面新建一个Dockerfile文件(不带任何后缀名),如下:

FROM tensorflow/tensorflow:latest-gpu

RUN apt-get update && \
    apt install -y libsm6 libxext6 libxrender1 vim
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple keras opencv-python==3.4.3.18
ENV DISPLAY: 0.0

②运用如下命令生成镜像:(这里tensorflow/tf_keras_yolo3是镜像名字,可以任意指定)

sudo docker build -t tensorflow/tf_keras_yolo3 .

完成之后应该可以通过sudo docker image ls查看到tensorflow/tf_keras_yolo3镜像

③ clone或者下载keras-yolo3的代码,完成yolov3.weight的转化,并且完成第6)点即可。

9.9 用docker访问usb摄像头

参考网址:http://tech.ifeng.com/a/20180421/44964062_0.shtml

①docker容器与host摄像头建立连接(主要是添加--device=/dev/video0)

sudo nvidia-docker run -ti --rm -v /tmp/.X11-unix:/tmp/.X11-unix:rw -v /media/lab/873821cf-d234-44cf-bd63-4372eac823a1/keras-yolo3:/root/tf_yolo3 --env="QT_X11_NO_MITSHM=1" --env="DISPLAY" --device=/dev/video0 tensorflow/tf_keras_yolo3:v0 bash

②测试(借用9.7中的程序测试,VideoCapture中的0表示启动默认摄像头,如果有多个摄像头,则可以改为1/2/3……)

import os 
import cv2
vid = cv2.VideoCapture(0)
print(vid.isOpened())
while True:
    return_value, frame = vid.read()
    cv2.namedWindow("result", cv2.WINDOW_NORMAL)
    cv2.imshow("result", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
vid.release()
cv2.destroyAllWindows()

9.10 docker+flask构建网页摄像头

①调试flask-video-streaming(普通主机与flask建立网页摄像头的程序)

②将docker容器与其宿主host建立连接,参考8(下面的命令没有与映射flask的路径)

sudo nvidia-docker run -ti --rm -p 8890:5000 --device=/dev/video0 tensorflow/tf_keras_yolo3:v0 bash

最重要的点:

  • -p实现主机端口8890与docker容器5000端口的连接;
  • --device实现docker容器连接宿主host的摄像头;
  • 将flask网页服务端template中的*.html中的地址修改为主机地址(因为实际网页访问还是需要首先经过宿主host,然后宿主host获取docker容器中启动的web服务)

能完成到这儿,想想后续过程使用docker便能实现一切深度学习框架的训练,以及单张图像测试,再也不用为本地环境一系列的问题发愁了,因为由镜像产生的每一个容器,都与其他容器隔离开来。之前遇到的糟心问题如下:

  • 不同版本的protobuf导致tensorflow和caffe不能同时使用;
  • 不同版本的cuda导致的深度学习框架不兼容问题;
  • 不同版本的opencv导致图片不能读取的问题;
  • 不同版本的python导致深度学习框架不能使用的问题。
  • ………………………………

致敬docker这一伟大发明!!!!!!!!

 

10.删除(镜像、容器)

删除镜像(表示仓库名:标签):

sudo docker image ls #list all images
sudo docker image rm 

删除容器:

sudo docker container ls -a  #list all containers
sudo docker container rm 

清理虚悬镜像(None):

sudo docker image prune

11.合并两个镜像

参考网站:http://dockone.io/article/527

docker history --no-trunc=true image > image1-dockerfile
docker history --no-trunc=true image2 > image2-dockerfile

然后合并两个dockerfile文件中的命令即可

12.docker+bazel问题

error running 'git init /root/.cache/bazel/_bazel_root/616e729fb330ad3359f2c6bbd4e9def8/external/io_bazel_rules_docker' while working with @io_bazel_rules_docker:
src/main/tools/process-wrapper-legacy.cc:58: "execvp(git, ...)": No such file or directory

解决方法:向WORKSPACE添加bazel_rule,直接在docker镜像下使用vim WORKSPACE,然后添加以下规则

http_archive(
    name = "io_bazel_rules_docker",
    sha256 = "aed1c249d4ec8f703edddf35cbe9dfaca0b5f5ea6e4cd9e83e99f3b0d1136c3d",
    strip_prefix = "rules_docker-0.7.0",
    urls = ["https://github.com/bazelbuild/rules_docker/archive/v0.7.0.tar.gz"],
)

13.同时运行多个进程

docker容器内部:/bin/bash -ce process1;process2  //分号 - 表示process1运行完,process2接着运行;& - 表示process1运行成功,process2才接着运行

k8s的yaml写法(env):

env:
  - '/bin/bash'
  - '-ce'
  - process1;process2

 

你可能感兴趣的:(docker)