1. 程式人生 > >Docker 更新版本

Docker 更新版本

Docker 更新版本

原來版本 1.10

更新後的版本 19.03.1

更新 Docker 版本需要注意的問題:

  • 注意系統是否支援新版本的儲存驅動。

    19.03.01 版本預設使用的儲存驅動是 overlay2

    overlay2 儲存驅動使用需要滿足以下條件:

一、暫停原有的容器並匯出

Docker 版本更新:

暫停所有docker, 現有的映象和容器都匯出成 tar包

匯出容器

docker export  container id  -o  d.tar

匯出映象

docker  image  save  container  -o  a.tar

二、移除原來的 Docker 並安裝新的版本

移除老版本的 Docker

 yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安裝新版本 Docker

# yum-utils 提供了命令 yum-config-manager,device-mapper-persistent-data和lvm2由需要 devicemapper儲存驅動程式。
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
# 設定 yum 源為 穩定的版本  
# 阿里的源,國內使用較快
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
# 生成快取
yum makecache
# 如果要安裝指定的版本
yum list docker-ce --showduplicates | sort -r
# 填入版本號到下面的命令(docker-ce-19.03.0-3.el7)
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

# 安裝最新穩定版本 Docker CE 
yum install docker-ce docker-ce-cli containerd.io    

三、 使用原來的資料目錄、或者 建立新的資料目錄。

使用原來的資料目錄

使用之前的資料目錄,也就是之前版本的資料目錄,這樣 之前的映象和容器就可以不用再匯入了,直接使用就行了。

指定之前的 儲存目錄,我們之前 Docker 的儲存目錄是 /opt/docker.

cat << EOF >>/etc/docker/daemon.json
{
    "data-root": "/opt/docker"
}
EOF

啟動docker

systemctl  start  docker
docker  images   # 我們可以看到之前的映象都存在
docker  info   # 我們可以看到

更新後改變的東西

  • 日誌驅動之前是 journal 現在是 logfile

    資料目錄:

[root@iz23nb5ujp69 docker]# ls -l
total 48
drwx------ 2 root root 4096 Aug  6 15:58 builder
drwx------ 4 root root 4096 Aug  6 15:58 buildkit
drwxrwxrwx 5 root root 4096 Aug  6 16:31 containers
drwxrwxrwx 5 root root 4096 Oct 13  2016 devicemapper
drwxrwxrwx 3 root root 4096 Oct 13  2016 image
drwxrwxrwx 3 root root 4096 Oct 13  2016 network
drwx------ 4 root root 4096 Aug  6 15:58 plugins
drwx------ 2 root root 4096 Aug  6 16:41 runtimes
drwx------ 2 root root 4096 Aug  6 15:58 swarm
drwx------ 2 root root 4096 Aug  6 16:41 tmp
drwxrwxrwx 2 root root 4096 Oct 13  2016 trust
drwxrwxrwx 2 root root 4096 Aug  6 15:58 volumes

原來的 1.10版本 是 預設驅動 devicemapper ,使用上一個版本的 Docker 目錄的話,會使用上一個版本的預設的驅動(為了相容),如果使用的是新的目錄,則會使用官方當前版本預設的儲存驅動和日誌引擎。

建立新的目錄,匯入映象

使用新的資料目錄 /opt/docker-ce

cat << EOF >>/etc/docker/daemon.json
{
    "data-root": "/opt/docker-ce"
}
EOF
systemctl restart  docker 

匯入映象

docker image import  jenkins.tar    fy:jenkins

匯入的映象會使用Docker 的預設的驅動,也就是 overlay2,會使用預設的日誌驅動。不管原來映象使用的什麼驅動,匯入後會使用當前的預設儲存驅動。

四、更新過程中遇到的問題

我們按照上面步驟更新,使用的是建立新的目錄的方式。當我們啟動我們的 Jenkins 容器後,執行構建後,發現有下面的報錯。

升級之後的問題。刪除資料夾報錯。命令是沒有問題的。

進入容器我執行下面的命令,也是報錯。

[root@491c264aea0d target]# rm -rf  ./*
rm: cannot remove `./classes/com/ugou88/wx/interceptor': Invalid argument
rm: cannot remove `./classes/com/ugou88/wx/i/controller': Invalid argument

問題,很有可能是驅動導致的,就是儲存驅動。

我們升級後 Docker 預設使用的驅動是 overlay2,那麼如果要使用該驅動需要滿足以下條件。

  • overlay2`Docker CE和Docker EE 17.06.02-ee5及更高版本支援該驅動程式,是推薦的儲存驅動程式。

  • 需要 Linux 核心版本在 4.0更高的版本或者使用 RHEL/CentOs 版本號大於 3.10.0-514。

  • overlayoverlay2驅動程式支援xfs的檔案系統,但需要d_type=true啟用。

    使用xfs_info驗證ftype選項設定為1。要xfs正確格式化 檔案系統,請使用該標誌-n ftype=1

我們使用的 ext4 檔案系統,Docker 的版本也高於 17.06.02,但是我們的 Centos 版本號是 低於 3.10.0-514 的, 所以我推測是由於 版本號過低,導致儲存驅動使用不了,我們對系統進行快照後,進行升級核心。

升級核心之後,我們重啟主機,發現是可以正常使用的