• Linux服务器搭建Docker


    一、Docker概述

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

    Docker的出现的原因?

    ​ 问题:项目开发到上线,环境配置不一致,跨平台,容易出错

    ​ 解决:发布项目时,不仅有jar包,还要包含环境配置

    核心概念:将项目和环境打包(镜像),发布到远程仓库,要用直接下载即可,每个镜像都是隔离互不干扰的,就像一个个集装箱

    二、Docker安装

    1、环境准备
    # 系统内核是4.18
    [root@tanghx ~]# uname -r
    4.18.0-240.22.1.el8_3.x86_64
    # 系统版本
    [root@tanghx ~]# cat /etc/os-release 
    NAME="CentOS Linux"
    VERSION="8"
    ID="centos"
    ID_LIKE="rhel fedora"
    VERSION_ID="8"
    PLATFORM_ID="platform:el8"
    PRETTY_NAME="CentOS Linux 8"
    ANSI_COLOR="0;31"
    CPE_NAME="cpe:/o:centos:centos:8"
    HOME_URL="https://centos.org/"
    BUG_REPORT_URL="https://bugs.centos.org/"
    CENTOS_MANTISBT_PROJECT="CentOS-8"
    CENTOS_MANTISBT_PROJECT_VERSION="8"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    2、下载安装

    官方文档地址:https://docs.docker.com/

    # 1、如果存在旧的版本,先卸载掉
    sudo yum remove docker \
               docker-client \
               docker-client-latest \
               docker-common \
               docker-latest \
               docker-latest-logrotate \
               docker-logrotate \
               docker-engine
               
    # 2、安装需要依赖的包
    sudo yum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2
    
    # 3、设置镜像的仓库
    # 安装阿里云的镜像
    sudo yum-config-manager \
        --add-repo \
        http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    # 4、安装docker相关,容器核心,客户端  docker-ce(社区版)
    yum install docker-ce docker-ce-cli containerd.io
    
    # 5、启动docker
    sudo systemctl start docker
    
    # 开机自动启动 
    sudo systemctl enable docker
    
    # 更新yum软件包索引,CentOS7命令,
    # centos8执行 dnf makecache
    yum makecache fasty
    
    • 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

    查看Docker启动docker version

    # 6、启动docker镜像
    docker run hello-world
    
    • 1
    • 2
    # 7、查看一下镜像是否存在,前面添加的hell-world存在
    docker images
    
    • 1
    • 2
    # 8、卸载docker
    # 卸载依赖
    yum remove docker-ce docker-ce-cli containerd.io
    # 删除资源
    rm -rf /var/lib/docker
    rm -rf /var/lib/containerd
    
    # /var/lib/docker docker的默认工作路径
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    3、阿里云镜像加速
    1. 登录阿里云,在弹性计算里找到容器镜像服务

    2. 找到镜像加速地址

    3. 配置使用

    # 创建一个目录
    sudo mkdir -p /etc/docker
    # 编写配置文件
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://xuxcjuy8.mirror.aliyuncs.com"]
    }
    EOF
    # 重启服务
    sudo systemctl daemon-reload
    # 启动
    sudo systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    三、Docker命令

    # 查看docker容器版本
    docker version
    # 查看docker容器信息
    docker info
    # 查看docker容器帮助
    docker --help
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1、镜像命令

    镜像是什么?

    镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,包含运行某个软件所需要的所有内容(代码、运行时库、环境变量和配置文件)
    所有的应用,直接打包docker镜像,就可以直接运行起来

    如何得到镜像?

    1. 从远程仓库下载
    2. 别人拷贝
    3. 自己制作一个镜像DockerFile
    • 镜像下载
    # 下载Redis官方最新镜像
    docker pull redis
    # 下载仓库所有Redis镜像
    docker pull -a redis
    # 下载私人仓库镜像
    docker pull bitnami/redis
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 镜像查看
    # 列出本地images
    docker images
    # 只显示镜像ID
    docker images -q
    # 显示镜像的摘要信息(某列,如digests列)
    docker images --digests
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 镜像搜索
    # 搜索仓库MySQL镜像
    docker search mysql
    # 只显示 starts >= 300 的mysql镜像
    docker search --filter=stars=300 mysql
    # 只列出 AUTOMATED=OK 的镜像
    docker search --automated mysql
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 镜像删除
    # 单个镜像删除
    docker rmi redis
    # 强制删除(针对基于镜像有运行的容器进程)
    docker rmi -f redis
    # 多个镜像删除,不同镜像以空格隔开
    docker rmi -f redis mysql nginx
    # 删除本地全部镜像
    docker rmi -f $(docker images -q)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 镜像构建
    # 1.编写dockerfile
    cd /docker/dockerfile
    vim mycentos
    # 2.构建docker镜像
    docker build -f /docker/dockerfile/mycentos -t mycentos:1.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    2、容器命令
    • 查看容器:
    # 查看正在运行的容器
    docker ps
    # 查看正在运行容器的ID
    docker ps -q
    # 查看所有容器(正在运行+历史运行过的容器)
    docker ps -a
    # 显示运行容器总文件大小
    docker ps -s
    # 显示最近创建的a个容器
    docker ps -n a
    # 不截断输出
    docker ps --no-trunc
    # 获取镜像redis的元信息
    docker inspect redis
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 容器启动

    启动并进入 centos 容器,并查看 centos 容器里面目录

    # 新建并启动容器(-i:交互模式运行,-t:为容器重新分配一个伪输入终端,--name:指定名称)
    docker run -i -t --name mycentos
    # 后台启动容器(-d:以守护方式启动容器)
    docker run -d mycentos
    
    # 启动一个或者多个已被停止的容器
    docker start redis
    # 重启容器
    docker restart redis
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意:当docker run -d启动后台容器,使用docker ps发现容器停止了,是因为使用后台运行,必须要有一个前台进程,不然会自动停止(发现自己没提供服务)

    • 容器进程
    # 列出redis容器中运行进程
    docker top redis
    # 查看所有运行容器的进程信息
    for i in  `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
    
    • 1
    • 2
    • 3
    • 4
    • 容器日志
    # 查看redis容器日志
    docker logs redis
    # 查看容器redis从2021年1月1日后的最新十条日志
    docker logs --since="2021-01-01" --tail=10 redis
    
    • 1
    • 2
    • 3
    • 4
    • 容器的进入与退出
    # 使用run方式在创建时进入
    docker run -it centos /bin/bash
    # 关闭容器并退出
    exit
    # 仅退出容器,不关闭
    快捷键:Ctrl+P+Q
    #直接进入centos 容器启动命令的终端,不会启动新进程,多个attach连接共享容器屏幕,参数:--sig-proxy=false  确保CTRL-D或CTRL-C不会关闭容器
    docker attach --sig-proxy=false centos
    #在 centos 容器中打开新的交互模式终端,可以启动新进程,参数:-i  即使没有附加也保持STDIN 打开;-t  分配一个伪终端
    docker exec -i -t  centos /bin/bash
    #以交互模式在容器中执行命令,结果返回到当前终端屏幕
    docker exec -i -t centos ls -l /tmp
    #以分离模式在容器中执行命令,程序后台运行,结果不会反馈到当前终端
    docker exec -d centos  touch cache.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 容器的停止与删除
    # 停止一个运行中的容器
    docker stop redis
    # 杀掉一个运行中的容器
    docker kill redis
    # 删除一个已停止的容器
    docker rm redis
    # 删除一个运行中的容器
    docker rm -f redis
    # 删除多个容器
    docker rm -f $(docker ps -a -q)
    docker ps -a -q|xargs docker rm
    # -l 移除容器间的网络连接,连接名为 db
    docker rm -l db 
    # -v 删除容器,并删除容器挂载的数据卷
    docker rm -v redis
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    四、操作命令

    1、生成镜像(commit)
    # 基于当前redis容器创建一个新的镜像;
    # 参数:
    	# -a :提交的镜像作者;
    	# -c :使用Dockerfile指令来创建镜像;
    	# -m :提交时的说明文字;
    	# -p :在commit时,将容器暂停
    docker commit -a="tanghx" -m="这里是提交说明" [redis容器ID]  myredis:v1.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    2、容器主主机间的数据拷贝
    # 将rabbitmq容器中的文件copy至本地路径
    docker cp rabbitmq:/[container_path] [local_path]
    # 将主机文件copy至rabbitmq容器
    docker cp [local_path] rabbitmq:/[container_path]/
    # 将主机文件copy至rabbitmq容器,目录重命名为[container_path](注意与非重命名copy的区别)
    docker cp [local_path] rabbitmq:/[container_path]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    五、容器数据卷

    数据可以持久化,存储在容器之外的地方,Docker容器中产生的数据,同步到本地,容器之间有一个数据共享

    目录的挂载,将我们容器内的目录,挂载到Linux上面

    1、使用数据卷

    方式一:直接使用命令来挂载 -v

    #  -p 主机地址:容器地址
    docker run -it -v 主机目录:容器目录
    docker run -it -v /home/test:/home centos /bin/bash
    
    # 启动之后查看容器信息,"Mounts:[]"-挂载信息
    docker inspect 容器ID
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    例子:Docker 部署 MySQL

    2、具名和匿名挂载
    ## 匿名挂载
    # -v 容器内路径	不写主机目录
    docker run -d -p --name nginx -v /etc/nginx nginx
    
    ## 具名挂载
    # 给挂载起个别名,别名前没有 "/"("/"表示绝对路径)
    docker run -d -p --name nginx -v mynginx:/etc/nginx nginx
    
    ## 查看所有卷的情况
    docker volume ls
    # 查看挂载信息
    docker volume inspect 挂载具名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    所有docker容器内的卷,没有指定目录的情况下,都是在/var/lib/docker/volumes/卷名/_data

    通过具名挂载,可以方便的找到我们的卷

    挂载文件权限

    # 通过 -v 容器内路径:ro rw 改变读写权限
    ro	readonly	# 只读,该文件只能从容器外部改变
    rw  readwrite	# 可读可写(默认)
    
    # 设置了容器权限,容器对挂载出来的内容操作就有限制了
    docker run -d -p --name nginx -v mynginx:/etc/nginx nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    3、DockerFile

    Dockerfile 就是用来构建docker镜像的构建文件,就是一个命令脚本

    ## 创建一个dockerfile文件,文件里面编写命令脚本(指令全大写)
    # 构建一个基础镜像
    FROM centos
    # 挂载
    VOLUME ["volume01","volume02"]
    CMD echo "-----打印内容----"
    CMD /bin/bash
    
    ## 执行Dockerfile创建镜像
    #	-f dockerfile文件目录
    #	-t 镜像名称、版本
    docker build -f /home/docker/dockerfile -t tanghx/centos:1.0 .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    安装CentOS7
    [英国访问学者]如何获取邀请函
    数据结构--6.5二叉排序树(插入,查找和删除)
    [R]第二节 对象介绍与赋值运算
    中国之声广播在线收听,云听“正直播”在路上
    Live800:教育行业新拐点,在线客服系统如何提供价值?
    Deep Image Matting:深度学习Matting开山之作
    elasticsearch安装ik分词器(多种安装方式)
    Communication-Efficient Learning of Deep Networks from Decentralized Data
    RabbitMQ原理和界面操作
  • 原文地址:https://blog.csdn.net/tanghaixu/article/details/126753906