Centos7 安装docker并配置shipyard

版权声明:仅供学习参考 转载请标明出处。 https://blog.csdn.net/xujiamin0022016/article/details/81281472

Centos7 安装docker并配置shipyard

 

 

Docker 包括三个基本概念

  1. 镜像(Image):镜像是只读的,镜像可以想象成操作系统的安装镜像(例CentOS6.8.ISO)。
  2. 容器(Container):容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以理解成 我们通过镜像安装操作系统,我们可以开机,关机,等操作。
  3. 仓库(Repository): 仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。一个仓库中可能有centos ubuntu fedora等镜像,然后ubuntu可以有12 13 15 16等版本则使用标签标明。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
    理解了这三个概念,就理解了 Docker 的整个生命周期。

          容器理念单进程  鼓励 “一个容器一个进程(one process per container)” 的方式

         docker 使用内核级别的资源隔离

 

 

Docker和传统的虚拟机方式的不同之处
Docker容器是在操作系统层面上实现虚拟化直接复用本地主机的操作系统因此更加轻量级。
 

安装Docker 

这边使用2-3台测试机 进行安装和测试 可能ip和hostname 会出现不一致 但是步骤和思路是没有问题的,都是走过一遍的

安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum makecache fast

yum -y install docker-ce

service docker start

 

基本命令

 

启动容器   docker run-name- h hostname

停止容器   docker stop CONTAINER ID

查看容器   docker ps -a -l

进入容器   docker exec

                 docker attach

                 nsenter(推荐)

删除容器   docker rm

 

启动容器

--name  起个名字 -t 分配一个伪终端 -i 让容器的标准输入打开

 

centos 是镜像 如果本地没有 会在启动时下载

执行一个命令  /bin/bash  或者/bin/bash都可以

进入容器  退出之后 会退出容器

docker run --name bash-test -t -i centos /bin/bash

 

docker start $CONTAINER ID

进入容器  查看进程

容器理念单进程

用nsenter进入指定容器

安装nsenter

yum -y install util-linux

 

docker inspect --format "{{.State.Pid}}" 624b8816e968

 

nsenter -t 31854  -u -i -n  -p进入指定PID的容器

 

#!/bin/bash

PID=$(docker inspect --format "{{.State.Pid}}" $1)

nsenter -t  $PID -u  -i -n  -p

 

有时候会出现进入容器 但是不能联网的情况

 

只需要退出容器 重新启动一下docker 服务即可

 

 

 

导出和导入镜像

#创建私有仓库(官方提供了 registry 镜像来启动本地的私有仓库)

docker pull registry

 

#docker run -d -p 5000:5000 --restart=always  registry

docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

注:默认情况下,会将仓库存放于容器内的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器内的/tmp/registry下,如下docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

 

导出

 

在装有docker的新机子上导入

docker load < /tmp/centos.tar.gz

 

 

删除镜像

只能删除没有创建容器的镜像

 

删除容器

docer rm $CONTAINER ID

加上-f 即使正在运行的容器也可以删除

 

docer rm -f $CONTAINER ID

 

运行结束自动删除容器

运行容器时带上—rm参数

 

 

 

 

docker 网络访问

随机映射

docker run -P
 

指定映射
-p host Port: containerPort
-p ip: hostPort: containerPort
-p i: container Port
-p hostPort: container Port: udp

 

docker数据管理

数据卷 -v /data                             数据卷容器  --volumes-

       -v src:dst                                                  from

挂载时指定权限

docker挂载多个目录

docker run --name test -v /tmp/1:/tmp/1  -i -t  centos  /bin/bash

 

docker手动构建镜像

nginx位于第三方的yum源里面,而不在centos官方yum源里

这边直接yum 可能会报No package nginx available.

rpm 安装rpm源

rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

在执行yum即可

 

基于容器做镜像

思路:

docker run --name mynginx -it centos容器 ↓

     yum -y install nginx ↓
docker commit -m "my nginx" a15eeffbed99  jiaminxu/mynginx:v1镜像↓

docker run -it --name nginxv1 jiaminxu/mynginx:v1容器↓


             vi /etc/nginx/nginx.conf ↓
               daemon off; ↓
docker commit -m "my nginx" bf0b50553f26  jiaminxu/mynginx:v2  镜像↓

 docker run -d -p 82:80 jiaminxu/mynginx:v2 nginx 容器←

 

docker run --name mynginx -it centos容器

rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

yum -y install nginx

 

docker commit  -m “名称” $CONTAINER ID 仓库名称/镜像名称/版本

docker commit -m "my nginx" a15eeffbed99  jiaminxu/mynginx:v1

基于镜像启动 

docker run -it --name nginxv1 jiaminxu/mynginx:v1

在nginx.conf中添加daemon off;

提交

docker commit -m "my nginx" bf0b50553f26  jiaminxu/mynginx:v2

docker run -d -p 82:80 jiaminxu/mynginx:v2 nginx

