Docker容器的详解与配置

本章大纲:

  • 1.什么是Docker
  • 2.Docker的三大核心是什么
  • 3.Docker的概念及安装

一、揭开Docker的神秘面纱

1.Docker是什么
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。
Docker作为开源社区最火爆的项目,它是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”,docker的全部源代码都在https://github.com/docker 进行相关维护,其官网是:https://www.docker.com

docker之所以拥有众多优势,与操作系统虚拟化自身的特点是分不开的,传统虚拟机需要有额外的虚拟机管理程序和虚拟机操作系统层,而docker是直接在操作系统层面之上实现的虚拟化,二者的工作示意图如下:

2.为什么要用Docker

* Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题;——一致的运行环境
* 可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间
* 避免公用的服务器,资源会容易受到其他用户的影响。——隔离性
* 善于处理集中爆发的服务器使用压力;——弹性伸缩,快速扩展
* 可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。——迁移方便
* 使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署

3.Docker和虚拟机的区别
作为一种轻量级的虚拟化方式,Docker与传统虚拟机相比具有显著的优势。
Docker容器很快,启动和停止可以在秒级实现,比传统虚拟机要快很多,Docker核心解决的问题是利用容器来实现类似VM的功能,从而利用更节省的硬件资源提供给更多的计算资源,所以Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,从而在保证应用性能的同时,减小系统开销,使得在一台主机上同时运行数千Docker容器成为可能,Docker操作方便,还可以通过Dockerfile配置文件支持灵活的自动化创建和部署。
下表对使用Docker容器技术与传统虚拟化技术的特性进行了比较。

4.Docker的使用场景
现在开发者需要能更方便地运行在云平台上的应用,必须要脱离底层的硬件,同时还需要任何时间地点可获得这些资源,这正是Docker所能提供的。Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器,通过这种容器打包应用程序,意味着简化了重新部署,调试这些琐碎的重复工作,极大地提高了工作效率,列如,服务器从腾讯云迁移到阿里云,如果采用Docker容器技术,迁移只需要在新的服务器上启动需要的容器即可。

二、Docker的三大核心

1、镜像
docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为是一个面向docker容器引擎的只读模板,比如,一个镜像可以是一个完整的centos操作系统环境,称为一个centos镜像;可以是一个安装了MySQL的应用程序,称为一个MySQL镜像,等等。
docker提供了简单的机制来创建和更新现有的镜像,我们也可以从网上下载已经做好的应用镜像来直接使用。

2、容器
docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,可以保证安全性的平台,可以把容器看做一个简易版的Linux环境,docker利用容器来运行和隔离应用。

3、仓库
docker仓库是用来几种保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到共有仓库或者私有仓库,这样一来当下次要在另一台机器上使用这个镜像时,只需要从仓库上拉去取下来就可以了。

仓库注册服务器是存放仓库的地方,其中包含了多个仓库,每个仓库集中存放某一类镜像,并且使用不同的标签来区分他们。目前最大的公共仓库是docker hub,存放了数量庞大的镜像提供用户下载使用。

docker默认的存储目录在/var/lib/docker,docker的镜像、容器、日志等内容全部都存储在这里,可以单独使用大容量的分区来存储这些内容,并且一般选择建立LVM逻辑卷,从而避免docker运行过程中存储目录容量不足的问题。

三、安装Docker的基础操作

1、安装及启动
安装时,必须保证服务器配置可上网,或者自行配置本地yum源也可以,

[[email protected] ~]# yum -y install docker       #直接安装
[[email protected] ~]# systemctl start docker     #启动docker服务
[[email protected] ~]# systemctl enable docker     #设置为开机自启动
[[email protected] ~]# docker version      #查看安装的docker版本

2、docker的镜像操作
(1)查找镜像
docker运行容器前需要本地存在相应的镜像,如果不存在本地镜像,docker就会尝试从默认镜像仓库https://hub.docker.com/ 进行查找。

[[email protected] ~]# docker search dhcp     #以DHCP作为关键字进行搜索镜像
INDEX       NAME                                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/networkboot/dhcpd                    Suitable for running a DHCP server for you...   40                   [OK]
docker.io   docker.io/joebiellik/dhcpd                     DHCP server running on Alpine Linux             14                   [OK]
docker.io   docker.io/gns3/dhcp                            A DHCP container for GNS3 using dnsmasq         2                    [OK]
docker.io   docker.io/instantlinux/dhcpd-dns-pxe           Serve DNS, DHCP and TFTP from a small Alpi...   2                    [OK]
docker.io   docker.io/ictu/dhcpd-tftpd                     dhcpd tftpd container                           1                    [OK]
                         .................#省略部分内容

