docker

作者: 无心文先森 | 来源:发表于2021-02-01 14:40 被阅读0次

    docker能干嘛

    虚拟机技术缺点

    1. 资源占用十分多
    2. 冗余步骤多
    3. 启动很慢

    容器化技术

    容器化技术不是模拟的一个完整的操作系统

    比较docker和虚拟机技术的不同

    • 传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
    • 容器内的应用直接运行在宿主机的内部,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
    • 每个容器间是互相隔离的,每个容器内都有一个属于自己的文件系统,互不影响

    应用更快速的交付和部署

    传统:一堆帮助文档,安装程序

    docker:打包镜像发布测试,一键运行

    更便捷的升级和扩缩容

    使用了docker之后,我们部署应用就和搭积木一样

    项目打包为一个镜像,扩展 服务器A,服务器B

    更简单的系统运维

    在容器化之后,我们的开发,测试环境都是高度一致的

    更高效的计算资源利用

    docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例,服务器的性能可以被压榨到极致

    docker安装

    docker基本组成

    image.png
    镜像(image)

    docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)

    容器(container)

    docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的

    启动,停止,删除,基本命令

    目前就可以把这个容器理解为就是一个简易的linux系统

    仓库(repository)

    仓库就是存放镜像的地方

    仓库分为共有仓库和私有仓库

    Docker Hub(默认是国外的)

    阿里云。。都有容器服务器(配置镜像加速)

    安装docker

    环境查看

    # 系统内核是3.10 以上的
    uname -r
    # 系统版本
    cat /etc/os-release
    # 是centos7
    

    安装

    参考帮助文档

    # 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
    
    # 3. 设置镜像的仓库
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo  # 默认是国外的
    
    sudo yum-config-manager \
        --add-repo \
        https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推荐使用阿里云的,十分快
        
    # 更新yum软件包索引
    yum makecache fast
    
    # 4. 安装docker  docker-ce 社区版 ee 企业版
    yum install docker-ce docker-ce-cli containerd.io
    
    # 5. 启动docker
    systemctl start docker
    
    # 6. 使用 docker vesion查看
    # 7. hello-world 
    docker run hello-world
    # 8. 查看一下下载的这个hello-world
    docker images
    

    了解:卸载docker

    # 1. 卸载依赖
    yum remove docker-ce docker-ce-cli containerd.io
    
    # 2. 删除资源
    rm -rf /var/lib/docker
    
    # /var/lib/docker    docker的默认工作路径
    

    阿里云镜像加速

    1. 登录阿里云找到镜像服务

    2. 找到镜像加速器

    3. 配置使用

    image.png

    回顾helloworld流程

    image.png

    底层原理

    docker是怎么工作的?

    docker是一个Client-Server结构的系统,docker的守护进程运行在主机上,通过socket从客户端访问!DockerServer接收到Docker-Client的指令,就会执行这个命令!

    image.png

    docker为什么比VM快

    1. docker有着比虚拟机更少的抽象层
    2. docker利用的是宿主机的内核,vm需要的是Guest OS

    所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级


    image.png

    docker的常用命令

    帮助命令

    docker  version           # 显示docker的版本信息
    docker  info              # 显示docker的系统信息,包括镜像和容器的数量
    docker 命令 --help         # 帮助命令
    

    帮助文档的地址:https://docs.docker.com/engine/reference/commandline/

    镜像命令

    docker images 查看所有本地的主机上的镜像

    docker images
    
    # 解释
    REPOSITORY      镜像的仓库源
    TAG             镜像的标签
    IMAGE ID        镜像的id
    CREATED         镜像的创建时间
    SIZE            镜像的大小
    
    # 可选项
    -a,  --all     # 列出所有镜像
    -q,  --quiet   # 只显示镜像的id
    

    docker search 搜索镜像

    docker search mysql
    
    # 可选项,通过收藏来过滤
    --filter=STARS=3000   # 搜索出来的镜像就是STARS大于3000的
    
    docker search mysql --filter=STARS=3000
    

    docker pull 下载镜像

    # 下载镜像  docker pull 镜像名[:tag]
    [root@muyi /]# docker pull mysql
    Using default tag:latest  # 如果不写tag 默认就是latest
    latest:Pulling from library/mysql
    5b54d594fba7:Pull complete  # 分层下载 docker image的核心 联合文件系统
    ...
    Digest:xxxx  # 签名
    ...
    docker.io/library/mysql:latest # 真实地址
    
    # 等价于它
    docker pull mysql
    docker pull dokcer.io/library/mysql:latest
    
    # 指定版本下载
    docker pull mysql:5.7
    

    docker rmi 删除镜像

    # docker rmi -f 镜像id   # 删除指定的镜像
    # docker rmi -f 镜像id 镜像id 镜像id # 删除多个镜像
    # docker rmi -f $(dokcer images -aq) # 删除全部的镜像
    

    容器命令

    说明:我们有了镜像才可以创建容器,下载一个centos来测试学习

    docker pull centos
    

    新建容器并启动

    docker run [可选参数]  image
    
    # 参数说明
    --name="Name"    容器名字   用来区分容器
    -d               后台方式运行
    -it              使用交互方式运行,进入容器查看内容
    -p               指定容器的端口   -p 8080:8080
        -P  ip:主机端口:容器端口
        -p  主机端口:容器端口 (常用)
        -p  容器端口
        容器端口
    -P  随机指定端口
    
    # 测试,启动并进入容器
    docker run -it centos /bin/bash
    ls  # 查看容器内的centos,基础版本,很多命令都是不完善的
    exit # 从容器中退回主机
    

    列出所有的运行的容器

    # docker ps 命令
    # 列出当前正在运行的容器
    -a  # 列出当前正在运行的容器+带出历史运行过的容器
    -n=? # 显示最近创建的容器
    -q  # 之显示容器的编号
    
    docker ps
    docker ps -a
    

    退出容器

    exit    # 直接容器停止并推出
    Ctrl + P +Q # 容器不停止退出
    

    删除容器

    docker rm 容器id   # 删除指定的容器,不能删除正在运行的容器,如果要强制删除  rm -f
    docker rm -f $(docker ps -aq) # 删除所有的容器
    docker ps -a -q|xargs docker rm # 删除所有的容器
    

    启动和停止容器的操作

    docker start   容器id  # 启动容器
    docker restart 容器id  # 重启容器
    docker stop 容器id     # 停止当前正在运行的容器
    docker kill 容器id     # 强制停止当前容器
    

    常用其他命令

    后台启动容器

    # 命令 docker run -d 镜像名
    docker run -d centos
    # 问题docker ps 发现centos停止了
    # 常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
    # nginx 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
    

    查看日志

    # docker logs -f -t --tail 条数 容器id
    # 显示日志
    -tf      # 显示日志
    --tail number # 要显示日志条数
    docker logs -tf --tail 10 dce7b86171bf
    

    查看容器中进程信息

    # 命令 docker top 容器id
    docker top dce7b86171bf
    

    查看镜像的元数据

    # docker inspect 容器id
    docker inspect dce7b86171bf
    

    进入当前正在运行的容器

    # 我们通常都是使用后台方式运行的 需要进入容器,修改一些配置
    # 命令
    # docker exec -it 容器id bashShell
    docker exec -it dce7b86171bf /bin/bash
    
    # 方式2
    # docker attach 容器id
    docker attach dce7b86171bf
    
    # docker exec  # 进入容器后开启一个新的终端,可以在里面操作(常用)
    # docker attach # 进入容器正在执行的终端,不会启动新的进程
    

    从容器内拷贝文件到宿主机上

    # docker cp 容器id:容器内路径  目的地主机路径
    docker cp dce7b86171bf:/home/test.html /home
    # 拷贝是一个手动过程,我们以后会使用数据卷的技术来实现
    # docker cp 容器id:容器内路径  目的地主机路径
    docker cp dce7b86171bf:/home/test.html /home
    # 拷贝是一个手动过程,我们以后会使用数据卷的技术来实现
    

    commit镜像

    docker commit 提交一个容器成为一个新的副本
    
    # 命令和git原理类似
    docker commit -m="提交的描述信息" -a="作者" 容器id 目的镜像名:[TAG]
    

    容器数据卷

    什么是容器数据卷

    docker就是将应用和环境打包成一个镜像。

    如果数据都在容器中,那么我们的容器删除,数据就会丢失! 需求:数据可以持久化

    比如以mysql为例,如果mysql容器删了,等于就是删库跑路了,需求:mysql数据可以存储在本地

    容器之间可以有一个数据共享的技术!docker容器中产生的数据,同步到本地

    这就是卷技术,就是目录的挂载,将我们容器内的目录,挂载在Linux上面

    总结:容器的持久化和同步操作!容器间也是可以数据共享的

    使用数据卷

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

    docker run -it -v 宿主机目录:容器内目录
    
    # 测试
    docker run -it -v /home/ceshi:/home centos /bin/bash
    # 启动起来时候我们可以通过 docker inspect 容器id
    # 假如我们将容器删除,发现,我们挂载都本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能
    

    具名挂载和匿名挂载

    # 匿名挂载
    -v 容器内路径
    docker run -d -P --name nginx01 -v /etc/nginx nginx
    
    # 查看所有的volume的情况
    docker volume ls
    # 这里发现,这种就是匿名挂载,我们在-v 只写了容器内的路径,没有写容器外的路径
    
    # 具名挂载
    docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
    docker volume ls
    
    # 通过-v 卷名:容器内路径
    # 查看一下这个卷
    docker volume inspect juming-nginx
    
    所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
    我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载
    
    # 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
    -v  容器内路径     # 匿名挂载
    -v  卷名:容器内路径 # 具名挂载
    -v  /宿主机路径:容器内路径 # 指定路径挂载
    
    扩展:
    通过 -v 容器内路径  ro  rw  改变读写权限
    ro   readonle   # 只读
    rw   readwrite   # 可读可写
    # 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了
    docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro  nginx
    docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw  nginx
    
    # ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的
    # 默认是rw
    

    相关文章

      网友评论

          本文标题:docker

          本文链接:https://www.haomeiwen.com/subject/uyhltltx.html