导语:为什么需要自动化部署

随着java系统架构由单体应用向分布式发展,本地单服务器向云端多服务器发展。java环境产生的代码需要向越来越多的服务器进行部署。

敏捷开发的流行,让客户或领导急于看到最新的开发进展,需要我们频繁的更新多台服务器的代码。 繁琐且重复的部署命令,不同服务器之间的环境差距,往往容易产生无法预知的问题。

在公司又不愿意花钱招运维的情况下,苦逼的java后端程序员急需要使用一种提高部署效率的解决方案。

Docker+DockerCompose+Docker-register+GitLab的方式就进入了我们的视野。

Docker

Docker是什么

Docker是一个开源的应用容器引擎。开发者可以将自己的应用打包在可移植的容器中,然后发布到任何Linux上都可以运行。真正的实现了一次构建到处运行。

Docker是一种虚拟化技术,由于直接运行在宿主机内核上,且不会虚拟任何硬件。因此资源耗费低,开启速度快,可以达到秒级启动。由于资源耗费低,在一台宿主机上甚至可以启动上千容器。此外,各个容器直接是相互隔离的,安全且高可用,一个容器出问题不会导致整个宿主机出问题。

Docker架构

Docker是C/S架构,通过Api管理容器。

Docker的容器通过镜像来创建,镜像类似于一套模板。容器可以根据一个镜像创建多个容器,每一个容器之间互相隔离。镜像中的数据会影响容器创建时的数据,容器产生的数据变化不会影响镜像。

Docker文件系统

Docker使用分层文件架构。一个镜像不是一个文件,而是一组文件的集合。在多个镜像之间有相互公用的底层文件时,能大大降低存储空间。因此在创建镜像的时候,每一层尽量只添加需要添加的东西,提供文件的复用率。

Docker镜像仓库

Docker镜像存在镜像仓库中,Docker官方为我们提供了官方镜像库Docker Hub,我们也可以搭建自己的私有仓库。

安装Dokcer

Docker分为CE社区版与EE企业版。普通人家只要装Docker CE就足够满足日常需求。

CentOS安装

⚠️:Docer在CentOS上运行需要系统为64位,且内核版本在3.10以上。

官方教程可参考https://docs.docker.com/install/linux/docker-ce/centos/

中文版本可参考http://www.runoob.com/docker/centos-docker-install.html

查看系统的内核版本
[root@ludan /]# uname -r
3.10以上内核版本
删除旧版本
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
安装必要系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存
sudo yum makecache fast
安装 Docker-ce
sudo yum -y install docker-ce
启动docker后台进程
sudo systemctl start docker
测试docker,运行hello-word
docker run hello-world

脚本安装docker

确保 yum 包更新到最新
sudo yum update
执行 Docker 安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
启动容器进程
sudo systemctl start docker
验证镜像
sudo docker run hello-world

Ubuntu安装Docker

卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
apt安装
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
安装 GPG 证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
写入软件信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
更新并安装 Docker CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
测试
docker run hello-world

镜像加速

Ubuntu 16.04+、Debian 8+、CentOS 7

⚠️ 针对systemd系统使用如下方法

/etc/docker/daemon.json设置仓库地址

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}
检查加速器是否生效

在命令行执行docker info 如果在命令回显的消息中出现如下信息,则表示成功

Registry Mirrors:
 https://registry.docker-cn.com/

删除docker-ce

sudo yum remove docker-ce
sudo rm -rf /var/lib/docker

Docker镜像

Docker的容器启动需要依赖镜像。在运行容器的时候如果本地没有镜像则自动会去docker镜像仓库中下载。

拉取镜像

可以通过docker pull命令主动获取镜像。命令格式为

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

OPTIONS是选项。

 -a, --all-tags               下载所有标记的镜像

  --disable-content-trust   跳过验证(默认为true)

NAME是镜像名,一般由域名/IP[:端口]仓库名构成,官方镜像默认只有仓库名 TAG是标签,一般为版本号。

展示镜像

可以使用docker image ls命令展示所有镜像。展示的列表:

$ docker images fedora

REPOSITORY   TAG         IMAGE ID        CREATED      SIZE
fedora       rawhide     ad57ef8d78d7    5 days ago   359.3 MB
fedora       20          105182bb5e8b    5 days ago   372.7 MB
fedora       heisenbug   105182bb5e8b    5 days ago   372.7 MB
fedora       latest      105182bb5e8b    5 days ago   372.7 MB
<none>       <none>      105182bb5e8a    6 days ago   372.7 MB

列表包含了仓库名(REPOSITORY)、标签(TAG)、镜像唯一id(IMAGE ID)、最近创建日期(CREATED)、大小(SIZE)

虚悬镜像

上列表中仓库名与标签都为none的为虚悬镜像。仓库名与标签对应一个唯一的镜像,但是这个镜像可以更换。当同一个镜像名+标签所指向的镜像更换后,旧的镜像就失去指引,变成虚悬镜像,类似于java中的对象失去了引用。可以通过docker image prune命令删除.

删除镜像

docker image rm [选项] <镜像1> [<镜像2> ...]

其中,镜像既可以是镜像名,短id,长id或是摘要

强制删除镜像
docker rmi [选项] <镜像1> [<镜像2> ...]

使用Dockerfile定制镜像

(待更新)

Docker容器

启动容器

新建容器并启动

 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

(OPTIONS太多,不赘述)主要使用的最多的就是直接docker run 镜像名

常用参数:

-i Keep STDIN open even if not attached(在没有连接的情况下持续打开标准输入)
-t Allocate a pseudo-TTY(分配一个伪终端)

启动已中止容器

docker container start [OPTIONS] 容器名1 [容器2...]

守护态运行

在启动的时候,加上参数 -d即可作为守护态运行。运行后,容器产生的相关输出结果不会显示在控制台上,而是显示一个容器id。

可以通过docker container logs 容器名或id查看容器相关日志

终止容器

docker container stop [OPTIONS] CONTAINER [CONTAINER...]

参数:

-t 关闭前等待时间,默认10s

进入容器

进入容器有两个命令:attachexec.

attach不推荐使用,因为在退出容器的时候会停止容器。

exec常搭配-it使用,以交互的方式进入容器。

常见用法

docker exec -it 容器名 /bin/bash,使用后,就如普通的终端一样。

Docker仓库

Docker仓库是存放docker镜像的中心,支持官方仓库与自建私有仓库。

Docker Hub

可以通过docker search命令来查找官方仓库中的镜像,并利用docker pull命令来将它下载到本地。

docker-registry

官方提供用于构建私有仓库的工具。

官方文档:https://docs.docker.com/registry/

下载registry

获取官方registry镜像并运行

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

在配置文件中添加私有仓库地址

对于systemd系统,打开之前设置的/etc/docker/daemon.json,添加一条镜像地址。

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ],
  "insecure-registries": [
    "127.0.0.0:5000"
  ]
}

使用流程

从官方下载镜像

docker pull ubuntu

为私有镜像标记特有的名称

docker image tag ubuntu localhost:5000/myfirstimage

上传到私有镜像

docker push localhost:5000/myfirstimage

从私有仓库下载刚上传的镜像

docker pull localhost:5000/myfirstimage

DockerCompose

DockerCompose是什么

Docker很方便的为我们进行了应用的部署,但是当大量的容器需要进行管理时,重复的Docker指令也令我们头疼。