nginx  表示启动容器之后运行的命令  查看docker机子的82端口,即映射到容器nginx的80  可以看到nginx 的主页

 

退出容器之后nginx还是启动着的

 

 

 

 

 

docker file

 docker build /opt/nginx/Dockerfile

基础镜像信息

维护者信息

镜像操作指令

容器启动时执行指令

 

#This docker file

#Version 1

#Author: jiamin xu

#Base image

FROM centos

#Maintainer

MAINTAINER jiamin xu  [email protected]

 

#Commands

RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

RUN yum -y install nginx

ADD index.html /usr/share/nginx/html/index.html

#不清楚echo 首字母是否需要大写

#RUN echo "daemon off;" >> /etc/nginx/nginx.cnf

EXPOSE 80

#CMD ["nginx"]

CMD ["nginx", "-g", "daemon off;"]

上传的文件 需要和 Dockerfile 在一个路径下

 

构建   -t  tag

构建状态会保留

docker build -t jiaminxu/mynginx:v4 /opt/docker/nginx/

 

 

 

docker run -it  -d -p 84:80 jiaminxu/mynginx:v4

 

 

 

私有仓库

默认端口5000

docker run -d -p 5000:5000 registry

(docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry)正确启动方式

 

修改nginx 配置文件nginx.conf

upstream docker-registry {

  server 10.6.11.120:5000;

}

server {

    listen       443 ssl;

    server_name  10.6.11.120 registry.hengtiansoft.com;

 

    ssl_certificate      /etc/pki/CA/nginx.crt;

    ssl_certificate_key  /etc/pki/CA/nginx.key;

    proxy_set_header HOST $http_host;

    proxy_set_header X-Real-IP $remote_addr;

    client_max_body_size 0;

    chunked_transfer_encoding on;

 

    location / {

        auth_basic       "Docker";

        auth_basic_user_file  /usr/local/nginx/conf/docker-registry.htpasswd;

        proxy_pass http://docker-registry;

}

    location /_ping {

        auth_basic off;

}

}

 

 

 

 

 

 

 

生成证书 生产不行

cd /etc/pki/CA

touch ./{serial,index.txt}

echo "00" > serial

openssl genrsa -out private/cakey.pem 2048

 

openssl req -new -x509 -key private/cakey.pem -days 3650 -out cacert.pem

 

 

openssl  genrsa -out nginx.key 2048

 

openssl req -new -key nginx.key -out nginx.csr

 

签发证书

openssl ca -in nginx.csr -days 3650 -out nginx.crt

 

让系统接收自签发的证书

#这边用自己的证书也是可以的

cat /etc/pki/CA/cacert.pem  >> /etc/pki/tls/certs/ca-bundle.crt

 

htpasswd -c /usr/local/nginx/conf/docker-registry.htpasswd jiaminxu

提示找不到htpasswd命令

yum -y  install httpd

 

重启nginx

 

添加/etc/hosts

registry.hengtiansoft.com

登录

Docker version 1.13.1, build dded712/1.13.1

docker login  -u jiaminxu -p 123456 -e [email protected]

Docker version 18.06.0-ce, build 0ffa825

docker login  -u jiaminxu -p 123456  registry.hengtiansoft.com

 

docker login  -u jiaminxu -p 123456 -e [email protected]

docker login  -u jiaminxu -p 123456 registry.hengtiansoft.com

 

 

Docker version 18.06.0-ce, build 0ffa825

docker ps -a

查看需要打tag的容器id,先将容器打成镜像

docker commit -m "my nginx" ac000f195cc6  jiaminxu/mynginx:v4

给commit之后的镜像 打一个tag

然后push

docker tag jiaminxu/mynginx:v4 registry.hengtiansoft.com/jiaminxu/mynginx:v5

docker push registry.hengtiansoft.com/jiaminxu/mynginx:v5

 

如果不成功

尝试以下操作  pull时替换register.hengtiansoft.com 为ip:5000可以pull

vim /usr/lib/systemd/system/docker.service

systemctl daemon-reload

systemctl restart docker

docker run -d -p 5000:5000 registry

docker login  -u jiaminxu -p 123456 registry.hengtiansoft.com

docker tag 9380147c5404  registry.hengtiansoft.com/jiaminxu/nginx_test:lastest

 

 

 

 

 

docker 管理工具 shipyard安装

http://shipyard-project.com/

 

wget https://wwwfcwys.oss-cn-shenzhen.aliyuncs.com/typecho/2017/12/27/shipyard.tar.gz

 

tar zxvf shipyard.tar.gz

 

install.sh      //一键安装脚本

deploy          //官方安装脚本修改版,若已下载前文所需镜像可直接运行此脚本安装

 

firewall-cmd --zone=public --permanent --add-port=2375/tcp

firewall-cmd –reload

 

 

参考https://www.fcwys.cc/index.php/archives/145.html

 

启动顺序(重启docker会自动启动shipyard)

docker start shipyard-rethinkdb

docker start  shipyard-discovery

docker start  shipyard-certs

