zoukankan      html  css  js  c++  java
  • docker学习

    Docker 介绍

    docker是什么

          操作系统级别的虚拟化,基于linux内核的namespace和cgroup

    docker 与虚拟机对比

                       启动秒级,虚拟机是分钟级别

                       磁盘几M,虚拟机G级别

                       隔离程度相比虚拟机较低

    应用场景

                       打包程序发布

                       部署微服务

                       测试

                       持续集成

                       应用程序隔离,环境的一致性,迁移方便  

    安装配置

             官网 www.docker.com

             安装文档:docs.docker.com

             操作系统:centos7                  注:6只支持一些老版本,要想使用好docker 内核版本要在3.8以上。

             docker 版本

             CE    社区版

             EE     企业版

             老的版本安装名就是docker ,新版本是 docker-ce

             早期的docker 版本号是1.13.x这种形式 : 大版本号.小本版本号.bug版本号,从17年开始版本号命名就是年年.月月.xx 形式,从这时候开始区分为社区版本和企业版。所以18.09.3 表示18年九月发行的版本。

    安装

    关闭防火墙/selinux

    安装过程参照官方文档:

    yum -y install yum-utils
    
    yum-config-manager --add-repo=http://...
    yum list  docker-ce  --show-duplicates    显示所有版本,然后安装制定版本(如果直接yum install 默认按照的是最新版本)
    
    yum -y install docker-ce-版本号

    注:如果是内网安装可以采用二进制方式,去官网下载二进制包,把这些包放在/usr/bin即可,复制docker.service 到/usr/lib/systemd/system/ 下

    执行命令systemctl  daemon reload     systemctl  start docker 即可

    配置

    Docker的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致,在 Ubuntu 中的位置是:/etc/default/docker,在 CentOS中的位置是:/etc/sysconfig/docker。

    docker是1.12或以上的版本,可以修改(或新建)daemon.json文件。修改后会立即生效,不需重启docker服务。

    mkdir  /etc/docker/
    
    vi /etc/docker/daemon.json
    
    {
    
      "data-root":"  "/data/docker-root",      #docker服务的根目录
    "storage-driver": "overlay2",           #早期存储驱动是overlay
    "insecure-registries": ["registry.kzf.com"],   #私有镜像仓库地址访问一般证书都是自签的,为了跳过验证证书不合法的步骤,配置此项
    "exec-opts": ["native.cgroupdriver=systemd"],  #后期上k8s 的话,cgroup的驱动要与kubelet 一致
    
    “live-restore”: true                #容器进程挂了,但是容器还存活
    }

    关于docker 根目录,是docker 所有数据存储的统一目录(镜像、容器、卷等),17及最新版本都是用 `data-root`代替`graph`了,这里的修改请一定确认好你的docker版本,最新的有最新的要求和规

    启动/加入自启:systemctl start docker ...

    docker info

    如果安装配置正常就会输出info 信息

    docker version

    创建/启动容器

    docker run -it  nginx               

    #run 启动并且运行,it 当前终端启动,nginx 镜像名,默认先从本地寻找,如果没有就去官方仓库下载镜像并且启动为容器,不加tag 默认就是最新版本的

    docker ps                                      #查看当前启动的容器           

    镜像

    镜像仓库

    默认是国外镜像源,可以更改为国内的官方镜像源。

    vi /etc/docker/daemon.json    #通用配置方法,无论新旧版本
    
    #添加如下镜像源
    {
    "registry-mirrors": ["http://registry.docker-cn.com"]
     }
    
    systemctl restart docker                             
    
    tips: 一般注册的镜像仓库都是公共读私有写。也就是pull 无需认证,push 需要登录认证。

    镜像名字结构
    registry-address/prject-group/image-name:tag        # 镜像仓库地址/镜像分组组名/镜像名字:镜像版本号

    镜像仓库登陆/拉取和推送

    首先需要去镜像仓库网站注册一个账号,然后才能登陆,注册地址 https://hub.docker.com/ docker
    login  xxxx           #xxxx镜像仓库地址
    docker push
    sadp/nginx:1.12 #没有指定镜像地址,那么默认推送的就是默认的镜像仓库地址
    docker  push   registry-asdf.com/sadp/nginx:1.12    #镜像名字里面有地址,就是推送到 registry-asdf.com 仓库的sadp组下面

    注意:在docker push之前必须登录,一次认证后docker 会记住对应 registry 的登陆信息,下次push 无需登陆。登录信息存储在用户 Home 下的 .docker 文件夹下的config.json信息如下:

    {
    "auths": {
    "registry.sensedeal.wiki:8443": {
    "auth": "bGljaGVuOlNasdfwefdMjA="
    }
    },
    "HttpHeaders": {
    "User-Agent": "Docker-Client/18.09.3 (linux)"
    }

    echo  "bGljaGVuOlNasdfwefdMjA=" | base64 -d       #可以解密出来  用户名和密码  

    镜像构成

    镜像是分层的,查看镜像构建历史 docker history nginx,docker 数据目录是/var/lib/docker/

    里面存储着镜像和容器。

     存储驱动

    存储镜像的驱动,不同操作系统支持的驱动类型不一样,性能最好的是overlay2。

    容器管理命令

    说明:新版相比老版本加入了管理的子命令 : image、container等,可以通过docker container --help 查看子命令的使用方法。

    docker    help

    镜像相关命令

    docker  image  help                #查看镜像相关命令
    
    docker info                     #显示信息包括镜像地址信息
    
    docker images                    #查看本地仓库存在的镜像(注意只是本地的镜像)
    
    镜像名字结构
    registry-address/prject-group/image-name:tag        # 镜像仓库地址/镜像分组组名/镜像名字:镜像版本号
    tips: 一般注册的镜像仓库都是公共读私有写。也就是pull 无需认证,push 需要登录认证。
    
    
    镜像仓库登陆/拉取和推送
    
    首先需要去镜像仓库网站注册一个账号,然后才能登陆,注册地址 https://hub.docker.com/
    
    docker  login  xxxx           #xxxx镜像仓库地址
    
    docker research nginx           #搜索镜像
    
    docker  pull  nginx             #如果没有指定地址那么就是默认镜像仓库地址,如果没有指定tag那么tag 就是默认的latest
    
    docker tag    nginx:v1   nginx:v1.1    #更改镜像tag ,实际上更改后的镜像与原镜像的id 一样
    docker  push   sadp/nginx:1.12        #没有指定镜像地址,那么默认推送的就是默认的镜像仓库地址
    docker  push   registry-asdf.com/sadp/nginx:1.12    #镜像名字里面有地址,就是推送到 registry-asdf.com 仓库的sadp组下面。如果没有地址就是默认的地址
    
    注:如果是官方的docker 地址,那么拉区推送镜像的时候默认的就是library 组下,例如docker pull  nginx  等同于  docker  pull  docker.io/library/nginx
    
    当无法使用镜像仓库的时候可以通过把其他主机上镜像到处再上传到无法使用镜像主机,再倒入本地,具体命令如下:
    docker image  save nginx:1.12  > nginx.tar      #把容器导出为文件
    
    docker image  load  -i <  nginx.tar            #把文件导入到镜像仓库
    
    docker image export 容器ID  > name.tar     #把容器导出为文件
    
    docker image import name.tar            #导入文件为镜像到本地仓库
    
    
    构建镜像
    docker build -t registry.cn-beijing.aliyuncs.com/asdf/image-name:tag  -f  /.../path/Dockerfile path  #根据dockerfile在本地仓库生成镜像,注意registry..地址只是镜像名一部分,不表示镜像生成在阿里云。
    
      -t 指定创建镜像索引路径和名称
    
      -f 指定Dockerfile 路径如果不写默认就是后面path路径下的名字为Dockerfile 文件
    
      path 上下文路径:就是Dockerfile 中命令执行的路径,例如复制文件就是在这个路径下寻找要复制的文件的。
    
    docker push registry.cn-beijing.aliyuncs.com/asdf/image-name:tag  #把本地仓库镜像推送到远程仓库,远程仓库地址会根据本地镜像名字识别(registry.cn-beijing.aliyuncs.com.. 表示远程仓库为阿里云,如                                                                                                                   果本地镜像名字中不包含镜像地址信息就会默认推送到docker 配置文件中配置的仓库。
    
    
    删除镜像
    docker rmi  asdfasdfsd    #可以删除镜像名字也可以是id
    docker rmi -f id          #如果两个镜像tag相同那么需要强制删除才可以
    View Code

    docker  commit -p  container-name   img-new:tag    #提交修改。保存当前容器内的更改,生成新的镜像 img-new:tag

    容器相关

    docker container  --help
    
    docker container run -itd -e a="kobe"  -p 8080:80 --name  nginx-container nginx  # -i 交互式 -t 分配一个伪终端,-d 后台运行,如果不加此参数就会占用当前终端。-e 定义一个变量传递到容器里面。-p 把宿主机端口8080映射到容器内部80, --name 容器命名,  nginx 镜像名字                                                                                                                                     器里面80 端口映射到宿主机的8080端口
    
    docker container start/stop/restart           #启动/停止容器
    
    docker ps                           #查看正在运行的容器,-a 表示查看包括已经停止的容器在内的所有容器
    
    docker container attach  container-name        #进入容器,直接退出会导致容器终止,可以ctrl+p+q  退出。有时候会卡住因为会与容器里面的进程争抢当前终端,所以最好用exec 进入容器。
    
    docker container exec -it nginx-1 bash         #交互式打开容器执行一个命令,最后面参数必须是一个要在容器中执行的命令,如果不是bash/sh 那么指挥执行一次就退出容器。sh/bash 会进入                                                                                                      容器,再次退出不会终止容器运行
    
    docker logs  nginx-1                     #查看容器日志, -f 表示持续实时接收日志。 /var/lib/docker/containers/xxxxx.json.log  #容器日志保存位置
    
    docker rm asdfas/docker-name               #删除容器根据容器id或者名字,-f 可以强制删除正在运行的容器,不加则无法删除正在运行容器
    
    docker  container  inspect  container-id        #查看容器详细信息
    
    docker cp  /root/a.txt  container-name:/opt/     #把当前目录文件复制到容器当中
    
    docker contianer commit  contianer-name  image-name:tat  #把当前容器提交保存到当前仓库存为一个镜像。不建议这么做,一般这种需求可用dockerfile 实现。
    
    docker stats container-name               #查看实时资源使用情况
    
    docker port container-name               #查看容器端口映射情况
    
    docker update                       #在线更改容器资源使用配置
    
    
    
    容器启动的一些参数 docker run  ..
    
    --name    给容器命名,如果没有会随机生成名字
    --rm    当容器推出的时候就会删除容器,docker ps -a 就无法查找到了
    --restart 重启策略,默认为no ,on-failure 在容器非正常退出时(退出状态非0),才会重启容器,always 不管退出状态码是什么,始终重启容器,当指定always时,docker daemon将无数次的重启容器,容器也会在daemon启动时尝试重启,不管容器的状态如何。
    限制宿主机资源使用如下参数
    
    --cpus                           #设置使用的cpu 核数
    
    --cpuset-cpus                        #指定使用特定的cpu
    
    --cpu-shares                        #cpu 使用的权重值
    
    --memory                          #限制使用的内存大小,默认使用的swap 分区大小为此值的2倍。
    其他参数
    -p     映射端口,8080:80  前面宿主机端口,后面容器端口
    -v     挂载数据卷,把宿主机磁盘目录挂到容器内,如果容器内目录不为空那么宿主机数据会覆盖之
    -e     传递环境变量到容器内
    View Code

     宿主机数据挂载到容器

    三种方式

    volumes              

    所有目录都是在/var/lib/docker/volumes目录下挂载,现在此目录下创建挂载卷以供容器挂载

    docker volume  create nginx-vol       #创建数据卷
    
    ls /var/lib/docker/volumes/nginx-vol/  #在此目录会有一个目录名
    
    docker run -it --name=nginx-test --mount type=volume,src=nginx-vol,dst=/usr/share/nginx/html  nginx  #挂载,如果不指定src 会自动创建卷,会把容器要挂载目录自带的数据自动放到宿主机要挂载的目录

    bind  

    只要宿主机存在的目录都可以挂载到volumes中, 当容器中目录存在数据,那么此目录挂载后会隐藏里面的数据。

    docker run -itd --name=nginx-cv --mount type=bind,src=/app/html,dst=/usr/share/nginx/html  nginx

    docker run -itd --name=nginx-cv -v /app/html:/usr/share/nginx/html nginx # 这个命令与上面命令效果一样

    两者比较

    volumes 相比于bind 性能更好,因为它绕过了存储。如果读写数据频繁的场景最好挂载到volumes。

     网络模式

    bridge模式结构 

    每一个容器都会获取一个独立的namespace,同一个网桥下的容器网络是互通的

    相关命令

    yum -y install bridge-utils
    
    brctl show
    
    docker network ls

     host 模式

    与宿主机处于同一个命名空间,无需像bridge模式一样需要端口映射,直接占用宿主机的端口。

    docker  run  -itd  --name  test1  --net host nginx
    
    docker exec -it test1 bash
    
    ifconfig    #执行命令后宿主机的网卡也会同时显示

     none 模式

    获取独立的命名空间,但是不配置网络,可以后期指定网段。

    container 模式

    与指定的container 共用一个network namespace,网卡配置也是相同的 

    自定义

    可以通过自定义生成一个网桥,实际还是bridge模式

  • 相关阅读:
    va_list va_start va_end va_arg 解决变参问题
    标准输出文件
    Qt QDataTime QString 两个类的使用
    联合开发网站
    iOS LLDB调试器和断点调试
    Wireshark 网络抓包工具Wireshark的使用
    linux 操作系统下c语言编程入门
    iOS 应用崩溃日志分析
    iOS sqlite3数据库解析
    iOS 解析手势识别(Gesture Recognizers)
  • 原文地址:https://www.cnblogs.com/fanggege/p/11872932.html
Copyright © 2011-2022 走看看