zoukankan      html  css  js  c++  java
  • Docker基础动手实验--操作笔记

    1 Docker相关介绍

    LXC --Linux container托管在GitHub,基于go语言并遵从apache2.0协议

    Docker repository : store images

    Docker components:

    ​ Client : Docker client

    ​ Server :docker daemon 的主要成分,接收client请求,按路由规则实现路由转发

    Docker image : container stoper

    Docker container :docker image run as container

    Docker 基本结构原理

    空白层优先级大于下层,image采用共享底层技术

    采用分层存储,最多能到128层,下载新的image,如果某一层和已有的相同,则跳过

    2 Docker installation

    Docker 的三种安装方式:

    script 脚本安装
    yum 源安装
    rpm 包安装
    

    script

    [root@node1 docker]# yum update
    [root@node1 docker]# curl -sSL https://get.docker.com/ | sh
    [root@node1 docker]# systemctl start docker
    [root@node1 docker]# systemctl enable docker
    [root@node1 docker]# docker run hello-world
    

    yum

    cat >/etc/yum.repos.d/docker.repo <<-EOF
    [dockerrepo]
    name=Docker Repository
    baseurl=https://yum.dockerproject.org/repo/main/centos/7
    enabled=1
    gpgcheck=1
    gpgkey=https://yum.dockerproject.org/gpg EOF
    yum install docker
    

    本次实验采用第三种安装方式:即 rpm包安装

    1. 先到官网下载docker rpm 包,下载版本:17.0.3

    https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
    docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
    docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
    2. 首先检查selinux 和 firewalld是否已经禁止,如果防火墙打开,可能对后续实验造成影响,且不好找到原因。

    #检查防火墙是否关闭
    [root@node1 docker]# systemctl status firewalld
    [root@node1 docker]# getselinux
    #安装iptables
    [root@node1 docker]# yum -y install iptables-services
    [root@node1 docker]# systemctl start iptables
    [root@node1 docker]# systemctl enable iptables
    #清空防火墙规则
    [root@node1 docker]# iptables -F
    #保存默认规则
    [root@node1 docker]# service iptables save
    #更新系统内核
    [root@node1 docker]# yum update
    
    1. 上传docker 安装包到docker 目录,安装并启动docker

    [root@node1 /]# mkdir docker 
    [root@node1 docker]# yum -y install * 
    [root@node1 docker]# systemctl start docker
    [root@node1 docker]# systemctl status docker
    
    1. 验证docker 是否安装启动成功

    [root@node1 docker]# docker run hello-world # Hello-world是镜像名,不加版本号则获取最新版本

    1. Docker 加速配置
    [root@node1 docker]# cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
    [root@node1 docker]# chmod a+x /etc/systemd/system/docker.service
    [root@node1 docker]# vim /etc/systemd/system/docker.service
    

    在内容种增加ExecStart=/usr/bin/dockerd --registry-mirror=https://dh0xuqe2.mirror.aliyuncs.com

    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network.target firewalld.service
    [Service]
    Type=notify
    # the default is not to use systemd for cgroups because the delegate issues still
    # exists and systemd currently does not support the cgroup feature set required
    # for containers run by docker
    ExecStart=/usr/bin/dockerd --registry-mirror=https://dh0xuqe2.mirror.aliyuncs.com
    ExecReload=/bin/kill -s HUP $MAINPID
    # Having non-zero Limit*s causes performance problems due to accounting overhead
    # in the kernel. We recommend using cgroups to do container-local accounting.
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    # Uncomment TasksMax if your systemd version supports it.
    # Only systemd 226 and above support this version.
    #TasksMax=infinity
    TimeoutStartSec=0
    # set delegate yes so that systemd does not reset the cgroups of docker containers
    Delegate=yes
    # kill only the docker process, not all processes in the cgroup
    KillMode=process
    [Install]
    WantedBy=multi-user.target
    

    Aliyun镜像加速地址需要到aliyun官网进行申请,每个账号会得到唯一的id,也可以使用别人的,这个是免费申请使用,这是我申请的link:https://dh0xuqe2.mirror.aliyuncs.com, 检查是否配置成功

    [root@node1 docker]# systemctl daemon-reload
    [root@node1 docker]# systemctl restart docker
    [root@node1 docker]# ps -ef |grep docker
    

    出现mirror镜像地址,则表示加速配置成功。

    2.1 Docker 应用实验:使用docker 安装运行wordpress

    1. 下载镜像
    [root@node1 docker]# docker pull wordpress
    [root@node1 docker]# docker pull mariadb
    [root@node1 docker]# docker images   //查看已经下载的镜像
    

    1. 运行镜像mariadb 和wordpress
    #命令解释:运行镜像为mariadb, --name db 取名为db, MYSQL_ROOT_PASSWORD=example 设置密码为example,-d 放后台运行 mariadb:镜像名称
    [root@node1 docker]# docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb
    720598be5d6b8a5b12659fa4ee2f1727feeee07887813149e0cefbbb88b13f08
    #命令解释:运行镜像为wordpress, --name MyWordPress取名为MyWordPress, --link db:mysql连接到mariadb数据库,取别名为mysql,-p 8080:80 将本机8080端口映射到docker80端口 -d 放后台运行 wordpress:镜像名称
    [root@node1 docker]# docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
    e9dd98be8031653bedfe5e4957e65854ef66285feda7b529a793cdd9d79e530f
    #查看运行情况
    [root@node1 docker]# ps -ef |grep docker   //查看运行情况
    

    1. 验证:浏览器访问

    http://192.168.1.10:8080,按流程安装后,可以正常login wordpress blog

    至此,docker 应用体验完成!看起来so easy, 比直接虚拟机安装方便。

    3 Docker-compose

    容器编排工具,允许用户在一个模板(yaml文件)中定义一组相关联的容器,会更具—link参数,对启动的优先级进行排序。

    下载docker-compose

    curl -L https://get.daocloud.io/docker/compose/releases/download/1.17.1/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose

    从国内的资源,下载较快

    [root@node1 bin]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    [root@node1 bin]# docker-compose –version
    docker-compose version 1.17.1, build 6d101fb
    

    docker compose旨在通过将多服务的构建和依赖关系都编写在docker-compose.yml中,通过docker-compose命令,即可完成对整个服务集群的启动,关闭等操作。大部分的compose命令都需要到docker-compose.yml文件所在的目录下才能执行。

    docker-compose up  --命令聚合每个容器的输出,命令退出时,所有容器都将停止。
    docker-compose up -d --在后台启动容器并使它们保持运行。
    docker-compose logs -f --查看该容器的启动的日志打印(日志从头打印)。
    docker logs -f container_id --查看某一容器的启动的日志打印(日志从头打印)。 
    docker logs -f --tail 数量词 container_id à查看某一容器的启动的日志打印(查看最后n条日志打印)。 例:docker logs -f --tail 50 44b 
    docker-compose stop --停止compose服务。
    docker-compose restart --重启compose服务。
    docker-compose kill --kill compose服务。
    docker-compose ps --查看compose服务状态。
    docker-compose rm --删除compose服务。
    

    写一个简单的docker-compose.yml 文件

    version: '2'
    
    services:
      db:
      image: mysql:5.7
      restart: always
      environment:
        - MYSQL_ROOT_PASSWOR=wordpress
        - MYSQL_DATABASE=wordpress
        - MYSQL_USER=wordpress
        - MYSQL_PASSWORD=wordpress
    
      wordpress:
      depends_on:
      - db
      image: wordpress:latest
      restart: always
      ports:
      - "8080:80"
      environment:
        - WORDPRESS_DB_HOST=db:3306
        - WORDPRESS_DB_USER=wordpress
        - WORDPRESS_DB_PASSWORD=wordpress
    

    执行docker中的yml命令报错时 一定要看清楚,yml的严格的格式书写要求:要求每个冒号 和每个 - 符号后面必须有一个空格

    [root@node1 docker]# docker-compose up -d

    可能出现错误

    ERROR: The Compose file './docker-compose.yml' is invalid because:
    Unsupported config option for services.db: 'MYSQL_ROOT_PASSWORD'
    Unsupported config option for services.wordpress: 'WORDPRESS_DB_HOST'
    services.db.environment contains an invalid type, it should be an object, or an array
    services.wordpress.environment contains an invalid type, it should be an object, or an array 
    

    将原来的所有这样格式的内容 WORDPRESS_DB_PASSWORD: wordpress 改为此格式 - WORDPRESS_DB_PASSWORD=wordpress, 报错消失。

    这样的错误也是格式不对导致

    4 Docker基础概念及命令

    Docker 的三个重要概念: 仓库 repository,镜像 image, 容器 container

    Docker指令基本用法:

    Docker +命令关键字 + 一系列参数

    Docker info 守护进程的系统资源设置

    Docker search //docker 仓库的查询

    Docker pull // docker 仓库的下载

    Docker images // docker 镜像的查询

    这里看到的size不是镜像的实际大小,因为docker 分层共享,而这里展示的是完整镜像大小,实际值小于等于这里的显示值

    Docker rmi // docker 镜像的删除

    用法: docker rmi imageName:version 或 docker rmi imageID

    Docker ps //查看当前运行的容器, 加 -a 可以查看所有容器,包括停止的容器

    Docker rm // 删除停止的容器,加 -f 强制删除

    Docker run // 容器的创建启动

    可以一次删除所有容器,操作方法:

    [root@node1 docker]# docker ps -a -q // 只显示容器的ID

    [root@node1 docker]# docker rm -f $(docker ps -a -q)

    容器管理

    每个容器创建后,都会分配一个container id 作为唯一标识,后续对容器的启停,修改删除都可以通过这个ID来完成,

    docker ps --no-trunc //查看,这个命令会展示container 完整的128 位ID

    Docker start/stop container ID // 容器启动停止

    Docker start/stop container alias name

    docker inspect container alias name // 查看容器所有基本信息

    docker logs container alias name // 查看容器log

    docker stats container alias name // 查看容器占用的系统资源

    docker stats //不加参数,显示所有容器系统资源占用情况

    docker exec 容器名 容器内执行的命令 //容器执行命令

    docker exec -it 容器名 /bin/bash //登入容器的bash,相当于进入交互模式

    exit 推出交互模式

    --restart=always //容器的自动启动, docker 重启后,容器自动运行
    -h x.xx.xxx //设置容器的主机名
    --dns xx.xx.xx.xx //设置容器使用的dns
    --dns-search //dns 搜索设置
    --add-host hostname:ip //注入hostname <> IP 解析

    [root@node1 ~]# docker run --name MyWordPress2 --restart=always --add-host www.lidepic.com:192.168.1.10 --link db1:mysql -p 8081:80 -d wordpress

    --rm //服务停止时自动删除

    [root@node1 ~]# docker run --name MyWordPress3 --rm --link db1:mysql -p 8084:80 -d wordpress

    容器MyWordPress3停止后将会被自动删除。

    5 镜像仓库管理

    5.1 docker 镜像管理

    容器创建时要指定image,每个image有一个唯一的id,和container id 一样,默认128位,可以使用前16位缩写形式,也可以使用镜像名和版本号来组合唯一标识,省略版本号则使用latest

    镜像分层:docker 的镜像通过联合文件系统ufs将各层文件系统叠加在一起

    bootfs : 用于系统引导的文件系统,包括bootloader 和kernel,容器启动完成后会被卸载以节省内存资源

    rootfs : 位于bootfs之上,表现为docker 容器的根文件系统

    ​ 传统模式中,系统启动时,内核挂载bootfs会将器挂载为只读模式,完整性自检完成后将其挂载为读写模式

    ​ docker中,由内核挂载为只读模式,而通过ufs技术挂载一个可写

    已有的分层只能读,不能修改

    上层镜像优先级大于底层镜像

    5.2 DockerFile

    1, 容器 > 镜像 : docker commit CID -t xxx.xx.xx

    需要至少一个工作在前台的守护进程

    #下载centos 镜像
    [root@node1 docker]# systemctl start docker
    [root@node1 docker]# docker pull centos:7
    7: Pulling from library/centos
    2d473b07cdd5: Pull complete 
    Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
    Status: Downloaded newer image for centos:7
    [root@node1 docker]# docker images
    REPOSITORY         TAG                 IMAGE ID           CREATED             SIZE
    wordpress           latest             a05fd91ad06a        10 days ago         550 MB
    nginx               latest             f6d0b4767a6c        11 days ago         133 MB
    mariadb             latest             3a348a04a815        8 weeks ago         407 MB
    centos              7                   8652b9f0cb4c        2 months ago        204 MB
    #启动centos 镜像
    [root@node1 docker]# docker run --name test centos:7
    #查看容器,由于无前台守护进程,启动即退出
    [root@node1 docker]# docker ps -a
    CONTAINER ID       IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    e1e9932535db       centos:7            "/bin/bash"         33 seconds ago     Exited (0) 33 seconds ago                       test
    
    

    2, DockerFile

    dockerfile 是一种被docker程序解释的脚本。dockerfile由一条条指令组成,每条指令对应linux下的一条命令。docker程序将这些指令翻译成真正的linux命令。

    生成命令: docker build -t xxxx

    最多不超过****128层

    Sample : wordpress/php7.1/fpm-alpine/Dockerfile

    FROM php:7.1-fpm-alpine
    
    # docker-entrypoint.sh dependencies
    RUN apk add --no-cache 
    # in theory, docker-entrypoint.sh is POSIX-compliant, but priority is a working, consistent image
    bash 
    # BusyBox sed is not sufficient for some of our sed expressions
    sed
    
    # install the PHP extensions we need
    RUN set -ex; 
    
    apk add --no-cache --virtual .build-deps 
    libjpeg-turbo-dev 
    libpng-dev 
    ; 
    
    docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr; 
    docker-php-ext-install gd mysqli opcache; 
    
    runDeps="$( 
    scanelf --needed --nobanner --recursive 
    /usr/local/lib/php/extensions 
    | awk '{ gsub(/,/, "
    so:", $2); print "so:" $2 }' 
    | sort -u 
    | xargs -r apk info --installed 
    | sort -u 
    )"; 
    apk add --virtual .wordpress-phpexts-rundeps $runDeps; 
    apk del .build-deps
    
    # set recommended PHP.ini settings
    # see https://secure.php.net/manual/en/opcache.installation.php
    RUN { 
    echo 'opcache.memory_consumption=128'; 
    echo 'opcache.interned_strings_buffer=8'; 
    echo 'opcache.max_accelerated_files=4000'; 
    echo 'opcache.revalidate_freq=2'; 
    echo 'opcache.fast_shutdown=1'; 
    echo 'opcache.enable_cli=1'; 
    } > /usr/local/etc/php/conf.d/opcache-recommended.ini
    
    VOLUME /var/www/html
    
    ENV WORDPRESS_VERSION 4.8.1
    ENV WORDPRESS_SHA1 5376cf41403ae26d51ca55c32666ef68b10e35a4
    
    RUN set -ex; 
    curl -o wordpress.tar.gz -fSL "https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz"; 
    echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c -; 
    # upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
    tar -xzf wordpress.tar.gz -C /usr/src/; 
    rm wordpress.tar.gz; 
    chown -R www-data:www-data /usr/src/wordpress
    
    COPY docker-entrypoint.sh /usr/local/bin/
    
    ENTRYPOINT ["docker-entrypoint.sh"]
    CMD ["php-fpm"]
    
    

    简单的Dockerfile 内容

    FROM hub.c.163.com/public/centos
    ADD ./apache-tomcat-9.0.40.tar.gz /root
    ADD ./jdk-8u271-linux-x64.tar.gz /root
    ENV JAVA_HOME /root/jdk1.8.0_271
    ENV PATH $JAVA_HOME/bin:$PATH
    EXPOSE 8080
    ENTRYPOINT /root/apache-tomcat-9.0.40/bin/startup.sh && tailf /root/apache-tomcat-9.0.40/logs/catalina.outDockerfile
    

    Dockerfile指令解释

    FROM                       #基础镜像,一切从这里开始
    MAINTAINER                 #镜像作者姓名、邮箱
    RUN                        #镜像构建时需要运行的命令
    ADD                        #步骤,tomcat镜像,这个tomcat压缩包,添加内容
    WORKDIR                    #镜像工作的目录
    VOLUME                     #挂载卷的目录
    EXPOST                     #暴露端口位置
    CMD                        #指定这个容器启动时要运行的命令,只有最后一个命令会生效,可被替代
    ENTRYPOINT                 #指定这个容器启动时要运行的命令,可以追加命令
    ONBUILD                    #当构建一个被继承 Dockerfile 这个时候就会运行 ONBUILD 的指令,触发指令
    COPY                       #类似ADD,将我们文件拷贝到镜像中
    ENV                        #构建时设置环境变量
    

    创建镜像并启动验证

    #创建镜像
    [root@node1 docker]# docker build -t tomcat:v1.0 .
    Sending build context to Docker daemon 19.55 MB
    Step 1/7 : FROM hub.c.163.com/public/centos
    latest: Pulling from public/centos
    96057de2d572: Pull complete 
    …
    5881bc109689: Pull complete 
    Digest: sha256:75a27ccbfdef28456d98134cf04f2f41f76b435d9e62c678c6791af467d6b1b0
    Status: Downloaded newer image for hub.c.163.com/public/centos:latest
    ---> 997f0ed97903
    Step 2/7 : ADD ./apache-tomcat-9.0.40.tar.gz /root
    ---> e7ecdd273d8c
    Removing intermediate container 748e6709f0d3
    Step 3/7 : ADD ./jdk-8u271-linux-x64.tar.gz /root
    ---> 3e6e168f8156
    Removing intermediate container d9dfff383328
    Step 4/7 : ENV JAVA_HOME /root/jdk1.8.0_271
    ---> Running in 8d576461d014
    ---> 13c68e3592cc
    Removing intermediate container 8d576461d014
    Step 5/7 : ENV PATH $JAVA_HOME/bin:$PATH
    ---> Running in b83238baaae0
    ---> fb6bc66ca738
    Removing intermediate container b83238baaae0
    Step 6/7 : EXPOSE 8080
    ---> Running in 4e9aea213e43
    ---> 4d416cd48b49
    Removing intermediate container 4e9aea213e43
    Step 7/7 : ENTRYPOINT /root/apache-tomcat-9.0.40/bin/startup.sh && tailf /root/apache-tomcat-9.0.40/logs/catalina.out
    ---> Running in dab5f9371ca7
    ---> 45c8e9694a5f
    Removing intermediate container dab5f9371ca7
    Successfully built 45c8e9694a5f
    #创建成功后启动镜像
    [root@node1 docker]# docker run --name tomcat -p 8080:8080 -d tomcat:v1.0
    f1fb101218a990584ca3208d796fc25453c04f3a5a8f294aa22ce5d2d0a38f0b
    [root@node1 docker]# curl localhost:8080
    <!DOCTYPE html>
    <html lang="en">
      <head>
          <meta charset="UTF-8" />
          <title>Apache Tomcat/9.0.40</title>
          <link href="favicon.ico" rel="icon" type="image/x-icon" />
          <link href="tomcat.css" rel="stylesheet" type="text/css" />
      </head>
    .....省略部分输出
    #进入容器查看目录结构
    [root@node1 docker]# docker exec -it tomcat /bin/bash
    [root@f1fb101218a9 /]# cd root
    [root@f1fb101218a9 ~]# ls
    apache-tomcat-9.0.40 jdk1.8.0_271
    [root@f1fb101218a9 ~]# 
    

    5.3 Docker仓库构建

    启动两台虚拟机,IP 分别为192.168.1.10 server, 192.168.1.10 client

    #仓库服务器配置
    #下载一个仓库,指定端口为5000 
    docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always registry
    Unable to find image 'registry:latest' locally
    latest: Pulling from library/registry
    0a6724ff3fcd: Pull complete 
    ....
    9af6d68b484a: Pull complete 
    Digest: sha256:d5459fcb27aecc752520df4b492b08358a1912fcdfa454f7d2101d4b09991daa
    Status: Downloaded newer image for registry:latest
    4f433c787d3ad16bb3131f0f6909273d4167fb267168587cc6f5e9e24187ea12
    #增加端口配置,默认为443,这里改为5000,需要加声明,不然会被认为不安全
    [root@node1 docker]# vim /etc/docker/daemon.json
    {
    "insecure-registries": ["192.168.1.10:5000"]
    }
    #重启docker 服务
    [root@node1 docker]# systemctl restart docker
    
    #仓库地址/username/imageName:tag0, 按此格式修改已有的image
    [root@node1 docker]# docker tag tomcat:v1.0 192.168.1.10:5000/tomcat:v1.0
    [root@node1 docker]# docker images
    REPOSITORY                   TAG                 IMAGE ID           CREATED             SIZE
    192.168.1.10:5000/tomcat     v1.0               45c8e9694a5f       About an hour ago   813 MB
    tomcat                       v1.0               45c8e9694a5f       About an hour ago   813 MB
    #仓库地址/username/imageName:tag0, 将镜像push到仓库
    [root@node1 docker]# docker push 192.168.1.10:5000/tomcat:v1.0
    The push refers to a repository [192.168.1.10:5000/tomcat]
    9318ec22b1eb: Pushed 
    .... 
    7bd4370c96a2: Pushed 
    v1.0: digest: sha256:596979c794747283e4993062fdf275bf84b13219e93aed47cec934c70706f104 size: 2408
    #查看上传结果
    [root@node1 docker]# curl -XGET http://192.168.1.10:5000/v2/_catalog
    {"repositories":["tomcat"]}
    
    #客户机配置
    
    # 安装docker, rpm包从node1节点copy而来
    [root@node2 docker]# yum -y install docker-ce-*
    #修改daemon.json文件,认为5000端口安全
    [root@node2 docker]# vim /etc/docker/daemon.json
    {
    "insecure-registries": ["192.168.1.10:5000"]
    }
    [root@node2 docker]# systemctl restart docker
    #查看是否可以连接到镜像仓库
    [root@node2 docker]# curl -XGET http://192.168.1.10:5000/v2/_catalog
    {"repositories":["tomcat"]}
    #从仓库下载镜像
    [root@node2 docker]# docker pull 192.168.1.10:5000/tomcat:v1.0
    v1.0: Pulling from tomcat
    aa655cdf203d: Pull complete 
    .... 
    e5da50c0f5a4: Pull complete 
    Digest: sha256:596979c794747283e4993062fdf275bf84b13219e93aed47cec934c70706f104
    Status: Downloaded newer image for 192.168.1.10:5000/tomcat:v1.0
    #查看镜像并运行镜像为容器
    [root@node2 docker]# docker images
    REPOSITORY                 TAG                 IMAGE ID           CREATED             SIZE
    192.168.1.10:5000/tomcat   v1.0               45c8e9694a5f       About an hour ago   813 MB
    [root@node2 docker]# docker run --name tomcat01 -p 80:8080 -d 192.168.1.10:5000/tomcat:v1.0
    b21d3003c228b26d19076ca943b11a3f2c93f66748e9b2672284c6b41ac94574
    

    测试:打开浏览器查看,是否可以访问tomcat

    5.4 Harbor 企业级私有仓库搭建

    1. 底层安装需求:

    --Python 2.7 及以上

    --Docker引擎为1.10及以上

    --Docker compose 1.6.0 或更高

    系统还原到初始状态

    #查看python版本
    [root@node2 /]# python
    Python 2.7.5 (default, Apr  2 2020, 13:16:51) 
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> exit()
    #安装docker
    [root@node1 docker]# ls
    docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm docker-compose
    [root@node1 docker]# yum -y install docker-ce*
    #配置docker-compose
    [root@node1 docker]# mv docker-compose /usr/local/bin/
    [root@node1 docker]# chmod +x /usr/local/bin/docker-compose 
    #查看docker 版本
    [root@node1 docker]# docker info
    Containers: 0
    Running: 0
    Paused: 0
    Stopped: 0
    Images: 0
    Server Version: 17.03.0-ce
    ....
    #查看docker-compose 版本
    [root@node1 docker]# docker-compose --version
    docker-compose version 1.17.1, build 6d101fb
    
    1. 下载harbor 版本1.7.1,高版本可能和已安装的docker17.03.0 存在兼容问题

    https://github.com/goharbor/harbor/releases/v1.7.1

    #将下载包上传到linux虚拟机
    [root@node1 docker]# rz -E
    rz waiting to receive.
    [root@node1 docker]# ls
    apache-tomcat-9.0.40.tar.gz                           docker-compose.yml                   jdk-8u271-linux-x64.tar.gz
    docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm         Dockerfile
    docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm harbor-offline-installer-v1.7.1.tgz
    [root@node1 docker]# tar -zxf harbor-offline-installer-v1.7.1.tgz 
    [root@node1 docker]# mv harbor /usr/local/
    [root@node1 harbor]# vi harbor.cfg
    
    hostname = hub.lidepic.com
    ui_url_protocol = https
    #Maximum number of job workers in job service
    max_job_workers = 3
    #The path of cert and key files for nginx, they are applied only the protocol is set to https
    ssl_cert = /data/cert/server.crt
    ssl_cert_key = /data/cert/server.key
    
    #The path of secretkey storage
    secretkey_path = /data
    #Change the admin password from UI after launching Harbor.
    harbor_admin_password = Harbor12345
    #The password for the root user of Harbor DB. Change this before any production use.
    db_password = root123
    
    #其余选项使用默认, 保存退出,执行安装脚本
    [root@node1 harbor]# ./install.sh 
    #注意保持环境干净,如果80端口被占用,将无法安装nginx
    #安装后会自动运行容器,查看运行的容器
    [root@node1 harbor]# docker ps
    CONTAINER ID       IMAGE                                   COMMAND                 CREATED             STATUS                     PORTS                                                             NAMES
    b8bc0333696d       goharbor/nginx-photon:v1.7.1             "nginx -g 'daemon ..."   5 minutes ago       Up 5 minutes (healthy)     0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx
    36d8cf19fbd9       goharbor/harbor-portal:v1.7.1            "nginx -g 'daemon ..."   5 minutes ago       Up 5 minutes (healthy)     80/tcp                                                             harbor-portal
    dbb5bfb97bd2       goharbor/harbor-jobservice:v1.7.1        "/harbor/start.sh"       5 minutes ago       Up 5 minutes                                                                                 harbor-jobservice
    6622db56f51b       goharbor/harbor-core:v1.7.1              "/harbor/start.sh"       5 minutes ago       Up 5 minutes (healthy)                                                                       harbor-core
    38afbed36085       goharbor/registry-photon:v2.6.2-v1.7.1   "/entrypoint.sh /e..."   5 minutes ago       Up 5 minutes (healthy)     5000/tcp                                                           registry
    6469aeb3b534       goharbor/harbor-registryctl:v1.7.1       "/harbor/start.sh"       5 minutes ago       Up 5 minutes (healthy)                                                                       registryctl
    bfa55f92a7c2       goharbor/harbor-adminserver:v1.7.1       "/harbor/start.sh"       5 minutes ago       Up 5 minutes (healthy)                                                                       harbor-adminserver
    06b05ca6ebc1       goharbor/redis-photon:v1.7.1             "docker-entrypoint..."   5 minutes ago       Up 5 minutes               6379/tcp                                                           redis
    3731bad1e01f       goharbor/harbor-db:v1.7.1                "/entrypoint.sh po..."   5 minutes ago       Up 5 minutes (healthy)     5432/tcp                                                           harbor-db
    824bd2cfa040       goharbor/harbor-log:v1.7.1               "/bin/sh -c /usr/l..."   5 minutes ago       Up 5 minutes (unhealthy)   127.0.0.1:1514->10514/tcp    
    

    修改windows下C:WindowsSystem32driversetc的hosts文件,解析hub.lidepic.com

    192.168.1.10 hub.lidepic.com

    同时在linux server 本机,也需要修改/etc/hosts 文件,增加一条记录,不然无法使用域名访问。

    hub.lidepic.com 192.168.1.10

    1. 创建https证书并赋予目录权限
    #生成证书,密码123456
    [root@node1 docker]# openssl genrsa -des3 -out server.key 2048
    #证书签名请求,国家地区域名等自定义,密码还是123456
    [root@node1 docker]# openssl req -new -key server.key -out server.csr
    #抹掉证书使用时的密码,这样证书将不需要密码,可以直接使用
    [root@node1 docker]# cp server.key server.key.org
    [root@node1 docker]# openssl rsa -in server.key.org -out server.key
    #生成证书
    [root@node1 docker]# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt 
    #创建目录,并赋予目录权限,目录同harbor 配置相关,将证书文件移动到此目录下
    [root@node1 docker]# mkdir -p /data/cert
    [root@node1 docker]# chmod -R 777 /data/cert/
    [root@node1 docker]# mv server.* /data/cert/
    
    1. 访问测试

    https://hub.lidepic.com/

    #停止harbor 仓库
    [root@node1 harbor]# docker-compose stop
    #启动harbor 仓库
    [root@node1 harbor]# docker-compose up -d
    

    发现错误,无法通过网页访问,本机也登录不了。

    问题: 域名没有解析,修改 /etc/hosts 文件,增加一条记录:

    192.168.1.10 hub.lidepic.com

    再次访问:使用配置文件默认的用户登录: admin / Harbor2345

    Login之后,创建一个项目,名为test-repository

    这里有推送的方法,首先是需要修改镜像名称,然后推送到仓库。下一步会使用到。

    · docker tag SOURCE_IMAGE[:TAG] hub.lidepic.com/test-repository/IMAGE[:TAG]

    · docker push hub.lidepic.com/test-repository/IMAGE[:TAG]

    1. 上传镜像测试

    指定镜像仓库地址

    #编辑daemon.json文件,告诉服务器该地址安全,不然认证通不过
    [root@node1 harbor]# vi /etc/docker/daemon.json
    
    {
      "insecure-registries": ["hub.lidepic.com"]
    }
    #修改配置文件在ExecStart=/usr/bin/dockerd后增加 --insecure-registry hub.lidepic.com
    [root@node1 harbor]# vi /usr/lib/systemd/system/docker.service 
    ExecStart=/usr/bin/dockerd --insecure-registry hub.lidepic.com
    #重新加载
    [root@node1 harbor]# systemctl daemon-reload
    #重启docker
    [root@node1 harbor]# systemctl restart docker
    

    登录harbor仓库,user admin 密码Harbor12345

    [root@node1 ~]# docker login -u admin hub.lidepic.com
    Password: 
    Login Succeeded
    

    如果出现截图错误,可能原因是host name 和IP 不匹配,检查hosts文件

    解决办法: 修改改hosts 文件,增加一条记录,可以ping 通这个域名,重新登录即可。

    192.168.1.10 hub.lidepic.com

    上传镜像到harbor仓库

    #修改原有镜像,按照 域名/项目名/镜像名:版本 格式
    [root@node1 ~]# docker tag tomcat:v1.0 hub.lidepic.com/test-repository/tomcat:v1.2
    #上传镜像到harbor 仓库test-repository项目
    [root@node1 ~]# docker push hub.lidepic.com/test-repository/tomcat:v1.2
    The push refers to a repository [hub.lidepic.com/test-repository/tomcat]
    9318ec22b1eb: Pushed 
    …
    7bd4370c96a2: Pushed 
    v1.2: digest: sha256:596979c794747283e4993062fdf275bf84b13219e93aed47cec934c70706f104 size: 2408
    

    查看网页端,在test-repository 项目下,增加了一个tomcat 镜像

    1. 在其他docker 客户端node2下载测试
    #首先指定镜像仓库地址,编辑daemon.json文件,告诉服务器该地址安全,不然认证通不过
    [root@node1 harbor]# vi /etc/docker/daemon.json
    
    {
      "insecure-registries": ["hub.lidepic.com"]
    }
    #修改hosts 文件,是 node2 可以通过域名访问到hub.lidepic.com
    [root@node2 docker]# vi /etc/hosts
    hub.lidepic.com    192.168.1.10
    node2    192.168.1.11
    192.168.1.10   hub.lidepic.com
    #测试是否可以正常ping 通
    [root@node2 docker]# ping hub.lidepic.com
    PING hub.lidepic.com (192.168.1.10) 56(84) bytes of data.
    64 bytes from hub.lidepic.com (192.168.1.10): icmp_seq=1 ttl=64 time=0.954 ms
    64 bytes from hub.lidepic.com (192.168.1.10): icmp_seq=2 ttl=64 time=1.40 ms
    #下载镜像
    [root@node2 docker]# docker pull hub.lidepic.com/test-repository/tomcat:v1.2
    Error response from daemon: Get https://hub.lidepic.com/v1/_ping: x509: certificate signed by unknown authority
    #这里发现了问题,https证书校验没通过,可能是没有reload配置文件,reload并重启docker
    [root@node2 docker]# systemctl daemon-reload
    [root@node2 docker]# systemctl restart docker
    [root@node2 docker]# docker pull hub.lidepic.com/test-repository/tomcat:v1.2
    Error response from daemon: repository hub.lidepic.com/test-repository/tomcat not found: does not exist or no pull access
    #这里发现 does not exist or no pull access, 应该是没有login,这里是私有仓库。要指定域名,不然默认登录docker 官方网站  
    [root@node2 docker]# docker login -u admin hub.lidepic.com
    Password: 
    Login Succeeded
    #再次pull,成功
    [root@node2 docker]# docker pull hub.lidepic.com/test-repository/tomcat:v1.2
    v1.2: Pulling from test-repository/tomcat
    Digest: sha256:596979c794747283e4993062fdf275bf84b13219e93aed47cec934c70706f104
    Status: Downloaded newer image for hub.lidepic.com/test-repository/tomcat:v1.2
    #查看镜像
    [root@node2 docker]# docker images
    REPOSITORY                             TAG     IMAGE ID         CREATED     SIZE
    hub.lidepic.com/test-repository/tomcat   v1.2   45c8e9694a5f    4 days ago      813 MB
    
    ***************用努力照亮现实的梦!***********************
  • 相关阅读:
    string subscript out of range
    基数树(radix tree)
    改进版的快速排序
    快速排序算法-C语言实现
    归并排序
    用数组名做函数参数(转)
    堆和栈的区别
    给指针malloc分配空间后就等于数组吗?
    codeblocks中添加-std=c99
    堆排序-C语言实现
  • 原文地址:https://www.cnblogs.com/orange2016/p/14345603.html
Copyright © 2011-2022 走看看