docker部署

 Docker 是一个开源的平台,设计目标是可以方便开发,方便部署和方便执行应用。使用docker可以快速分发开发好的应用。借助于Docker,你可以将开发平台和应用分离开,并且像管理应用一样管理开发平台。Docker可以帮助你快速开发应用,快速测试应用,快速部署应用,并且缩短开发代码和执行代码之间的周期间隔。

 Docker 是凭借一个轻量级容器的虚拟化平台工作流和相关工具来达到上述功能的,并且使用这个轻量化容器来帮助你管理和部署应用。

 在Docker核心层,它提供了一种方式来让各种应用运行在各个隔离的容器中。这种方式允许docker同一时间在同一台主机上面运行若干个容器。这种轻量级的容器运行方式,几乎没有额外的运行开销。这意味着你可以充分使用主句的硬件能力。

 使用Docker提供的工具和虚拟化平台,你可以完成以下事情:

  1.   将你的应用或者组件部署到容器中。
  2.   将你的容器分发给你的团队进行下一步的开发或者测试
  3.   将你开发的应用部署到发布环境中,无论这些环境是本地模式或者云模式

 为什么要用docker

  1、快速分发应用

  Docker可以帮助你把控开发各个周期。Docker允许你在本地的开发环境中进行代码开发,然后将开发好的应用整合到团队的开发流程中。比如:你可以再本地编写代码,当编写完成后。你将代码开发堆栈信息共享给团队成员。当他们也编写完成后,同样共享开发堆栈信息。然后再测试环境中,使用团队共享的开发堆栈就可以进行所需要的测试了。当完成测试后,团队就可以将测试通过的docker镜像(images)发布到产品环境中。

  2、方便部署和易于管理

  Docker基于容器的机制可以很容易进行部署。Docker容器可以在本地主机上面执行,也可以在虚拟机中执行,不论这些虚拟机是在本地或者云中。Docker快速部署和轻量级的特性也使得管理负载变得很容易。你可以快速启动或者销毁容器。这种时间几乎是实时的。

  3、可以执行大量的工作负载

  因为Docker具有便于部署和快速启停的方式,同时docker也提供了可行的,符合效益-成本的虚拟机管理机制。使得docker很适合负载要求高的环境。比如:将你的云平台作为PAAS用途时,或者你要求你的环境具有高资源使用率时。

 docker的组件

  1.   镜像:类似于操作系统安装包,如果要创建一个docker容器,那么必须先有镜像,然后才能通过这个镜像来创建容器
  2.   容器:类似于在操作系统中启动一个进程,在docker run一个镜像后便产生一个容器。
  3.   仓库:类似于yum源仓库,可以通过自定义的镜像,将镜像上传到docker官方或企业私有的仓库中,便于其他用户下载使用或测试。

 docker改变了什么

  •   面向产品: 产品交付
  •   面向开发: 简化环境配置
  •   面向测试: 多版本测试
  •   面向运维: 环境一致性
  •   面向架构: 自动化扩容(微服务)

docker部署及应用

 docker的安装可以通过epel源来安装,所以要先安装epel源,然后再用yum来安装docker

#安装docker
[root@linux-node2 ~]# yum  install  docker -y
#启动docker并设置开机自启动
[root@linux-node2 ~]# systemctl  start  docker
[root@linux-node2 ~]# systemctl  enable  docker

 从docker官方拉取docker镜像,比如拉取centos镜像

#不加仓库地址,默认是从docker.io官方拉取
[root@linux-node2 ~]# docker  pull  centos
#通过docker images 查看系统中的镜像
[root@linux-node2 ~]# docker  images

#docker的镜像管理有
docker search :搜索镜像
docker pull  :拉取镜像
docker images:查看镜像
docker rmi:删除镜像
docker push:上传镜像到仓库
docker login:登陆docker仓库
#当然可以通过docker --help来查看docker有哪些镜像管理命令

 docker的容器管理

启动容器:docker run  --name 容器的名称 -i -t  镜像
开启/停止容器;docker start/stop  container-id
查看正在运行的容器:docker  ps
查看运行和退出的所有容器:docker  ps -a
进入正在运行的容器:docker exec | docker  attach | nsenter
删除容器:docker  rmi container-id

  可以使用nsenter的命令来进入容器,我们可以创建一个脚本来实现这个功能

