[Docker] Docker的概念原理与基本用法待完善
Posted 千千寰宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Docker] Docker的概念原理与基本用法待完善相关的知识,希望对你有一定的参考价值。
1 概述
1.1 简述
Docker
是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何支持 docker 的机器上运行。
容器是完全使用沙箱机制,相互之间不会有任何接口调用。
1.2 优缺点
1.2.1 优点
1)快
运行时的性能快,管理操作(启动,停止,开始,重启等等) 都是以秒或毫秒为单位的。
2)敏捷
像虚拟机一样敏捷,而且会更便宜,在 bare metal(裸机)上布署像点个按钮一样简单。
3)灵活
将应用和系统“容器化”,不添加额外的操作系统
4)轻量
在一台服务器上可以布署 100~1000 个 Containers 容器。
5)便宜
开源的,免费的,低成本的。
1.2.2 缺点
所有容器共用 linux kernel 资源,资源能否实现最大限度利用,所以在安全上也会存在漏洞。
1.3 版本
目前最近的2个版本
- docker-ce
docker-ce-18.06.3.ce-3.el7
- docker-ee
2 docker的基本用法
2.1 镜像相关操作
从 dockerhub 查找镜像
docker search 某个镜像的名称
- 查找对应DockerHub仓库中的镜像
--filter=stars=50
: 列出收藏数不小于指定值的镜像
docker search tomcat
...
docker search centos
解释说明:
NAME
: 镜像仓库源的名称DESCRIPTION
: 镜像的描述OFFICIAL
: 是否docker 官方发布stars
: 类似Github 里面的star,表示点赞、喜欢的意思。AUTOMATED: 自动构建。
补充
[root@guoweixin ~]# docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
根据提供的条件过滤器输出
--format string Pretty-print search using a Go template
⽤Go模板打印出漂亮的搜索结果
--limit int Max number of search results (default 25)
搜索结果的最⼤数量(默认值为25)
--no-trunc Don\'t truncate output
不要截断输出
下载镜像
docker pull [选项] [Docker Registey 地址[:端口号]/] 仓库名[:标签]
从 Docker 镜像仓库获取镜像
- Docker 镜像仓库地址: 地址的格式一般是
< 域名 /IP>[: 端口号 ]
。默认地址是Docker Hub
。- 仓库名:这里的仓库名是两段式名称, 即
< 用户名 >/< 软件名 >
。对于 Docker Hub ,如果不给出用户名,则默认为 library ,也就是官方镜像。
docker pull centos
又例如:我们需要一个tomcat的镜像来作为我们的web服务。通过 docker pull获取镜像
docker pull tomcat:版本号 //不写 :版本号 代表laster版本
查看本地镜像
要想列出已下载下来的镜像,可以使用 docker image ls 命令
列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间。其中,仓库名、标签在之前的基础概念已经介绍过了。
镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个标签。
因此,如果拥有相同的 ID,因为它们对应的是同一个镜像。
docker images
-a
:--all
,列出所有镜像-q
:--quiet
,只显示镜像的id--digests
: 显示镜像的摘要信息
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的 ID
CREATED 镜像创建时间
SIZE 镜像大小
同一个仓库源可以有多个 TAG,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG 定义不同的镜像;
如果你不定义镜像的标签版本,docker将默认使用 lastest 镜像!
将镜像做成离线压缩包
docker save -o centos.tar.gz centos
ls ./
解压离线镜像包
docker load -i centos.tar.gz
删除镜像
docker rmi -f centos:latest
K FAQ/问题集
Q1 配置docker镜像加速器?
- Step1 登陆阿里云镜像仓库
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
如果没有开通,可开通阿里云的镜像服务
编辑
/etc/docker/daemon.json
- Step2 重启docker
systemctl daemon-reload
systemctl restart docker
Q2 docker hub官网进不去?
问题分析
docker hub进不去是因为“hub.docker.com”是在国外的,所以访问速度很慢,导致无法访问该网址。
解决方法
- 1、找到“daemon.json”文件
- 2、使用vim命令将其打开
- 3、添加“ "registry-mirrors" :["https://docker.mirrors.ustc.edu.cn"]”内容
- 4、重启docker即可
参考文献
Y 推荐资源
Y.1 核心资源/核心链接
- Docker官网
- Docker github
- Dockerhub 镜像站官网
- Docker 官方 registry 镜像加速
Y.2 Docker Hub 镜像加速器列表
- Docker 官方镜像
镜像加速器 | 镜像加速器地址URL | 专属加速器 | 其他加速 |
---|---|---|---|
Docker 中国官方镜像站 | https://registry.docker-cn.com | ... | Docker Hub |
Dao Cloud 镜像站 | http://f136db2.m.daocloud.io/ | 可登录,系统分配 | Docker Hub |
Azure 中国镜像站 | https://dockerhub.azk8s.cn | Docker Hub / GCR / Quay | |
科大镜像站 | https://docker.mirrors.ustc.edu.cn | ... | Docker Hub / GCR / Quay |
阿里云 | https://docker.mirrors.ustc.edu.cn | 需登录,系统分配 | Docker Hub |
七牛云 | https://reg-mirror.qiniu.com | ... | Docker Hub / GCR / Quay |
网易云 | https://hub-mirror.c.163.com | ... | Docker Hub |
腾讯云 | https://mirror.ccs.tencentyun.com | ... | Docker Hub |
Y.3 其他
-
容器镜像服务/制品中心 - 阿里云
https://cr.console.aliyun.com/cn-hangzhou/instances/artifact
X 参考文献
待阅读