docker start  shipyard-proxy

docker start shipyard-swarm-manager

docker start shipyard-swarm-agent

docker start shipyard-controller

 

 

使用

缺陷:添加私有仓库会报错

 

还是使用老的方式  而不是/v2/_catalog

参考网上2个办法  均不成功   有兴趣的朋友可以尝试一下

https://blog.csdn.net/hailwind/article/details/51526842?locationNum=1

https://www.jianshu.com/p/b0f9739b5c25

构建 shipyard-builder的第5步就会报错  修改源什么的都试了一下 都不行

 

 

可能中文版本时间比较久远了 不支持了吧

 

花了挺多时间 终于找到了可以添加私有仓库的办法

就是将controller换成英文版 即官方版本

首先pull 官方镜像

docker pull shipyard/shipyard

关闭并删除旧容器 避免重启docker 又自动重启容器

docker stop shipyard-controller

docker rm   shipyard-controller

启动容器 并设置只要容器停止了 就重新启动

附--restart的使用方法

标志                                 描述

no                         不自动重启容器(默认值)

on-failure             如果容器由于错误而退出,则将其重新启动,非零退出代码表示错误

unless-stopped    重新启动容器,除非明确停止容器或者 Docker 被停止或重新启动

always                 只要容器停止了,就重新启动

 

 

 

 

docker run --restart always -ti -d --name shipyard-controller-v2 --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 8080:8080 shipyard/shipyard server -d tcp://swarm:3375

 

启动之后需要等待几分钟 会从中文模式切换到英文模式 直到出现以下界面

 

添加name=localhost;Registry Address=http://10.6.11.120:5000; Usename和Passwd;

私有仓库地址一定要带上http://否则会报以下错误

 

添加成功  查看私有仓库地址

 

 

手动启动方式(参考)

https://www.cnblogs.com/xuezhigu/p/6734756.html

其实只要手动起新controller 其余服务用默认docker start container即可

1. 数据存储(rethinkdb)

 

docker run -ti -d --name shipyard-rethinkdb rethinkdb

2.服务发现(etcd)

 

为了启用Swarm leader选择,我们必须使用来自Swarm容器的外部键值存储。此处,我们使用Etcd作为服务发现工具。可以选用的服务发现工具还有Consul、Zookeeper等。

 

docker run -ti -d -p 4001:4001 -p 7001:7001 --name shipyard-discovery microbox/etcd -name discovery

3. Docker代理服务(shipyard/docker-proxy)

 

默认情况下,Docker引擎只侦听套接字。 我们可以重新配置引擎以使用TLS,或者您可以使用代理容器。 这是一个非常轻量级的容器,它只是将请求从TCP转发到Docker监听的Unix套接字。

 

docker run  -ti -d -p 2375:2375 --hostname=$HOSTNAME --name shipyard-proxy -v /var/run/docker.sock:/var/run/docker.sock -e PORT=2375 shipyard/docker-proxy

4.Swarm管理节点(swarm manager)

 

将IP-OF-HOST替换为对应的ip;

将SWARM-INNER-PORT换成对应的端口,默认2375.

将SWARM-MAP-PORT换成映射到host机的ip,例如2376

 

格式:docker run -ti -d --name -p [SWARM-MAP-PORT]:[SWARM-INNER-PORT] shipyard-swarm-manager docker.io/swarm manage --host tcp://0.0.0.0:[SWARM-INNER-PORT] etcd://[IP-OF-HOST]:4001实例化:docker run  -ti -d --name shipyard-swarm-manager swarm manage --host tcp://0.0.0.0:3375 etcd://10.211.55.20:4001

5.Swarm Agent节点将当前docker节点加入到集群中

 

将IP-OF-HOST替换为对应的ip

将IP-OF-ETCD-HOST换成etcd所在的docker节点ip。

将LOCAL-DOCKER-PORT换成本机docker所监听的端口,例如2375

 

 

格式:docker run -ti -d --name shipyard-swarm-agent docker.io/swarm join --addr [IP-OF-HOST]:[LOCAL-DOCKER-PORT] etcd://[IP-OF-ETCD-HOST]:4001

 

实例: docker run -ti -d --name shipyard-swarm-agent swarm join --addr 10.6.11.120:2375 etcd://discovery:4001

6.启动Shipyard管理工具

 

 

docker run -ti -d --name shipyard-controller --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 8080:8080 shipyard/shipyard server -d tcp://swarm:3375

7.浏览器访问:http://10.6.11.120:8080/ 即可进入链接

 

默认用户名/密码 admin/shipyard

 

防火墙需打开4001  2375端口,否则防火墙会拦住容器。

容器界面会显示空白

 

至此 shipyard就可以使用啦.10分感谢文中几个大佬的博客和老男孩的视频.

如果有大佬成功build了支持registry:v2中文的镜像,麻烦分享一下[email protected]  10分感谢

 

 

 

 

猜你喜欢

转载自blog.csdn.net/xujiamin0022016/article/details/81281472