返回很多包含DHCP关键字的镜像,其中返回的信息包括镜像名称(NAME)、描述(DESCRIPTION)、星级(STARS)、是否官方创建(OFFICIAL)、是否主动创建(AUTOMATED)。默认的输出结果会按照星级评价进行排序,表示该镜像的受欢迎程度,在下载镜像时,可以参考这一项,星级越高表示越受欢迎;是否为官方镜像一项是指是否由官方项目组创建和维护的镜像,一般官方项目组维护的镜像使用单个单词作为镜像名称,我们称为基础镜像或者根镜像。如/reinblau/dhcp这种命名方式的镜像,表示是由docker hub的用户reinblau创建并维护的镜像,带有用户名为前缀;是否主动创建资源则是指是否允许用户验证镜像的来源和内容。
(2)下载镜像
搜索到符合需求的镜像,可以使用docker pull命令从网络下载镜像到本地使用。
命令格式:docker pull 仓库名称[:标签]
对于docker镜像来说,如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest,也可通过指定的标签来下载特定版本的某一镜像。这里标签就是用来区分镜像版本的。

如下,下载一个镜像

[[email protected] ~]# docker pull docker.io/networkboot/dhcpd           #下载查询出来的某个镜像
[[email protected] ~]# docker images      #查询下载的镜像
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
docker.io/networkboot/dhcpd   latest              52cbff801df2        5 months ago        105 MB
从回显的信息可以读出以下信息:
#REPOSITORY:镜像属于的仓库;
#TAG  :镜像的标签信息,标记同一个仓库中的不同镜像;
#IMAGE ID:镜像的唯一ID号,唯一标识了该镜像;
#CREATED:镜像创建的时间;
#SIZE:镜像的大小
用户还可以根据镜像的唯一标识ID号,获取镜像的详细信息。命令如下:
[[email protected] ~]# docker inspect 52cbff801df2      #获取镜像的详细信息
#镜像的详细信息中包括创建时间、系统版本、主机名、域名、用户、卷、标签、操作系统、设备ID等各种信息。
#为了在后续的工作使用这个镜像,可以用docker  tag命令来为本地镜像添加新的标签,
#命令格式:docker tag名称:[标签] 新名称:[新标签],具体操作如下:
[[email protected] ~]# docker tag docker.io/networkboot/dhcpd dchp:dhcp    #改新名称及标签
[[email protected] ~]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
dchp                          dhcp                52cbff801df2        5 months ago        105 MB
docker.io/networkboot/dhcpd   latest              52cbff801df2        5 months ago        105 MB

(3)删除镜像
会发现原来的镜像还在,那么删除原来的镜像试试吧!
使用docker rmi命令可以删除多余的镜像,可以指定标签进行删除,也可以指定ID删除镜像
删除镜像的命令格式:docker rmi 仓库名称:标签或docker rmi 镜像ID号,当一个镜像有多个标签的时候,指定标签只是删除该镜像多个标签中的指定标签,不会影响镜像文件,相当于只是删除了镜像的一个标签而已,但当该镜像只剩下一个标签的时候就要注意了,再使用删除命令就会彻底删除该镜像。

[[email protected] ~]# docker rmi docker.io/networkboot/dhcpd    #删除原本的镜像标签
Untagged: docker.io/networkboot/dhcpd:latest
Untagged: docker.io/networkboot/[email protected]:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b67

当使用docker rmi命令后面跟上镜像的ID号时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉所有指向该镜像的标签,然后删除该镜像文件本身,如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。

(4)导出镜像
当需要把一台机器上的镜像迁移到另一台机器上的时候,需要将镜像保存位本地文件,这一过程叫做导出镜像,可以使用docker save命令进行存出操作,之后就可以复制该文件到其他机器上。
命令格式:docker save -o 存出镜像为本地文件
如下:

[[email protected] ~]# docker images          #获取镜像名称及标签
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
dchp                dhcp                52cbff801df2        5 months ago        105 MB
[[email protected] ~]# docker save -o dhcptest dchp:dhcp      #导出为本地镜像
[[email protected] ~]# du -sh dhcptest              #会导出至本地当前工作目录
103M    dhcptest

(5)载入镜像
将导出的镜像从A机器复制到B机器,需要在B机器上使用该镜像,就可以将该导出文件导入到B机器中的镜像库中,这一过程叫做载入镜像。
命令格式为(从文件dhcp中载入镜像导本地镜像库中):

[[email protected] ~]# docker load --input dhcp
#或者
[[email protected] ~]# docker load < dhcp

(6)上传镜像
本地存储的镜像越来越多,就需要指定一个专门存放这些镜像的地方——仓库,比较简单的就是公共仓库,默认上传到dockerhub官方仓库,需要注册使用公共仓库的账号,可以使用docker login命令来输入用户名,密码和邮箱来完成注册和登录,在上传镜像之前还需要对本地镜像添加新的标签,然后再使用docker push命令进行上传。
命令格式:docker push 仓库名称:标签