本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
Docker 概念及基本用法
Docker 概念及基本用法
一、 本节内容简介
本实验中我们初步接触Docker的概念和基本用法。需要依次完成下面几项任务:
- 理解Docker是什么
- 学习如何在Linux上安装Docker
- 学习如何使用Docker Hub
- 创建第一个Hello Shiyanlou的Docker应用
- Docker基本的容器和镜像管理
- 推荐阅读:深入浅入docker docker核心技术预览:http://www.infoq.com/cn/articles/docker-core-technology-preview
二、Docker概念
1、容器技术
Linux容器技术很早就有了,比较有名的是被集成到主流Linux内核中的LXC项目。容器通过对操作系统的资源访问进行限制,构建成独立的资源池,让应用运行在一个相对隔离的空间里,同时容器间也可以进行通信。
容器技术对比虚拟化技术,容器比虚拟化更轻量级,对资源的消耗小很多。容器操作也更快捷,启动和停止都要比虚拟机快。但Docker容器需要与主机共享操作系统内核,不能像虚拟机那样运行独立的内核。
Docker是一个基于LXC技术构建的容器引擎,基于GO语言开发,遵循Apache2.0协议开源。Docker的发展得益于为使用者提供了更好的容器操作接口。包括一系列的容器,镜像,网络等管理工具,可以让用户简单的创建和使用容器。
Docker支持将应用打包进一个可以移植的容器中,重新定义了应用开发,测试,部署上线的过程,核心理念就是 Build once, Run anywhere
。
Docker容器技术的典型应用场景是开发运维上提供持续集成和持续部署的服务。
下面我们开始介绍Docker中的几个基本概念。
2、镜像
Docker的镜像概念类似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
镜像可以基于Dockerfile构建,Dockerfile是一个描述文件,里面包含若干条命令,每条命令都会对基础文件系统创建新的层次结构。
用户可以通过编写Dockerfile创建新的镜像,也可以直接从类似github的Docker Hub上下载镜像使用。
3、容器
Docker容器是由Docker镜像创建的运行实例。Docker容器类似虚拟机,可以支持的操作包括启动,停止,删除等。每个容器间是相互隔离的,但隔离的效果比不上虚拟机。容器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。
在Docker容器中,每个容器之间的隔离使用Linux的 CGroups
和 Namespaces
技术实现的。其中 CGroups
对CPU,内存,磁盘等资源的访问限制,Namespaces
提供了环境的隔离。
4、仓库
如果你使用过 git
和 github
就很容易理解Docker的仓库概念。Docker仓库相当于一个 github
上的代码库。
Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Registry)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。Docker运行中使用的默认仓库是 Docker Hub 公共仓库。
仓库支持的操作类似 git
,创建了新的镜像后,我们可以 push
提交到仓库,也可以从指定仓库 pull
拉取镜像到本地。
三、安装
1、Ubuntu 上安装最新Docker
只需要执行下面的命令就可以安装:
$ sudo apt-get update
$ sudo apt-get install docker
ps:但是Ubuntu默认的源中版本是1.5
,太老了,目前实验楼环境中安装的是最新的 Docker 1.10
版本。
安装的时候添加的是Docker官方的apt-get
源,安装过程如下:
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates
$ sudo apt-key adv
--keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
添加文件/etc/apt/sources.list.d/docker.list
,然后向文件中写入下面的内容:
deb https://apt.dockerproject.org/repo ubuntu-trusty main
最后再次执行安装命令:
$ sudo apt-get update
$ sudo apt-get install docker-engine
更多安装选项可以参考:https://docs.docker.com/engine/installation/linux/ubuntulinux/
安装完成后,可以使用 docker version
查看Docker的版本信息
四、基本命令
1、查看Docker命令
$ docker
2、查看指定命令的帮助docker command --help
,例如启动命令docker run --help
:
五、Docker 服务
1、配置Docker服务启动选项,可以通过修改文件 /etc/default/docker
来实现,查看实验楼中已有的配置文件内容:
看到其中的启动参数为 DOCKER_OPTS
,表示 Docker 服务启动时会监听在 tcp://127.0.0.1:4243
。
如果你修改这个文件则需要重新启动 Docker 服务。
停止Docker服务:$ sudo service docker stop
启动Docker服务:$ sudo service docker start
查看 Docker 服务状态:$ sudo service docker status
六、例:
1、需求描述
Docker 安装后,我们开始尝试启动第一个 Docker 应用。这个应用很简单,作用就是输出一句 Hello, Shiyanlou!
。
2、需求分析
应用执行的命令是 echo "Hello, Shiyanlou"
,我们需要为这个影响构建一个运行的容器,让这条命令在容器中运行,运行后容器自动退出。
3、解决方案
首先,我们需要有一个镜像来运行这个应用,这里我们选择用 busybox
镜像,直接使用 docker run
命令来运行容器:
$ docker run busybox echo "Hello, Shiyanlou"
其中后面跟的 busybox 是镜像的名字, busybox 镜像不需要提前从仓库中下载到本地,因为 Docker会首先在本地查找,如果找不到就会自动从 Docker Hub 或系统配置的默认 Registry 中下载 busybox 镜像。
最后的 echo "Hello, Shiyanlou"
是在容器中运行的命令。docker run
命令会基于指定的镜像运行一个容器实例,然后把后续的命令传递给该容器内部运行。
该操作运行的结果会在屏幕上输出 Hello, Shiyanlou
。
运行过程见上图所示,第一个箭头指向的是运行的命令,第二个箭头表示在本地没有查找到 busybox:latest
的镜像,所以需要从远端的Docker Registry 中 pull,镜像下载下来后进入到执行应用阶段,最后一个箭头表示应用执行完毕输出了Hello, shiyanlou!
字符串到屏幕上。
执行 docker ps
命令查看运行的容器列表:
发现没有任何容器在运行,原因是容器运行了 echo 命令后已经终止,进入到停止状态,需要用 docker ps -a
命令查看。
在这个命令的输出中我们看到列表里有一个处于 Exited (0 3 minutes ago)
的容器,这个容器表示大约3分钟之前终止。列表中还包括该容器的ID,是用的镜像,执行的命令,创建的时间等信息。最后一个是为容器随机设置的名称,也可以通过run
的参数进行设置为指定名称,注意同一个服务器上的容器不可以同名。
七、容器管理
本节实验中我们创建几个容器,并介绍 docker 容器管理中最常用的几个命令。
1、docker run
最主要的是创建运行容器的命令 docker run
,这个命令的参数非常多,可以通过docker run --help
查看。
继续上一节实验,echo 命令运行后容器就退出了,如果我们需要一个保持运行的容器呢,最简单的方法就是给这个容器一个可以保持的应用,比如bash
,运行 ubuntu 容器并进入容器的 bash:
$ docker run -t -i ubuntu /bin/bash
上面命令的说明:
-t
:分配一个pseudo-TTY
-i
:--interactive
参数缩写,表示交互模式,如果没有attach
保持 STDIN 打开状态ubuntu
:运行的镜像名称,默认为latest
标签/bin/bash
:容器中运行的应用
新创建容器的bash中,在bash里执行的任何命令都不会影响到我们的宿主机,可以随意操作。你可以看到主机名和环境变量 HOSTNAME
都已经显示为容器的ID了。
在这个bash下,我们可以进行各种Ubuntu系统上的操作,当然因为Docker本身的限制,有些涉及到磁盘、网络、设备等Linux特权命令是无法执行的,可以试试reboot
命令,会提示你shutdown: Unable to shutdown system
。
如何退出这个bash呢?有两种方法,两种方法的效果完全不同:
- 直接
exit
,这时候 bash 程序终止,容器进入到停止状态 - 使用组合键退出,仍然保持容器运行,我们可以随时回来到这个bash中来,组合键是
Ctrl-p Ctrl-q
,你没有看错,是两组组合键,先同时按下Ctrl
和p,再按Ctrl
和q。就可以退出到我们的宿主机了。
上述第二种方法比较常用,此时使用 docker ps
查看,能看到容器仍然在运行中:
注意:有些浏览器把Ctrl-Q
作为退出标签的快捷键,可能在执行上述命令时实验楼的页面会关掉,不过没有关系,重新打开实验楼的网站登陆后点击头像旁边的继续实验
就能够再次回到实验桌面。
如果想再次回到刚才的bash中,只需要使用 docker attach
命令就可以再次连接到运行的bash里:
注意: 命令后面的参数是容器的ID,并不需要输入完整的数字,只要能唯一定位这个容器即可,通常输入4位就足够了。
本节只是针对Docker有一个基本的概念,docker run
的其他参数我们将在后续的实验课程中详细介绍。
2、docker ps
docker ps
命令用来查看正在运行的容器:
几个最常用的参数:
-a
:查看所有容器,含停止运行的-l
:查看刚启动的容器-q
:只显示容器ID
我们查看所有容器的ID列表:
docker start
docker start
启动容器,此处我们尝试启动先前的运行/bin/bash
的容器:
步骤说明:
docker ps -a
查看当前所有的容器,得到该容器的IDdocker start
启动该容器docker ps
再次查看运行的容器
最后我们可以通过 docker attach
连接到该bash上继续操作。
3、docker stop
docker stop
停止容器,此处我们停止刚才启动的/bin/bash
容器:
此处还有一些其他的类似命令,比如 docker restart
重启运行中的容器,相当于先stop
,再start
。
4、docker inspect 容器id
查看 Docker 容器或镜像的一些内部信息:
启动并查看 /bin/bash
容器:
返回的信息非常多,是JSON格式,每一项内容具体含义本节不做详细介绍,可以参考官方文档。
5、docker rm
删除容器操作。该命令默认不可以删除运行的容器,但提供了强制删除的参数-f
,下面的实验操作中我们尝试删除一个运行容器会报错,只可以把停止状态的Hello, shiyanlou!
容器删除:
6、docker top
查看容器中运行的进程信息,显示容器中进程的PID,UID,PPID,时间,tty等信息。
本节作为入门介绍,无法涵盖所有命令,后续单独的容器管理
实验中学习更多的操作命令。
八、镜像管理
这里介绍镜像获取和创建的最常见的方法。更多实验会在镜像管理
实验中学习。
1、查看镜像列表
docker images
命令我们可以列出当前系统上所有的镜像信息:
其中:
- REPOSITORY:仓库名称
- TAG:标签名,一个仓库可以有若干个标签对应不同的镜像,默认都是
latest
- IMAGE ID:镜像ID
- CREATED:创建时间,注意不是本地的pull时间
- SIZE:镜像大小
2、获取镜像
最简单的获取镜像的方式是从 Docker Hub上 pull
最新的镜像,比如我们想要一个 busybox
的镜像,直接使用命令:
$ docker pull busybox
由于我们已经在第一步骤Hello, shiyanlou!
中下载过这个镜像,则会显示如下信息:
查看镜像列表 docker images
,可以看到新pull的镜像已经在列表里了:
可以查看 Docker Hub 查看别人做好的镜像,这个网站上有很多制作很好的官方镜像,可以避免我们自己在制作镜像过程中重复造轮子。
3、创建镜像
最常用的是写一个Dockerfile,从Dockerfile里创建新的镜像。
Dockerfile的详细编写方法我们后续有专门的实验介绍,此处只写一个最简单的Dockerfile来介绍。
使用 vim 或 gedit 打开一个文件 Dockerfile
:
$ cd /home/shiyanlou/
$ mkdir shiyanlouimage
$ cd shiyanlouimage/
$ vim Dockerfile
在文件中输入以下内容:
from ubuntu:latest
ENV HOSTNAME=shiyanlou
保存退出编辑器。
这个 Dockerfile
中只有两行,第一行表示基于哪个镜像创建新的镜像,类似于程序开发中的 import
或 include
,我们这里以 ubuntu:latest
镜像为基础创建新的镜像。第二行是在新的镜像中我们要对基础镜像 ubuntu:latest
做的改变。这句是设置一个环境变量HOSTNAME
等于shiyanlou
。
完成 Dockerfile 后,使用 docker build
命令进行构建:
$ cd /home/shiyanlou/shiyanlouimage/
$ docker build -t shiyanlou .
这个命令中第一个参数 -t shiyanlou
指定创建的新镜像的名字,第二个参数是一个点 .
指定从当前目录查找 Dockerfile 文件。
命令执行过程截图:
执行完成后我们 docker images
命令中就可以看到新的 shiyanlou
镜像了。
我们现在运行这个 shiyanlou 镜像并进入到bash环境:
$ docker run -t -i shiyanlou /bin/bash
进入到bash后,我们查看镜像是否已经设置了HOSTNAME
环境变量:
$ echo $HOSTNAME
还记得如何退出bash并保持运行吗?那个组合键。
4、清理镜像
退出到宿主机后,请使用 docker rm
命令删除容器,并使用 docker rmi
删除镜像。
$ docker rmi shiyanlou
$ docker images
上述命令说明:
docker ps
查看运行的容器docker rm -f 6c86
强制删除运行的容器docker rmi shiyanlou
删除shiyanlou镜像docker images
查看镜像列表
九、总结
- 理解Docker是什么
- 学习如何在Linux上安装Docker
- 学习如何使用Docker Hub
- 创建第一个Hello Shiyanlou的Docker应用
- Docker基本的容器和镜像管理
请务必保证自己能够动手完成整个实验,只看文字很简单,真正操作的时候会遇到各种各样的问题,解决问题的过
以上是关于[Docker] Docker的概念原理与基本用法待完善的主要内容,如果未能解决你的问题,请参考以下文章