#!/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

 docker的网络访问

随机映射:docker run  --name  容器名称  -P  镜像
指定端口映射:docker run --name 容器名称  -p  访问端口:容器中业务端口,比如nginx服务
    docker run --name  mynginx  -d  -p 88:80  nginx
#想测试环境下启动一个容器,可以使用--rm参数,比如启动一个centos容器
    docker run --rm -it  centos /usr/bin/bash

 docker数据管理

列出container id的所有的状态
[root@linux-node2 ~]# docker inspect  container-id

随机挂载的话,查看挂载点
[root@linux-node2 ~]# docker inspect -f "{{ .Mounts}}" container-id

[root@linux-node2 ~]# docker run -it --rm -v /data:/webroot:ro centos 
这里的/data目录是宿主机的目录,如果没有,在创建docker容器的时候会自动创建
这里的/webroot目录是docker容器要生成的目录,权限ro指的是对容器中/webroot/目录的权限,当在容器中国
向/webroot目录写入操作的时候就会报Read-only权限提示,不让写入。
通过数据卷的方式对程序员开发程序很有用,只要在宿主机的某个目录下放代码,直接可以同步到容器中。

使用数据卷容器
[root@linux-node2 ~]# docker run --name nfs -it -v /data:/webroot centos
[root@linux-node2 ~]# docker run --name test -it --volumes-from nfs centos
[root@linux-node2 ~]# touch /data/bbb
这时候容器test的/webroot目录中就同步了宿主机挂载目录中的内容.两个容器同时同步到宿主机/data目录
[root@0024ded4ace0 /]# ls /webroot/
bbb

 镜像的导入导出、

  由于我们下载和上传镜像默认都是docker官方,速度非常慢,我们可以将别人pull下来的镜像导入到docker中,当然也可以自定义的镜像导出给别人使用

当运行docker命令的时候报错如下:

[root@linux-node2 ~]# docker save  -o  /opt/nginx.tar  nginx

Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/e1f001c8413116e1a16dad232b2b3b8fad66734d9d0ef6b156c7598f9e22d84b/merged: invalid argument

这个是因为用的overlay2文件系统,而系统默认只能识别overlay文件系统,所以我们就要更新文件系统了。操作步骤如下:

[root@linux-node2 ~]# systemctl   stop  docker

情掉docker images镜像

[root@linux-node2 ~]# rm  -rf  /var/lib/docker/

修改docker存储配置文件’

[root@linux-node2 ~]# vim  /etc/sysconfig/docker-storage

DOCKER_STORAGE_OPTIONS="--storage-driver overlay"

修改docker的配置文件:去掉option后面的--selinux-enabled 

[root@linux-node2 ~]# vim  /etc/sysconfig/docker

OPTIONS='--log-driver=journald --signature-verification=false'

最后启动docker,问题解决

[root@linux-node2 ~]# systemctl  start  docker  

将docker镜像导出为一个文件和从一个文件导入镜像

比如将nginx镜像导出成一个nginx.tar文件

[root@linux-node2 ~]# docker save  -o  nginx.tar  nginx

当然也可以同时将多个镜像文件导出成一个文件

[root@linux-node2 ~]# docker  save  -o  docker-images.tar  redis memcached  nginx centos

将以个文件导入成docker镜像,只要这个文件中包含一个镜像还是多个镜像,将被完全导入成docker镜像

[root@linux-node2 ~]# docker  load  -i  nginx.tar

[root@linux-node2 ~]# docker  load -i  docker-images.tar 

通过centos镜像来手动构建一个镜像mynginx
[root@linux-node2 ~]# docker run --name mynginx -it centos
[root@ac5fb91d8794 ~]# rpm -ih https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
[root@ac5fb91d8794 ~]# yum install nginx
[root@ac5fb91d8794 ~]# vi /etc/nginx/nginx.conf
daemon off;
[root@ac5fb91d8794 ~]# exit
[root@linux-node2 ~]# docker ps -a
ac5fb91d8794 centos "/bin/bash" 8 minutes ago Exited (0) About a minute ago mynginx
[root@linux-node2 ~]# docker commit -m 'my nginx' ac5fb91d8794 goser/mynginx:v1
[root@linux-node2 ~]# docker images
goser/mynginx v1 ab390208b195 4 seconds ago 390 MB
根据创建的镜像生成容器,这样通过http://192.168.1.180:88就可以访问nginx页面了
[root@linux-node2 ~]# docker run --name mynginx -d -p 88:80 goser/mynginx:v1 nginx

 创建镜像

  1、手动创建

