zoukankan      html  css  js  c++  java
  • docker初解

    1 什么是容器

    1. 容器就是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出。
    2. 隔离的环境拥有自己的系统文件,ip地址,主机名等
    3. 容器是一种软件打包技术

    程序:代码,命令
    进程:正在运行的程序
    容器的系统文件就是宿主机的某一个目录

    2 容器和虚拟化的区别

    区别:
    kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)
    容器:共用宿主机内核,第一个进程直接启动服务
    优势:
    容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行在linux系统上
    虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统

    3 容器技术的发展过程

    3.1 chroot技术

    新建一个子系统(拥有自己完整的系统文件)

    1. 参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
    2. 使用chroot监狱限制SSH用户访问指定目录和使用指定命令(cp,ls)

    https://linux.cn/article-8313-1.html

    3.2 lxc

    linux container  (namespaces:命名空间 隔离环境 及cgroups 进程资源限制)
    cgroups 限制一个进程能够使用的资源。cpu,内存,硬盘io

    3.3 docker

    4 docker容器安装

    docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
    namespace:资源隔离
    cgroups:进程的资源限制
    配置源

    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    配置docker源,改为从清华源下载
    wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
    sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
    yum install docker-ce -y
    

    docker-ce:社区版
    docker-ee:企业版

    5 docker的主要组成部分

    docker是传统的CS架构分为docker client和docker server

    [root@docker01 ~]# docker version 
    Client: Docker Engine - Community
     Version:           19.03.2
     API version:       1.40
     Go version:        go1.12.8
     Git commit:        6a30dfc
     Built:             Thu Aug 29 05:28:55 2019
     OS/Arch:           linux/amd64
     Experimental:      false
    
    Server: Docker Engine - Community
     Engine:
      Version:          19.03.2
      API version:      1.40 (minimum version 1.12)
      Go version:       go1.12.8
      Git commit:       6a30dfc
      Built:            Thu Aug 29 05:27:34 2019
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.2.6
      GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
     runc:
      Version:          1.0.0-rc8
      GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
     docker-init:
      Version:          0.18.0
      GitCommit:        fec3683
    

    docker主要组件有:镜像、容器、仓库, 网络,存储
    启动容器必须需要一个镜像,仓库存储镜像
    启动容器需要镜像,仓库存储镜像

    6 启动容器

    docker的主要目标是“Build,Ship and Run any App,Angwhere”,构建,运输,处处运行
    一次构建,处处运行

    [root@docker01 ~]# docker run -d -p 80:80 nginx
    # run:创建并启动一个容器
    # -d: 放在后台运行
    # -p:  端口映射
    # nginx: 镜像名字
    

    配置镜像加速

    [root@docker01 ~]# cat /etc/docker/daemon.json
    {
     "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    [root@docker01 ~]# systemctl restart docker
    

    7 镜像命令

    官方镜像仓库地址:hub.docker.com
    image:镜像

    [root@docker01 ~]# docker image 
    build    import   load     prune    push     save     
    history  inspect  ls       pull     rm       tag   
    ====================================================================================
    docker search tomcat      # 搜索镜像 优先选择官方镜像,stars(星星)数量多的 
    docker pull alpine        # 获取alpine最新版
    docker pull alpine:3.9    # 指定获取alpine版本
    docker push alpine        # 上传镜像到仓库
    # 官方pull:    docker pull centos:6.8(没有指定版本,默认会下载最新版)
    # 私有仓库pull: docker pull daocloud.io/huangzhichong/alpine-cn:latest
    # daocloud.io:域名   huangzhichong:用户名
    
    docker image ls                       # 查看镜像列表
    docker images                         # 查看镜像列表
    docker image rm alpine:3.9            # 删除镜像  可以写镜像ID号
    docker rmi alpine:3.9                 # 删除镜像
    docker image save nginx:latest -o docker_nginx.tar.gz     # 导出镜像
    docker image load -i docker_alpine3.9.tar.gz              # 导入镜像
    docker image import docker_alpine3.9.tar.gz               # 导入镜像,导入镜像没有名字
    docker image inspect docker_alpine3.9.tar.gz              # 查看镜像属性
    docker image built -t                                     # 构建镜像
    docker image history                                      # 构建镜像历史
    docker image prune                                        # 清楚镜像缓存
    
    

    8 容器命令

    docker run -d -p 80:80 nginx
    # run:创建并启动一个容器
    # -d: 放在后台运行
    # -p:  端口映射
    # nginx: 镜像名字
    # -v:     源地址(宿主机):目标地址(容器)
    
    docker restart infallible_hodgkin        # 重启容器 可以写容器名字或者容器ID
    docker start infallible_hodgkin          # 启动容器
    docker stop infallible_hodgkin           # 关闭容器
    docker kill infallible_hodgkin           # 杀死容器
    docker ps                                # 默认查看运行的容器
    docker ps -a                             # 查看所有状态容器
    docker ps -l                             # 查看最近创建的容器
    docker ps -q                             # 只显示镜像id号
    docker rm crazy_elgamal                  # 删除容器 可以写容器名字和ID
    docker rm -f `docker ps -a -q`           # 删除所有容器
    docker rm `docker ps -a -q`              # 只删除关闭的容器
    docker container commit                  # 提交容器为镜像
    docker container update                  # 容器性能进行限制
    docker container update --memory 300MiB --memory-swap 3000MiB nging:latest
    docker container create                  # 创建容器不启动
    docker container export                  # 将容器提交为tar.gz包
    docker container logs                    # 查看容器历史信息
    docker container pause                   # 容器挂起
    docker container unpause                 # 取消容器挂起
    docker container cp                      # 将宿主机文件拷贝到容器目录
    docker container diff                    # 对比容器有哪些改变
    
    docker run -it --name centos6 centos:6.9 /bin/bash      # 创建启动容器,并进入容器
    # -it        配交互式的终端interactive tty
    # --name     指定容器的名字
    # /bin/bash  覆盖容器的初始命令
    
    # 进入正在运行的容器的命令
    方法1: 
    格式:docker exec [OPTIONS] CONTAINER COMMAND
    docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
    例子:docker container exec -it centos6 /bin/bash
    
    方法2:格式:docker attach [OPTIONS] CONTAINER
    例子:docker attach 4bcf2984f4e7
    ctrl+p,ctrl+q  退出
    

    总结:
    docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
    业务在容器中运行:初始命令,夯住,启动服务
    nginx服务初始命令夯住:nginx -g 'daemon off;'
    zabbix服务初始命令夯住:/usr/sbin/zabbix_agentd -f -c /etc/zabbix/zabbix_agentd.conf

    9 容器的网络访问(端口映射)

    指定映射(docker 会自动添加一条iptables规则来实现端口映射)

    命令格式:
    -p hostPort:containerPort
    -p ip:hostPort:containerPort 多个容器都想使用8080端口
    -p ip::containerPort(随机端口)
    -p hostPort:containerPort/udp
    -p 10.0.0.100::53/udp 使用宿主机的10.0.0.100这个ip地址的随机端口的udp协议映射容器的udp53端口
    -p 81:80 –p 443:443 可以指定多个-p
    随机映射:docker run -P(大P) (随机端口)
    # hostPort:宿主机端口       containerPort:容器端口
    
    命令示范:
    docker run -d -p 80:80 nginx:latest
    
    docker run -d -p 10.0.0.11:81:80 nginx:latest   #多个容器都想使用81端口,改变IP地址即可实现
    docker run -d -p 10.0.0.12:81:80 nginx:latest   #多个容器都想使用81端口,改变IP地址即可实现
    
    docker run -d -p 10.0.0.11::80 nginx:latest     #宿主机随机选用端口
    
    docker run -d -p 10.0.0.11::80/udp nginx:latest            # 更换udp协议,还能再用80端口
    
    docker run -d -p 10.0.0.11:80:80 -p 443:443 nginx:latest   #指定端口映射
    

    10 docker的数据卷管理

    数据卷(文件或目录)
    -v 卷名:/data (第一次卷是空,会将容器的数据复制到卷中,如果卷里面有数据,把卷数据的挂载到容器中)
    -v src(宿主机的目录):dst(容器的目录)
    数据卷容器
    -–volumes-from(跟某一个已经存在的容器挂载相同的卷)

    数据卷命令
    [root@docker01 ~]# docker volume 
    create   inspect  ls       prune    rm   
    =====================================================================================
    
    docker run -d -p 80:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest 
    # xiaoniao:站点目录
    
    docker run -d -p 81:80 -v xiaoniao:/usr/share/nginx/html nginx:latest
    # xiaoniao为数据卷:在宿主机上 目录:/var/lib/docker/volumes/xiaoniao/_data/
    # 数据卷没有会自动创建
    
    docker run -d -p 84:80 --volumes-from busy_greider nginx:latest 
    # 跟某一个已经存在的容器挂载相同的卷
    

    练习题:
    基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现小鸟。
    方法一

    [root@docker01 _data]# docker run -d -p 80:80 -p 81:81 -v /opt/xiaoniao:/opt nginx:latest 
    194068a14505104e1886aac31bceed5fc631dd1c1e514f97d5cf38dfdc91532d
    
    [root@docker01 _data]# docker exec -it adoring_roentgen /bin/bash
    
    root@194068a14505:/# ls /opt/
    2000.png  21.js  icon.png  img	index.html  sound1.mp3	xiaoniaofeifei.zip
    
    root@194068a14505:/# cd /etc/nginx/conf.d/
    root@194068a14505:/etc/nginx/conf.d# ls
    default.conf
    
    root@194068a14505:/etc/nginx/conf.d# echo 'server {
    >     listen       81;
    >     server_name  localhost;
    >     location / {
    >         root   /opt;
    >         index  index.html index.htm;
    >     }
    > }' >xiaoniao.conf
    root@194068a14505:/etc/nginx/conf.d# exit 
    exit
    [root@docker01 _data]# docker restart adoring_roentgen 
    adoring_roentgen
    

    方法二:

    [root@docker01 opt]# echo 'server {
    >     listen       81;
    >     server_name  localhost;
    >     location / {
    >         root   /opt;
    >         index  index.html index.htm;
    >     }
    > }' >xiaoniao.conf
    
    [root@docker01 opt]# ls
    containerd  xiaoniao  xiaoniao.conf
    [root@docker01 opt]# docker run -d -p 82:80 -p 83:81 -v /opt/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf -v /opt/xiaoniao:/opt nginx:latest 
    ad5180b890ed044d705ed240ed1845a6bbe2d6d86724676b0cc8d302daaa9f44
    
    
  • 相关阅读:
    iOS 开发中的争议(一)
    好用的第三方控件,Xcode插件(不断更新)
    Objective-C Runtime 运行时之四:Method Swizzling
    Objective-C Runtime 运行时之一:类与对象
    va_start和va_end使用详解
    [Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)
    IOS开发之----#import、#include和@class的区别
    ARC
    iOS所有常见证书,appID,Provisioning Profiles配置说明及制作图文教程
    WWDC笔记:2013 Session 201 Building User Interfaces for iOS 7
  • 原文地址:https://www.cnblogs.com/zeq912/p/11880467.html
Copyright © 2011-2022 走看看