一、揭开 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 运行过程中存储目录容量不足的问题。