通过centos镜像来手动构建一个镜像mynginx
[root@linux-node2 ~]# docker run --name mynginx -it centos
[root@ac5fb91d8794 ~]# rpm -ih https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
[root@ac5fb91d8794 ~]# yum install nginx
[root@ac5fb91d8794 ~]# vi /etc/nginx/nginx.conf
daemon off;
[root@ac5fb91d8794 ~]# exit
[root@linux-node2 ~]# docker ps -a
ac5fb91d8794 centos "/bin/bash" 8 minutes ago Exited (0) About a minute ago mynginx
[root@linux-node2 ~]# docker commit -m 'my nginx' ac5fb91d8794 goser/mynginx:v1
[root@linux-node2 ~]# docker images
goser/mynginx v1 ab390208b195 4 seconds ago 390 MB
根据创建的镜像生成容器,这样通过http://192.168.1.180:88就可以访问nginx页面了
[root@linux-node2 ~]# docker run --name mynginx -d -p 88:80 goser/mynginx:v1 nginx

  2、dockerfile来创建

使用Dockerfile从原始centos镜像创建一个nginx镜像
[root@linux-node2 ~]# mkdir /opt/dockerfile/{base,runtime,app} -p
[root@linux-node2 ~]# cd /opt/dockerfile/runtime/
[root@linux-node2 runtime]# mkdir nginx
[root@linux-node2 runtime]# cd nginx/
[root@linux-node2 nginx]# vim Dockerfile
# source image
FROM centos
# maintainer
MAINTAINER goser goser1@docker.com
# commands
RUN rpm -ih https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
N yum install -y nginx
ADD index.html /usr/share/nginx/html/index.html
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"]
[root@linux-node2 nginx]# vim index.html
this is my docker nginx
[root@linux-node2 nginx]# docker build -t goser/mynginx:v2 .
[root@linux-node2 nginx]# docker images
goser/mynginx v2 9eff99a2609c 16 seconds ago 411 MB
[root@linux-node2 nginx]# docker run -d --name test1 -p 8888:80 goser/mynginx:v2
然后使用http://192.168.1.180:8888即可访问自定义的html页面

 dockerfile创建镜像规范

  dockerfile的书写规范

FROM                指定基础镜像
MAINTAINER     指定维护者信息
ENV                  指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。 
RUN                  指定要运行的命令
ADD                  拷贝文件到指定的目录,如果文件是压缩文件会自动解压
WORKDIR         设置当前工作目录,类似于cd命令
VOLUME           设置卷,挂载主机目录
EXPOSE            指定对外服务的端口
CMD                 指定容器启动后要干的事情
COPY                复制本地主机的 (为Dockerfile所在目录的相对路径)到容器中的 
ENTRYPOINT     配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
USER                指定运行容器时的用户名或UID,后续的 RUN 也会使用指定用户。        

  生产中构建镜像的模式为:基础镜像、模块镜像、业务镜像,这种划分有点类似于saltstack创建状态文件的架构

  根据上面的设计架构,我们来实现一个提供python和ssh业务的镜像

#首先创建架构的目录
[root@linux-node2 ~]# mkdir /opt/dockerfile/{base,runtime,app} -p
#进入base目录,创建最基本的镜像,比如安装最基本的工具包
[root@linux-node2 ~]# cd  /opt/dockerfile/base
[root@linux-node2 base]# mkdir  centos-ssh
[root@linux-node2 base]# cd  centos-ssh

[root@linux-node2 centos-ssh]# vim Dockerfile
# Docker for CentOS

#Base image
FROM centos

#Who
MAINTAINER goser  goser1@163.com

#EPEL
ADD epel.repo /etc/yum.repos.d/

#Base pkg
RUN yum install -y wget python-devel python-pip supervisor mysql-devel gcc glibc gcc-c++ make git openssl-devel openssh-clients openssh-server redis tree net-tools && yum clean all

# For SSHD
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 echo "root:123456" | chpasswd

