# 安装Docker
#### 简介
Docker是一款开源的应用容器引擎，具有可移植性、可扩展性、高安全性和可管理性等优势。开发者可将应用程序和依赖项打包到一个可移植的容器中，能够快速发布到Linux机器上，实现更高效地构建、部署和管理应用程序。本教程介绍如何在HCE服务器中安装Docker。
#### 准备工作
准备一台ECS实例。
#### 前置条件
已完成本机yum源的配置，可参考[HCE的REPO源配置](https://support.huaweicloud.com/usermanual-hce/hce_repo.html)进行yum源的配置。
#### 操作步骤
1. 安装Docker软件。 
   1. 执行以下命令安装Docker：
      ```
      dnf install docker
      ```
      
   
   
   
   
2. 验证Docker是否安装成功。 
   1. 执行以下命令启动Docker服务：
      ```
      systemctl start docker
      ```
      
   
   2. 执行以下命令后，如果显示Docker版本，则表示Docker安装成功，效果如[图1]：
      ```
      docker -v
      ```
      图1检查Docker是否安装成功   
      ![](https://support.huaweicloud.com/bestpractice-hce/zh-cn_image_0000002512128441.png) 
   
   
   
   
![](https://support.huaweicloud.com/bestpractice-hce/public_sys-resources/caution_3.0-zh-cn.png)
上述方法安装的Docker版本为18.09.0，如果需要安装更高版本的Docker，请参考[Docker文档](https://docs.docker.com/engine/install/binaries/#install-daemon-and-client-binaries-on-linux)进行安装。
#### Docker的使用
1. 管理Docker守护进程。
   - 运行守护进程：
     ```
     systemctl start docker
     ```
     
   
   
   
   - 停止守护进程：
     ```
     systemctl stop docker
     ```
     
   
   
   
   - 重启守护进程：
     ```
     systemctl restart docker
     ```
     
    
2. 管理镜像（以nginx镜像为例，请提前准备好本地镜像文件nginx_latest.tar）。
   - 导入本地镜像：
     ```
     docker load -i <nginx_latest.tar文件路径>
     ```
     
   
   - 修改标签：
     ```
     # 将 nginx 镜像的标签从 latest 修改为 v1
     docker tag nginx:latest nginx:v1
     ```
     
   
   
   
   - 查看已有镜像：
     ```
     docker images
     ```
     
   
   
   
   - 删除镜像：
     ```
     docker rmi nginx:v1
     ```
     
    
3. 管理容器。
   - 启动并进入容器：
     ```
     # 运行以下命令使用指定ID的镜像创建容器并进入，其中镜像ID可通过docker images命令获取
     docker run -it <镜像ID> /bin/bash
     ```
     
   
   
   
   - 退出容器：
     ```
     exit
     ```
     
   
   
   
   - 以后台方式启动容器：
     ```
     docker run -itd <镜像ID>
     ```
     
   
   - 查看所有运行的容器：
     ```
     docker ps
     ```
     
   
   - 进入后台运行的容器，其中容器ID可通过docker ps命令获取：
     ```
     docker exec -it <容器ID> /bin/bash
     ```
     
   
   
   
   - 将容器做成镜像，其中容器ID可通过docker ps命令获取：
     ```
     docker commit <容器ID> [<仓库名>[:<标签>]]
     ```
     例如：
     ```
     docker commit 135****9f757 nginx:v1
     ```
     
    
 
#### 系统掉电影响
主机意外掉电或系统panic等场景下，由于docker daemon的状态无法及时刷新到磁盘，导致重启后docker daemon状态不正常，可能出现的问题有（包括但不限于）：
- 掉电前创建的容器，重启后docker ps -a看不到，该问题是因为该容器的状态文件没有刷新到磁盘，从而导致重启后daemon无法获取到该容器的状态（镜像、卷、网络等也可能会有类似问题）。
- 掉电前某个文件正处于写入状态，尚未完全写入，重启后daemon重新加载该文件发现文件格式不正常或内容不完整，导致重启加载出错。
- 针对掉电时会破坏docker DB的情况，在重启节点时会清理data-root下面的db文件。因此重启前创建的如下信息在重启后会被删除：
  - network，用docker network创建的资源会在重启后清除。
  
  - volume，用docker volume创建的资源会在重启后删除。
  
  - 构建缓存，构建缓存信息会在重启后删除。
  
  - containerd保存的元数据，重启节点会清理containerd中保存的元数据，启动容器会重建 containerd元数据。
    ![](https://support.huaweicloud.com/bestpractice-hce/public_sys-resources/caution_3.0-zh-cn.png)
    用户若选择采用手动清理恢复环境的方式，可通过配置Docker守护进程在其启动环境中使用的环境变量"DISABLE_CRASH_FILES_DELETE=true"来屏蔽daemon掉电重启时db文件清理功能。
    
   
 
