in centos docker linux ~ read.

初始化CentOS搭载Docker

本文地址:https://www.chihoc.com/init-centos-with-docker/
欢迎转载,请注明出处,谢谢

新建账户

  1. 拿到新服务器root后,新建帐号chiho并修改密码。此命令会自动创建同名组。

    $ adduser chiho
    $ passwd chiho
    

安装Docker

  1. 登录root用户

  2. 执行下面的命令添加 yum 软件源

    # 国内源 (阿里云)
    $ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # 腾讯云
    # $ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # 官方源(如果想使用官方源,执行下面命令,下载速度可能会比较慢)
    # $ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
  3. 安装Docker依赖包

    $ yum install -y yum-utils device-mapper-persistent-data lvm2
    
  4. 安装Docker CE

    $ yum makecache fast
    $ yum install -y docker-ce
    
  5. 添加自启动

    # 开机自动启动docker
    $ systemctl enable docker
    # 启动docker
    $ systemctl start docker
    
  6. 默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用chiho加入 docker 用户组。

    # 建立docker组:
    $ groupadd docker
    # 将chiho加入docker组
    $ usermod -aG docker chiho
    
  7. 退出当前终端并重新登录,进行如下测试。

    $ docker run hello-world
    
    
    # Unable to find image 'hello-world:latest' locally
    # latest: Pulling from library/hello-world
    # ca4f61b1923c: Pull complete
    # Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c
    # Status: Downloaded newer image for hello-world:latest
    
    
    # Hello from Docker!
    # This message shows that your installation appears to be working correctly.
    
    
    # To generate this message, Docker took the following steps:
    #  1. The Docker client contacted the Docker daemon.
    #  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    #     (amd64)
    #  3. The Docker daemon created a new container from that image which runs the
    #     executable that produces the output you are currently reading.
    #  4. The Docker daemon streamed that output to the Docker client, which sent it
    #     to your terminal.
    
    
    # To try something more ambitious, you can run an Ubuntu container with:
    #  $ docker run -it ubuntu bash
    
    
    # Share images, automate workflows, and more with a free Docker ID:
    #  https://cloud.docker.com/
    
    
    # For more examples and ideas, visit:
    #  https://docs.docker.com/engine/userguide/
    

    若能正常输出以上信息,则说明安装成功。

使用镜像加速器

阿里云本身提供镜像加速器,可以提升在国内获取Docker官方镜像的速度。

通过使用root用户修改daemon配置文件/etc/docker/daemon.json来使用加速器:

注意修改镜像加速器的地址

$ mkdir -p /etc/docker
# 阿里云改为你的专有链接
$ tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://abc.mirror.aliyuncs.com"]
}
EOF
# 腾讯云 
$ tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
EOF
$ systemctl daemon-reload
$ systemctl restart docker

修改Docker存储配置

Docker可以依赖不同的存储驱动在系统中存储容器数据以及镜像,这里有Docker几种存储驱动的分析,以及官方的推荐

CentOS中的Docker默认使用vfs,目前来说稳定性不够高,随着镜像和容器数量的增长性能会明显下降。

因此使用CentOS支持的另外一种storage driver —— device mapper

device mapper方式又分两种模式:loop-lvmdirect-lvm

loop-lvm使用的是回环设备,在普通磁盘文件虚拟一个块设备,所有对它的读写操作都将被重定向到读写一个名为 virtualfs 的普通文件而非操作实际磁盘或分区的轨道和扇区。因此存在I/O性能问题。

官方要求正式环境使用direct-lvm,使用物理磁盘初始化thin-pool作为存储池。thin-pool由一个metadata设备和data设备组成,thin的概念就是按需分配数据块,删除时也回收数据块,提高存储空间利用率。

direct-lvm存储的磁盘需要为非系统盘,因此需要挂载数据盘并分区,阿里云提供了分区教程lvm管理的分区不需要创建文件系统)。

