• Docker 之 基础篇(安装、卸载、阿里云镜像加速、常用命令、发布、应用安装)


    前言

    这一章开始,我们就开始记录Docker了,它也是开发中很实用的一项技术,希望通过学习能够有一个初步的了解和掌握,在后续的工作中,可以快速上手,熟练运用,熟能生巧。

    一、简介

    1、是什么

    Docker是基于Go语言实现的云开源项目
    Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。

    1.1 与传统虚拟机技术对比

    传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
    Docker容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
    每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

    2、能干嘛

    • 更快速的应用交付和部署

    传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。

    • 更便捷的升级和扩缩容

    随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。

    • 更简单的系统运维

    应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。

    • 更高效的计算资源利用

    Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。

    3、去哪下

    官网:http://www.docker.com
    Docker Hub官网: https://hub.docker.com/

    这里有两个地址,第一个官网是Docker的官方网站。第二个则是我们镜像仓库的地址。就如同maven仓库,因为其是外国网站,因此访问比较的慢,我们一般都是使用国内的仓库,如阿里云、网易云等。

    二、安装

    1、卸载与安装

    因为部分朋友可能下载安装过docker,一般咱们先卸载干净,再来安装。
    官网是有步骤的,可以根据官网的来:https://docs.docker.com/engine/install/centos/。
    不过有个大坑,需要注意,后续内容会有说明。

    1. 查看Linux版本是否是CentOS7及以上版本,通过cat /etc/redhat-release查看。
      在这里插入图片描述

    2. 删除旧版本

    yum remove docker \
               docker-client \
               docker-client-latest \
               docker-common \
               docker-latest \
               docker-latest-logrotate \
               docker-logrotate \
               docker-engine
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. yum安装gcc相关
      需要gcc的环境,这个很多小伙伴都有,就可以跳过。
    yum -y install gcc
    yum -y install gcc-c++
    
    • 1
    • 2
    1. 安装需要的软件包
    yum -y install yum-utils
    
    • 1
    1. 设置stable镜像仓库(坑!!!)
      这么设置镜像仓库的地址是不对的,他是从官网下载,我们在国内很可能是下不下来的。容易出现Error 12和Error 14的错误。
      在这里插入图片描述
      我们需要配置自己的地址,比如设置阿里云仓库。如下。
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    • 1
    1. 更新yum软件包索引
    yum makecache fast
    
    • 1
    1. 安装DOCKER CE
    yum -y install docker-ce docker-ce-cli containerd.io
    
    • 1
    1. 启动docker
      这一步没有报错就对咯,也可以查看一下进程看看。
    systemctl start docker
    
    • 1
    1. 测试docker是否成功安装
    # 查看docker版本
    docker version
    # 运行hello-world
    docker run hello-world
    
    • 1
    • 2
    • 3
    • 4

    出现如下信息就表明安装成功了。
    在这里插入图片描述
    我们也可以通过运行hello world来查看。如果机器上没有hello-world的镜像,就会去仓库里拉取,此时的仓库就是我们配置的阿里云仓库。当现实Hello from Docker就表明安装成功了。
    在这里插入图片描述

    1. 卸载 Docker
    # 关闭docker
    systemctl stop docker
    # 删除docker相关的组件
    yum remove docker-ce docker-ce-cli containerd.io
    # 删除docker的容器和镜像(这些上面的步骤无法删除,需要手动删除)
    rm -rf /var/lib/docker
    rm -rf /var/lib/containerd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2、阿里云镜像加速

    1)首先登录阿里云:https://promotion.aliyun.com/ntms/act/kubernetes.html
    2)点击控制台 - 选择容器镜像服务 - 获取加速器地址
    在这里插入图片描述
    3)使用下方的操作文档,按步骤执行即可。
    至此,docker就正式安装完成啦。解下来就是常用命令的说明。

    三、常用命令

    常用命令我们从三方面记录,分别是帮助启动类命令、镜像命令、容器命令。

    1、帮助类命令

    # 启动docker
    systemctl start docker
    # 停止docker
    systemctl stop docker
    # 重启docker
    systemctl restart docker
    # 查看docker状态
    systemctl status docker
    # 开机启动
    systemctl enable docker
    # 查看docker概要信息
    docker info
    # 查看docker总体帮助文档
    docker --help
    # 查看docker命令帮助文档,比如docker run --help
    docker 命令 --help
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    注意:
    执行 systemctl stop docker会出现“Warning: Stopping docker.service, but it can still be activated by: docker.socket”问题,它表示docker关闭了,但是docker.socket仍然存在,此时一旦执行docker相关命令。比如docker ps,docker 又重启了,可通过systemctl status docker查看此时docker状态为active (running),如果不需要这种机制,在执行 systemctl stop docker后再执行systemctl stop docker.socket即可。

    2、镜像命令

    # 列出本地的镜像
    # -a :列出本地所有的镜像(含历史映像层)
    # -q :只显示镜像ID。 
    docker images [OPTIONS]
    
    # 查询镜像 如docker search redis
    # --limit num   num为限制数,如5、10、20...
    docker search  [OPTIONS] 镜像名
    
    # 下载镜像
    # 可以指定tag、如果不指定则下载latest,即最新版本
    docker pull 镜像名[:TAG]
    
    # 删除镜像
    # -f 强制删除
    docker rmi [OPTIONS] 镜像ID/镜像仓库/镜像仓库:Tag
    
    # 查看镜像/容器/数据卷所占的空间
    docker system df
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3、容器命令

    # 新建 + 启动容器
    # OPTIONS说明(常用):有些是一个减号,有些是两个减号
    # --name="容器新名字" 为容器指定一个名称;如果不写系统则随机一个名字
    # -d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
    
    # -i:以交互模式运行容器,通常与 -t 同时使用;
    # -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互);
    
    # -P: 随机端口映射,大写P
    # -P: 指定端口映射,小写P
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    # 列出当前所有正在运行的容器
    # -a :列出当前所有正在运行的容器+历史上运行过的
    # -l :显示最近创建的容器。
    # -n:显示最近n个创建的容器。
    # -q :静默模式,只显示容器编号。
    docker ps [OPTIONS]
    
    # 退出容器
    # run进去容器,exit退出,容器停止
    exit
    # run进去容器,ctrl+p+q退出,容器不停止
    ctrl+p+q
    
    # 启动已停止运行的容器
    docker start 容器ID/容器名
    # 停止运行的容器
    docker stop  容器ID/容器名
    # 重启容器
    docker restart 容器ID/容器名
    # 强制停止容器
    docker kill 容器ID/容器名
    
    # 删除已经停止的容器
    # 无法删除未停止的容器,可以先停止再删除或者强制删除
    docker rm 容器ID/容器名
    # 一次删除多个容器
    # -f 强制删除
    # -a -q 可以合并写 -aq
    docker rm [OPTIONS] $(docker ps -a -q)
    docker ps -a -q | xargs docker rm
    
    
    # 查看容器日志
    docker logs 容器ID/容器名
    # 查看容器内运行的进程
    docker top 容器ID/容器名
    # 查看容器内部细节
    docker inspect 容器ID/容器名
    
    
    # 进入正在运行的容器并以命令行交互
    # bashShell 可为/bin/bash
    docker exec -it 容器ID/容器名 bashShell
    # 重新进入,不推荐使用
    docker attach 容器ID/容器名
    # 从容器内拷贝文件到主机上
    # 例:docker cp 3ba05078c5d5:/home/a.txt /home
    docker cp 容器ID:容器内路径 目的主机路径
    # export 导出容器的内容留作为一个tar归档文件[对应import命令]
    # 例:docker export 3ba05078c5d5 > /home/aaa.tar
    docker export 容器ID > 文件名.tar
    # import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
    # 例:cat aaa.tar | docker import - b-images:1.1.1
    # 例:cat aaa.tar | docker import - myfiles/a-images:1.1.0
    cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。
    exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止。
    推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。
    一般用-d后台启动的程序,再用exec进入对应容器实例

    四、本地镜像发布

    0、commit

    将容器生成镜像发布到本地。

    docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
    docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
    
    • 1
    • 2

    1、发布到阿里云

    1. 访问阿里云开发者平台https://promotion.aliyun.com/ntms/act/kubernetes.html,并登录。
    2. 选择控制台,进入容器镜像服务
    3. 选择个人实例,按要求填写内容,代码源时选择本地仓库
    4. 进入管理界面获得脚本

    脚本页面有登录、拉取、推送等脚本,复制粘贴即可。

    请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。注意:连同[]一起替换!!!

    2、发布到私有库

    Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。

    Docker Registry是官方提供的工具,可以用于构建私有镜像仓库

    1)下载并运行镜像Docker Registry

    docker run -d -p 5000:5000 -v /zdl/myregistry/:/tmp/registry --privileged=true registry
    
    • 1

    运行一个带有容器卷存储功能的容器实例,rw为读写都行,ro为read only,不写默认rw
    docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
    查看是否挂载成功
    docker inspect 容器ID

    数据卷:就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File
    System提供一些用于持续存储共享数据的特性:
    卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
    卷的继承docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu

    如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,
    在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限

    2) 查看本地库现有镜像

    curl -XGET http://192.168.61.111:5000/v2/_catalog
    
    • 1

    可以发现刚刚创建时是没有任何镜像的。

    3)创建一个镜像

    略。上文有描述

    4)将新镜像修改符合私服规范的Tag

    Host为Registry所在服务器的IP
    Port为Registry所在服务器的端口
    Repository为镜像仓库名
    Tag为镜像版本标签

    docker tag 镜像:Tag Host:Port/Repository:Tag
    
    • 1

    例如:docker tag myubt_tools:1.1 192.168.61.111:5000/myubt_tools:1.1

    5)修改配置文件使之支持http

    vim /etc/docker/daemon.json
    
    • 1
    {
      "registry-mirrors": ["https://fo6f0ahm.mirror.aliyuncs.com"],
      "insecure-registries": ["192.168.61.111:5000"]
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    修改配置文件后一定要重新启动docker!
    修改配置文件后一定要重新启动docker!
    修改配置文件后一定要重新启动docker!

    6)将创建的镜像发布到本地库

    docker push Host:Port/Repository:Tag
    
    • 1

    例如:docker push 192.168.61.111:5000/myubt_tools:1.1
    在这里插入图片描述

    7)pull到本地并运行

    docker pull Host:Port/Repository:Tag
    docker run -it [ImageId] /bin/bash
    
    • 1
    • 2

    例如:docker pull 192.168.61.111:5000/myubt_tools:1.1
    使用实际镜像ID替换[ImageId]

    五、docker简单安装应用

    1、MySQL的安装(MySQL 5.7)

    哪一个版本无所谓,此处记录以MySQL 5.7为例。
    运行MySQL。
    端口3306、数据卷、root密码123456、后台启动

    docker run -d -p 3306:3306 --privileged=true -v /zdl/mysql/log:/var/log/mysql -v /zdl/mysql/data:/var/lib/mysql -v /zdl/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
    
    • 1

    **在conf文件下新建文件my.cnf,**内容如下

    [client]
    default-character-set=utf8
    [mysqld]
    character-set-server = utf8
    collation-server = utf8_general_ci
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果出现了初始化问题,可以试一试将MYSQLROOTPASSWORD改为MYSQL_ROOT_PASSWORD,我就是因为这个弄好好久。。。人麻了

    重新启动mysql容器实例再重新进入并查看字符编码

    SHOW VARIABLES LIKE 'character%'
    
    • 1

    2、Tomcat的安装

    docker pull tomcat
    docker run -it -p 8080:8080 tomcat
    
    • 1
    • 2

    新版启动后,访问首页可能无法出现tom猫,因为新版的webapps里没有任何文件,它将文件放在了webapps.dist,可以把webapps.dist目录换成webapps再重启tomcat就可以访问了。
    可以使用这个版本的tomcat,就无需修改了。
    docker pull billygoo/tomcat8-jdk8

    3、Redis的安装(Redis 6.0.16)

    此处记录以Redis 6.0.16为例。

    先拉取镜像docker pull redis:6.0.16
    新建文件夹mkdir -p /zdl/redis,在该目录下放入一个redis.conf默认文件,文件来源自行解决。
    修改配置文件

    允许redis外地连接 必须 注释掉 # bind 127.0.0.1
    daemonize no 将daemonize yes注释起来或者daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败

    运行redis测试是否成功。使用数据卷。使用我们修改后的文件。

    docker run -d -p 6379:6379 --name myredis --privileged=true -v /zdl/redis/redis.conf:/etc/redis/redis.conf -v /zdl/redis/data:/data  redis:6.0.8 redis-server /etc/redis/redis.conf
    
    • 1

    至此。Docker基础篇结束,后续会继续记录高级部分!欢迎关注。

    参考

    学习地址:
    https://www.bilibili.com/video/BV1gr4y1U7CY
    思维导图(需要使用思维导图的软件打开):
    链接:https://pan.baidu.com/s/1_XuF4MeeBcNKvcRf23YApg
    提取码:ukkj

  • 相关阅读:
    作为一个十年卷王,告诫你们年轻人应该如何才能认清自己的价值
    4721. 排队
    计算机辅助数据绘图(matlab\python\js)
    javacc之路5---词法分析器技巧
    BFS解决FloodFill算法:(Leetcode:200. 岛屿数量)
    爬取动态网页数据的软件-抓取动态网页数据的工具
    网络并发编程
    【通信原理】第四章 -- 信道
    嘿~ Win安装失败?来试试DeepinOS
    golang操作数据库--gorm框架、redis
  • 原文地址:https://blog.csdn.net/qq_41404112/article/details/126505656