Docker学习第二天

时间:2020-12-23 20:53:27

CentOS 系列安装 Docker

Docker 支持 CentOS6 及以后的版本。

CentOS6

对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下

[root@MSJTVL-MJSP-A35 opt]# yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
Loaded plugins: fastestmirror, security
Setting up Install Process
epel-release-6-8.noarch.rpm                                                                                                                                                                                          |  14 kB     00:00     
Examining /var/tmp/yum-root-dp2p3m/epel-release-6-8.noarch.rpm: epel-release-6-8.noarch
/var/tmp/yum-root-dp2p3m/epel-release-6-8.noarch.rpm: does not update installed package.
Error: Nothing to do
[root@MSJTVL-MJSP-A35 opt]# yum install docker-io

 

CentOS7

CentOS7 系统 CentOS-Extras 库中已带 Docker,可以直接安装:

$ sudo yum install docker

安装之后启动 Docker 服务,并让它随系统启动自动加载。

[root@MSJTVL-MJSP-A35 opt]# service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:                                       [  OK  ]
[root@MSJTVL-MJSP-A35 opt]# chkconfig docker on

Docker 镜像

镜像是 Docker 的三大组件之一

Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。

下面介绍:

  • 从仓库获取镜像;
  • 管理本地主机上的镜像;
  • 介绍镜像实现的基本原理。

获取镜像

可以使用 docker pull 命令来从仓库获取所需要的镜像。

下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像。

[root@MSJTVL-MJSP-A35 docker]# docker pull ubuntu:12.04
12.04: Pulling from ubuntu
191c4e1e4400: Pull complete 
fd04a9dc157f: Pull complete 
be08d59fa177: Pull complete 
ecf8c2069900: Pull complete 
8ea067ad7a27: Pull complete 
8ea067ad7a27: Pulling fs layer 
Digest: sha256:57a83f4b4f43f2d008c8ceaa9663a6f7ecd061fefa80da8f32e0f22c7b923390
Status: Downloaded newer image for ubuntu:12.04

下载过程中,会输出获取镜像的每一层信息。

该命令实际上相当于 $ sudo docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务器registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。

为了方便在后续工作中使用这个镜像,还可以使用docker tag 命令为本地镜像添加新的标签,例如:

[root@MSJTVL-MJSP-A35 docker]# docker tag ubuntu:12.04 unbutn:02.09
[root@MSJTVL-MJSP-A35 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              12.04               8ea067ad7a27        7 weeks ago         103.6 MB
unbutn              02.09               8ea067ad7a27        7 weeks ago         103.6 MB

 

列出本地镜像

使用 docker images 显示本地已有的镜像。

[root@MSJTVL-MJSP-A35 docker]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 12.04 8ea067ad7a27 7 weeks ago 103.6 MB unbutn 02.09 8ea067ad7a27 7 weeks ago 103.6 MB

在列出信息中,可以看到几个字段信息

  • 来自于哪个仓库,比如 ubuntu
  • 镜像的标记,比如 12.04
  • 它的 ID 号(唯一)
  • 创建时间
  • 镜像大小

其中镜像的 ID 唯一标识了镜像,注意到 ubuntu:12.04 和 ubuntu:02.09 具有相同的镜像 ID,说明它们实际上是同一镜像。

TAG 信息用来标记来自同一个仓库的不同镜像。例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本,例如 10.0412.0412.1013.0414.04 等。例如下面的命令指定使用镜像 ubuntu:12.04 来启动一个容器。

[root@MSJTVL-MJSP-A35 docker]# docker run -t -i ubuntu:12.04 /bin/bash
root@d67d32057f1c:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
root@d67d32057f1c:/# pwd
/
root@d67d32057f1c:/# id
uid=0(root) gid=0(root) groups=0(root)
root@d67d32057f1c:/# ip a
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:01 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global eth0
    inet6 fe80::42:acff:fe11:1/64 scope link 
       valid_lft forever preferred_lft forever
6: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
root@d67d32057f1c:/# exit

如果不指定具体的标记,则默认使用latest标记信息。

创建镜像

创建镜像的方法有三种:基于已有镜像的容器创建,基于本地模板导入,基于Dockerfile创建

接下来重点介绍前两种,最后一种基于Dockerfile创建的方法将在后续的专门详细介绍

基于已有镜像的容器创建

该方法主要使用docker commit命令,其命令格式为docker commit[OPTIONS]CONTAINER[REPOSUTORY[:TAG]] 主要选项包括:

·-a,--author="作者信息"

·-m,--message="提交信息"

·-p,--pause=true提交时暂停容器运行

下面演示如何使用命令创建新的镜像。

首先启动一个镜像,并在其中进行修改操作,例如创建一个test文件,之后退出:

[root@MSJTVL-MJSP-A35 docker]# docker run -t -i ubuntu:12.04 /bin/bash
root@5b098fe766ca:/# touch test
root@5b098fe766ca:/# exit
exit
[root@MSJTVL-MJSP-A35 docker]#

注:记住容器的ID:5b098fe766ca。

此时该容器跟原Ubuntu:12.04镜像相比,已经发生了改变,可以使用docker commit命令来提交一个新的镜像。提交时可以使用ID或者名称来指定容器

[root@MSJTVL-MJSP-A35 docker]# docker commit -m "Added a new file" -a "Docker Tian" 5b098fe766ca test
1a67c55ea39412ca5f64b9b56050683dd5d269ef0c6c037412d1a20b033d6c3d
[root@MSJTVL-MJSP-A35 docker]# 

此时查看本地镜像列表,即可看到先创建的镜像:

[root@MSJTVL-MJSP-A35 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
test                latest              1a67c55ea394        About a minute ago   103.6 MB
ubuntu              12.04               8ea067ad7a27        7 weeks ago          103.6 MB
unbutn              02.09               8ea067ad7a27        7 weeks ago          103.6 MB

 基于本地模板导入

也可以直接从一个操作系统模板文件导入一个镜像。在这里,推荐使用Open VZ提供的模板创建。在OPENVZ模板的下载地址为:https://openvz.org/Download/template/precreated

比如,笔者现在一个下载一个centos的模板压缩包后,可以使用以下的命令导入,并且查看新导入的镜像,已经在本地存在了:

 

[root@MSJTVL-MJSP-A35 docker]# cat centos-6-x86-minimal.tar.gz |docker import - centos:14.04
2197ed1032f71381bf4746f2423aea5b22f9dacd7407c1794ea36d0b6a70a84e
[root@MSJTVL-MJSP-A35 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              14.04               2197ed1032f7        6 minutes ago       512.1 MB
test                latest              1a67c55ea394        2 hours ago         103.6 MB
ubuntu              12.04               8ea067ad7a27        7 weeks ago         103.6 MB
unbutn              02.09               8ea067ad7a27        7 weeks ago         103.6 MB

 

 存出和载入镜像

可以使用docker save 和docker load命令来存出和载入镜像。

存出镜像

如果要存出镜像到本地文件,可以使用docker save命令。例如ubuntu:12.04镜像为文件ubuntu_12.04.tar

[root@MSJTVL-MJSP-A35 docker]# docker save -o ubuntu_12.04.tar ubuntu:12.04
[root@MSJTVL-MJSP-A35 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              14.04               2197ed1032f7        41 minutes ago      512.1 MB
test                latest              1a67c55ea394        2 hours ago         103.6 MB
ubuntu              12.04               8ea067ad7a27        7 weeks ago         103.6 MB
unbutn              02.09               8ea067ad7a27        7 weeks ago         103.6 MB
<none>              <none>              511136ea3c5a        3 years ago         0 B
[root@MSJTVL-MJSP-A35 docker]# ll
total 312636
-rw-r--r-- 1 root root 210291971 Feb  9 13:40 centos-6-x86-minimal.tar.gz
-rw-r--r-- 1 root root 109515264 Feb  9 14:00 ubuntu_12.04.tar
[root@MSJTVL-MJSP-A35 docker]# 

导入镜像

可以使用docker load从存出的本地文件中再导入到本地镜像库,例如从文件ubuntu_12.04.tar到入镜像到本地镜像列表,如下所示:

[root@MSJTVL-MJSP-A35 docker]# docker load --input ubuntu_12.04.tar