#将epel源放到centos-ssh目录中,和Dockerfile在同一个目录中
[root@linux-node2 centos-ssh]# ls
Dockerfile    epel.repo
#执行构建dockerfile镜像
[root@linux-node2 centos-ssh]# docker build -t goser/centos-ssh .

#接下来创建一个运行环境层的dockerfile文件,比如创建一个nginx业务模块
[root@linux-node2 centos-ssh]# cd /opt/dockerfile/runtime
[root@linux-node2 runtime]# mkdir  nginx-ssh && cd  nginx-ssh
[root@linux-node2 nginx-ssh]#vim Dockerfile
# source image
FROM goser/centos-ssh
# maintainer
MAINTAINER goser goser1@docker.com
# commands
yum install -y nginx
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
#构建nginx-ssh镜像
[root@linux-node2 nginx-ssh]# docker build -t goser/nginx-ssh:v1 .

#最后进入业务层,创建一个web业务的dockerfile文件
#这里的ssh和nginx的启动由supervisor来管理
[root@linux-node2 nginx-ssh]# cd  /opt/dockerfile/app
[root@linux-node2 app]# mkdir  web && cd  web
[root@linux-node2 web]# vim  Dockerfile
#Base image
FROM goser/nginx-ssh

#Maintainer
MAINTAINER goser  goser1@163.com

# Add www user
RUN useradd -s /sbin/nologin -M www

# ADD file
ADD supervisord.conf /etc/supervisord.conf
ADD app-supervisor.ini /etc/supervisord.d/

# Port
EXPOSE 80 22

#ENTRYPOINT
ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
#添加supervisor配置文件到此目录,并在此目录中创建一个supervisor启动文件
[root@linux-node2 web]# vim app-supervisor.ini
[program:web-nginx]
command=/usr/sbin/nginx 
process_name=%(program_name)s
autostart=true
user=www
stdout_logfile=/tmp/nginx/nginx.log
stderr_logfile=/tmp/nginx/nginx.error

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

[root@linux-node2 web]# ls
app-supervisor.ini   supervisord.conf  Dockerfile
#构建nginx的web镜像
[root@linux-node2 web]# docker build -t goser/nginx-web:v1 .
#测试,挂载数据卷,这个卷作为程序员开发的代码文件放置位置
[root@linux-node2 ~]# docker run --name  myweb -d  -v  /data:/usr/share/nginx/html:ro  goser/nginx-web:v1
#这样程序员就可以在/data目录中编写代码文件,创建的文件会同步到容器的/usr/share/nginx/html/目录

 在docker官网上注册一个仓库,上传制作的镜像文件到仓库中(这个做个人测试用,企业最好部署私有仓库)

  1、注册账号:

  在https://hub.docker.com/上点击“sign up”,按照提示输入用户名、邮箱等信息完成注册。建立新的仓库“nginx”,并标记为public

  注册的账号为:goser   密码为xg?????

  2、测试将本地的nginx镜像上传到dockerhub上供别人使用

[root@linux-node1 ~]# docker images

docker.io/nginx latest cd5239a0906a 2 weeks ago 109 MB
docker.io/centos latest 49f7960eb7e4 2 weeks ago 200 MB

  3、 本地登录 输入注册时的用户名、密码

[root@linux-node1 ~]# docker  login

Username: goser
Password: 
Login Succeeded

  4、把Repository、tag分别修改成自己的namespace下仓库的名字、tag名。修改后可以发现,其<IMAGE_ID>是一样的,只是REPOSITORY及TAG名字不同

[root@linux-node1 ~]# docker  tag  nginx  goser/nginx:nginx-v1.0

[root@linux-node1 ~]# docker images

REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE

goser/nginx    nginx-v1.0  cd5239a0906a   2 weeks ago      109 MB
docker.io/nginx          latest        cd5239a0906a      2 weeks ago      109 MB

  5、上传至docker hub

  docker push 镜像到docker hub 的仓库。如下图,如果没有报错,等待上传结束,我们就能在Docker hub的页面上对应的tag标签下看到这个tag。

