zoukankan      html  css  js  c++  java
  • docker 基础

    docker

    # 容器: 在隔离环境中运行的一个进程,进程停止,容器销毁(打包软件的容器)
    -- 隔离的环境拥有自己的系统文件,ip地址,主机名等
    -- 程序: 代码或命令
    -- 进程: 运行的程序
    # 容器和虚拟化的区别
    -- kvm 虚拟化: 需要硬件的支持,需要模拟硬件,可云翔在不同的操作系统
    -- kvm 模拟硬盘(写数据先写在自己,然后宿主机)
    -- 可以
    # linux 开机启动流程:
    bios 开机硬件自检
    根据bios设置的优先启动项boot 网卡, 硬件,u盘 , 光驱
    读取mbr引导  UEFI(gpt分区) mbr硬盘分区信息,内核加载路径
    加载内核
    启动一个进程 init systemd
    系统初始化完成
    运行服务
    # 容器的启动流程  --- 直接使用宿主机的硬件
    共用宿主机的内核
    启动第一个进程,直接启动服务
    -- 优点: 损耗少,启动快,性能高
    -- 缺点: 只能运行linux(windows 起虚拟机,然后运行docker)
    # 容器发展历程
    chroot技术:新建一个子系统
    
    

    安装docker

    网址: https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
    docker version 用来查看docker 版本
    # docker 官方仓库地址
    1. 官方仓库: https://hub.docker.com/
    2. 私有仓库: daocloud
    -- docker 是一种软件的打包技术
    -- 构建: 做一个docker 镜像
    -- 运输: docker pull
    -- 运行: 启动一个容器
    -- 每一个容器,都有自己的系统rootfs
    # docker主要组成部分
    -- cs 架构,分为docker client and docker server
    -- 主要组件: 镜像,容器,仓库,网络,存储
    -- 启动容器必须有一个镜像,仓库中只存镜像
    -- 容器 -- 镜像 -- 仓库
    # 命令总结
    docker version
    systemctl start docker  # 启动服务端
    systemctl enable docker
    docker info  # 如果要做监控
    

    docker 使用

    # 配置docker 镜像加速
    vi /etc/docker/daemon.json
    {
    	"registry-mirrors": ["https://registry.docker-cn.com"]
    }
    systemctl restart docker
    # 启动一个nginx 的容器
    docker run -d -p 80:80 nginx
    run 创建并运行一个容器
    -d 放在后台
    -p 端口映射  宿主机:容器
    nginx  docker镜像的名字
    # 镜像 (在docker hug注册账号可以自己上传镜像)
    # 搜索镜像  
    docker search tomcat  
    选择镜像: stars 多的
    # 拉镜像  (官方仓库和私有仓库都可以)
    docker pull 搜出来的镜像名
    docker pull alpine  /  docker pull alpine:3.6
    dockerhub 搜索alpine 可以获得版本
    # 镜像有关的所有命令查看
    docker image
    docker image ls   查看镜像列表or  docker images
    # 导出镜像
    docker image save alpine:latest -o docker_alpine.tar.gz
    # 删除镜像
    docker image rm alpine
    # 导入镜像
    docker image load -i docker_alpine.tar.gz
    # 镜像改名
    docker image tag 镜像id oldboy:v1  
    

    docker的容器管理

    # 启动容器 
    docker run -d -p 80:80 nginx:latest
    docker run -it --name centos6 centos:6.9 /bin/bash
    --it  分配交互式的终端
    -- name 指定容器的名字
    /bin/bash 覆盖容器的初始命令
    '''
    docker run image_name
    docker run -it image_name  CMD
    docker run ==== docker create + docker start
    '''
    # 查看容器列表
    docker container ls
    docker container ls -a
    docker ps 
    docker ps -a
    docker ps -a -q 静默输出,只输出容器的id
    docker ps -a -l  last查看最近启动的容器
    docker ps -a -l --no-trunc  显示详细
    # 停止容器
    docker container stop 容器ID
    docker container kill 容器ID或名字
    # 启动容器
    docker container start 容器名
    # 进入容器(目的,调试,排错)
    doceker exec options container command 
    -- docker exec -it 容器id或名字 /bin/bash
    docker attach  # 多个xshell 窗口用同一个终端
    -- docker attach options container #用的少
    
    # 退回宿主机 (临时回宿主机)
    ctrl + p  ctrl + q
    # 再返回容器,保存刚才对容器的操作
    docker attach 容器id
    # 删除容器
    docker container rm 容器id
    docker rm 容器id
    docker rm `docker ps -a -q`  批量删除容器
    docker rm -f `docker ps -a -q`   -f 强制删除
    # 启动一个命令,一直活着
    docker run -d centos:6.9 tail -f /etc/hosts
    
    # 检查容器状态
    systemctl status docker
    '''
    总结: docker 容器内的第一个进程(初始命令)必须一直处于前台运行的状态,否则这个容器刚启动就退出了
    业务中的容器:夯住,启动服务
    '''
    

    容器的网络访问

    1. yum install httpd -y
    2. service httpd start 
    3. netstat -lntup  # 查看是否监听80端口
    4. 可以加端口映射
    iptables -t nat -A PREDOUTING -d 10.0.0.12 -p tcp --dport 80 -j DNAT --to-destination 172.7.3.0:80
    iptables -t nat -I PREDOUTING -d 10.0.0.12 -p tcp --dport 80 -j DNAT --to-destination 172.7.3.0:80
    iptables -t nat -L -n 查看
    # 为避免以上操作,加 -p参数
    docker run -d -p 81:80 nginx:latest
    # 端口映射依赖内核转换参数
    sysctl -a|grep ipv4|grep forward
    docker 一启动,net.ipv4.ip_forward=1  是否能上网的参数
    如果虚拟机挂起再恢复,那么上面值会变为0
    # 指定映射(docker 会自动添加一条iptabelse 规则来实现端口映射)
    -p hostPort:containerPort
    -p ip:hostPort:containerPort  # 多个容器都想使用80端口
    -p ip::containerPort  # 省略宿主机端口,起了一个随机端口 
    随机的端口根据内核参数决定的
    sysctl -a|grep net.ipv4|grep 'rang'   # 随机端口范围
    -p hostPort:containerPort:udp
    -p 81:80 -p 443:443  可指定多个 -p  做多个端口映射
     
    

    容器的数据卷挂载

    #修改首页页面
    # opt下的bird 映射到/usr/share/nginx/html 目录
    docker run -d -p 80:80 -v /opt/bird:/usr/sare/nginx/html nginx:latest
    wget http://192.168.15.84/xiaoniaofeifei.zip
    unzip xiaoniaofeifei.zip
    方法二
    docker run -d -p 81:80 -v  octivia:/usr/share/nginx/html nginx:latest
    -v 创建了一个卷
    docker volume inspect octivia 查看
    

    基于nginx启动一个容器,监听80和81,访问80,出现nginx 默认欢迎首页,访问81出现小鸟
    -p 80:80  -p 81:81 -v
    基于nginx 多端口的多站点
    # 进入容器中手动配置配置文件
    docker run -it -p 80:80 -p 81:81 -v /opt/bird:/data nginx:latest /bin/bash
    进入配置文件中,添加bird.conf 目录设为data, 端口设为81
    # 在宿主机生成配置文件 bird.conf
    server {
        listen    81;
        location / {
            root   /data;
            index  index.html index.htm;
        }
    }
    echo '' >bird.conf
    docker run -d -p 80:80 -p 81:81 -v /opt/bird:/data -v /opt/bird.conf:/etc/nginx/conf.d/bird.conf nginx:latest
    # 方法三
    docker run -it -p 80:80 -p 81:81 -v /opt/bird:/data nginx:latest /bin/bash
    apt-get updata  # 生成apt-get的缓存
    apt-get install vim -y
    
    '''
    debian 换源
    mv /etc/apt/sources.list /temp/
    echo '源' > /etc/apt/sources.list
    
    手动修改DNS
    echo 'nameserver 180.76.76.76' >/etc/resolv.conf
    '''
    

    自己做docker 镜像

    # 想让自己的代码在容器里面跑起来,自己做镜像
    1. 启动一个基础容器
    docker run -it centos:6.9
    docker run -it alpine  # 比较小的liunx发行版
    2. 在容器中安装服务,ssh
    yum provides sshd   # 查看sshd属于哪个包(openssh-server)
    这里可以换源
    yum install openssh-server -y
    service sshd start  # 秘钥对生成
    ls /etc/ssh   # 可以看到启动服务后自动生成的三对秘钥对
    echo '123'|passwd --stdin root  
    chpasswd  # 也可以改密码
    # 可以在另一台服务器上通过ssh 连入到容器中(有秘钥对的情况下可以连上)
    ssh root@172.17.0.2
    密码:123
    # 公钥改变以后要删除 /root/.ssh/known_hosts才可以连上
    rm -rf /root/.ssh/known_hosts
    3. 把已经安装好的额服务的容器,提交为镜像
    exit 退出容器
    docker container commit 1ee55652b589 镜像名centos6.9_ssh:v1
    4. 测试镜像的功能
    docker run -d -p 1022:22 centos6.9_ssh:v1
    docker ps -a -l  查看
    # docker run -d -p 1022:22 centos6.9_ssh:v1 tail -f /etc/hists  防止服务一起就死
    docker run -d -p 1022:22 centos6.9_ssh:v1 /usr/sbin/sshd -D  # 启动服务并夯住
    # ssh root@10.0.0.11:1022进行连接 
    

    支持多个服务的docker 镜像

    1. 启动一个基础容器
    docker run -it -p 81:80 -p 1023:22 centos6.9_ssh:v1 /bin/bash
    curl -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo   # 换源
    2. 在容器中安装服务
    yum install nginx -y
    service nginx start
    3. 把已经安装好服务的容器提交为镜像
    vi /init.sh  # 初始启动脚本
    service sshd restart
    nginx -g 'daemon off;'
    
    ctrl + p , ctrl + q 退出容器
    docker commit 022211a29630 centos6.9_ssh_nginx:v2  # 提交镜像
        
    4. 测试镜像的功能
    同时其两个服务,需要在容器内写脚本
    docker run -d -p 1025:22 -p 83:80 centos6.9_ssh_nginx:v2 /bin/bash /init.sh
    # 测试
    用ssh连接容器,查看进程 ps -ef nginx是否已经启动
    
    '''
    每启动一个容器,宿主机中的 /etc/hosts, /etc/hostname 一些文件会被挂载进来
    /etc/resolv.conf,为了宿主机能上网
    error:
    No package nginx available
    solution:
    先安装epel, 再安装nginx  yum install epel-release
    
    export SSH_PWD = 123  设置环境变量
    unset SSH_PWD   取消环境变量
    env|grep SSH   查看环境变量
    '''
    

    修改密码

    # 默认的镜像不支持修改密码
    init.sh 脚本中添加, $SSH_PWD 通过外界传入
    if [ -z $SSH_PWD ];then
    	SSH_PWD = 123
    fi
    echo "$SSH_PWD"|passwd --stdin root
    #改完脚本需要重新提交镜像
    docker commit 18ca45742518 centos6.9_ssh_nginx:v3
    docker run -d -p 1026:22 -p 86:80 -e "SSH_PWD=12345" centos6.9_ssh_nginx:v3 /bin/bash /init.sh
    

    其他命令

    # 查看系统版本
    cat /etc/redhat-release
    cat /etc/os-release
    # 只看请求头
    curl -I 172.17.0.3
    
    grep -Ev '^$|#' default.conf   # 去除注释行,只显示内容
    # 所有程序正常起,最后一条 tail -f
    tail -F /var/log/nginx/access.log
    
  • 相关阅读:
    Protobuf
    CPU profiling
    转 Unicode 和 UTF-8 的区别
    Redis数据结构底层知识总结
    MySQL 加锁处理分析 ---非常牛逼
    MySQL Gap Lock问题
    利用Linux文件系统内存cache来提高性能
    Xcode7安装CocoaPods
    字符串排列组合算法
    iOS项目开发实战——学会使用TableView列表控件(四)plist读取与Section显示
  • 原文地址:https://www.cnblogs.com/Afrafre/p/11432825.html
Copyright © 2011-2022 走看看