目前常用的Linux发行版主要包括Debian/Ubuntu系列和CentOS/Fedora系统。前者以自带软件包版本较新而出名,后者则宣称运行更稳定一些。选择哪个操作系统取决于读者的具体需求。同时,社区学推出了完全基于Docker的Linux发行版CentOS。

使用Docker,只需要一个命令就能快速获取一个Linux发行版镜像,这是以往包括各种虚拟化技术都难以实现的。这些镜像一般都很精简,但是可以支持完整Linux系统的大部分功能。

本章将介绍如何使用Docker安装和使用BusyBox、Alphine、Debin/Ubuntu、CentOS/Fedora等操作系统。

9.1 BusyBox

BusyBox是一个集成了一百多个最常用Linux命令和工具的精简工具箱,它只有几MB的大小,很方便进行各种快速验证。

在Docker Hub中搜索busybox相关的镜像:

[root@localhost ~]# docker search busybox
NAME                        DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
busybox                     Busybox base image.                             1251                [OK]                
progrium/busybox                                                            66                                      [OK]
hypriot/rpi-busybox-httpd   Raspberry Pi compatible Docker Image with a …   40                                      
radial/busyboxplus          Full-chain, Internet enabled, busybox made f…   19                                      [OK]
hypriot/armhf-busybox       Busybox base image for ARM.                     9                                       
arm32v7/busybox             Busybox base image.                             5                                       
armhf/busybox               Busybox base image.                             4                                       
i386/busybox                Busybox base image.                             2                                       
p7ppc64/busybox             Busybox base image for ppc64.                   2                                       
prom/busybox                Prometheus Busybox Docker base images           2                                       [OK]
aarch64/busybox             Busybox base image.                             2                                       
yauritux/busybox-curl       Busybox with CURL                               2                                       
sequenceiq/busybox                                                          2                                       [OK]
s390x/busybox               Busybox base image.                             2                                       
armel/busybox               Busybox base image.                             2                                       
onsi/grace-busybox                                                          2                                       
ppc64le/busybox             Busybox base image.                             1                                       
arm64v8/busybox             Busybox base image.                             1                                       
spotify/busybox             Spotify fork of https://hub.docker.com/_/bus…   1                                       
odise/busybox-curl                                                          1                                       [OK]
concourse/busyboxplus                                                       0                                       
ggtools/busybox-ubuntu      Busybox ubuntu version with extra goodies       0                                       [OK]
cfgarden/garden-busybox                                                     0                                       
trollin/busybox                                                             0                                       
amd64/busybox               Busybox base image.                             0

用户可以使用docker pull指令下载镜像busybox:latest

[root@localhost ~]# dockekr pull busybox:latlst

下载后,可以看到busybox镜像只有1.15M

[root@localhost ~]# docker images
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE                                     7                   e934aafc2206        4 weeks ago         199MB
busybox                                      latest              8ac48589692a        5 weeks ago         1.15MB

启动一人busybox容器,并在容器内查看挂载信息,如下所示:

