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

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

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

  1. 运行容器并开启映射 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

docker 概览 (1)的更多相关文章

  1. Docker 概览

    什么是Docker Docker是开发,运行和部署应用程序的开放管理平台. 开发人员能利用docker 开发和运行应用程序 运维人员能利用docker 部署和管理应用程序 Docker 平台介绍 Do ...

  2. Docker概览

    Docker.xmind下载

  3. Kubernetes & Docker

    Docker核心技术原理及其应用 Docker 概览 Docker版本与安装介绍 Docker 核心技术之镜像 Docker 核心技术之容器 Docker 核心技术之容器与镜像 Docker 核心技术 ...

  4. Docker 生态概览

    Docker 和容器技术的发展可谓是日新月异,本文试图以全局的视角来梳理一下 docker 目前的生态圈.既然是概览,所以不会涉及具体的技术细节. Docker 自从发布以来发生了很多的变化,并且有些 ...

  5. docker底层技术概览

    docker解决了云计算环境难于分发并且管理复杂,而用KVM.Xen等虚拟化又浪费系统资源的问题.Docker最初是基于lxc构建了容器引擎,为了提供跨平台支持,后又专门开发了libcontainer ...

  6. Docker生态概览

    百花齐放的容器技术 虽然 docker 把容器技术推向了巅峰,但容器技术却不是从 docker 诞生的.实际上,容器技术连新技术都算不上,因为它的诞生和使用确实有些年头了.下面的一串名称肯能有的你都没 ...

  7. Docker容器编排器概览

    就像Apple推出iPhone让智能手机变成主流,Docker让容器变成了主流.自从项目发布以来,Docker着重于提升开发者的体验.基本理念是可以在整个行业中,在一个标准的框架上,构建.交付并且运行 ...

  8. 初识Docker和Windows Server容器

    概览 伴随着Windows Server 2016 Technical Preview 3 (TP3)版本的发布,微软首次提供了Windows平台下地原生容器.它集成了Docker对Windows S ...

  9. docker好文收藏

    深入浅出Docker(一):Docker核心技术预览 2. 核心技术预览 Docker核心是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观.我们从虚拟化方法的四个方面:隔离性.可配额/可度 ...

随机推荐

  1. GO语言web框架Gin之完全指南

    GO语言web框架Gin之完全指南 作为一款企业级生产力的web框架,gin的优势是显而易见的,高性能,轻量级,易用的api,以及众多的使用者,都为这个框架注入了可靠的因素.截止目前为止,github ...

  2. SpringCloud服务的注册发现--------Eureka实现高可用

    1,Eureka作为注册中心,掌管者服务治理的功能,十分重要,如果注册中心的服务一旦宕机,所有的服务就会挂了,为此,实现注册中心的集群(高可用)就显得十分必要了 2,Eureka 搭建集群 实现原理就 ...

  3. php _weakup()反序列化漏洞

    概念&原理 序列化就是使用 serialize() 将对象用字符串的方式进行表示: 反序列化是使用 unserialize() 将序列化的字符串构造成相应的对象,为序列化的逆过程. 序列化的对 ...

  4. Go语言库系列之email

    导读 大家好我是平也,今天跟大家介绍一款用来发送邮件的Go语言库email,目前星星1.3k,非常好用. 极速上手 准备工作 初始化项目 go get github.com/jordan-wright ...

  5. CSS3新增的选择器

    1. 层次选择器 子元素选择器: 只选择子元素    父选择器 > 子选择器 后面紧相邻的兄弟元素:  选择器1 + 选择器2 后面所有的兄弟元素:   选择器1 ~ 选择器2 2.属性选择器  ...

  6. 面试刷题31:分布式ID设计方案

    面试中关于分布式的问题很多.(分布式事务,基本理论CAP,BASE,分布式锁)先来一个简单的. 简单说一下分布式ID的设计方案? 首先要明确在分布式环境下,分布式id的基本要求. 1, 全局唯一,在分 ...

  7. scrapy Selector用法及xpath语法

    准备工作 html示例: <?xml version="1.0" encoding="UTF-8"?> <html <head> ...

  8. 《深入理解 Java 虚拟机》读书笔记:线程安全与锁优化

    正文 一.线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那 ...

  9. 力软敏捷框架 jfGrid 使用例子之一

    百度了下关于力软敏捷框架 jfGrid的教程,基本没有,出来的全是jqGrid.好吧看来只能自己上手了 今天来讲讲列设置属性里数据格式化事件(formatter)的使用 常规的使用方式如上图所示. 先 ...

  10. 关于C#三层架构中的“分页”功能

    新手上路,请多指教! 今天将分页功能实现了,要特别感谢坐在前面的何同学的指点,不胜感谢!功能的实现采用了三层架构的方式实现该功能,简述如下: 界面: DAL层有两个方法:“当前所在页”和“总页数” 这 ...