• 学习Docker(二)


    一、Docker快速入门

    Docker 改变了什么?

    1.简化配置
    2.流水线管理
    3.应用隔离
    4.提高开发效率
    5.快速部署
    6.面向产品:产品交付
    7.面向开发:简化环境配置
    8.面向测试:多版本测试
    9.面向运维:环境一致性
    10.面向架构:自动化扩容(微服务)

    1、安装、启动

    1、配置yum源
    http://mirrors.aliyun.com/centos/7/extras/x86_64/
    http://mirrors.aliyun.com/centos/7/os/x86_64/
    http://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/
    2、安装
    yum install docker-ce -y
    
    3、启动
    systemctl start docker

    2、配置远程访问和第三方仓库

    1、修改配置脚本
    vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd
    2、配置启动参数(默认daemon文件没有)
    vim /etc/docker/daemon.json
    {
    "registry-mirrors":  ["http://hub-mirror.c.163.com"],
    "data-root": "/opt/docker",
    "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"] }
    配置daemon文件参数,不能和docker.service文件里ExecStart一致,否则会冲突。
    3、重载配置并重启 systemctl daemon‐reload systemctl docker restart docker daemon ‐‐help 这里可以查看到所有支持的参数

    3、简单操作

    ctrl+PQ  保存容器退出
     
    #帮助
    docker --hlep
    docker deamon --help
     
    #查看镜像
    docker images  
     
    #查看镜像环境
    docker image inspect xxx
     
    #搜索镜像
    docker search centos  
     
    #下载镜像
    docker pull docker.io/centos
     
    #导出镜像
    docker save centeos >/tmp/centos.tar.gz
     
    #导入镜像
    docker load --input centos.tar
    docker load centos.tar
     
    #删除镜像
    docker rmi 镜像ID(IMAGE ID)
     
    #删除容器
    docker rm mydocker
    docker rm -f mydocker(删除正在运行的容器)
    docker run --rm centos /bin/echo "hehe"  运行后删除容器
     
    #启动容器
    docker run centos /bin/echo 'Hello world'
    docker start mydocker   
     
    #显示镜像状态
    docker ps -a 
     
    #更改名称
    docker run --name mydocker -t -i centos /bin/bash
     
    #后台运行容器
    docker run -d -P nginx
     
    #查看容器访问日志
    docker logs e6b599b46241
    docker logs mydocker
     
    #查看容器映射的端口
    docker port mydocker
     
    #数据卷
    docker run -d --name test1 -v /data nginx
    docker inspect -f {{.Mounts}} mynginx ##查找上面方法,默认挂载的位置
    -v src:dst          #源:目的
    -v src:dst:ro       #加ro 为只读
     
    #挂载单文件
    -v srcfile:dstfile  #源文件:目的文件
     
    --volumes-from      
    docker run -d --name test2 --volumes-from test1 cenos /bin/bash
    #数据卷容器。让此数据卷在多个容器之间共享,test1为已经挂载数据卷的容器名。
     
    #结束正在运行的所有容器
    docker kill $(docker ps -a -q) 
     
    #删除所有容器
    docker rm $(docker ps -a -q)

    4、进入容器

    方法1
    docker attach mydocker(不安全,不推荐)
    同时进入2次容器,一个窗口执行的命令,另个窗口可以看到,不安全。

    方法2(执行命令返回结果) docker exec
    -it mydocker /bin/bash docker exec mydocker whoami
    方法3(复杂)
    yum install -y util-linux
    docker inspect --help
    nsenter --help
    docker inspect -f "{{ .State.Pid}}" mydocker
    nsenter -t 3729 -m -u -i -n -p nsenter --target 3729 --mount --uts --ipc --net --pid

    5、网络访问

    随机映射
    docker run -P
    
    指定映射
    -p 81:80 -p 443:443 
    docker run -d -p 192.168.1.253:81:80 nginx

    6、容器间互联

    方法1
    docker --name web2 --link web1  -d -p 8080:80 mynginx nginx   
    docker exec -it web2 sh   
      cat /etc/hosts        #查看    
    docker inspect web1     #查看容器信息
    
    方法2 docker
    -d --name web2 --link web1:shop_web -p 8080:80 mynginx nginx cat /etc/hosts #查看 有变化,shop_web为别名

    7、手动构建容器

    1、在centos镜像基础上安装nginx
    docker run --name mynginx -it centos
    rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    yum install -y nginx
    vi /etc/nginx/nginx.conf
    daemon off;
    
    2、保存镜像
    docker commit -m "My-Nginx" 148aca4d9f2e oldboy/mynginx:v1
    -m 描述信息
    
    3、启动构建好的容器
    docker run --name test1 -d -p 80:80 qinzc/mynginx:v1  nginx

    8、自动构建容器

    1、编写dockerfile
    vim  /opt/dockerfile/nginx/Dockerfile
    
    #基础镜像
    FROM centos
     
    #维护人的信息
    MAINTAINER Zicheng.Qin 542129333@qq.com
     
    #安装执行
    RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    RUN yum -y install nginx && yum clean all
    RUN echo "daemon off;" >> /etc/nginx/nginx.conf
    
    #添加文件
    ADD index.html /user/share/nginx/html/index.html
    
    #开放端口
    EXPOSE 80
    
    #容器执行命令
    CMD ["nginx"]
    
    2、开始构建
    echo "nginx in docker,hahaha" > index.html 
    docker build -t oldboy/mynginx:v2  /opt/dockerfile/nginx/
    
    3、启动
    docker run --rm --name test -d -p 80:80  mynginx:v2

    9、Docker网络

    1)Docker 创建自定义网络

    1、创建网络
    docker network create --driver bridge --subnet 10.10.0.0/24 --gateway 110.10.0.1 my_net
    
    2、查看 docker network ls
    3、验证测试指定IP dokcer run -it --rm --network=my_net --ip 10.10.0.88 nginx 4、给容器添加自定义的网段 docker network connect my_net 容器ID

    默认网络

    docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    a12599cda63c        bridge              bridge              local
    e24ca1f8f76d        host                host                local
    2ab615faf494        none                null                local
    
    默认带有3种网络驱动
    bridge:        NAT模式,默认使用
    host :         会走物理网卡,只能起一个对应端口容器。相当于复制物理机IP来访问。
    none :         容器内只有回环地址。需要API等配置。
    
    案例:docker run -it --rm --net=host -p 80:80 centos bash

    2)跨主机通信 (指定路由方法)

    1、首先保证两台主机之间能正常通信。
    2、更改Docker默认的网卡IP,使之间不同网段。

    环境

    第一台宿主机:(IP:192.168.1.100)
    第二台宿主机:(IP:192.168.1.200)
    
    进入容器,查看各自IP,ping对方容器IP看看是否畅通(一般不通)
    docker run -it --name node1 centos bash  (容器1 IP:192.58.1.2)
    docker run -it --name node2 centos bash  (容器2 IP:192.68.1.2

    配置静态路由

    宿主机1上配置一条路由到宿主机2  (演示:临时生效)
    
    route add -net 192.158.1.0/24 gw 192.168.1.200   
    最后进入容器测试是否能ping宿主机2,到此主机间容器互联配置完毕

    3)跨主机通信 (overlay)

    consul实现跨容器互通

    需要用到配置管理中心consul,实现跨容器互通

    准备环境

    consul管理中心(IP:192.168.1.99)
    docker pull progrium/consul 
    docker run -d -p 8500:8500 -name consul  progrium/consul  -server -bootstrap
    
    第一台宿主机:(IP:
    192.168.1.100) vim /etc/docker/daemon.json 增加: { "cluster-store":"consul:192.168.1.99:8500", "cluster-advertise":"192.168.1.100:2375" } 保存后: systemctl daemon-reload #重载配置 systemctl restart docker #记得关闭防火墙,selinux之类的。
    第二台宿主机:(IP:
    192.168.1.200) vim /etc/docker/daemon.json 增加: { "cluster-store":"consul:192.168.1.99:8500", "cluster-advertise":"192.168.1.200:2375" } 保存后: systemctl daemon-reload #重载配置 systemctl restart docker #记得关闭防火墙,selinux之类的。

    开始配置

    1.第一台宿主机:(IP:192.168.1.100)
    
    创建网络:    
    docker network create
    -d overlay my_net1 验证是网络否创建同步:
    docker network ls,到第二台宿主机执行同样命令,看看my_net1网络是否同步过去。 运行容器 docker run
    -it --rm --network my_net1 nginx
    2.第二台宿主机:(IP:192.168.1.200) 运行容器 docker run -it --rm --network my_net1 nginx

    验证

    进入容器,Ping对端容器IP,一般就可以通信了。

    10、docker 日志收集

    环境准备

    sysctl vm.max_map_count=262144 
    docker pull sebp/elk

    运行ELK容器

    docker run -p 56015601 -p 92009200 -p 5044:5044 -it --rm --name elk sebp/elk
    #容器启动后执行下面地址验证es是否启动成功
    http://192.168.1.xx:9200/_search?pretty

    安装fluentd软件(与elk容器安装同一台机)

    docker pull fluent/fluentd        #拉取软件
    mkdir /fluentd_log                #创建一个收集日志后保存的路径
     
    docker run -d -p 24224:24224 -p 24224:24224/udp -v /fluentd_log:/fluentd/log fluent/fluentd

    安装日志收集工具filebeat (与elk容器安装同一台机)

    1、安装
    https://artifacts.elastic.co/downloads/beats/filebeat/filebeat rpm -ivh filebeat-6.x.x-x86_l4.rpm
    2、配置
    vim
    /etc/filebeat/filebeat.yml enabled:true #开启 paths: - /var/log/*.log #注释掉这行日志目录 - /data/docker/containers/*/*.log #注释,此目录为容器ID - /fluentd_log #添加这行 output.elasticsearch: hosts:["192.168.1.xx:9200"] #改成ES地址 3、启动 /etc/init.d/filebeat start #启动 filebeat /etc/init.d/filebeat status #查看 filebeat 状态

    修改docker日志驱动,发送日志到fluentd软件

    (要收集日志的 主机修改此文件)
    vim /etc/docker/daemon.json
    {
        "log-driver":“fluent”,
        "log-opts":{
            "fluentd-address":"192.168.1.xx:24224",
            "tag":"linux-node4.xx.com"   #标识,改成自己主机名
            }
    }
     
    systemctl daemon-reload              #重载配置
    systemctl restart docker             #记得关闭防火墙,selinux之类的。

    容器时间同步方法

    docker exec d2kldds23 mkdir /usr/share/zoneinfo -p
    docker cp /usr/share/zoneinfo/Asia  d2kldds23:/usr/share/zoneinfo/Asia
    docker restart d2kldds23

    11、Docker 单机编排入门

    Docker-compose 容器编排
    LNMP场景

    LN:        A容器
    MYSQL:    B容器
    Redis:    C容器
    
    1、想启动A容器时,B容器必须先启动。
    2、C容器要启动,B容器必须先启动。 实现方法,就是使用docker-compose单机编排工具 Docker-compose

    环境准备

    yum -y install python-pip
    pip install docker-compose
    #如果下载启动有问题可到gitbug下载二进制版本,chmod +x 给执行权限即可
    https://github.com/docker/compose/releases

    创建docker-compose.yml编排文件

    web1:
      image: nginx
      volumes:
        - /root/docker/index1.html:/usr/share/nginx/html/index.html
      expose:
        - 80
    
    web2:
      image: nginx
      volumes:
        - /root/docker/index2.html:/usr/share/nginx/html/index.html
      expose:
        - 80
    
    haproxy:
      image: haproxy
      volumes:
        - /root/docker/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
      links:
        - web1
        - web2
      ports:
        - "7777:1080"
        - "80:80"

    启动编排

    docker-compose up    /root/docker/ocker-compose.yml 
    docker-compose -d up /root/docker/ocker-compose.yml   #生产环境加-d参数,后台启动

    haproxy.cfg

    global
    log 127.0.0.1 local0
    log 127.0.0.1 local1 notice
    maxconn 4096
    
    defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000ms
    timeout client 5000ms
    timeout server 5000ms
    
    listen stats
    bind 0.0.0.0:1080
    mode http
    stats enable
    stats hide-version
    stats uri /stats
    stats auth admin:admin
    
    frontend balance
    bind 0.0.0.0:80
    default_backend web_backends
    
    backend web_backends
    mode http
    option forwardfor
    balance roundrobin
    server web1 web1:80 check
    server web2 web2:80 check

     12、搭建Docker私有仓库(Harbor)

    1)Harbor简介

    Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

    2)下载和配置Harbor

    环境说明

    系统版本:               CentOS7.x
    docker-ce:             18.03.1-ce
    docker-compose:        version 1.22.0
    Harbor:                v1.7.0
    安装方式:               在线安装
    安装位置:               /volume1/harbor

    ####安装Harbor需要先安装docker和docker-compose###

    下载安装包

    从 github harbor 官网 release 页面下载指定版本的安装包,因为是谷歌的地址,国内下载不了,饭墙下载后在传到服务器上即可。
    
    #在线安装包
    $ wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-online-installer-v1.7.0.tgz
    $ tar xvf harbor-online-installer-v1.7.0.tgz
    #离线安装包
    https://storage.googleapis.com/harbor-releases/release-1.5.0/harbor-offline-installer-v1.5.0-rc2.tgz

    配置Harbor

    解压缩之后,找到/volume1/harbor/harbor.cfg文件,该文件就是Harbor的配置文件。
    
    vim /usr/local/harbor/harbor.cfg
     
    # hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhost
    hostname = 192.168.1.11
     
    # 访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on
    ui_url_protocol = http
     
    # mysql数据库root用户默认密码root123,实际使用时修改下
    db_password = root123
     
    #邮箱根据情况配置,发送重置密码邮件时使用,也可以不配置
    email_server = smtp.qinzc.me
    email_server_port = 25
    email_username = admin@qinzc.me
    email_password = 12345678
    email_from = admin <admin@qinzc.me>
    email_ssl = false
     
    #设置只有管理员可以创建项目
    project_creation_restriction = adminonly
     
    # 启动Harbor后,管理员UI登录的密码,默认是Harbor12345
    harbor_admin_password = Harbor12345
     
    # 认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是db_auth,mysql数据库认证
    auth_mode = db_auth
     
    # 是否开启自注册
    self_registration = on
     
    # Token有效时间,默认30分钟
    token_expiration = 30
     
    # 用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员)
    project_creation_restriction = everyone

    3)安装Harbor

    执行安装脚本
    
    /volume1/harbor/install.sh
    修改完配置文件后,在的当前目录执行./install.sh,Harbor服务就会根据当期目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动各个服务,Harbor依赖的镜像及启动服务如下:
    
    # docker images
    REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
    goharbor/chartmuseum-photon     v0.7.1-v1.7.0       666d74cc236a        2 weeks ago         111MB
    goharbor/harbor-migrator        v1.7.0              482699d98927        2 weeks ago         799MB
    goharbor/redis-photon           v1.7.0              8adff755797f        2 weeks ago         96.1MB
    goharbor/clair-photon           v2.0.7-v1.7.0       7e72f6ba05bd        2 weeks ago         165MB
    goharbor/notary-server-photon   v0.6.1-v1.7.0       b4a22960dfce        2 weeks ago         102MB
    goharbor/notary-signer-photon   v0.6.1-v1.7.0       bb0db7ebd1de        2 weeks ago         99.6MB
    goharbor/harbor-registryctl     v1.7.0              1906a8b84fa5        2 weeks ago         101MB
    goharbor/registry-photon        v2.6.2-v1.7.0       677f21b09362        2 weeks ago         86.4MB
    goharbor/nginx-photon           v1.7.0              6ed96fc73f83        2 weeks ago         35.5MB
    goharbor/harbor-log             v1.7.0              722fa4a77846        2 weeks ago         81MB
    goharbor/harbor-jobservice      v1.7.0              effd390c0cd4        2 weeks ago         83.8MB
    goharbor/harbor-core            v1.7.0              2ebd58ce5638        2 weeks ago         95.2MB
    goharbor/harbor-portal          v1.7.0              72a291f86bab        2 weeks ago         40.2MB
    goharbor/harbor-adminserver     v1.7.0              9f850341a571        2 weeks ago         72MB
    goharbor/harbor-db              v1.7.0              45d94fe5fee5        2 weeks ago         133MB
    microbox/dockerui               latest              c3452e32cfe9        3 years ago         10.4MB
     
    # docker-compose ps
           Name                     Command                       State                                         Ports                               
    ------------------------------------------------------------------------------------------------------------------------------------------------
    harbor-adminserver   /harbor/start.sh                 Restarting                                                                                
    harbor-core          /harbor/start.sh                 Up (health: starting)                                                                     
    harbor-db            /entrypoint.sh postgres          Up (healthy)            5432/tcp                                                          
    harbor-jobservice    /harbor/start.sh                 Up                                                                                        
    harbor-log           /bin/sh -c /usr/local/bin/ ...   Up (healthy)            127.0.0.1:1514->10514/tcp                                         
    harbor-portal        nginx -g daemon off;             Up (healthy)            80/tcp                                                            
    nginx                nginx -g daemon off;             Up (healthy)            0.0.0.0:433->443/tcp, 0.0.0.0:4433->443/tcp, 0.0.0.0:80->80/tcp
    redis                docker-entrypoint.sh redis ...   Up                      6379/tcp                                                          
    registry             /entrypoint.sh /etc/regist ...   Up (healthy)            5000/tcp                                                          
    registryctl          /harbor/start.sh                 Up (healthy)
    启动完成后,访问刚设置的hostname设置的即可 进行管理http://192.168.1.11 ,可以修改docker-compose.yml文件更改对应服务的端口映射。 自此私有仓库搭建完毕。

    4)客户端配置

    因为docker 默认不支持http方式登陆,所以客户端要以http方式登陆,需修改下配置。
    
    方法一:
    vim /usr/lib/systemd/system/docker.service
     ExecStart=/usr/bin/dockerd   --insecure-registry 192.168.1.11    #增加镜像地址
    
    方法二: 创建
    /etc/docker/daemon.json文件,在文件中指定仓库地址 "insecure-registries":["192.168.1.11"] 完成后从载配置,重启docker systemctl daemon-reload systemctl restart docker

    5)测试上传和下载镜像

    1.客户端登陆
    docker login 192.168.1.11
    Username (admin): 
    Password: 
    Login Succeeded
    
    2.创建Dockerfile vim Dockerfile FROM centos:centos7.1.1503 ENV TZ "Asia/Shanghai"
    3.创建镜像 docker build -t 192.168.1.11/library/centos7.1:0.1 /opt/
    4.把镜像push到Harbor docker push 192.168.1.11/library/centos7.1:0.1 如果是从其他仓库pull下来的镜像,记得先执行 docker tag 给镜像做tag 才能push,例如: docker pull busybox docker tag busybox:latest 192.168.1.11/library/busybox:latest docker push 192.168.1.11/library/busybox:latest 格式如下: #docker tag 镜像 域名/项目名称/镜像名:版本 docker tag SOURCE_IMAGE[:TAG] 192.168.1.11/library/IMAGE[:TAG] # docker push 更改tag后的镜像名 docker push 192.168.1.11/library/IMAGE[:TAG]
    5.登录web页面查看镜像 查看上传的镜像。 6.拉取上传到Harbor的镜像 docker pull 192.168.1.11/track/busybox:latest

     13、Docker数据卷

    数据卷的作用

    1:持久化容器运行过程中产生的数据文件
    2:实现多个容器间的文件共享。

    容器数据持久化

    1、数据卷:将本地磁盘文件或文件夹挂载到容器里
    -v /dest
    -v src:dst [ro]|[rw]
    docker run -it  --name mynginx1 -v /data/nginx:/etc/nginx/conf.d  nginx
    2、数据卷容器:将外部容器分享给容器 --volumes-from 数据卷容器专门用来挂载数据卷的容器,以供其他容器引用和使用
    docker run -it --volumes-from mynginx1 --name mynginx2 nginx
    3、数据卷管理命令 docker volume create 创建数据卷
    docker volume ls    查看数据卷
    docker volume inspect    查看数据卷的属性
    docker volume rm    删除数据卷

    一个容器的volume可以被多个容器同时共享,当容器被删除时,volume不会被自动删除,需要手动来删除。

    关于Docker清理

    ocker system df:                               查看Docker的磁盘使用情况
    docker images                                   列出docker镜像
    docker ps                                       列出docker容器
    docker volume ls                                列出docker数据卷
    docker network ls                               列出docker网络
    docker info                                     列出容器镜像的数量以及一些docker 安装等系统信息。
    
    docker system prune                             清除未使用的数据与进程,默认没有清除数据卷的功能
    
    docker container prune                          清除停止的容器;
    docker volume prune                             清除未使用的数据卷;
    docker image prune                              清除未使用的镜像;
    
    docker container rm $(docker container ls -a -q) / docker rm $(docker ps -a -q);  清除容器 
    docker image rm $(docker images ls -a -q);       清除镜像 
    docker volume rm $(docker volume ls -q);         清除数据卷 
    docker network rm $(docker network ls -q);       清除网络 
    docker rm $(docker ps -a -q)                     删除所有已经停止的容器;
    docker rmi $(docker images -q -f dangling=true)  删除未打标签的镜像
  • 相关阅读:
    css 设置特定宽度,超出部分用...代替
    php 二维数组根据某个key去重
    一些大厂开源项目
    JavaScript如何解析本地xml文件
    console的知识点
    toLocalDateString的用途
    在Vue中使用Object.freeze
    淘宝npm镜像
    JavaScript Async/Await
    vue中的addEventListener和removeEventListener
  • 原文地址:https://www.cnblogs.com/wuhg/p/12072876.html
Copyright © 2020-2023  润新知