我这里把磁盘分成2个区,分别为/dev/vdb1和/dev/vdb2。/dev/vdb2使用lvm管理供Docker使用,/dev/vdb1进行用ext4初始化挂载到/data目录上。

  1. 安装device mapperlvm

    $ yum install -y lvm2 device-mapper
    
  2. 创建基于磁盘的物理卷Physical Volume

    # 停止docker
    $ systemctl stop docker
    $ fdisk -l
    # Device Boot      Start         End      Blocks   Id  System
    # /dev/vdb1       204802048   436207615   115702784   83  Linux
    # /dev/vdb2            2048   204800000   102398976+  83  Linux
    # 假设我有这么一个分区/dev/vdb2,创建物理卷 (若挂载的磁盘容量很大,可以先做分区)
    $ pvcreate /dev/vdb2
    # Physical volume "/dev/vdb2" successfully created
    # 查看物理卷创建是否成功
    $ pvdisplay
    # --- Physical volume ---
    # PV Name               /dev/vdb2
    # VG Name               docker
    # PV Size               <97.66 GiB / not usable 3.00 MiB
    # Allocatable           yes
    # PE Size               4.00 MiB
    # Total PE              24999
    # Free PE               24999
    # Allocated PE          0
    # PV UUID               EAPUU2-vT5l-sXDw-fcIq-VLZc-xSpY-RwKGLc
    
  3. 创建Docker卷组Volume Group

    $ vgcreate docker /dev/vdb2
    # 查看卷组创建是否成功
    $ vgdisplay
    # --- Volume group ---
    # VG Name               docker
    # System ID
    # Format                lvm2
    # Metadata Areas        1
    # Metadata Sequence No  1
    # VG Access             read/write
    # VG Status             resizable
    # MAX LV                0
    # Cur LV                0
    # Open LV               0
    # Max PV                0
    # Cur PV                1
    # Act PV                1
    # VG Size               97.65 GiB
    # PE Size               4.00 MiB
    # Total PE              24999
    # Alloc PE / Size       0 / 0
    # Free  PE / Size       24999 / 97.65 GiB
    # VG UUID               qQdO4x-51dG-39bu-0N7w-E07u-FXGN-WSIWgg
    
  4. 创建完卷组之后,就可以开始创建逻辑卷(Logic Volume)了。输入下面命令以指定新逻辑卷的名字、大小及其所在的卷组。

    # 前面说了thin pool由meta和data组成
    # 磁盘分区约为100G,分50%即50G到给data用,5%即5G给meta使用,剩下用于扩展用
    $ lvcreate -n thinpool docker -l 50%VG
    $ lvcreate -n thinpoolmeta docker -l 5%VG
    # 查看创建状态
    $ vgs
    # VG     #PV #LV #SN Attr   VSize  VFree
    # docker   1   2   0 wz--n- 97.65g <43.95g
    $ lvs
    # LV           VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
    # thinpool     docker -wi-a----- 48.82g
    # thinpoolmeta docker -wi-a----- <4.88g
    
  5. 把逻辑卷转为thin-pool,块大小为512K。

    $ lvconvert --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
    
  6. 设置thinpool的自动扩展参数,并应用此profile

    $ vi /etc/lvm/profile/docker-thinpool.profile
    # activation {
    #     thin_pool_autoextend_threshold=80
    #     thin_pool_autoextend_percent=20
    # }
    $ lvchange --metadataprofile docker-thinpool docker/thinpool
    # Logical volume "thinpool" changed.
    
    
    # 查看thinpool是否是已监视状态
    $ lvs -o+seg_monitor
    #  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Monitor
    #  thinpool docker twi-a-t--- 48.82g             0.00   0.01                             monitored
    # 查看逻辑磁盘状况
    
    
    $ lsblk
    # NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    # vda                       253:0    0   200G  0 disk
    # └─vda1                    253:1    0   200G  0 part /
    # vdb                       253:16   0   208G  0 disk
    # ├─vdb1                    253:17   0 110.4G  0 part
    # └─vdb2                    253:18   0  97.7G  0 part
    #   ├─docker-thinpool_tmeta 252:0    0   4.9G  0 lvm
    #   │ └─docker-thinpool     252:2    0  48.8G  0 lvm
    #   └─docker-thinpool_tdata 252:1    0  48.8G  0 lvm
    #     └─docker-thinpool     252:2    0  48.8G  0 lvm
    # vdc                       253:32   0   208G  0 disk
    
  7. 删除Docker原存储目录

    $ rm -rf /var/lib/docker/*
    
  8. 修改启动参数,指定使用device mapper

    $ vi /etc/docker/daemon.json
    # {
    #   "registry-mirrors": ["https://5f8nf6xb.mirror.aliyuncs.com"],
    #   "storage-driver": "devicemapper",
    #   "storage-opts": [
    #      "dm.thinpooldev=/dev/mapper/docker-thinpool",
    #      "dm.use_deferred_removal=true",
    #      "dm.use_deferred_deletion=true"
    #   ]
    # }
    
  9. 重新启动Docker并确认状态

    $ systemctl start docker
    $ docker info
    # 正确配置的话就能看到以下信息
    # Storage Driver: devicemapper
    #  Pool Name: docker-thinpool
    #  Pool Blocksize: 524.3kB
    #  Base Device Size: 10.74GB
    #  Backing Filesystem: xfs
    #  Udev Sync Supported: true
    #  Data Space Used: 20.45MB
    #  Data Space Total: 52.42GB
    #  Data Space Available: 52.4GB
    #  Metadata Space Used: 385kB
    #  Metadata Space Total: 5.239GB
    #  Metadata Space Available: 5.238GB
    #  Thin Pool Minimum Free Space: 5.242GB
    #  Deferred Removal Enabled: true
    #  Deferred Deletion Enabled: true
    #  Deferred Deleted Device Count: 0
    #  Library Version: 1.02.140-RHEL7 (2017-05-03)
    

挂载另一个分区

  1. 创建文件系统ext4

    $ mkfs.ext4 /dev/vdb1
    
  2. 备份 etc/fstab并写入自动挂载信息,最后手动挂载翻去

    # 创建挂载路径
    $ mkdir /data
    # 备份
    $ cp /etc/fstab /etc/fstab.bak
    # 自动挂载
    $ echo /dev/vdb1 /data ext4 defaults 0 0 >> /etc/fstab
    # 手动挂载一次
    $ mount /dev/vdb1 /data
    # 确认挂载
    $ df -h
    # /dev/vda1       197G  1.6G  186G   1% /
    # devtmpfs         16G     0   16G   0% /dev
    # tmpfs            16G     0   16G   0% /dev/shm
    # tmpfs            16G  376K   16G   1% /run
    # tmpfs            16G     0   16G   0% /sys/fs/cgroup
    # tmpfs           3.2G     0  3.2G   0% /run/user/1000
    # /dev/vdb1       109G   61M  103G   1% /data