docker 概览 (1)
Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker的基本概念
docker最重要的三个概念是:镜像(image),容器(container),仓库(repository),在这三个概念中,镜像是最重要的概念。
镜像
我们可以把镜像理解为一个文件系统,并且是一个只读的文件系统。镜像是由一层层的只读层构造起来的,但是从使用者的角度来看我们只有一个镜像而已。那么问题就来了,镜像是只读的,那么我们在使用它的过程中,如果需要对它进行修改,该怎么办呢,别着急,这个就得看我们的容器了。
容器
容器是镜像的一个运行实例,可以不准确的把镜像当作类,容器当作对象。容器其实他的结构是与镜像相类似的,底部也是一层层的只读层,只不过在最上层会存在一个存储层,我们可以在这一层定制化我们的这个容器,还可以通过build命令,把容器打包成我们自己需要的镜像。另外镜像启动后会形成一个容器,容器在计算机中是一个进程,但这个进程对其他进程并不可见。
容器的启动过程:
检查镜像是否在本地存在,如果不存在去远程仓库下载
==>利用镜像创建一个容器
==>启动刚刚创建的容器
==>分配一个文件系统给容器,并且在镜像层外挂载一个可读可写层
==>从宿主主机的网桥接口中桥接一个给容器
==>从网桥中分一个ip地址给容器
==>执行用户指定的应用程序
==>执行完毕后容器自动终止
仓库
这个理解起来就很简单了,大家应该有使用过git,他是有一个远程的仓库,这个仓库记录着我们的代码,和每一次我们提交的记录。但是在这里,把docker的仓库比做maven仓库更加恰当,就相当于我们可以去maven远程仓库取我们需要的依赖,多个依赖构成了我们的整个项目,这个思想同样适用于docker。默认情况下,我们都是从docker hub中取得的镜像(http://registry.hub.docker.com/)
Docker cheatsheet
- https://github.com/wsargent/docker-cheat-sheet
- https://devhints.io/docker
- https://github.com/wsargent/docker-cheat-sheet
Docker 命令
1. docker create:基于镜像创建容器。
docker create --name newnginx nginx:latest,这句命令的意思是使用nginx的镜像来创建一个名叫newnginx的容器
- 本地有就使用本地镜像,没有则从远程镜像库拉取。
- 创建成功后会返回一个容器的ID
2.docker pull :拉取一个或多个镜像
docker pull registry.cn-qingdao.aliyuncs.com/openvino/workshop:[image_tag]
下载完成后显示
Status: Downloaded newer image for ****
3.docker images :查看主机上的镜像
4.docker run 使用镜像名启动一个容器
例: docker run -it --name=openvino_serve openvino:latest /bin/bash
-i:打开容器的标准输入。
-t:告诉docker为容器建立一个命令行终端
-d: 参数默认不会进入容器
openvino:latest openvino镜像名
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
--name 别名
例:docker run -d -P training/webapp python app.py
-P:将容器内部使用的网络端口映射到我们使用的主机上。
使用 docker ps 来查看我们正在运行的容器:
runoob@runoob:~# docker ps
CONTAINER ID IMAGE COMMAND ... PORTS
d3d5e39ed9d3 training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp
以下为端口信息
PORTS
0.0.0.0:32769->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。
这时我们可以通过浏览器访问WEB应用
也可通过 docker port 容器ID 来查看容器端口的映射情况。
5.docker exec:在运行的容器中执行命令
例如:docker exec-i -t newnginx /bin/bash意思为在容器 newnginx 中开启一个交互模式的终端
-d :分离模式: 在后台运行
-i:打开容器的标准输入。
-t:告诉docker为容器建立一个命令行终端
要退出终端,直接输入 exit,退出容器终端,不会导致容器的停止
name:指定容器名称,可以不填(随机),建议根据具体使用功能命名,便于管理
6. docker ps -a :查看所有容器,包括停止的
docker ps: 查看当前运行的容器
CONTAINER ID:容器的唯一表示ID。
IMAGE:创建容器时使用的镜像。
COMMAND:容器最后运行的命令。
CREATED:创建容器的时间。
STATUS:容器状态。
PORTS:对外开放的端口。
NAMES:容器名。可以和容器ID一样唯一标识容器,同一台宿主机上不允许有同名容器存在,否则会冲突。
7. 再次启动容器需要的操作
docker start -i 容器名 #直接进入容器里面
sudo docker start 容器名 #仅仅是打开,需要和下面这句两句一起才等于第一种方法
sudo docker attach 容器名 #将容器和创建时的终端关联,需要再按多一下回车才会显示终端
docker attach 容器ID #注意: 如果从这个容器退出,会导致容器的停止。
8. 修改容器
docker commit 命令来提交更新后的副本。
docker run -t -i docker—image /bin/bash
在容器中添加应用
docker commit -m "" -a "" 0b2616b0e5a8 ouruser/sinatra:v2
-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;
-a 可以指定更新的用户信息;之后是用来创建镜像的容器的
ID;最后指定目标镜像的仓库名和 tag 信息。
创建成功后会返回这个镜像的 ID 信息。
9. docker export 导出容器
docker export 1e560fca3906 > ubuntu.tar 导出容器 1e560fca3906 快照到本地文件 ubuntu.tar。
10. docker import导入容器快照
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
使用 docker import 从容器快照文件ubuntu.tar导入为镜像test/ubuntu:v1
11. docker pause
docker pause <容器 ID>:暂停容器中所有的进程。
可通过docker unpause恢复容器中所有的进程。
例如:docker pause nginx意思为暂停nginx服务;docker unpause nginx意思为启动刚刚暂停的nginx服务。
这两条命令比较简单,与以往命令不同的是docker使用了pause和unpause两个命令。
在linux中一般会使用start、stop、restart、pause来实现一个服务的启动停止和重启,没有unpause的概念。
docker stop <容器 ID> :停止停容器中所有的进程,将容器退出
停止的容器可以通过 docker restart 重启:
docker kill [NAME]/[CONTAINER ID]:强制停止一个容器。
12. docker inspect :查看该容器的详细信息
docker inspect :looks at all the info on a container (including IP address)
查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
13. docker rm :删除容器
docker rm [NAME]/[CONTAINER ID]:不能够删除一个正在运行的容器,会报错。需要先停止容器。
Docker 安装openvino
- 腾讯工程师 OpenVINO Docker 镜像 https://zhuanlan.zhihu.com/p/83581823
- 通过 Docker * 图像安装面向 Raspbian * 的英特尔® OpenVINO™工具包套件
docker https://www.intel.cn/content/www/cn/zh/support/articles/000055220/boards-and-kits.html
Docker 挂载摄像头
https://blog.csdn.net/weixin_40922744/article/details/103245166
docker run -it --device=/dev/video0 <image_name>
--device参数详细明确Docker容器能够使用哪些设备
Docker 显示图像
linux系统目前的主流图像界面服务X11支持 客户端/服务端(C/S)的工作模式,只要在容器启动的时候,将 『unix:端口』或『主机名:端口』共享给Docker,Docker 就可以通过端口找到显示输出的地方,和linux系统共用显示接口。
sudo apt install x11-xserver-utils
-
允许所有用户访问显示接口
xhost + -
只允许Docker用户访问显示接口 (两者选其一即可)
xhost +local:docker -
docker run -it --rm --device=/dev/video0 -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix whynot0/opencamrea:v1
-v /tmp/.X11-unix:/tmp/.X11-unix 共享本地unix端口
-e DISPLAY=unix$DISPLAY 修改环境变量DISPLAY
在容器内操作
-
在容器内安装包
docker exec coursera-aml-nlp pip3 install PACKAGE_NAME
注意理想情况下,所有软件包都应该是Dockerfile的一部分。 如果某些东西丢失,请打开一个问题或者提交一个PR来更新 Dockerfile。 -
查看容器内部的标准输出
docker logs [ID或者名字] 可以查看容器内部的标准输出,看到在这个容器做了什么操作
docker logs -f [ID或者名字] 查看容器内部的标准输出最后10行,然后追踪文件 -
查看容器内部运行的进程
docker top 来查看容器内部运行的进程
runoob@runoob:~$ docker top wizardly_chandrasekhar
UID PID PPID ... TIME CMD
root 23245 23228 ... 00:00:00 python app.py
docker 使用容器的jupyter
- 运行容器并开启映射 docker run -i -t -p 7777:8888 [other options]
而-p 7777:8888 本地服务器本身的7777端口会映射到container里面的8888端口
前面的7777可以更改为别的数字,只要别和服务器自身已经使用的端口产生冲突就好,8888是jupyter notebook的默认端口。
2 、在container里安装jupyter notebook
(1) pip3 install PACKAGE_NAME
(2)运行python或ipython 设置密码,生成密钥
from notebook.auth import passwd
passwd()
会生成一个sha1的秘钥
(3)quit() 退出python
(4)生成jupyter notebook的配置文件
jupyter notebook --generate-config
这时候会生成配置文件,在 ~/.jupyter/jupyter_notebook_config.py
(5)修改配置文件 ~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.ip=''
c.NotebookApp.password = u'sha1:密钥号'
c.NotebookApp.open_browser = False
c.NotebookApp.port =8888
8888表明要使用container的8888端口访问jupyter,然后保存退出。
(6)启动jupyter
jupyter notebook --allow-root
(7)在本地浏览器输入
127.0.0.1:7777
或直接拷贝带token的URL在本地浏览器打开
http://[all ip addresses on your system]:8888/?token=*********
持久数据管理
docker run -it -p 8888:8888 -v/Users/yourname/data:/home/docker/data deeprig/fastai-course-1
*将docker中的jupyter的8888接口与本机的8888接口关联
- -v/Users/yourname/data 本地目录,windows系统文件夹映射需要绝对路径,windows目前只支持C盘
- /home/docker/data 冒号后为镜像内挂载的路径
- deeprig/fastai-course-1 用户名/仓库名,指定使用的镜像
- 本地数据目录现在将在 /home/docker/data的容器中可见
Docker 课程
https://edu.51cto.com/center/course/lesson/index?id=347210
基于 TensorFlow 、OpenCV 和 Docker 的实时视频目标检测
https://www.sohu.com/a/242832191_114877
Docker 安装
https://docs.docker.com/docker-for-windows/install/
Docker镜像上传到阿里云
Info
docker ps shows running containers.
docker logs gets logs from container. (You can use a custom log driver, but logs is only available for json-file and journald in 1.10).
docker inspect looks at all the info on a container (including IP address).
docker events gets events from container.
docker port shows public facing port of container.
docker top shows running processes in container.
docker stats shows containers' resource usage statistics.
docker diff shows changed files in the container's FS.
Import / Export
docker cp copies files or folders between a container and the local filesystem.
docker export turns container filesystem into tarball archive stream to STDOUT.
Info
docker history shows history of image.
docker tag tags an image to a name (local or registry).
Load/Save image
- Load an image from file:
docker load < my_image.tar.gz - Save an existing image:
docker save my_image:my_tag | gzip > my_image.tar.gz
Import/Export container
- Import a container as an image from file:
cat my_container.tar.gz | docker import - my_image:my_tag - Export an existing container:
docker export my_container | gzip > my_container.tar.gz
Registry & Repository
A repository is a hosted collection of tagged images that together create the file system for a container.
A registry is a host -- a server that stores repositories and provides an HTTP API for managing the uploading and downloading of repositories.
Docker.com hosts its own index to a central registry which contains a large number of repositories. Having said that, the central docker registry does not do a good job of verifying images and should be avoided if you're worried about security.
- docker login to login to a registry.
- docker logout to logout from a registry.
- docker search searches registry for image.
- docker pull pulls an image from registry to local machine.
- docker push pushes an image to the registry from local machine.
windows 上docker 配置
https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/manage-docker/configure-docker-daemon
阿里天池 docker 入门赛
https://tianchi.aliyun.com/competition/entrance/231759/information
https://yq.aliyun.com/articles/60601?spm=a2c6h.12873639.0.0.50265056TxrPXW