[root@linux-node1 ~]# docker push goser/nginx:nginx-v1.0
The push refers to a repository [docker.io/goser/nginx]
3ff93588120e: Mounted from library/nginx 
24ee0a3fd4b9: Mounted from library/nginx 
d626a8ad97a1: Mounted from library/redis 
nginx-v1.0: digest: sha256:1f9c00b4c95ef931afa097823d902e7602aebc3ec5532e907e066978075ca3e0 size: 948

  镜像上传成功之后,我们可以到Docker hub上查看一下

  6、将上传好的镜像供别人使用,按照Repository:tag的形式,将镜像下载到本地

 当然也可以让docker监听tcp,事项docker-api功能,让别的程序来调用docker-api

让docker默认监听tcp连接,首先修改配置文件
[root@linux-node1 conf.d]# vim /etc/sysconfig/docker 
OPTIONS='--log-driver=journald --signature-verification=false -H tcp://0.0.0.0:235 -H unix://var/run/docker.sock'
然后重启docker,使用curl就可以查看docker的一些信息
[root@linux-node1 conf.d]# curl -s http://192.168.1.180:235/info |python -mjson.tool

使用vmvare的harbor项目创建私有仓库

 根据vmvare的harbor项目安装说明来安装私有仓库,地址为:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md

 安装docker-ce

  1、安装docker-ce的依赖包:

[root@docker-registry ~]# yum install -y yum-utils  device-mapper-persistent-data lvm2

  2、添加docker-ce仓库文件

[root@docker-registry ~]# yum-config-manager --add-repo  https://download.docker.com/linux/centos/docker-ce.repo

  3、安装docker-ce

[root@docker-registry ~]# yum install docker-ce -y

  4、启动docker-ce和开机自启动

[root@docker-registry ~]# systemctl  start   docker
[root@docker-registry ~]# systemctl  enable   docker

  5、查看docker-ce版本号,并测试docker-ce安装是否成功

[root@docker-registry ~]# docker  version
Client:
 Version:      18.05.0-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   f150324
 Built:        Wed May  9 22:14:54 2018
 OS/Arch:      linux/amd64
 Experimental: false
 Orchestrator: swarm
#测试从docker官方pull一个镜像
[root@docker-registry ~]# docker  run  hello-world

 安装docker-compose

  安装方式一:手动安装

#安装python软件安装工具pip
[root@docker-registry ~]# yum install -y  python-pip
#按照提示升级pip工具
[root@docker-registry ~]# pip install --upgrade pip
Installing collected packages: pip
  Found existing installation: pip 8.1.2
    Uninstalling pip-8.1.2:
      Successfully uninstalled pip-8.1.2
Successfully installed pip-10.0.1
#安装docker-compose,这时候可能会报如下错误
[root@docker-registry ~]# pip install docker-compose
docker 3.4.0 has requirement six>=1.4.0, but you'll have six 1.3.0 which is incompatible.
docker-pycreds 0.3.0 has requirement six>=1.4.0, but you'll have six 1.3.0 which is incompatible.
#解决这个报错方式为:安装six
[root@docker-registry ~]# pip install six --user -U
[root@docker-registry ~]# pip install ipython --user -U
#再次安装docker-compose就正常了
[root@docker-registry ~]# pip install docker-compose
[root@docker-registry ~]# pip install --upgrade backports.ssl_match_hostname
#查看docker-compose能查看到说明docker-compose安装成功了
[root@docker-registry ~]# docker-compose --version
docker-compose version 1.21.2, build a133471

  安装方式二:通过curl方式来安装

#通过curl来安装docker-compose,安装的时候可能会报如下错误
[root@docker-registry ~]# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose 
curl: (35) Peer reports incompatible or unsupported protocol version.
#对这个错误的解决方式为:升级nss和curl
[root@docker-registry ~]# yum update nss nss-util nspr curl

#最后再使用curl来安装docker-compose就没问题了
[root@docker-registry ~]# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   596    0   596    0     0    435      0 --:--:--  0:00:01 --:--:--   435
100  1480  100  1480    0     0    623      0  0:00:02  0:00:02 --:--:--  2840
#授权docker-compose脚本有执行权限
[root@docker-registry ~]# chmod +x /usr/local/bin/docker-compose
#查看docker-compose版本
[root@docker-registry ~]# docker-compose --version
docker-compose version 1.21.2, build 1719ceb

 安装harbor

  因为harbor使用的协议是https的方式,所以提前要做好自签名证书的生成

  1、生成证书

