导语:为什么需要自动化部署
随着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
删除旧版本
$ 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
进入容器
进入容器有两个命令:attach
和exec
.
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指令也令我们头疼。