[root@localhost ~]# docker run -it busybox
/ # mount
rootfs on / type rootfs (rw)
/dev/mapper/docker-253:0-68001902-e3fbd5b445be3be17b7696e714f4b5619c86aefd2960655c6f7eae2898558734 on / type xfs (rw,seclabel,relatime,nouuid,attr2,inode64,logbsize=64k,sunit=128,swidth=128,noquota)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev type tmpfs (rw,seclabel,nosuid,size=65536k,mode=755)
devpts on /dev/pts type devpts (rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
sysfs on /sys type sysfs (ro,seclabel,nosuid,nodev,noexec,relatime)
tmpfs on /sys/fs/cgroup type tmpfs (ro,seclabel,nosuid,nodev,noexec,relatime,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (ro,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/net_cls type cgroup (ro,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/perf_event type cgroup (ro,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (ro,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/devices type cgroup (ro,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (ro,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/blkio type cgroup (ro,nosuid,nodev,noexec,relatime,blkio)
mqueue on /dev/mqueue type mqueue (rw,seclabel,nosuid,nodev,noexec,relatime)
/dev/mapper/centos-root on /etc/resolv.conf type xfs (rw,seclabel,relatime,attr2,inode64,noquota)
/dev/mapper/centos-root on /etc/hostname type xfs (rw,seclabel,relatime,attr2,inode64,noquota)
/dev/mapper/centos-root on /etc/hosts type xfs (rw,seclabel,relatime,attr2,inode64,noquota)
shm on /dev/shm type tmpfs (rw,seclabel,nosuid,nodev,noexec,relatime,size=65536k)
devpts on /dev/console type devpts (rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
proc on /proc/bus type proc (ro,relatime)
proc on /proc/fs type proc (ro,relatime)
proc on /proc/irq type proc (ro,relatime)
proc on /proc/sys type proc (ro,relatime)
proc on /proc/sysrq-trigger type proc (ro,relatime)
tmpfs on /proc/kcore type tmpfs (rw,seclabel,nosuid,size=65536k,mode=755)
tmpfs on /proc/keys type tmpfs (rw,seclabel,nosuid,size=65536k,mode=755)
tmpfs on /proc/timer_list type tmpfs (rw,seclabel,nosuid,size=65536k,mode=755)
tmpfs on /proc/timer_stats type tmpfs (rw,seclabel,nosuid,size=65536k,mode=755)
tmpfs on /proc/sched_debug type tmpfs (rw,seclabel,nosuid,size=65536k,mode=755)
tmpfs on /proc/scsi type tmpfs (ro,seclabel,relatime)
tmpfs on /sys/firmware type tmpfs (ro,seclabel,relatime)
/ #

busybox镜像虽然小巧,但包括了大量常见的Linux命令,读者可以用它快速熟悉Linux命令。

9.2 Alpine

包管理工具:

https://pkgs.alpinelinux.org/packages 查询包信息。

通过apk命令直接查询安装各种软件。

1.使用官方镜像

[root@localhost ~]# docker run alpine echo '123'
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
ff3a5c916c92: Pull complete 
Digest: sha256:7df6db5aa61ae9480f52f0b3a06a140ab98d427f86d8d5de0bedab9b8df6b1c0
Status: Downloaded newer image for alpine:latest
123

用了7s

[root@localhost ~]# time docker run alpine echo '123'  
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
ff3a5c916c92: Pull complete 
Digest: sha256:7df6db5aa61ae9480f52f0b3a06a140ab98d427f86d8d5de0bedab9b8df6b1c0
Status: Downloaded newer image for alpine:latest
123

real    0m7.072s
user    0m0.139s
sys     0m0.038s

9.3 Debian/Ubuntu

1.Debian系统简介和使用

搜索debian镜像

[root@localhost ~]# docker search debian
NAME                                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                              Ubuntu is a Debian-based Linux operating sys…   7657                [OK]                
debian                              Debian is a Linux distribution that's compos…   2567                [OK]                
google/debian                                                                       52                                      [OK]
neurodebian                         NeuroDebian provides neuroscience research s…   50                  [OK]                
arm32v7/debian                      Debian is a Linux distribution that's compos…   35                                      
armhf/debian                        Debian is a Linux distribution that's compos…   31                                      
itscaro/debian-ssh                  debian:jessie                                   23                                      [OK]
resin/armv7hf-debian                Debian is a Linux distro composed entirely o…   18                                      
samueldebruyn/debian-git            a minimal docker container with debian and g…   16                                      [OK]
eboraas/debian                      Debian base images, for all currently-availa…   8                                       [OK]
i386/debian                         Debian is a Linux distribution that's compos…   7                                       
rockyluke/debian                    Docker images of Debian.                        5                                       
smartentry/debian                   debian with smartentry                          4                                       [OK]
vergissberlin/debian-development    Docker debian image to use for development, …   4                                       [OK]
vicamo/debian                       Debian docker images for all versions/archit…   3                                       
ppc64le/debian                      Debian is a Linux distribution that's compos…   2                                       
s390x/debian                        Debian is a Linux distribution that's compos…   2                                       
vpgrp/debian                        Docker images of Debian.                        1                                       
holgerimbery/debian                 debian multiarch docker base image              1                                       
dockershelf/debian                  Repository for docker images of Debian. Test…   1                                       [OK]
jdub/debian-sources-resource        Concourse CI resource to check for updated D…   0                                       [OK]
trollin/debian                                                                      0                                       
igneoussystems/base-debian-client   Base image for debian clients                   0                                       
casept/debian-amd64                 A debian image built from scratch. Mostly fo…   0                                       
fleshgrinder/debian                 Debian base images for production and multis…   0                                       [OK]
[root@localhost ~]#

面向科研领域neurodebin镜像


[root@localhost ~]# docker run -it debian bash  
Unable to find image 'debian:latest' locally
latest: Pulling from library/debian
cc1a78bfd46b: Pull complete 
Digest: sha256:de3eac83cd481c04c5d6c7344cd7327625a1d8b2540e82a8231b5675cef0ae5f
Status: Downloaded newer image for debian:latest
root@f4d68aee7222:/#

debian镜像很适合作为基础镜像,用于构建自定义镜像。


2.ubuntu系统简介和使用

ubuntu相关镜像有很多,在docker hub 上使用-s 10 参数进行搜索,只搜索那些收藏10次以上的镜像:

[root@localhost ~]# docker search -s 10 ubuntu
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                 Ubuntu is a Debian-based Linux operating sys…   7657                [OK]                
dorowu/ubuntu-desktop-lxde-vnc                         Ubuntu with openssh-server and NoVNC            180                                     [OK]
rastasheep/ubuntu-sshd                                 Dockerized SSH service, built on top of offi…   146                                     [OK]
ansible/ubuntu14.04-ansible                            Ubuntu 14.04 LTS with ansible                   91                                      [OK]
ubuntu-upstart                                         Upstart is an event-based replacement for th…   86                  [OK]                
neurodebian                                            NeuroDebian provides neuroscience research s…   50                  [OK]                
ubuntu-debootstrap                                     debootstrap --variant=minbase --components=m…   38                  [OK]                
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          34                                      [OK]
nuagebec/ubuntu                                        Simple always updated Ubuntu docker images w…   23                                      [OK]
tutum/ubuntu                                           Simple Ubuntu docker images with SSH access     18                                      
i386/ubuntu                                            Ubuntu is a Debian-based Linux operating sys…   13                                      
ppc64le/ubuntu                                         Ubuntu is a Debian-based Linux operating sys…   12

下面以Ubuntu 14.04为例,演示如何使用该容器安装一些常用软件。

    首先使用-ti参数启动容器,登录bash,查看ubuntu的发行版本号:

[root@localhost ~]# docker run -ti ubuntu:14.04 /bin/bash
root@b412a5b98153:/# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.5 LTS
Release:        14.04
Codename:       trusty
root@b412a5b98153:/#

当月试图直接使用apt-get安装一个软件的时候,会提示E: Unable to locate package curl

root@b412a5b98153:/# apt-get install curl
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package curl

怕并非系统不支持apt-get命令。Docker镜像在制作时为了精简清除了apt仓库信息,因此需要执行apt-get update命令来更新仓库信息。更新信息后,即可成功通过apt-get命令安装软件:

root@b412a5b98153:/# apt-get update
Get:1 http://security.ubuntu.com trusty-security InRelease [65.9 kB]           
Ign http://archive.ubuntu.com trusty InRelease             
Get:2 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]
Get:3 http://security.ubuntu.com trusty-security/universe Sources [88.0 kB]    
Get:4 http://archive.ubuntu.com trusty-backports InRelease [65.9 kB]           
Get:5 http://archive.ubuntu.com trusty Release.gpg [933 B]                     
Get:6 http://security.ubuntu.com trusty-security/main amd64 Packages [913 kB]  
Get:7 http://archive.ubuntu.com trusty-updates/universe Sources [252 kB]       
Get:8 http://archive.ubuntu.com trusty-updates/main amd64 Packages [1339 kB]   
Get:9 http://security.ubuntu.com trusty-security/restricted amd64 Packages [18.1 kB]
Get:10 http://security.ubuntu.com trusty-security/universe amd64 Packages [289 kB]
Get:11 http://archive.ubuntu.com trusty-updates/restricted amd64 Packages [21.4 kB]
Get:12 http://archive.ubuntu.com trusty-updates/universe amd64 Packages [584 kB]
Get:13 http://security.ubuntu.com trusty-security/multiverse amd64 Packages [4725 B]
Get:14 http://archive.ubuntu.com trusty-updates/multiverse amd64 Packages [16.0 kB]
Get:15 http://archive.ubuntu.com trusty-backports/main amd64 Packages [14.7 kB]
Get:16 http://archive.ubuntu.com trusty-backports/restricted amd64 Packages [40 B]
Get:17 http://archive.ubuntu.com trusty-backports/universe amd64 Packages [52.5 kB]
Get:18 http://archive.ubuntu.com trusty-backports/multiverse amd64 Packages [1392 B]
Get:19 http://archive.ubuntu.com trusty Release [58.5 kB]                      
Get:20 http://archive.ubuntu.com trusty/universe Sources [7926 kB]             
Get:21 http://archive.ubuntu.com trusty/main amd64 Packages [1743 kB]          
Get:22 http://archive.ubuntu.com trusty/restricted amd64 Packages [16.0 kB]    
Get:23 http://archive.ubuntu.com trusty/universe amd64 Packages [7589 kB]      
Get:24 http://archive.ubuntu.com trusty/multiverse amd64 Packages [169 kB]     
Fetched 21.3 MB in 40s (523 kB/s)                                              
Reading package lists... Done
root@b412a5b98153:/#

安装curl 工具

root@b412a5b98153:/# apt-get install curl -y
Reading package lists... Done
Building dependency tree       
Reading state information... Done
...
Processing triggers for libc-bin (2.19-0ubuntu6.14) ...
Processing triggers for ca-certificates (20170717~14.04.1) ...
Updating certificates in /etc/ssl/certs... 148 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.
root@b412a5b98153:/#

接下来,再安装apache服务:

root@b412a5b98153:/# apt-get install -y apache2

启动这个apache服务,然后使用curl来测试本地访问:

root@b412a5b98153:/# service apache2 start
 * Starting web server apache2                                                                                                                                                  AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
 *

配合使用-p参数对外映射服务端口,可以允许外来容器访问该服务。

9.4 Centos/Fedora

在Docker Hub上使用docker search命令搜索标星至少为25的CentOS相关镜像,如下所示:

[root@localhost ~]# docker search -f stars=25 centos
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                            The official build of CentOS.                   4275                [OK]                
ansible/centos7-ansible           Ansible on Centos7                              109                                     [OK]
jdeathe/centos-ssh                CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x86_…   95                                      [OK]
consol/centos-xfce-vnc            Centos container with "headless" VNC session…   52                                      [OK]
imagine10255/centos6-lnmp-php56   centos6-lnmp-php56                              40                                      [OK]
tutum/centos                      Simple CentOS docker image with SSH access      39                                      
gluster/gluster-centos            Official GlusterFS Image [ CentOS-7 +  Glust…   30                                      [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   27

2.Fedora系统简介及使用

在Docker Hub 上使用docker search命令来搜索标星至少为2的Fedrora相关镜像,结果如下:

[root@localhost ~]# docker search -f stars=2 fedora 
NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
fedora                    Official Docker builds of Fedora                657                 [OK]                
mattdm/fedora             A basic Fedora image corresponding roughly t…   49                                      
fedora/apache                                                             34                                      [OK]
mattsch/fedora-nzbhydra   Fedora NZBHydra                                 5                                       [OK]
darksheer/fedora22        Base Fedora 22 Image -- Updated hourly          2                                       [OK]
vbatts/fedora-varnish     https://github.com/vbatts/laughing-octo/tree…   2                                       [OK]

使用docker run 命令直接运行Fedora官方镜像,并登录bash:

[root@localhost ~]# docker run -it fedora bash
Unable to find image 'fedora:latest' locally
latest: Pulling from library/fedora
e71c36a80ba9: Pull complete 
Digest: sha256:74d8985b737de78af3d06450b8e48768b66fedf8868684e8fcf47c8253f84282
Status: Downloaded newer image for fedora:latest
[root@6811667a13ac /]# cat /etc/redhat-release 
Fedora release 28 (Twenty Eight)
[root@6811667a13ac /]#

9.5 本章小结

    本章讲解了典型操作系统镜像的下载和使用,除了官方的镜像之外,在Docker Hub上还有许多第三方组织或个人上传的Docker镜像。读者可以根据具体情况来选择。一般来说注意如下 几点:

    官方镜像体积都比较小,只带有一些基本的组件。精简的系统有利于安全、稳定和高效运行,也适合进行定制。

    个别第三方镜像(如tutum,已被Docker收购)质量非常高。这些镜像通常针对某个具体应用进行配置,比如、包含LAMP组件的Ubuntu镜像。

    出于安全考虑,几乎所有的官方制作的镜像都没有安装SSH服务,无法使用用户名和密码直接登录。