[[email protected] ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don‘t have a Docker ID, head over to https://hub.docker.com to create one.
Username: ljztest      #输入注册的用户名
Password:          #输入密码
Login Succeeded                     #提示登录成功
[[email protected] ~]# docker push docker.io/ljztest/dhcp
#在这里登录上传时,报错,发现是因为镜像的仓库名称有问题,根据提示改了下仓库名称,就上传成功了
The push refers to a repository [docker.io/ljztest/dhcp]
8d3d1c857813: Pushed
37ee4253c76e: Pushed
b57c79f4a9f3: Pushed
d60e01b37e74: Pushed
e45cfbc98a50: Pushed
762d8e1a6054: Pushed
testdhcp: digest: sha256:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b670477 size: 1569

、docker的容器操作
容器是docker的另一个核心概念,简单来说,容器是镜像的一个运行实例,是独立运行的一个或一组应用及它们所必需的运行环境,包括文件系统、系统类库、shell环境等。镜像是只读模板,而容器会给这个只读模板一个额外的可写层。

(1)容器的创建与启动
docker的创建就是将镜像加载到容器的过程,docker的容器十分轻量级,用户可以随时创建或者删除。新创建的容器默认处于停止状态,不运行任何程序,需要在其中一个发起一个进程来启动容器,这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全停止。停止的容器可以重新启动并保留原来的修改。可以使用docker create 命令新建一个容器。

1)创建容器
命令如下(-i:表示让容器的输入保持打开,就是容器一直运行;-t:是让docker分配一个伪终端):

[[email protected] ~]# docker create -it dchp:dhcp /bin/bash     #创建一个容器,并指定伪终端
2304f92a815800305804987bcb2ee20aca5f4d651d577427c476554d54171f2d
#如果此刻创建容器命令报错“WARNING:IPv4 forwarding is disabled.Network will bot
#work.”,就使用vim编辑器打开/usr/lib/sysctl.d/00-system.conf文件,在其中添加
#net.ipv4.ip_forward=1,然后使用systemctl  start network命令重启网络服务即可
[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   8 minutes ago       Created                                 naughty_perlman
#输出的信息显示容器的ID号、加载的镜像、运行的程序、创建时间、目前所处的状态、端口映射、容器名称等。
#上面查出的状态一栏是create表示当前的容器是新创建的并处于停止状态。

2)启动和停止容器

[[email protected] ~]# docker ps -a                #先查出容器的ID号
CONTAINER ID        IMAGE               COMMAND                  CREATE
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   10 min
[[email protected] ~]# docker start 2304f92a8158              #启动时,需指定容器的ID号
2304f92a8158
[[email protected] ~]# docker ps -a         #再查询容器的状态,会发现状态栏变成了UP
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   23 minutes ago      Up 42 seconds                           naughty_perlman
[[email protected] ~]# docker stop 2304f92a8158        #停止这个容器
2304f92a8158
[[email protected] ~]# docker ps -a            #再次查看状态,会发现状态栏变成了exited
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   About an hour ago   Exited (0) 4 seconds ago                       naughty_perlman

3)进入容器

[[email protected] ~]# docker start 2304f92a8158              #再次启动这个容器
[[email protected] ~]# docker exec -it 2304f92a8158 /bin/bash     #进入这个容器
[email protected]:/# ls  #查看这个容器的根目录,可以看到进入容器后命令提示符发生了变化
bin   dev            etc   lib    media  opt   root  sbin  sys  usr
boot  entrypoint.sh  home  lib64  mnt    proc  run   srv   tmp  var
[email protected]:/# exit       #退出这个容器
exit
[[email protected] ~]# 

(2)容器的导出与导入

[[email protected] ~]# docker ps -a      #查询容器的ID号
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   About an hour ago   Up 6 minutes                            naughty_perlman
[[email protected] ~]# docker export 2304f92a8158>centos7dhcp  #导出到当前工作目录,并定义名字为centos7dhcp
[[email protected] ~]# ls      #查看导出的文件,下面标红的就是导出的文件
anaconda-ks.cfg  ‘centos7dhcp‘  dhcptest  initial-setup-ks.cfg
#将导出的文件复制到另一台服务器上,之后使用docker  import 命令导入,成为镜像
[[email protected] ~]# scp [email protected]:/root/centos7dhcp /tmp     #在另一台服务器进行复制
[email protected]‘s password:                 #输入对端的用户密码
centos7dhcp                         100%   84MB  95.2MB/s   00:00
[[email protected] ~]# cd /tmp
[[email protected] tmp]# ls     #确定复制过来了
centos7dhcp
 .............#省略部分内容
 [[email protected] tmp]# cat centos7dhcp | docker import - centos7:dhcp
 #导入文件centos7dhcp成为本地镜像