#创建证书目录
[root@docker-registry ~]# mkdir -p /data/cert
[root@docker-registry ~]# cd  /data/cert/
#创建CA根证书
[root@docker-registry cert]# openssl req  -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt -subj "/C=CN/L=Shanghai/O=goser/CN=harbor-registry"
#生成一个证书签名, 设置访问域名为 harbor.goser.com
[root@docker-registry cert]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout harbor.goser.com.key -out server.csr -subj "/C=CN/L=Shanghai/O=goser/CN=harbor.goser.com"
#生成主机的证书
[root@docker-registry cert]# openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor.goser.com.crt
#查看生成的证书如下:
[root@docker-registry cert]# ls
▽a.crt  ca.key  ca.srl  harbor.goser.com.crt  harbor.goser.com.key  server.csr

  2、下载harbor并配置

   这里的hostname要配置成域名(比如harbor.goser.com),ui_url_protocol要配置成https协议

#根据官方说明下载harbor
[root@docker-registry ~]# wget https://storage.googleapis.com/harbor-releases/release-1.5.0/harbor-offline-installer-v1.5.1.tgz
[root@docker-registry ~]# tar xf  harbor-offline-installer-v1.5.1.tgz
#配置harbor配置文件如下:
[root@docker-registry ~]# cd   harbor
[root@docker-registry ~]# vim harbor.cfg
hostname = harbor.goser.com
ui_url_protocol = https
max_job_workers = 50 
customize_crt = on
ssl_cert = /data/cert/harbor.goser.com.crt
ssl_cert_key = /data/cert/harbor.goser.com.key
secretkey_path = /data
admiral_url = NA
log_rotate_count = 50
log_rotate_size = 200M
http_proxy =
https_proxy =
no_proxy = 127.0.0.1,localhost,ui
email_identity = 
email_server = smtp.mydomain.com
email_server_port = 25
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
email_ssl = false
email_insecure = false
harbor_admin_password = Harbor12345
auth_mode = db_auth
ldap_url = ldaps://ldap.mydomain.com
ldap_basedn = ou=people,dc=mydomain,dc=com
ldap_uid = uid 
ldap_scope = 2 
ldap_timeout = 5
ldap_verify_cert = true
ldap_group_basedn = ou=group,dc=mydomain,dc=com
ldap_group_filter = objectclass=group
ldap_group_gid = cn
ldap_group_scope = 2
self_registration = on
token_expiration = 30
project_creation_restriction = everyone
db_host = mysql
db_password = root123
db_port = 3306
db_user = root
redis_url = redis:6379
clair_db_host = postgres
clair_db_password = password
clair_db_port = 5432
clair_db_username = postgres
clair_db = postgres
uaa_endpoint = uaa.mydomain.org
uaa_clientid = id
uaa_clientsecret = secret
uaa_verify_cert = true
uaa_ca_cert = /path/to/ca.pem
registry_storage_provider_name = filesystem
registry_storage_provider_config =

   既然这里的hostname配置成了域名的形式,那么企业中要么有DNS服务器来提供域名解析服务,要么docker客户端修改hosts文件,手动添加域名解析

[root@linux-node2 ~]# vim  /etc/hosts
192.168.1.180   linux-node1  harbor.goser.com

  3、安装harbor,注意要保证系统中80端口没被占用,因为harbor启动默认用到80端口,当然端口可以修改(修改docker-compose.yml配置文件即可)。

   安装harbor前最好先执行下prepare脚本,生成配置文件,没报错,接下来就可以执行install.sh脚本来安装harbor了。

[root@docker-registry harbor]# ./install.sh 
[Step 0]: checking installation environment ...

Note: docker version: 18.05.0

Note: docker-compose version: 1.21.2

[Step 1]: loading Harbor images ...
52ef9064d2e4: Loading layer  135.9MB/135.9MB
4a6862dbadda: Loading layer  23.25MB/23.25MB
58b7d0c522b2: Loading layer   24.4MB/24.4MB
9cd4bb748634: Loading layer  7.168kB/7.168kB
c81302a14908: Loading layer  10.56MB/10.56MB
7848e9ba72a3: Loading layer  24.39MB/24.39MB
Loaded image: vmware/harbor-ui:v1.5.1
f1691b5a5198: Loading layer  73.15MB/73.15MB
a529013c99e4: Loading layer  3.584kB/3.584kB
d9b4853cff8b: Loading layer  3.072kB/3.072kB
3d305073979e: Loading layer  4.096kB/4.096kB
c9e17074f54a: Loading layer  3.584kB/3.584kB
956055840e30: Loading layer  9.728kB/9.728kB
Loaded image: vmware/harbor-log:v1.5.1
...........
...........
✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at https://192.168.182.170. 
For more details, please visit https://github.com/vmware/harbor .

   当然也可以在harbor的安装目录中执行下面操作来关闭或开启harbor

