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. hdu1078 dfs+dp(记忆化搜索)搜索一条递增路径,路径和最大,起点是(0,0)

    #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...

  2. Hive面试准备

    Hive与HBase的区别Hive架构原理Hive的数据模型及各模块的应用场景Hive支持的文件格式和压缩格式及各自特点Hive内外表的区分方法及内外部差异Hive视图如何创建.特点及应用场景Hive ...

  3. Python如何用virtualenv搭建虚拟环境

    虚拟环境的搭建 优点 1.使不同应用开发环境相互独立 2.环境升级不影响其他应用,也不会影响全局的python环境 3.防止出现包管理混乱及包版本冲突 windows 安装 # 建议使用pip3安装到 ...

  4. w3cshool -- 排列组合去重算法挑战

    function permAlone(str) { if(str.length == 1) return str; var a = str.substr(0, 1), one = [a], count ...

  5. 《java编程思想》多态与接口

    向上转型 定义:把某个对象的引用视为对其基类类型的引用的做法被称为向上转型方法调用绑定 将一个方法调用同一个方法主体关联起来被称作绑定. 前期绑定:程序执行前进行的绑定叫做前期绑定,前期绑定也是jav ...

  6. js拖拽效果的实现及原理

    元素拖拽分成3个步骤:按下鼠标,移动鼠标,松开鼠标. 拖拽原理:按下拖拽元素后开始监听文档中鼠标移动事件,然后再监听鼠标松开事件:鼠标移动时,元素div要随着鼠标一起移动,需要计算元素div位移的距离 ...

  7. WEB缓存系统之varnish状态引擎

    前文我们聊了下varnish的VCL配置以及语法特点,怎样去编译加载varnish的vcl配置,以及命令行管理工具varnishadm怎么去连接varnish管理接口进行管理varnish,回顾请参考 ...

  8. what the fuck!(二分查找 / 暴力模拟)

    what the fuck! Description 现在有一家公司有nnn个员工(nnn为奇数),他们的工资发放是基本工资+提成,现在这家公司计划再招一批人.要写一篇招聘启事,但是对于这个招聘启事中 ...

  9. tensorflow编程学习路线及笔记

    话不多说,直接上图! 关于人工智能算法学习思路,欢迎浏览我的另一篇随笔:如果你想开始学习算法,不妨先了解人工智能有哪些方向? 关于python编程学习路线及笔记,欢迎浏览我的另一篇随笔:python编 ...

  10. 多线程学习笔记(五)---- 在JDK文档的使用

    1.前言 我们经常在JDK文档中见到一些类上的介绍说,该类是"安全的"."不安全"."效率高"."效率低"的词眼.这里, ...