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

    Docker基础

    一 docker 容器介绍

    1.1 docker的理念

    一次构建,多处运行、
    拒绝ssh,日抛型的隐形眼镜

    1.2 docker的组成

    CS架构

    组成与组件
    docker由docker server和docker client组成
    docker组件包括镜像、容器、仓库

    docker对比kvm

    类别 Docker KVM/OpenStack
    部署难度 非常简单 组件多,部署复杂
    启动速度 秒级 分钟级
    执行性能 与物理系统几乎一致 VM会占用一些资源
    镜像体积 镜像是MB级别 虚拟机镜像是GB级别
    管理效率 管理简单 组件相互依赖,管理复杂
    隔离性 隔离性高 彻底隔离
    可管理性 单进程,不建议启动SSH 完成的系统管理
    网络连接 比较弱 建筑Neutron可以了灵活组建各类网络架构

    1.3 docker 能干什么

    简化配置
    流水线管理
    提高开发效率
    应用隔离
    整合服务器资源
    debug
    多租户能力??
    快速部署

    1.4 docker改变了什么

    产品交付:直接交付镜像 dockerfile
    面向开发:简化环境配置
    面向测试:多版本测试 -- 较少提测排队时间
    面向运维:环境一致性
    面向架构:自动化扩容(微服务)

    1.5 基于docker的不可变基础设施

    故障来源于变更
    用替换的方式来做变更、回滚
    一旦上线 上线的内容不可变

    二 Docker镜像和容器管理

    2.1 相关站点

    Docker官网
    Docker官方文档
    阿里云镜像站
    Docker HUB

    2.2 Docker部署与实践

    系统环境:

    cat /etc/redhat-release
    CentOS Linux release 7.4.1708 (Core)
    

    2.2.1 安装docker-ce源

    cd /etc/yum.repos.d/
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    

    2.2.2 安装docker-ce

    yum install docker-ce -y
    

    2.2.3 启动docker

    systemctl enable docker.service
    systemctl start docker.service
    # 无法启动 删除/var/lib/docker  重新下载
    
    

    2.2.4 常用命令

    docker search centos # 搜索镜像
    docker pull centos
    docker images
    # 镜像导出 当前路径下
    docker save -o centos.tar centos:latest
    # 镜像导入
    docker load < centos.tar # <==> docker --input centos.tar 
    # 镜像删除
    docker rmi images_name # <==>  docker rmi images_id
    

    安装系统 并没有安装系统内核,只是lib库之类的。
    所以即使在centos的宿主机上起了ubuntu的容器,但是设计到内核的一些特性,还是依赖于centos系统。反之亦然

    启动容器 即是启动镜像
    可以启动一个已经pull下来的镜像,也可以启动一个不存在的镜像

    docker run centos /bin/echo 'Hello world'
    docker ps -a # -a 看到所有的容器 包括已经exited的
    

    docker run的时候 先检查本地是否有镜像 ,没有就先pull

    docker在会在前台运行一个任务,任务结束,容器即停止。
    如果我们用docker运行一个nginx,那我们需要保证这个nginx任务不能停止。

    docker run --name mydocker -t -i centos /bin/bash   # -t tty 分配一个伪终端 -i 标准输入  
    
    [root@linux-node1 ~]# docker run --name mydocker -t -i centos /bin/bash
    [root@f17f755eedee /]# ps -aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.6  0.0  11820  1908 pts/0    Ss   06:57   0:00 /bin/bash
    root        14  0.0  0.0  51708  1700 pts/0    R+   06:58   0:00 ps -aux
    [root@f17f755eedee /]# exit
    

    此时执行docker ps -a会发现刚才起的容器已经退出。因为我们在这个docker运行的任务是/bin/bash。退出了bash,容器就自动停止了。

    docker start mydocker
    docekr stop mydocker
    docker run .... -h hostname # 指定主机名
    

    2.2.6 进入容器的三张方式

    1. attach
    docker attach mydocker  # 缺点 多个窗口同步进入  会同步显示,一个命令阻塞,所有窗口无法操  退出即终止
    退出方式:ctrl + P  再+q
    
    1. nsenter # namespace enter nsenter 进入容器 需要容器的pid
      生产中用到的比较多
    # 需要安装  
    yum install util-linux
    

    获取docker详情

    docker inspect mydocker 
    

    只获取容器pid:(容器第一个进程的PID)

    docker inspect --format "{{.State.Pid}}"  mydocker
    

    nsenter进入容器

     nsenter  --target 19265 --mount --uts --ipc --net --pid
     # --mount 指定命名空间
     # 。。。
    

    这时候执行exit 不会退出docker里面的bash, docker进程不会终止

    进入脚本:

    #!/bin/bash
    
    # Use nsenter to access docker
    
    docker_in(){
       NAME_ID=$1
       PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID) 
       nsenter -t $PID -m -u -i -n -p
    }
    
    docker_in $1
    
    1. docker exec
      这个命令用来在 一个正在运行的容器中去执行命令
    docker exec mydocker whoami   
    

    可以巧妙的利用这个命令去进入容器

    docker exec -it mydocker /bin/bash
    

    docker exec 退出不影响进程。

    三种方式总结
    attach 使用的是容器本身的bash 所以exit退出 会停止容器
    nsenter 和 docker exec是开启了一个新的bash

    docker inspest docker_name # 容器详情 用法:可以使用-f指定参数
    docker rm docker_name  # 删除正在运行的容器会报错 需要先stop 可强制删除 -f  生产禁止!
    docker run --rm centos /bin/echo "hehe" # 退出自动删除容器 --rm 测试用
    

    2.2.7 docker支持tcp连接管理

    vim /usr/lib/systemd/system/docker.service
    # 修改配置
    # ExecStart=/usr/bin/dockerd
    # ExecStart=/usr/bin/dockerd -H tcp://192.168.56.12 # 重启会发现本地docker命令找不到socket
    ExecStart=/usr/bin/dockerd -H tcp://192.168.56.12 -H unix://var/run/docker.sock
    
    systemctl daemon-reload
    systemctl restart docker.service
    

    查看端口 默认:2375

    netstat  -lntup
    #####
    tcp        0      0 192.168.56.12:2375      0.0.0.0:*               LISTEN      29849/dockerd
    

    我们可以在其他机器通过tcp管理这台机器上的docker

    [root@linux-node1 ~]# docker -H 192.168.56.12 info
    
    

    2.2.8 docker其他命令

      attach      Attach local standard input, output, and error streams to a running container
      build       Build an image from a Dockerfile
      commit      Create a new image from a container's changes
      cp          Copy files/folders between a container and the local filesystem
      create      Create a new container
      diff        Inspect changes to files or directories on a container's filesystem
      events      Get real time events from the server
      exec        Run a command in a running container
      export      Export a container's filesystem as a tar archive
      history     Show the history of an image
      images      List images
      import      Import the contents from a tarball to create a filesystem image
      info        Display system-wide information
      inspect     Return low-level information on Docker objects
      kill        Kill one or more running containers
      load        Load an image from a tar archive or STDIN
      login       Log in to a Docker registry
      logout      Log out from a Docker registry
      logs        Fetch the logs of a container
      pause       Pause all processes within one or more containers
      port        List port mappings or a specific mapping for the container
      ps          List containers
      pull        Pull an image or a repository from a registry
      push        Push an image or a repository to a registry
      rename      Rename a container
      restart     Restart one or more containers
      rm          Remove one or more containers
      rmi         Remove one or more images
      run         Run a command in a new container
      save        Save one or more images to a tar archive (streamed to STDOUT by default)
      search      Search the Docker Hub for images
      start       Start one or more stopped containers
      stats       Display a live stream of container(s) resource usage statistics
      stop        Stop one or more running containers
      tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
      top         Display the running processes of a container
      unpause     Unpause all processes within one or more containers
      update      Update configuration of one or more containers
      version     Show the Docker version information
      wait        Block until one or more containers stop, then print their exit codes
    
    

    2.2.9 docker run 命令

    --cpuset-cpus 0  # 绑定运行在0号CPU上
    -c 2048         # 指定cpu权重 默认1024
    
    dockr run --help
    

    三 Docker的网络访问和数据管理

    3.1 Docker网络

    3.1.1 docker网络访问

    运行一个docker nginx

     docker pull nginx
     docker images
     docker run -d -P nginx  # -d 后台 -P 随机端口映射
     docker ps  # 可以查看到一个随机端口,可以通过这个端口访问
     docker logs ‘docker_id(name)’ # 查看日志 nginx运行在前台
    
    docker run -d -p 3333:80 --name nginx-demo nginx # -p 指定映射端口,宿主机多个ip时 可以指定地址映射 
    # 可以只指定ip 不指定端口
    # 默认协议tcp 可以 :udp 指定协议
    docker port docker_name  # 查看一个容器的映射端口 
    ### 
    -d, --detach       Run container in background and print container ID
    如果在docker run后面追加-d=true或者-d,那么容器将会运行在后台模式。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行docker attach来重新附着到该容器的会话话中。需要注意的是,容器运行在后台模式下,是不能使用--rm选项的。
    

    208baf606979cf08d5ad08cdeea263fd.png

    3.2.2 docker内网互通

    同宿主机上内网互通

    1、link 单机容器互通常用(别名)

    docker run -itd --name test1 192.168.56.11/app/jenkins
    docker run -itd --link test1:t1 --name test2 192.168.56.11/app/jenkins
    ## link Add link to another container,可以在test2中通过主机名t1访问test1
    

    2、docker network

    # 默认有三种模式
    [root@linux-node1 ~]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    89f45a7a5f5d        bridge              bridge              local
    26f0654bc9db        host                host                local
    ed3b95232e9f        none                null                local
    
    

    host模式

    # hosts模式,网卡模式与宿主机模式一致
    # 先启动一台nginx 映射80端口
    docker run --rm -itd --name test1 -p 80:80  nginx
    #再绑定host网卡启动,不映射端口,前台运行,会发现报端口占用。
    docker run --rm -it --name test2  --net=host  nginx
    
    
    # 优点:充分利用网卡的性能
    # 缺点:容易对本地端口进行占用
    # 只有对网络性能要求比较高的情况下才使用
    
    

    bridge模式

    docker rm -f $(docker ps -a -q)
    # 创建一张自己的桥接网卡
    docker network create --driver bridge gm0
    docker network ls
    # 查看网卡信息
    [root@linux-node2 ~]# ifconfig
    br-8aac39faf141: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
            inet6 fe80::42:1eff:fe1f:b0e6  prefixlen 64  scopeid 0x20<link>
            ether 02:42:1e:1f:b0:e6  txqueuelen 0  (Ethernet)
            RX packets 26  bytes 2340 (2.2 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 26  bytes 2340 (2.2 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
            inet6 fe80::42:cdff:fed3:42bd  prefixlen 64  scopeid 0x20<link>
            ether 02:42:cd:d3:42:bd  txqueuelen 0  (Ethernet)
            RX packets 2644  bytes 112598 (109.9 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 4596  bytes 6442280 (6.1 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    # 创建两台容器,查看IP
    docker run --rm -itd -p 81:80  --name test1   nginx
    # 172.17.0.2
    docker run --rm -itd -p 82:80  --name test2   --network=gm0  nginx
    # 172.18.0.2
    
    ## 生产环境指定网段
    docker network create --driver bridge --gateway 192.168.10.1 --subnet 192.168.10.0/24 gm1
    
    # --bridge  指定驱动
    # --gateway 设定网关
    # --subnet  设置子网
    
    [root@linux-node2 ~]# ifconfig
    br-8aac39faf141: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
            inet6 fe80::42:1eff:fe1f:b0e6  prefixlen 64  scopeid 0x20<link>
            ether 02:42:1e:1f:b0:e6  txqueuelen 0  (Ethernet)
            RX packets 26  bytes 2340 (2.2 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 26  bytes 2340 (2.2 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    br-bd9624c7d8ac: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 192.168.10.1  netmask 255.255.255.0  broadcast 192.168.10.255
            ether 02:42:a7:91:11:ce  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
            inet6 fe80::42:cdff:fed3:42bd  prefixlen 64  scopeid 0x20<link>
            ether 02:42:cd:d3:42:bd  txqueuelen 0  (Ethernet)
            RX packets 2644  bytes 112598 (109.9 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 4596  bytes 6442280 (6.1 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    # 指定新网卡创建容器
    docker run --rm -itd -p 83:80  --name test3   --network=gm1  nginx
    # 192.168.10.2
    
    # 指定新网卡创建容器,并指定ip
    docker run --rm -itd -p 83:80  --name test3   --network=gm1 --ip=192.168.10.250 nginx
    # 192.168.10.250
    
    docker run --rm -it --ip 192.168.10.247  --name test11   --network=gm1  centos
    docker run --rm -it --ip 192.168.10.248  --name test12   --network=gm1  centos
    # 在两台容器中,互ping对方容器名称,可以直接ping通。
    # 这个解析只对我们自定义的网络有效,可通过容器名进行解析。
    # 1. 自建网络 2. 主机名不存在解析
    
    

    不同docker网卡创建的容器如何互通(不同网段)

    # 可以将一个容器绑定到另一个网卡上
    # docker run --rm -it --ip 192.168.10.248  --name test12   --network=gm1  centos
    docker network  connect gm0 test12
    # 此时test12 可以ping通绑定gm0网卡的容器。 这时test12会有两个ip,分别和两个网段进行通信
    
    跨主机之间的docker容器互通
    1. consul overlay全局网卡 。 。 。
    2. Flanneld + Etcd

    3.2 Docker数据数据存储

    3.2.1 数据卷

    volumes

    -v /data
    # 挂载一个目录到容器的/data目录下。挂到哪儿?
    
    docker run -d --rm --name nginx-test1 -v /data nginx
    docker inspect nginx-test1 # 找到Mounts信息
    

    可以发现,我们不指定挂载源,docker默认挂载到:/var/lib/docker/volumes/下,可以创建文件测试下

            "Mounts": [
                {
                    "Type": "volume",
                    "Name": "7171f9f4d0602af66d6aa0eb35733f09a35c84ac070480030c3aec469c4515a4",
                    "Source": "/var/lib/docker/volumes/7171f9f4d0602af66d6aa0eb35733f09a35c84ac070480030c3aec469c4515a4/_data",
                    "Destination": "/data",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
    

    生产常用 指定源挂载

    -v src:det 
    
    docker run -d --name nginx-test2 -v /data/docker-volume-ngninx:/data nginx  # src 目录会自动创建 (touch文件测试)
    

    3.2.2 数据卷容器

    开发环境: 挂载代码目录 -v /src:/dst
    生产环境:存储持久化数据

    --volumes-from
    一个特殊的容器

    # 把宿主机的/data直接挂载到容器volume-demo的/data
    # 这个容器就可以当做数据卷容器
    docker run -d --name volume-demo -v /data:/data nginx
    

    其他容器想使用相同的数据时,可以--volumes-from 直接指定这个数据卷容器。可以共享数据卷容器挂载的容器。

    docker run -d --name nginx-volume-demo --volumes-from volume-demo nginx
    

    数据卷容器特性:
    数据卷容器stop状态,不影响挂载目录的使用

    作用:
    启动一个logstash或者filebeat的容器,把这个容器当做数据卷容器。做log的采集。即使这个容器挂掉,也不影响日志的存储。

    用法:

    所有服务日志都写在 /data/logs/下
    数据卷容器filebeat启动: -v /data/logs:/data/logs 
    其他容器启动 --volume-from filebeat
    

    四 Docker镜像构建

    4.1 Docker镜像手动构建

    docker pull centos
    docker run --name mynginx -it centos /bin/bash
    
    ## 安装epel源
    rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    yum install nginx -y
    # 需要把nginx放到前台运行,否则docker会挂掉。
    #在nginx.conf中加入 
    "daemon off;"
    
    #退出容器
    exit
    docker commit -m 'nginx on centos' '容器id' gm-nginx:v1
    docker images # 可看到我们手动创建的镜像 gm-nginx:v1
    

    测试镜像:

    docker run -d -p 91:80 gm-nginx:v1 nginx # 最后的nginx是运行的命令
    docker ps  # 看到容器启动成功,访问192.168.56.11:91测试 OK
    

    4.2 Dockerfile自动构建Docker镜像

    dockerfile基础指令
    基础镜像信息
    维护者信息
    镜像操作指令
    容器启动时执行指令


    FROM:       指定基础镜像 谁是他妈
    MAINTAINER: 指定维护者信息
    RUN:        在要执行的命令前加上RUN
    ADD:        copy文件,会自动解压 
    WORKDIR:    设置当前工作目录(相当于cd)
    VOLUME:     设置卷,挂载目录
    EXPOSE:     设定打开的端口
    CMD:        指定容器启动后要干的事情
    

    dockerfile for nginx

     mkdir -p  /opt/dockerfile/gm-nginx
     cd /opt/dockerfile/gm-nginx
     vim Dockerfile
    

    文件内容

    # Base Image
    From centos
    # MAINTAINER
    MAINTAINER wph
    #RUN
    RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    RUN yum install -y nginx --enablerepo=epel
    RUN yum clean all # 让打包的镜像尽可能的小一点
    RUN echo "daemon off;" >> /etc/nginx/nginx.conf  # 在生产中 我们直接add一个nginx.conf文件进去 不要更改文件
    #ADD
    # add 的文件要和Dockerfile在同一级目录下.
    ADD index.html /usr/share/nginx/html/index.html
    #WORKDIR
    #VOLUME
    #EXPOSE
    EXPOSE 80
    #CMD
    CMD ["nginx"]
    
    # 当前目录下执行:
    echo "nginx in docker" > index.html
    docker build -t gm-nginx:v2 . # -t 打tag  . (点)代表当前目录的Dockerfile
    # 查看生成镜像
    docker images
    
    Dockerfile中CMD与ENTRYPOINT的区别

    ENTRYPOINT,表示镜像在初始化时需要执行的命令,不可被重写覆盖,需谨记
    CMD,表示镜像运行默认参数,可被重写覆盖
    ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一个生效 多个存在,只有最后一个生效,其它无效!
    需要初始化运行多个命令,彼此之间可以使用 && 隔开,但最后一个须要为无限运行的命令,需切记!

    4.3 镜像构建最佳实践

    Dockerfile中层的概念

    dockerfile中每一行的一个指令,都会生成一个层。每个Dockerfile中,都有From centos,centos镜像只下载一次,不会重复下载。一个存在的层,不会重复构建

    分层构建

    系统无内核,只是一个操作环境

    4.3.1 系统层 构建Centos+SSH镜像

    用惯了虚拟机,强依赖SSH服务的。。。。还是得装一个。

    1. Docker镜像分层构建

    docker镜像是分层存储的 构建也要分层构建
    Dockerfile中的每一个指令,都会在镜像中有一个层

    # 创建目录层级结构
    cd /opt/dockerfile
    mkdir -p system/centos runtime app
    cd system/centos
    
    vim Dockerfile
    ################## file start ##################
    
    # Base Image
    From centos
    # MAINTAINER
    MAINTAINER wph
    #RUN
    RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    RUN yum install -y nginx --enablerepo=epel
    RUN yum install -y wget sudo git tree net-tools openssh-clients openssh-server openssh-devel && yum clean all
    
    ################## file  end ##################
    
    # 构建镜像并查看
    docker build -t system/centos:v1 .
    docker images
    
    mkdir system/centos-ssh && cd system/centos-ssh
    
    vim Dockerfile
    ################## file start ##################
    
    # Base Image
    From centos
    # MAINTAINER
    MAINTAINER wph
    #RUN
    RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    RUN yum install -y nginx --enablerepo=epel
    RUN yum install -y sudo git tree net-tools openssh-clients openssh-server openssh-devel && yum clean all
    RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
    RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
    RUN ssh-keygen -A -t  dsa -f /etc/ssh/ssh_host_dsa_key
    # Set root password
    RUN echo "root:123123" |chpasswd
    
    ################## file  end ##################
    
    # 构建镜像并查看
    docker build -t system/centos:v2 .
    docker images
    docker run -d --rm --name centos-ssh-demo -p 8022:22 system/centos:v2 /usr/sbin/sshd -D
    ssh root@192.168.56.11 -p 8022   # pass: 123123
    

    4.3.2 Supervisor管理容器多进程

    docker容器 只能在前台运行一个程序。如何搞定??

    • -d 后台运行
    • 脚本管理多个服务,保证脚本不退出。比如死循环
    • suoervisor管理 -- good

    在刚才创建的容器中安装配置Supervisor

    yum install -y supervisor
    # 修改配置文件 /etc/supervisord.conf中 nodaemon=false 
    # 让supervisor启动在前台
    nodaemon=true    ; (start in foreground if true;default false)
    ### 
    

    保存supervisord.conf到dockerfile同级目录
    在当前目录准备文件sshd.ini(下面会用到)

    # sshd.ini
    [program:sshd]
    command=/usr/sbin/sshd -D
    process_name=%(program_name)s
    autostart=true
    

    构建Supervisor的镜像

     docker build -t system/centos . # 不打标签,最新版本 latest
     docker images
     docker run -d --name centos-ssh-supervisor -p 2222:22 system/centos
     ssh 192.168.56.11 -p 2222  # 密码 123123
    

    4.3.3 环境层 构建JDK+Tomcat运行环境镜像

    cd /opt/dockerfile/runtime/
    mkdir tomcat && cd tomcat
    
    vim Dockerfile
    ################## file start ##################
    
    # Base Image
    From system/centos
    # MAINTAINER
    MAINTAINER wph
    #RUN
    RUN yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel && yum clean all
    ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk
    
    # For tomcat  Add 自动解压 COPY没有其他特性
    ADD apache-tomcat-8.5.33.tar.gz /usr/local/
    RUN ln -s /usr/local/apache-tomcat-8.5.33  /usr/local/tomcat
    
    # For supervisor
    ADD tomcat.ini /etc/supervisord.d/tomcat.ini
    ENV TOMCAT_HOME /usr/local/tomcat
    # Outside port
    EXPOSE 22 8080
    # CMD
    CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
    
    
    ################## file  end ##################
    

    当前目录准备tomcat安装包和tomat.ini文件

    wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.33/bin/apache-tomcat-8.5.33.tar.gz
    
    vim tomcat.ini
    ################## file start ##################
    [program:tomcat]
    command=/usr/local/tomcat/bin/catalina.sh run
    process_name=%(program_name)s
    autostart=true
    ################## file  end ##################
    

    构建镜像测试

    cd /opt/dockerfile/runtime/tomcat
    docker build -t runtime/tomcat .
    docker run -d --name tomcat-demo -p 8080:8080 -p 8888:22 runtime/tomcat
    

    测试容器

    ssh 127.0.0.1 -p8888  #pass 123123  
    # 浏览器访问:http://192.168.56.11:8080
    # success
    

    4.3.4 应用层 构建jenkins应用镜像

    系统+环境的镜像已经构建,应用只需要ADD包进去就OK
    cd /opt/dockerfile/app/
    mkdir jenkins && cd jenkins
    
    vim Dockerfile
    ################## file start ##################
    From runtime/tomcat
    MAINTAINER wph
    ADD jenkins.war  /usr/local/tomcat/webapps/
    EXPOSE 22 8080
    CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
    ################## file  end ##################
    

    准备jar包

    wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
    

    构建测试

    docker build -t app/jenkins .
    docker run -d --name  jenkins-demo -p 98:22 -p 99:8080 app/jenkins
    

    访问测试:

    # 浏览器访问: http://192.168.56.11:99/jenkins
    # success
    

    构建升级
    Dockerfile最佳实践
    Docker最佳实践之多阶段构建


    ################## file start ##################
    ################## file  end ##################
    

    五 构建Docker私有仓库

    5.1 官方registry构建私有仓库

    [root@linux-node1 ~]# docker run -d --name docker-registry -p 5000:5000 registry
    Unable to find image 'registry:latest' locally
    ...
    

    用官方提供的registry镜像启动,默认5000端口。
    官方要求使用https认证,
    我们使用http的方式,需要在docker服务中配置信任我们的私有仓库。

    vim /etc/docker/daemon.json # 这个文件最后一行不能有逗号!!!
    ################## file start ##################
    {
      "registry-mirrors": ["https://38zi2wqv.mirror.aliyuncs.com"],
      "insecure-registries": ["http://192.168.56.11:5000"]
    }
    ################## file  end ##################
    

    registry-mirrors: docker镜像源指定,这里配置的是阿里云的源
    insecure-registries:配置我们的私有仓库
    需要重启docker服务

    registry仓库的使用验证

    docker tag app/jenkins 192.168.56.11:5000/app/jenkins
    docker push 192.168.56.11:5000/app/jenkins
    docker rm -f jenkins-demo
    docker rmi app/jenkins
    docker rmi 192.168.56.11:5000/app/jenkins
    docker pull 192.168.56.11:5000/app/jenkins
    docker run -d --name  jenkins-demo -p 98:22 -p 99:8080 192.168.56.11:5000/app/jenkins
    

    registry没有认证

    5.2 Harbor构建docker私有仓库

    Harbor是Vmware开源的docker镜像仓库管理工具。
    Harbor官网

    下载offline版本(内有全部包,无须下载),被墙的话,用浏览器翻墙下载。
    或者翻墙服务器下载,发送过来。

    5.2.1 下载工具

    yum install -y python-pip
    pip install docker-compose
    pip list|grep docker-compose
    # docker-compose 一个docker的管理工具,可以快捷的启动集群
    

    删除之前创建的实验容器

    # 列出所有的容器ID
    docker ps -a  -q
    # 快速删除 生产禁用!!!
    docker rm $(docker ps -a  -q)
    

    5.2.2 下载安装部署

    # wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-offline-installer-v1.6.0-rc2.tgz
    tar zxf harbor-offline-installer-v1.6.0-rc2.tgz
    cd harbor/
    
    cat docker-compose.yml
    # 查看这个文件docker-compose.yml,启动的是80 443 4443端口,保证本机没有占用。否则需要更改
    # 所以我们需要修改上文配置的daemon.json,去掉5000端口,重启docker服务。
    
    # 更改配置文件 
    # 主机名改为本机IP或对外域名 
    # 可选协议控制,这里不做更改ui_url_protocol = http
    sed -i.ori 's#hostname = reg.mydomain.com#hostname = 192.168.56.11#g' harbor.cfg
    # 默认密码:harbor_admin_password = Harbor12345
    
    ### 安装:
    # 确认 docker-compose 命令安装正确,且可执行
    # 执行安装脚本:
    ./install.sh
    # 安装成功后,查看状态:
    docker-compose  ps # 需要在当前目录执行 可执行 stop start 。。
    

    5.2.3 异常处理

    界面访问192.168.56.11,Ng502,经过查阅,可能是harbor版本问题
    实验改用:harbor-offline-installer-v1.5.1.tgz版本

    docker-compose down
    重装还不行的话,删除挂载目录,再删除所有镜像。

    重新验证:
    浏览器访问192.168.56.11

    user:admin
    pass:Harbor12345 # harbor.cfg 配置文件中指定
    

    5.3 harbor管理

    425371ff3437e1e591e2741af2deb2a7.png

    在harbor新建项目
    36fd66cdc1e065a561c1172f33a5f3ca.png

    在客户端登录测试,并push镜像

    # 登录
    docker login 192.168.56.11
    user:admin
    pass:Harbor12345
    
    # 打tag
    docker tag app/jenkins  192.168.56.11/app/jenkins
    # push镜像
    docker push 192.168.56.11/app/jenkins # 注意先创建项目app
    

    在界面查看镜像,可以看到成功推送的镜像。

    在其他节点使用Harbor,

    1. 在/etc/docker/daemon.json配置信任
    2. docker login 192.168.56.11
  • 相关阅读:
    Python-Django学习
    Python+Selenium+Pycharm
    selenium基础实例学习
    Django实例
    Django路由机制
    Selenium爬取电影网页写成csv文件
    Numpy初步
    Python matplotlib图片转化成矢量图并裁剪
    先选先赢问题
    Python退火算法在高次方程的应用
  • 原文地址:https://www.cnblogs.com/wangph/p/9621798.html
Copyright © 2011-2022 走看看