zoukankan      html  css  js  c++  java
  • Docker-基础

    一、docker基本组成

    镜像(image)

    镜像就好比是一个模板,可以通过这个模板来创建容器服务。
    
    比如tomcat镜像==》run==》tomcat01容器(提供服务)。
    
    可以通过这个镜像可以创建多个容器(最终服务的运行就是在容器中)
    

    容器(container)

    利用容器技术,独立运行一个或者一个组应用。通过镜像来创建。目前可以将其理解为一个简易版的各种环境
    

    仓库(repository)

    存放镜像的地方,分共有仓库和私有仓库
    

    Docker与VM的比较

    1.docker有比虚拟机更少的抽象层
    2.docker直接使用宿主机的内核
    

    二、docker镜像基本命令

    docker version  # 查看版本
    docker info     # 查看详情
    
    docker images   # 查看镜像
    	参数:-a   显示所有镜像
    		 -q   只显示镜像id
    		 -aq  连用表示显示所有镜像的id
    
    
    docker pull    # 从仓库拉去镜像,这个仓库可以自己配置源
    docker pull mysql:5.7 拉取mysql,指定版本,没写版本默认最新版
    
    
    docker rmi -f 镜像id 镜像id 镜像id 镜像id# rmi=remove images方便记忆
    docker rmi -f $(docker images -aq) 删除所有镜像
    
    
    docker image prune 参数
    -a:删除所有未被使用的镜像
    -f:强制删除
    
    docker search 镜像名
    docker search -f is-official=true redis 搜索官方镜像 f相当于filter
    docker search -f starts=100 搜索收藏数大于一百的
    docker search redis limit 5
    
    docker tag [原镜像仓库url]/[原命名空间]/[原仓库名称]:[版本号] [新的名字]
    docker tag redis:v2  # 例子
    
    docker history 
    

    三、docker容器命令

    docker run 命令
            参数
            --name="test1"  #容器名字,将名称加入docker dns中
            -d  后台方式运行,即用守护进程的方式运行一个容器
            -it  使用交互方式运行,进入容器查看内容
            -p  小写,指定容器端口
                -p ip:主机端口:容器端口
                -p 主机端口:容器端口(常用)
                -p 容器端口
                容器端口
    
            -P  大写,随机端口
            -v  挂载存储卷
            比如部署django,文件可以使用我们主机的,而环境用docker的
            docker run  -v 主机目录:容器内目录 
    
            -e  在容器内设置一个环境变量
            docker run -d -e NGINX_VERSION=1.19.5 nginx:1.19.5
            比如我们登陆mysql的时候是需要账号密码的,我们在启动mysql服务的时候就可以利用-e把mysql的密码写
            进环境变量
            docker run -d -P -e:MYSQL_ROOT_PASSWORD=123456 mysql:latest 
    
            docker run -it centos /bin/bash # -it使用交互方式运行,进入容器查看内容
    
    exit      # 退出容器
    ctrl+p+q  # 容器不停止退出
    
    docker ps # 当前在运行的容器
    docker ps -a # 当前在运行的容器+曾经运行过的容器
            -n=2 显示最近的两个容器
            -q 显示容器的编号
            -aq 显示所有容器的编号
    
    
    docker rm 容器id  # 删除容器
    docker rm -f $(docker ps -aq)     # 删除所有容器
    docker ps -aq | 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发现没有应用,就会自动停止
    
    
    docker logs 	# 查看日志
    # 造点日志数据
    docker run -d centos /bin/sh -c "while true;do echo 123;sleep 1;done"
    docker logs -ft --tail 10 容器id  # 打印最后十行日志
    
    
    docker top 容器id  # 查看容器中的进程信息
    
    
    docker inspect 容器id  # 查看docker容器的元数据,出来的是json格式
    
    
    
    # 从容器中拷贝文件到主机上,拷贝的话和容器是否运行没关系,就算关了也可以拷贝出来
    docker cp 容器id:容器内的路径 主机的路径
    
    
    
    当容器生命周期结束的时候,有时候我们就不要这个容器了,比如我们stop掉一个容器,使用docker ps
    命令确实看不到他了,但是使用-a参数,还是可以看到,说明这个容器停止之后还是在我们机子上占着空间的。
    如果我们用再使用这个容器,其实重新run一个就行了,因为我们都是通过镜像来启动的,重新起一个就是一模一样的。
    设置--rm参数即可
    
    docker run --rm -d redis
    
    
    # 保存我们的容器为镜像
    export 和 import
    docker export 容器id或容器名称 > 压缩包名字
    docker import 压缩包 镜像名字可包含路径
    
    docker export redis > test1.tar
    docker import test1.tar test/redis1:v1
    
    # export导出的是压缩包,commit导出的是镜像,是不同的
    
    # 导出镜像为压缩包
    docker save 镜像名字或者id > 压缩包名称
    	参数-o 指定在一个压缩包内保存多个镜像
    	docker save -o [压缩包名称] [镜像名1,镜像名2...]
    docker load 压缩包名称
    	参数-i 解压多个镜像的压缩包
    
    docker save test/reids:v1 > test2.tar
    docker load < test2.tar
    docker load -i test2.tar
    
    
    export和save区别
    export只保存镜像,save是完全保存,包括名字,id,历史记录等等,所以两者保存的文件大小不同save会更大
    import的时候可以重命名,load不行,原因基于第一条
    
    save和export使用场景
    1打包镜像一般用save,打包容器一般用export
    2保存信息需要历史信息,名字等等,使用save
    

    进入容器

    # 进入当前正在运行的容器,一二常用,其他了解
    1 exec  
    2 attach
    3 nsenter
    4 ssh
    # 通常我们容器是在后台方式运行,有时候需要进入容器,修改一些配置等
    docker exec -it 容器id /bin/bash  # 方式一
    docker attach 容器id  # 方式二
    
    
    # 区别:
    exec进入容器后开启一个新的终端,可以在里面操作,是常用的
    attach进入容器正在执行的终端,不会启动新的进程。即创建一个管道,链接上容器内pid为1的进程
    

    复制文件

    1.宿主主机复制到容器
    docker cp [宿主主机文件路径] [容器id]:[容器内路径]
    
    2.容器复制到宿主主机(反过来)
    docker cp [容器id]:[容器内路径] [宿主主机文件路径]
    

    docker网络实现原理

    首先通过网络命名空间来分隔开不同的容器,防止在同一个网络下的端口重复占用等问题,之后可以通过veth设备或者网桥还有iptables来实现网络的互通。
    veth设备因为是一对一的,所以会导致当连接数过多的话数量增长太大。
    网桥是相当与一个中间转发,需要通信的容器通过网桥来连接,转发
    

    image-20201130171411545

    四、linux网络

    命名空间:网络名称空间,即在同一台linux系统上,生成不同的隔离的网络空间
    veth设备对:对端与对端之间的网路合同,缺点是只能一对一,如果有很多需要连接,那么需要非常多设备对
    网桥:提供一个网络空间,做一个中间转发的功能,其他网络空间可以使用网桥的网络,可以支持多对多
    iptables(内核级):通过iptables规则转发网络,缺点:iptables规则复杂
    

    五、docker网络

    1 host
    实现原理:docker容器名称空间网络连接根命名空间的网络
    使用127.0.0.1这个本地网络,通过根名称空间内的lo互通
    docker run -d --network host nginx
    curl 127.0.0.1
    
    2 container
    实现原理:共享一个容器的网络给其他容器
    docker run -d -it --name test01 busybox sh
    docker run -d -it --network "container:test01" busybox sh
    
    3 none
    这个模式表示不提供任何其他网络,只有本地回环网络。这种网络模式可以适用于我们本地在做安全性要求很高的任务,不允许被外界打扰。
    docker -run --network none [镜像id|镜像命令] [命令(默认执行镜像指定的命令)]
    docker run -dit --network none busybox sh
    
    4 网桥
    实现原理:创建一个统一网络(相当于交换机),为与其相连的容器提供网络转发
    docker network [参数]
    
    查看系统网桥
    docker network ls
    
    创建网桥
    docker network create 名字
    
    查看网桥详细信息
    docker network inspect 网桥名字
    
    删除网桥
    docker network rm 网桥名字或id
    
    清理网桥
    docker network prune #三个默认的网桥不会被删除
    

    1.使用网桥的小案例

    现在有四个容器服务nginx,redis,mysql,如果直接-p使用根名称空间的网络,可能会存在端口重复占用的情况,比如我们要起两个redis
    
    所以我们使用网桥
    创建网桥
    docker network create testnet
    
    连接网桥
    docker run --network [网桥名称] [镜像id或名]
    docker run -d --name nginx1 --network testnet nginx
    docker run -d --name redis1 --network testnet redis
    docker run -d --name mysql1 --network testnet -e MYSQL_ROOT_PASSWORD=123 mysql:5.7
    
    # 创建一个测试网络是否互通的容器
    docker run -dit --name busybox1 --network testnet busybox:latest sh
    # 进入busybox1看看网络是否通了
    docker exec -it busybox1 sh
    ping mysql
    

    2.dockerfile构建

    利用dockerfile可以自定义我们镜像,这样就可以用于部署我们项目的环境。

    docker build [参数] [自定义的镜像名字] [dockerfile的名字,一般默认就是Dockerfile,也可以自定义]
    

    image-20201203173650636

  • 相关阅读:
    使用 EasyBCD 安装Ubuntu 14.04 Error 15: file not found错误的解决方法
    浅谈程序猿的职业规划,看你如何决定自己的未来吧。
    [转载]DOS循环:bat/批处理for命令详解 (史上虽详尽的总结和说明~~)
    bat 批处理 字符串 截取
    window上使用GIT的个人经验(入门级)
    Android 访问 wcf
    解决 MyEclipse 10 中 JSp页面 “return false” 报错问题
    微信公共平台(码农在努力)
    Spring Cloud 中使用 Zipkin 追踪服务
    Spring Cloud Config 分布式配置中心
  • 原文地址:https://www.cnblogs.com/chiyun/p/14067455.html
Copyright © 2011-2022 走看看