Docker详解与安装
更新:HHH   时间:2023-1-7


一、揭开 Docker 的神秘面纱
Docker 是在Linux容器中运行的应用的开源工具,是一种轻量级的“虚拟机”诞生于2013年,短短几年时间,已经成为了开源社区最火爆的项目。
.
那么为什么Docker会这么火呢?看看下图就知道了:

作为一种轻量级的虚拟机方式,Docker 与传统虚拟机相比具有显著的优势。
Docker 之所以拥有众多优势,与操作系统虚拟化自身的特点是分不开的。传统虚拟机需要额外的虚拟机管理程序和虚拟机操作系统层,而Docker容器是直接在操作系统层面上实现的虚拟化。

Docker 的使用场景
现在开发者需要能方便地创建运行在云平台上的应用,必须要脱离底层硬件,同时还需要任何时间地点可获取这些资源,这正是Docker所能提供的。Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。通过这中容器打包应用程序,意味着简化了重新部署、调试这些琐碎的重复工作,极大的提高了工作效率。例如,服务器从腾讯云迁移到阿里云,如果采用Docker容器技术,迁移只需要在新的服务器上启动需要的容器即可。
二、Docker 的核心概念
1.镜像
Docker的镜像(mage) 是创建容器的基础,类似虚拟机的快照.可以理解为是一个 面向Docker 容器引擎的只读模板。比如,一个镜像可以是一个完整的 CentOS操作系统环境,称为一个CentOS 镜像;可以是一个安装了MySQL的应用程序.称为一个MySOL镜像.等等
Doacker提供了简单的机制来创建和更新现有的镜像.用户也可以从网上下载已经做好的应用镜像来直接使用。
2.容器
Docker的容器(Conainer! 是从镜像创建的运行实例,它可以被启动.停止和删除。所创建的每个容器都是相互隔离.互不可见,可以保证安全性的平台。可以把容器看作一个简易版的Linux环境,Docker 利用容器来运行和隔离应用。
3.仓库
Docker仓库(Repository) 是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push 命令将它上传到公有仓库(Pbli) 或者私有仓库(Private), 这样一来当下次要 在另外一台机器上使用这个镜像时,只需要从仓库上拉取下来就可以了。
仓库注册服务器(Registry) 是存放仓库的地方,其中包含了多个仓库,每个仓库集中存放某一类镜像,并且使用不同的标签(Tag) 来区分它们,目前最大的公共仓库是Docker Hb,存放了数量庞大的镜像供用户下载使用。
三、安装Docker
Centos 系统下安装 Docker 可以有两种方式:一种是使用 curl 获得 Docker 的安装脚本进行安装。另一种是使用 YUM 仓库来安装Docker。
注意:目前Docker只能支持64位操作系统
注意:目前Docker只能支持64位操作系统
注意:目前Docker只能支持64位操作系统
这里我使用的是Docker自己的YUM源进行安装
开始安装:

[root@test /]# yum -y install docker             # 安装docker
[root@test /]# systemctl start docker              # 启动服务
[root@test /]# systemctl enable docker           # 设为开机自启动
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

安装好的Docker有两个程序:Docker服务端和Docker客户端。其中Docker服务进程,管理着所有的容器。Docker 客户端则扮演着Docker服务端的远程控制器,可以用来控制 Docker 的服务端进程。大部分的情况下,Docker服务端和客户端运行在一台机器上。

[root@test /]# docker version 
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-75.git8633870.el7.centos.x86_64
 Go version:      go1.9.4
 Git commit:      8633870/1.13.1
 Built:           Fri Sep 28 19:45:08 2018
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-75.git8633870.el7.centos.x86_64
 Go version:      go1.9.4
 Git commit:      8633870/1.13.1
 Built:           Fri Sep 28 19:45:08 2018
 OS/Arch:         linux/amd64
 Experimental:    false

Docker 镜像操作
Docker 运行容器前需要本地存在对应的镜像,如果不存在本地镜像,Docker 就会尝试从默认镜像仓库 https://hub.docker.com 处下载,这是一个由 Docker 官方维护的一个公共仓库。
1、搜索镜像:

[root@test /]# docker search dhcp        # 命令格式 docker search 关键字
INDEX       NAME                                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/networkboot/dhcpd                    Suitable for running a DHCP server for you...   43                   [OK]
docker.io   docker.io/joebiellik/dhcpd                     DHCP server running on Alpine Linux             15                   [OK]
docker.io   docker.io/gns3/dhcp                            A DHCP container for GNS3 using dnsmasq         3                    [OK]
...............      // 省略部分内容

2、获取镜像:
搜索到符合的镜像,可以使用docker pull 进行下载到本地

[root@test /]# docker pull docker.io/networkboot/dhcpd
Using default tag: latest
Trying to pull repository docker.io/networkboot/dhcpd ... 
latest: Pulling from docker.io/networkboot/dhcpd
898c46f3b1a1: Downloading 5.602 MB/32.47 MB
63366dfa0a50: Download complete 
041d4cd74a92: Download complete 
6e1bee0f8701: Download complete 
114483241095: Downloading 3.693 MB/6.702 MB
ef446bdcb1f0: Waiting 

3、查看镜像信息:

[root@test /]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
docker.io/networkboot/dhcpd   latest              52cbff801df2        8 months ago        105 MB
从回显的信息中可以读出:
REPOSITORY:镜像属于的仓库
TAG:镜像的标签信息,标记同一个仓库的不同镜像
IMAGE ID :镜像的唯一ID号,唯一标识了该镜像
CREATED:镜像创建时间
VIRTUAL SIZE:镜像大小

用户可根据镜像的唯一标识ID号,获取镜像的详细信息:

[root@test /]# docker inspect 52cbff801df2
[
    {
        "Id": "sha256:52cbff801df2c6e2da3866d9f9476f20f190f64a0e886fbdfa79d843befa666a",
        "RepoTags": [
            "docker.io/networkboot/dhcpd:latest"
        ],
...............................  // 省略部分内容

镜像的详细信息包含了创建时间、系统版本、主机名、域名、用户、卷、标签、操作系统、设备ID等各种信息。
为了方便使用,可为本地的镜像添加新标签:

[root@test /]# docker tag docker.io/networkboot/dhcpd  dhcp:dhcp
[root@test /]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
dhcp                          dhcp                52cbff801df2        8 months ago        105 MB
docker.io/networkboot/dhcpd   latest              52cbff801df2        8 months ago        105 MB

4、删除镜像:

命令格式:
docker  rmi  仓库名称:标签
或者
docker rmi   镜像ID号

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

[root@test /]# docker save -o /tmp/dhcp docker.io/networkboot/dhcpd
[root@test /]# ll -d /tmp/dhcp 
-rw------- 1 root root 107891712 Nov 25 17:56 /tmp/dhcp

载入

[root@test tmp]# docker load --input dhcp
[root@test tmp]# docker load < dhcp

6、上传镜像:
本地存出的镜像越来越多,就需要指定一个专门存放这些镜像的地方——仓库,目前比较方便的就是公共仓库,默认上传到 DockerHub 官方仓库,需要注册使用公共仓库的账号,可以使用docker login 命令来输入用户名、密码和邮箱来注册和登陆。在上传镜像之前还需要对本地镜像添加新的标签,然后再使用docker push来进行上传。
例如: 在公共仓库上已经注册了一个账号,本例账号为test,镜像标签为docker/dhcp:centos7.3
(1)首先使用账号登录官方仓库:

[root@test /]# 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: test                       # 输入账号
Password:                               # 输入密码
Login  Succeeded

(2)成功登陆后就可以上传镜像:

[root@test /]# docker push docker/dhcp:centos7.3

Docker 容器操作
容器是Docker的另一个核心概念,简单来说,容器就是镜像的一个运行实例,是独立运行的一个或一组应用及它们所必须的运行环境,包括文件系统、系统类库、shell环境等。镜像是只读模板,而容器会给这个只读模板一个额外的可写层。
1、容器的创建与启动:
Docker 的创建就是镜像加载到容器的过程,Docker 的容器十分轻量级,用户可以随时创建或删除。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器,这个进程就是该容器的唯一进程,所以当该进程结束的时候,容器也会完全停止。停止的容器可以重新启动并保留原来的修改。

[root@test /]# docker create -it docker.io/networkboot/dhcpd /bin/bash           # 创建容器
08ab448cd0be320b24d6878b377bfa6957127c7ffb4c7e050e64340deeee1562
# -i 表示让容器的输入保持打开;-t 表示让Docker分配一个伪终端

如果此处创建容器命令报错“WARNING: IPv4 forwarding is disabled.Networking will notwork." ,就使用vi编辑器打开/usr/lib/sysctl.d/00-system.conf文件,在其中添加net.ipv4.ip_ forward=1, 然后使用service network start命令重启网络服务。

使用docker create 命令创建新容器后会返回一个唯一的ID。

[root@test /]# docker ps -a                 # 查看所有容器的运行状态        -a 可以列出系统最近一次启动的容器
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS               NAMES
08ab448cd0be        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   5 minutes ago       Created                                 keen_payne
命令格式: docker   start   容器的ID/名称
[root@test /]# docker start 08ab448cd0be                # 可跟容器的ID与名称
08ab448cd0be
[root@test /]# docker ps -a | grep 08ab448cd0be 
08ab448cd0be        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   8 minutes ago       Up About a minute                       keen_payne
# 容器启动后,可以看到容器状态一栏已经变成了 UP ,表示容器已经处于启动状态

2、容器的运行与停止:

[root@test /]# docker stop 08ab448cd0be
08ab448cd0be
[root@test /]# docker ps -a 
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                     PORTS               NAMES
08ab448cd0be        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   10 minutes ago      Exited (0) 5 seconds ago                       keen_payne
# 查看容器的运行状态,可以看出容器处于Exited,中止状态。

3、容器的进入:

[root@test /]# docker exec -it 08ab448cd0be /bin/bash
#  -i 表示让容器的输入保持打开;-t 表示让Docker分配一个伪终端
root@08ab448cd0be:/# ls                  # 已经进入到了容器中
bin  boot  dev  entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@08ab448cd0be:/# exit
exit
[root@test /]# 

4、容器的导出与导入:
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,首先需要将已经创建好的容器导出为文件,可以使用 docker export 命令实现,无论这个容器是处于运行还是停止均可导出。导出之后可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

命令格式:docker export  容器ID/名称>文件名
[root@test /]# docker export  08ab448cd0be>centos7dhcp
[root@test /]# ll -d centos7dhcp 
-rw-r--r-- 1 root root 87825920 Nov 25 19:58 centos7dhcp

导出的文件从A机器复制到B机器,之后使用docker import 命令导入,成为镜像 。

命令格式:cat    文件名 | docker  import   - 生成的镜像名称:标签
[root@test /]# cat centos7dhcp | docker import - centos7:dhcp
sha256:e7193f77c973a89dd2d1046f09eb4328798f4ee9dff92ad13514fb7268bc3c27
[root@test /]# docker images | grep centos7
centos7                       dhcp                e7193f77c973        17 seconds ago      84.7 MB

5、容器的删除:

命令格式:docker  rm   容器ID/名称
[root@test /]# docker stop 08ab448cd0be
08ab448cd0be
[root@test /]# docker rm 08ab448cd0be
08ab448cd0be
[root@test /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
# 如果删除一个正在运行的容器,可以添加 -f 选项强制删除,但是建议先将容器停止再做删除操作

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

返回云计算教程...