[root@linux-node1 ~]# cd harbor
#关闭harbor的方式为:
[root@linux-node1 harbor]# docker-compose stop
#开启harbor的方式为:
[root@linux-node1 harbor]# docker-compose start

  4、登录harbor的web界面如下:

  docker客户端要想登陆到harbor私有仓库的进行push/pull的话,必须在docker客户端对ca.crt证书做可信任操作,然后重启docker即可

#将ca.crt证书推送到docker客户端
[root@linux-node1 cert]# scp  ca.crt  192.168.1.190:/etc/docker/certs.d/
#然后再docker客户端将这个ca.crt证书做信任处理
[root@linux-node2 certs.d]# cat  ca.crt >> /etc/pki/tls/certs/ca-bundle.crt
#最后重启docker
[root@linux-node2 certs.d]# systemctl   stop  docker
[root@linux-node2 certs.d]# systemctl   start  docker 

  这样通过harbor就搭建好了docker私有仓库,那么docker客户端就可以通过命令:docker login -u admin -p Harbor12345 harbor.goser.com来连接harbor私有仓库,并可上传和下载docker镜像。

  如果使用docker login -u admin -p Harbor12345 192.168.1.180登录的话,可能会报如下错误

[root@linux-node2 ~]# docker  login  -u admin -p Harbor12345 192.168.1.180
Error response from daemon: Get https://192.168.1.180/v1/users/: x509: cannot validate certificate for 192.168.1.180 because it doesn't contain any IP SANs

  另外,如果配置文件中的hostname不是使用域名,而是使用服务器ip的情况,还需要再docker的配置文件中添加–insecure-registry server_ip的参数,否则会报错的。增加参数如下:

vim  /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd-current \
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --insecure-registry 192.168.1.180 \

#然后在登录registry就会通过了
docker login  -u admin  -p Harbor12345  192.168.1.180

  下面通过docker客户端来上传镜像到harbor仓库

#先对需要上传的镜像打标签
[root@linux-node2 ~]# docker tag  redis  harbor.goser.com/dev/redis:v1.0
#打好标签后做上传操作
[root@linux-node2 ~]# docker  push  harbor.goser.com/dev/redis:v1.0

  通过浏览器查看上传镜像是否成功

  在harbor中可以创建各种角色的用户来操作harbor仓库,比如对一个项目创建一个账号,可以赋予这个账号管理员角色(可以上传和下载镜像、删除镜像)、开发人员角色(可以上传和下载镜像,但不可删除镜像)、访客角色(只可下载镜像)

 我们知道haobor私有仓库支持分布式方式存储镜像,通过harbor的复制管理来复制镜像到不同的harbor服务节点中。

docker-ui管理容器vmware/admiral的使用

 要启动admiral容器,可以先下载admiral镜像,或者直接启动admiral容器时候自动下载admiral,这里我们先下载admiral镜像0.9.2版本,至于最新版本的使用添加的docker主机需要htttps连接的docker-api

[root@linux-node1 ~]# docker  pull  vmware/admiral:0.9.2

 启动admiral容器:docker  run  -d  --name  admiral -p 8888:8282  vmware/admiral,启动完成后,打开admiral的web界面,发现不需要登录认证就可以直接进入,这样不安全,所以要对admiral的容器启动后必须登录才能使用admiral的设置,设置方式如下:

#创建用户认证文件
[root@linux-node1 ~]# mkdir -p /path/to/admiral/
[root@linux-node1 ~]# cd  /path/to/admiral/
[root@linux-node1 admiral]# vim  local-users.json 
{
  "users": [{
    "email": "admin@goser.com",
    "password": "passWord"
    },{
    "email": "user1@goser.com",
    "password": "passWord"
    }]
}
#启动admiral容器,将这个认证文件放入到admiral容器的数据卷中
[root@linux-node1 ~]# docker run  -d  --name  admiral-lasted  -p 8888:8282 -e XENON_OPTS="--localUsers=/tmp/local-users.json"  -v /path/to/admiral/local-users.json:/tmp/local-users.json vmware/admiral:0.9.2

 添加好用户的认证文件后,打开admiral容器的web界面如下:

 输入用户名和密码后,添加一个主机名为linux-node2.goser.com的docker主机,要添加docker主机必须实现了docker-api的功能,实现docker-api的协议有http协议和安全的https协议。

 使用http方式实现的docker-api

