详解基于Docker的服务部署流程
本次总结涉及到docker-io、docker-ce的安装、centos7镜像的制作、docker私有仓库搭建、centos6.7环境下从centos7私有仓库拉取私有镜像、docker容器运行、centos6.5及centos7一起运行时兼容性处理等内容。
一、docker基本组件及devops运作流程
dockerimage:docker镜像是一个运行容器的只读模板。
dockercontainer:docker容器是一个运行应用的标准化单元。
dockerregistry:docker注册服务器用来存放镜像。
dockerengine:docker引擎用来在主机上创建,运行和管理容器。
二、docker安装与配置
由于docker国外站点下载较慢或无法正常下载,需要更新为国外源之后再进行快速安装配置。centos6.5安装docker-io,cnetos7安装docker-ce
#创建docker相关的目录 mkdir -p /data/docker #安装docker运行必要工具 sudo yum install -y yum-utilsdevice-mapper-persistent-data lvm2 crontabs #增加docker下载仓库,使用阿里云仓库下载,国外站点下载太慢 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum makecache fast #安装docker并检测docker安装运行情况 sudo yum -y install docker-ce docker version systemctl enable docker.service systemctl start docker.service #配置docker sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json<<-'eof' {"graph": "/data/docker"} eof sudo systemctl daemon-reload sudo systemctl restart docker
三、搭建私有docker仓库
docker安装完成后dockerd的配置文件在/etc/docker/daemon.json中,如果没有该文件,可以手动创建。
1、安装配置registry镜像
pull docker官方的registry的第二个版本,docker1.6版本以上支持registry2
docker pull registry:2.6.0
或者不指定版本,表示latest版本
docker pull registry
配置daemon.json,去掉docker默认的https的访问,否则易出现如下问题:
get https://120.78.253.133:5000/v2/:http: server gave http response to https client
打开配置文件
vim /etc/docker/daemon.json
里面的内容是一个json对象,加上一项insecure-registries,地址自己更改:
{ "insecure-registries":["192.168.1.78:5000"] }
此处设置无效时,直接配置服务程序如下(增加红色字体内容):
vim/usr/lib/systemd/system/docker.service
execstart=/usr/bin/dockerd --insecure-registry 172.18.3.242:5000
重启docker
systemctl daemon-reload systemctl restart docker
2、无认证启动registry容器
上传到私有仓库的镜像时是默认存放在容器的/var/lib/registry/,为了防止删除registry时上传的镜像也被删除,所以启用一个volume,将上传的镜像持久化保存在我们物理机上,这里保存位置是/opt/registry/。
测试是否启动容器
curlhttp://192.168.1.78:5000/v2/_catalog
如果返回以下信息表示启动成功
{"repositories":["mynginx"]}
3、私有仓库推拉私有镜像
测试上传到我们自己的私有registry,首先将mynginx镜像重命名tag:
docker tag mynginx 192.168.1.78:5000/mynginx
这里需要注意的是重命名的tag必须带有建立192.168.1.78:5000/这个前缀,后面的mynginx是新镜像名,二者名称可以不同。然后开始push到我们建立的私有registry仓库:
docker push 192.168.1.78:5000/mynginx
检测推送镜像的情况,返回以下结果说明推送正常。
curl http://192.168.1.78:5000/v2/_catalog {"repositories":["mynginx"]}
测试私有仓库镜像拉取pull,本机拉取如下:
docker rmi 192.168.1.78:5000/mynginx
其他物理主机拉取私有仓库镜像,在安装docker前提下配置/etc/docker/daemon.json文件添加insecure-registries,ip地址自己更改:
{ "insecure-registries":["192.168.1.78:5000"] }
然后重启docker,执行pull,同理也可以上传镜像
systemctl daemon-reload systemctl restart docker docker pull 192.168.1.78:5000/mynginx
4、dockerfile创建服务镜像
dockfile是一种被docker程序解释的脚本,dockerfile由一条一条的指令组成,每条指令对应linux下面的一条命令。docker程序将这些dockerfile指令翻译真正的linux命令。dockerfile有自己书写格式和支持的命令,docker程序解决这些命令间的依赖关系,类似于makefile。docker程序将读取dockerfile,根据指令生成定制的image。相比image这种黑盒子,dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了dockerfile,当我们需要定制自己额外的需求时,只需在dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。
基于centos7创建镜像,首先拉取centos7镜像,
docker pull centos7
制作镜像的dockerfile如下所示:
from centos:7 maintainer tcy tiancy@jovision.com run yum update -y && \ yum install crontabs iproutewget net-tools gcc automake autoconflibtool make gcc gcc-c++ zlib* zlib-devel -y run mkdir -p /home/mynginx copy octmts /home/mynginx/octmts copy tools /home/mynginx/tools workdir /home/mynginx/octmts run chmod –r 755 * run sh install.sh octmts
编译创建镜像
docker build -t octmts -f dockerfile-octmts .
创建容器
程序文件和dockerfile放在同一目录
创建容器+运行
创建centos7容器,使用systemctl后台运行服务程序时遇到以下问题:
failed to get d-bus connection
解决方案(此方案在主机是centos6.5系统下无效,暂时无法处理):
或者
四、centos6.5系统下使用私有仓库的兼容问题
centos6.5系统下使用私有仓库时由于版本问题导致pull私有镜像失败,docker 1.7.1版本pull私有镜像仓库报错,v1,v2等。docker 1.7版本和docker ce的配置文件的位置不同:
docker 1.7版本 /etc/sysconfig/docker
docker ce版本使用 /etc/docker/daemon.json
使用docker 1.7版本如果要pulldocker registry v2或harbor里的镜像,如果没有配置ca证书的话,需要配置insecure-registry,并且需要将这个参数加到docker daemon的启动参数里。配置步骤:
1、docker 1.7解决办法
⑴ 配置docker_opts参数并保存
[root@123 ] # vi /etc/sysconfig/docker other_args=docker_cert_path=/etc/docker ## add docker_opts="--insecure-registry ip:port"
⑵ 修改启动项
[root@123 ] # vi /etc/init.d/docker ## 找到 start 函数,在exec处增加刚配置的docker_opts,参见下边空行处 start() { if [ ! -x $exec ]; then if [ ! -e $exec ]; then echo "docker executable $exec not found" else echo "you do not have permission to execute the docker executable$exec" fi exit 5 fi check_for_cleanup if ! [ -f $pidfile ]; then prestart printf "starting $prog:\t" echo "\n$(date)\n" >> $logfile ## adddocker_opts $exec -d $docker_opts &>> $logfile & pid=$! touch $lockfile # waitup to 10 seconds for the pidfile to exist. see #https://github.com/docker/docker/issues/5359 tries=0 while [ ! -f $pidfile -a $tries -lt 10 ]; do sleep 1 tries=$((tries + 1)) done success echo else failure echo printf "$pidfile still exists...\n" exit 7 fi }
⑶ 重启docker并验证pull功能
[root@123 ] # service docker restart
⑷其他方法
不这么费事,直接修改启动项,原理和结果都是相同的,然后重启dockerdaemon
[root@123 ] # vi /etc/init.d/docker ## 找到exec,直接添加--insecure-registry ip:port prog="docker" exec="/usr/bin/$prog --insecure-registryip:port" pidfile="/var/run/$prog.pid" lockfile="/var/lock/subsys/$prog" logfile="/var/log/$prog"
2、docker ce版本
检查/etc/docker目录下是否有daemon.json文件,如果没有则创建,或者直接vi/etc/docker/daemon.json修改完在:wq也行。
[root@123 ] # vi /etc/docker/daemon.json ## add { "registry-mirrors": ["https://registry.docker-cn.com"], "insecure-registries" : ["ip:port","ip:port"] }
添加完成后重启docker服务
service docker restart
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。