• docker入门到放弃


    1.容器简介

    Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的cgroup,namespace,Union FS等技术,对应用进程进行封装隔离,并且独立于宿主机与其他进程,这种运行时封装的状态称为容器。

    Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

    容器不就是虚拟化吗

    是,但也不竟然。

    虚拟化使得许多操作系统可同时在单个系统上运行。

    容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。

    官方文档

    https://docs.docker.com/install/linux/docker-ce/centos/

    2.安装

    2.1卸载旧版本

    sudo yum remove docker 
                      docker-client 
                      docker-client-latest 
                      docker-common 
                      docker-latest 
                      docker-latest-logrotate 
                      docker-logrotate 
                      docker-engine
    

    2.2替换阿里云yum源

    curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    

    2.3配置宿主机网卡转发

    ## 配置网卡转发,看值是否为1
    sysctl -a |grep -w net.ipv4.ip_forward
    net.ipv4.ip_forward = 1
    
    ## 若未配置,需要执行如下
    cat <<EOF >  /etc/sysctl.d/docker.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward=1
    EOF
    sysctl -p /etc/sysctl.d/docker.conf
    

    2.4安装docker-ce

    默认是安装最新稳定版本

    yum clean all && yum makecache
    ## yum安装
    yum install -y docker-ce
    ## 查看源中可用版本
    yum list docker-ce --showduplicates | sort -r
    ## 安装指定版本
    ##yum install -y docker-ce-18.09.9
    

    2.5配置阿里云镜像加速

    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://u7vs31xg.mirror.aliyuncs.com"]
    }
    EOF
    

    2.6启动docker服务

    systemctl start docker  #启动docker  stop restart
    systemctl enable docker #开机启动docker systemctl daemon-reload
    systemctl status docker #查看docker状态
    

    2.7卸载

    1. systemctl stop docker
    
    2. systemctl diable docker
    
    3. yum remove docker-ce
    
    4. rm -rf /var/lib/docker
    

    3.体系

    4.镜像管理

    4.1镜像获取

    方式一 docker hub 获取 Dockerfile

    新建一个文件夹,新建一个文件 Dockerfile

    执行docker build 进行构建:

    docker build -t centos:v1 
    

    使用v1版本的镜像启动一个容器:

    docker run -d -p 80:80 centos:v1  -g "daemon off;"
    

    方式二

    docker search centos
    

    下载镜像

    docker pull centos:7.5  #冒号之后是版本,不加默认选择最新稳定版
    

    查看新构建的镜像:

    docker images
    

    有/的是 别人写的 没有/是官方的

    4.2标识镜像的唯一性方法

    方法1

    REPOSITORY:TAG

    如,centos:7.5.1804

    方法2

    IMAGE ID (sha256:64位的号码,默认只取12位)

    docker image ls --no-trunc  #查看详细信息
    

    4.3镜像详细查看

    docker image inspect   镜像名:TAG
    
    docker image inspect   ID
    

    4.4查看镜像ID

    docker image ls -q
    

    4.5镜像的导入和导出

    docker image save ID(镜像名:版本号)  >/www/centos.tar #-o
    docker image  rm  -f ID 
    docker image  load -i  /www/centos.tar
    

    改名

    docker image tag  ID 镜像名:版本号
    

    4.6镜像删除

    docker image  rm  -f ID 
    docker image  rm  -f `docker image ls -q` #删除所有的
    

    5.容器管理

    5.1交互式容器

    docker  run  -it 0f3e07c0138f  #-i: 交互式操作。  -t: 终端。
    

    查看正在启动的容器

    docker ps  # -a 查看所有容器 
    
    CONTAINER ID  IMAGE        COMMAND  CREATED   STATUS   PORTS        NAMES
    7e2c15223ea8 0f3e07c0138f  "/bin/bash" 11 minutes ago  Up 11 minutes kind_dijkstra             
    
    CONTAINER ID    #容器的唯一标识码
    
    NAMES     #容器的名字不能重复 可以手动生成
    docker  run  -it  --name="zbb" 0f3e07c0138f
    
    COMMAND #启动容器运行的命令
    
    STATUS #运行状态
    
    

    5.2守护式容器

    docker run -d --name='zxy' nginx:1.14 #-d  以守护式启动,不手动结束不会停止
    #默认 没有镜像 会自动下载 
    
    docker  container inspect zxy  #查看容器详细信息 container默认可以不写
    

    5.3两类容器使用场景

    交互式一般用于测试 ,工具,临时任务 用完退出就停止了,但是不会删除,以后会越来越多

    docker rm -f kind_dijkstra  #删除容器
    
    run  -it  --name='zbbdentos'  --rm  0f3e07c0138f #加rm使用完会自动删除
    

    守护式,如tomcat等软件

    docker默认只能内部访问,必须提供端口才能对外访问

    docker run -d -p 8080:80 --name='zbb_nginx' nginx:1.14
    

    5.4docker启停

    守护式容器

    docker stop zxy 
    docker start zxy 
    docker attach zbb #进入容器
    

    交互式

    docker stop zxy
    docker start  -i zxy #不加-i连接不进去....只能输入以下命令菜能进入
    docker attach zbb
    
    ## 资源限制,-cpuset-cpus用于设置容器可以使用的 vCPU 核。-c,--cpu-shares用于设置多个容器竞争 CPU 时,各个容器相对能分配到的 CPU 时间比例。假设有三个正在运行的容器,这三个容器中的任务都是 CPU 密集型的。第一个容器的 cpu 共享权值是 1024,其它两个容器的 cpu 共享权值是 512。第一个容器将得到 50% 的 CPU 时间,而其它两个容器就只能各得到 25% 的 CPU 时间了。如果再添加第四个 cpu 共享值为 1024 的容器,每个容器得到的 CPU 时间将重新计算。第一个容器的CPU 时间变为 33%,其它容器分得的 CPU 时间分别为 16.5%、16.5%、33%。必须注意的是,这个比例只有在 CPU 密集型的任务执行时才有用。在四核的系统上,假设有四个单进程的容器,它们都能各自使用一个核的 100% CPU 时间,不管它们的 cpu 共享权值是多少。
    $ docker run --cpuset-cpus="0-3" --cpu-shares=512 --memory=500m nginx:alpine
    

    5.5容器的连接

    docker attach zbb #进入容器
    

    子进程的方式登录

    [root@docker ~]# docker  exec  -it zbb /bin/bash 
     exec进入调试  ,这样ctrl + D  exit 就不会退出容器
    #原理是又开了一个 /bin/bash
    

    容器的后台及前台运行

    1. ctrl + p ,q
    2. attach 调用到前台

    5.6删除所有容器

    docker rm -f `docker ps -a -q`
    

    5.7容器的网络访问

    docker启动的所有容器都是可以内部访问的

    docker run -d -p 8080:80 --name='zzb_n1' nginx:1.14
    将nginx的80映射到宿主的8080上
    

    映射多个端口

    docker run -d -p 8080:80 --name='zzb_n2' nginx:1.14
    

    5.8docker管理命令

    docker top zzb_n1  #查看进程
    

    UID PID PPID C STIME TTY
    root 9923 9907 0 20:27 ? ss nginx -g daemon off;
    101 9955 9923 0 20:27 ? ss

    docker logs  zzb_n1  
    #-f 持续监控日志
    #-t 显示详细时间
    #--tail  10 只显示10行
    

    23.112.18.xx - - [04/Nov/2019:12:27:17 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36" "-"

    6.数据卷使用

    在nginx镜像中无法编辑

    在外部创建好文件 cp到对应的目录中 ,手动交互数据

    docker cp index.html n1:/usr/share/nginx/html
    docker cp  n1:/usr/share/nginx/html/index.html ./
    #但是这样太麻烦了
    

    Volume实现宿主和容器相通

    docker run -d  --name='n1' -p80:80 -v /html:/usr/share/nginx/html   nginx:1.14
    

    作用数据持久化

    容器挂载容器 用于批量挂载相同目录的容器,

    在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,

    docker run -d  -p 81:80 --volumes-from  n1  --name "nn1" nginx:1.14
    
    

    进入

    docker exec -it nn1 /bin/bash   #挂载的所有文件同步
    

    7.制造本地局域网yum源

    7.1安装

    yum install -y vsftpd
    

    7.2启动

    systemctl   start vsftpd
    

    7.3上传系统镜像

    centos7 的镜像上传到服务器

    7.4配置

    mkdir -p /var/ftp/centos.7.5
    mount -o loop /mnt/centos.7.5.iso  /var/ftp/centos.7.5
    
    cat >/etc/yum.repos.d/ftp_7.repo <<EOF
    [ftp]
    name=ftpbase
    baseurl=ftp://172.168.2.2/centos7.5
    enabled=1
    gpgcheck=0
    EOF
    

    l浏览器访问,就可以查看

    ftp://172.168.2.2/centos7.5
    

    8.镜像制作

    获取镜像

    docker pull centos:6.9
    docker run -it  --name='old_centos' 
    
    

    在容器中安装ssh #必须要启动安装密钥对

    yum install openssh*
    /etc/init.d/sshd start
    

    在宿主机上ssh连接测试

    ssh 172.17.0.2
    

    8.1基于容器制作镜像

    8.11制作阿里云ECS

    [root@docker ~]# docker commit  old_centos  zbb/centos6.9sshd:v1
    sha256:4ed573ae9c3b71c2aa61bf44d1cbeabc9e96d92d57c1539fc7eb0e6fd8c42b7b
    

    查看已经制作成功

    [root@docker ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    zbb/centos6.9sshd   v1                  4ed573ae9c3b        42 seconds ago      352MB
    centos              v1                  0f3e07c0138f        7 weeks ago         220MB
    nginx               1.14                295c7be07902        7 months ago        109MB
    centos              6.9                 2199b8eb8390        8 months ago        195MB
    
    

    用这个镜像创建一个容器

    [root@docker ~]# docker run  -d --name=sshd -p 200:20 4ed573ae9c3b  /usr/sbin/sshd  -D
    

    连接测试

    [root@docker ~]# ssh 172.17.0.2
    root@172.17.0.2's password: 
    

    8.12构建LAMP环境

    启动容器

    docker run -it --name='lamp' -v /var/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html centos:6.9
    

    安装lamp

    [root@5a110938e7a1 /]# yum install -y  openssh* mysql mysql-server httpd php php-mysql
    

    软件初始化

    /etc/init.d/sshd  start 
    
    echo '123' |passwd root --stdin
    

    mysql初始化

    /etc/init.d/mysqld start
    
    mysql> grant all on *.* to root@'%' identified by '123';
    
    mysql> create  database discuz   charset utf8;
    

    apache初始化

    [root@5a110938e7a1 mysql]# /etc/init.d/httpd start 
    
    

    根据容器制作镜像

    [root@docker ~]# docker commit    5a110938e7a1  zbb/centos_lamp:v1
    
    

    根据镜像启动容器

    docker run -it --name='lamp-cs' -p8888:80 -v /var/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html ad3758bb4262
    
    

    启动

    [root@docker ~]# /etc/init.d/httpd start
    [root@docker ~]# /etc/init.d/mysqld start
    
    

    页面访问ip:8888

    创建启动脚本

    cd  /opt/vol/html  #映射目录
    
    

    vim init.sh

    #!/bin/bash
    /etc/init.d/mysqld start
    /etc/init.d/httpd start
    /usr/sbin/sshd -D
    
    

    然后启动容器,运行脚本,就自启动了

    docker run -it --name='lamp-cs2' -p8888:80 -v /var/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html ad3758bb4262  /var/www/html/init.sh
    
    

    centos7问题

    ssh

     docker run -it --name=75sshd centos:7.5.1804
    
    
    yum install -y openssh*
    mkdir /var/run/ssh
    echo 'UseDNS no' >> /etc/ssh/sshd_config
    sed -i -e '/pam_loginuid.so/d'  /etc/pam.d/sshd
    echo 'root:123' |chpasswd
    /usr/bin/ssh-keygen -A
    
    
    docker commit  old_centos  zbb/centos7.5sshd:v1
    
    
    [root@docker ~]# docker run  -d --name=sshd -p 200:20 4ed573ae9c3b  /usr/sbin/sshd  -D
    #ssh测试
    
    

    8.2基于文件创建镜像

    #centos-6.9sshd
    
    #FROM centos:6.9
    
    FROM 2199b8eb8390  #获取镜像
    
    RUN yum install -y openssh*  #执行命令
    RUN /etc/init.d/sshd start && /etc/init.d/sshd start && echo '123' |passwd root --stdin
    EXPOSE 22  #暴露端口
    CMD ["/usr/sbin/sshd","-D"]  #结束的最后执行的命令
    
    
    

    根据镜像创建镜像

    docker image  build  -t  'zbb/centos6.9-sshdv3'  ./
    
    

    创建容器

    docker run -d 897a471638e5
    
    

    查看容器的ip

    docker inspect c10335410d7c
    
    

    连接测试

    ssh 172.17.0.2
    
    

    8.3根据dockerfile 创建LAMP

    #centos-lnmp
    
    FROM centos:6.9
    
    #FROM 2199b8eb8390  #获取镜像
    
    RUN yum install -y  openssh* mysql mysql-server httpd php php-mysql
    
    RUN /etc/init.d/sshd  start && echo '123' |passwd root --stdin  
    #&& /etc/init.d/mysqld start && /etc/init.d/httpd start 
    
    #RUN mysql -e "grant all on *.* to root@'%' identified by '123';create  database discuz   charset utf8;"
    
    COPY index.php   /var/www/html
    COPY init.sh   /
    # ADD  bbs.tar.gz     /var/www/html  会自动解压 还可以传url的文件
    
    EXPOSE 22
    EXPOSE 80
    EXPOSE 3306  #暴露端口
    CMD ["/bin/bash","/init.sh"]  #结束的最后执行的命令
    #VOLUME ['/var/www/html','/data/mysql/data'] 自动挂载卷
    #WORKDIR  进入目录相当于cd
    #ENV  AA_DIR = '/var/www/html' 申明变量   ${AA_DIR}调用
    #ENTRYPOINT 和CMD一样  但是不会被命令行的命令 替换掉
    #USER 指定用户
    
    

    vim index.php

    <?php
    phpinfo();
    ?>
    
    

    vim init.sh

    #!/bin/bash
    echo '123' |passwd root --stdin
    /etc/init.d/mysqld start
    mysql -e "grant all on *.* to root@'%' identified by '123';create  database discuz   charset utf8;"
    /etc/init.d/httpd  start
    /usr/sbin/sshd -D
    
    

    构建镜像

    docker build  -t 'zbb:lnmp' -f Dockerfile
    
    

    制作容器

    docker run  -d  --name='zbb_lnmp'  -p33:22 -p34:80  -p3306:3306  zbb/lnmp
    

    测试 浏览器访问端口 服务器telnet 测试端口开放性

    9.Docker构建私有registry

    搭建docker仓库

    1.启动

    docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry registry
    
    --restart=always  #每次重启doker 容器会自动重启也可以在配置文件中 配置
    "live-restore":true
    

    2.修改配置为文件

    不改配置文件,默认找的是docker hub

    vim /etc/docker/daemon.json

    "insecure-registries": ["127.0.0.1:5000"]
    

    3.重启docker

    systemctl  restart docker
    
    

    4.上传镜像

    docker tag nginx:1.14 127.0.0.1:5000/zbb/nginx:v1
    docker push  127.0.0.1:5000/zbb/nginx
    
    

    5.测试

    删除源镜像,从本地上pull

    docker image  rm -f 295c7be07902
    docker pull 127.0.0.1:5000/zbb/nginx:v1
    
    

    6.本地仓库加安全认证

    yum install  httpd-tools -y
    mkdir /opt/registry-auth/ -p
    htpasswd  -Bbn zbb 123 > /opt/registry-auth/htpasswd
    
    

    重启

    docker rm -f `docker ps -aq`
    
    
    docker run -d -p 5000:5000 -v /opt/registry-auth/:/auth/ -v /opt/registry:/var/lib/registry --name register-auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
    
    

    上传

    docker tag centos:6.9 127.0.0.1:5000/zbb/centos:v1
    docker login 127.0.0.1:5000 
    docker push 127.0.0.1:5000/zbb/centos:v1
    
    

    10.habor实现图形化register

    1.安装

    yum -y install epel-release
    yum install -y docker-compose
    
    

    2.下载harbor

    wget https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.0.tgz
    
    

    3.上传到/opt下

    tar -zxvf harbor-offline-installer-v1.8.0.tgz
    
    

    4.修改harbor.cfg配置文件

    vim harbor.yml

    #修改如下几项
    hostname = 你本机的IP
    harbor_admin_password = admin账号的密码
    
    

    5.编译

    ./install.sh
    
    

    ip地址访问 测试

    6.加入配置文件

    vim /etc/docker/daemon.json

    {
      "registry-mirrors": ["https://u7vs31xg.mirror.aliyuncs.com"],
      "insecure-registries": ["127.0.0.1","129.2x.16.25x"],
      "live-restore": true
    }
    
    

    7.重启

    systemctl restart   docker.service 
    
    

    8.新建项目

    9.项目推送拉取

    docker login  127.0.0.1
    docker tag centos:6.9 127.0.0.1/zbb/centos:v2
    docker push 127.0.0.1/zbb/centos:v2
    
    
    docker image rm -f 127.0.0.1/zbb/centos:v2
    docker pull 127.0.0.1/zbb/centos:v2
    
    

    11.Docker网络类型

    1.查看支持网络类型

    docker network ls
    
    
    [root@docker ~]# docker network ls 
    NETWORK ID          NAME                DRIVER              SCOPE
    7e9072c9bb16        bridge              bridge              local
    7921b218278b        harbor_harbor       bridge              local
    9643c2e650a2        host                host                local
    efabf4ae7459        none                null                local
    
    

    2.测试使用各类网络类型

    none : 无网络模式

    bridge : 默认模式,相当于NAT

    host : 公用宿主机Network NameSpace(不隔离网络资源)

    container : 与其他容器公用Network Namespace(两个容器共用一个端口)

    docker  run  -it  --name="c_h13"  --network=host  centos:6.9 /bin/bash
    

    3.Docker跨主机网络

    4.macvlan

    docker自带无需安装 2台服务器

    docker network create  --driver macvlan --subnet=10.0.0.0/24 --gateway=10.0.0.1 -o parent=eth0 macvlan_1
    #docker network rm  macvlan_1 删除
    
    #docker  run -it --network macvlan_1  --ip=10.0.0.12  busybox  #1
    docker  run -it --network macvlan_1 --ip=10.0.0.13 busybox #2
    

    sudo docker rm $(docker ps -qf status=exited)

    5.overlay

    容器在两个跨主机进行通信的时候,是使用overlay network这个网络模式进行通信;如果使用host也可以实现跨主机进行通信,直接使用这个物理的ip地址就可以进行通信。overlay它会虚拟出一个网络比如10.0.2.3这个ip地址。在这个overlay网络模式里面,有一个类似于服务网关的地址,然后把这个包转发到物理服务器这个地址,最终通过路由和交换,到达另一个服务器的ip地址。

    1.基本配置

    两台服务器host1

    vim /etc/docker/deamon.json

    {
      "registry-mirrors": ["https://u7vs31xg.mirror.aliyuncs.com"],
      "insecure-registries": ["127.0.0.1:5000",],
      "live-restore": true,
      "hosts":["tcp://0.0.0.0:2376","unix://var/run/docker.sock"],
      "cluster-store": "consul://host1_ip:8500",
      "cluster-advertise": "host1_ip:2376"
    }
    
    
    

    host2

    {
      "registry-mirrors": ["https://u7vs31xg.mirror.aliyuncs.com"],
      "insecure-registries": ["127.0.0.1:5000",],
      "live-restore": true,
      "hosts":["tcp://0.0.0.0:2376","unix://var/run/docker.sock"],
      "cluster-store": "consul://host1_ip:8500",
      "cluster-advertise": "host2_ip:2376"
    }
    
    

    会报错,都要改一下配置

    vim /usr/lib/systemd/system/docker.service
    ExecStart=/usr/bin/dockerd
    
    

    都重启

    然后host1安装

    docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
    

    浏览器输入 ip:8500测试

    2.创建overlay网络

    host1

    docker network create -d overlay zbb
    
    docker run -it --network zbb --name zbb01 busybox:latest /bin/sh
    

    host2

    docker network ls #发现也有了
    docker run -it --network zbb --name zbb02 busybox:latest /bin/sh
    
    / # ping zbb01   #通了
    

    至此完成配置

    dcoker network connect zbb zbb05

    6.直接路由模式

    没做过 网上一位大神写的很好 这是博客地址

    https://www.jianshu.com/p/477a62165376
    

    12.抓包分析

    抓包演示

    我们先想一下,我们要抓哪个网卡的包

    • 首先访问宿主机的8088端口,我们抓一下宿主机的eth0

      $ tcpdump -i eth0 port 8088 -w host.cap
      
    • 然后最终包会流入容器内,那我们抓一下容器内的eth0网卡

      # 容器内安装一下tcpdump
      $ sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
      $ apk add tcpdump
      $ tcpdump -i eth0 port 80 -w container.cap
      

    到另一台机器访问一下,

    $ curl 172.21.32.6:8088/
    

    停止抓包,拷贝容器内的包到宿主机

    $ docker cp test:/root/container.cap /root/
    

    把抓到的内容拷贝到本地,使用wireshark进行分析。

    $ scp root@172.21.32.6:/root/*.cap /d/packages
    

    (wireshark合并包进行分析)

    13.调试分析

    调试或者排查容器启动错误

    ## 若有时遇到容器启动失败的情况,可以先使用相同的镜像启动一个临时容器,先进入容器
    $ docker exec -ti --rm <image_id> bash
    ## 进入容器后,手动执行该容器对应的ENTRYPOINT或者CMD命令,这样即使出错,容器也不会退出,因为bash作为1号进程,我们只要不退出容器,该容器就不会自动退出
    

    参考文档:docker中文

    http://www.dockerinfo.net/document

    参考书籍:Docker开发指南

    https://www.zhuimengnan.com/docker.pdf

  • 相关阅读:
    MyBatis mapper.xml中SQL处理小于号与大于号 和小于等于号
    iOS打包时Export的四个选择是什么意思?
    Xcode中New Build System和 Legacy build system的区别
    Xcode中Debug、Profile、Release的区别
    versionCode和versionName区别
    Android Studio 3.5 plugin中找不到Flutter插件
    Javascript 面向对象编程(一):封装
    Flutter-常用第三方库
    iOS info.plist 中的隐私权限
    Flutter打包ios应用流程详解
  • 原文地址:https://www.cnblogs.com/zdqc/p/11941536.html
Copyright © 2020-2023  润新知