#让docker主机实现docker-api功能的方式一,修改docker的配置文件
[root@linux-node2 docker]# vim  /etc/sysconfig/docker
OPTIONS='--log-driver=journald --signature-verification=false -H tcp://0.0.0.0:235 -H unix://var/run/docker.sock'

#方式二,配置docker的daemon.json文件,生产上主要用这种方式,比较灵活
[root@linux-node2 ~]# cd  /etc/docker/
[root@linux-node2 docker]# vim daemon.json
{
  "hosts":[
    "tcp://0.0.0.0:235",
    "unix://var/run/docker.sock"
  ]

}
#重启docker
[root@linux-node2 ~]# systemctl  stop  docker
[root@linux-node2 ~]# systemctl  start  docker

 实现了docker-api功能后,在admiral界面中添加linux-node2.goser.com这个docker主机

 使用https方式实现的docker-api

#配置docker的daemon.json文件
[root@linux-node2 ~]# cd  /etc/docker/
[root@linux-node2 docker]# vim daemon.json
{
  "tlsverify": true,
  "tlscert": "/data/cert/docker.goser.com.crt",
  "tlskey": "/data/cert/docker.goser.com.key",
  "tlscacert": "/data/cert/cacert.pem",
  "hosts":[
    "tcp://0.0.0.0:235",
    "unix://var/run/docker.sock"
  ]

}
#重启docker
[root@linux-node2 ~]# systemctl  stop  docker
[root@linux-node2 ~]# systemctl  start  docker

 实现了https方式的docker-api后,在admiral中就可以添加这个docker主机了,通过https添加的docker主机是需要提供证书认证的(提供的是认证的主机而不是ca证书)。生成的证书如下:

[root@linux-node2 docker]# ls /data/cert/
docker.goser.com.crt  docker.goser.com.key

 在admiral中添加docker主机的时候,将docker主机的证书内容粘贴进去即可

 验证通过后,点击添加即可

 添加完docker主机后,测试在linux-node2.goser.com的docker主机上创建一个nginx容器。在templates模板界面中输入nginx,然后点击provision来构建一个nginx容器

 待nginx容器构建完成后,就可以在container界面中展现出来,点击构建好的ngixn容器,可以看到这个容器的详细信息,比如nginx的web地址

 通过构建容器前的编辑操作导出成模板的形式一次串联构建多个容器,比如将nginx的构建导出成模板,然后在这个模板后再添加一个容器

 添加好后,点击nginx模板的privision来同时构建多个容器,待构建完成后就可以在applications界面中查看构建的多个容器

 至于如何将harbor仓库加入到admiral中,在部署的时候还是因为证书报错的问题无法加入,待后期研究中。。。。

 关于docker-api的https安全连接的方式可以参考:https://deepzz.com/post/dockerd-and-docker-remote-api.html

 关于申请免费ssl证书,可以参考:https://firefore.com/free-https-lets-encrypt.html  http://www.ymq.io/2018/06/08/certs-https/#3-copy安装-证书

 关于下载docker镜像,国内的镜像源可以选择:docker公司中国区(https://registry.docker-cn.com)、DaoCloud(http://aad0405c.m.daocloud.io)、阿里云(https://0wtxe175.mirror.aliyuncs.com),网易蜂巢等(http://hub-mirror.c.163.com)等。下面就以添加网易蜂巢docker源为例添加到自己的docker环境中

#修改docker的daemon.json文件,将网易蜂巢docker源地址添加进去
[root@linux-node2 ~]# vim  /etc/docker/daemon.json 
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
#重启docker即可使用网易蜂巢docker加速器
[root@linux-node2 ~]# systemctl daemon-reload
[root@linux-node2 ~]# systemctl  restart  docker

 

posted @ 2018-06-23 22:40  goser  阅读(614)  评论(0)    收藏  举报