sha256:e016fa46360492daa9323a0d35bccec76610433f03ba9171fe6d9a5500f823ff
[[email protected] tmp]# docker images | grep centos7        #确定镜像导入成功
centos7                  dhcp                e016fa463604        14 minutes ago      84.7 MB

(3)容器的删除
可以使用docker rm命令将一个已经终止状态的容器进行删除。


[[email protected] ~]# docker ps -a         #还是需要查出容器的ID
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2304f92a8158        dchp:dhcp           "/entrypoint.sh /b..."   About an hour ago   Up 35 minutes                           naughty_perlman
[[email protected] ~]# docker stop 2304f92a8158       #删除容器前需要先停止容器
2304f92a8158
[[email protected] ~]# docker rm 2304f92a8158          #删除容器
2304f92a8158

如果删除一个正在运行的容器,可以添加-f选项强制删除,但是建议先将容器停止再进行删除。

———————— 本文至此结束,感谢阅读 ————————``

原文地址:https://blog.51cto.com/14223370/2453418

时间: 2024-08-30 07:00:03

Docker容器的详解与配置的相关文章

Docker基础命令详解——镜像及容器操作

Docker基础命令详解--镜像及容器操作 前言 ? 上篇文章介绍了有关Docker的基础与Linux下docker的安装,本文主要讲解安装docker后的基础使用方法以及命令的介绍,主要是docker镜像操作及容器操作命令. ? 当然,docker的相关命令非常多,可以使用docker help命令查看对应目录以及相关提示命令. Docker镜像操作命令 [[email protected] ~]# which docker /usr/bin/docker 1.镜像搜索:docker sear

docker run命令详解及示例(二)

docker run Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container 上接博文:docker run命令详解及示例(一) --link --link=[]        Add link to another container 用于连接两个容器. 启动容器1:web docker run --name web -d -p 22 -p 80 -itwebserver:v1

Docker Compose 配置文件详解

Docker Compose 配置文件详解 左蓝关注 72017.01.19 23:25:09字数 2,827阅读 144,706 先来看一份 docker-compose.yml 文件,不用管这是干嘛的,只是有个格式方便后文解说: version: '2' services: web: image: dockercloud/hello-world ports: - 8080 networks: - front-tier - back-tier redis: image: redis links

WEB容器监听器详解 ServletContextListener

WEB容器监听器ServletContextListener主要用来监听容器启动和 销毁的时候需要做一些操作,就可以使用这个监听器来做. ServletContextListener在Spring启动前启动. 我们实现一个简单的监听器,需要继承接口ServletContextListener: * 一个测试的监听器例子 * @author zhuli * @date 2014-7-26 */ public class TestContextLister implements ServletCon

STL之map容器的详解

一.关于map的介绍 map是STL的 一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键 字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据.这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.学习map我们一定要理解什么是一对一的数据映射?比如:一个班级中,每个学生的学号跟他的姓名

【转】Hadoop安全模式详解及配置

原文链接 http://www.iteblog.com/archives/977 在<Hadoop 1.x中fsimage和edits合并实现>文章中提到,Hadoop的NameNode在重启的时候,将会进入到安全模式.而在安全模式,HDFS只支持访问元数据的操作才会返回成功,其他的操作诸如创建.删除文件等操作都会导致失败. NameNode在重启的时候,DataNode需要向NameNode发送块的信息,NameNode只有获取到整个文件系统中有99.9%(可以配置的)的块满足最小副本才会自

详解CentOS配置和管理web服务-Apache

详解CentOS配置和管理web服务-Apache 家住海边喜欢浪:zhang789.blog.51cto.com 目录 1.web介绍 2.web历史和工作原理 3.http请求流程 4.关于Apache 5.Apache服务器软件安装使用 6.符号链接和虚拟目录 7.页面重定向 8.Apache日志文件 9.Apache安全配置 10.虚拟主机 10.1.基于IP 10.2.基于域名 10.3.基于端口 web服务器配置和管理 http协议简介 http协议,全称HyperText Tran

详解linux配置java环境变量

详解linux配置java环境变量 一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议,连继敲回车,当询问是否同意的时候,输入yes,回车.之后会在当前目录下生成一个jdk1.6.0_14目录,你可以将它复制到 任何一个目录下. 二. 需要配置的环境变量 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中

log4j.properties 详解与配置步骤(转)

找的文章,供参考使用 转自 log4j.properties 详解与配置步骤 一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失INFO 为一般要显示的信息,比如登录登出DEBUG 为程序的调试信息 2.配置日志信息输出目的地 log4j.appender.appenderName = fully.qualified.name.of.appender.