为什么要有docker
自己的理解:以前发一个项目只发单独的war包或者jar包,而现在由于有微服务,对于每一个服务都要单独的对待,比较麻烦,所以需要一个自动化的容器进行环境统一并且快速部署。docker就相当于整体的包(标准集装箱)直接部署。
Linux系统
实际上就是:内核(2.4/2.6版本的) + 文件系统 构成的。
linux虚拟化技术
其实是:复用原linux内核 + 自己定制的文件系统(就是以上说的标准集装箱)。
基本概念
三个部件:1、镜像(Image);2、容器(Container);3、仓库(Respostory)
安装
1、配置yum源(如果不配置的话需要到国外找文件,比较慢,建议配置yum源),并使用yum安装
cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y
systemctl start docker(启动docker)
systemctl enable docker(设置docker开机启动)
sudo mkdir -p /etc/docker(创建daemon.json文件,设置为阿里云镜像,其中registry-mirrors的值为我个人的地址,你也可以直接使用,请叫我雷锋就好,json里还可以设置ip)
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"bip":"172.17.33.1/24"(这个设置可以指定ip),
"registry-mirrors": ["https://6515d0po.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker常用命令
docker操作
版本/信息— docker [info|version]
容器操作
容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
容器操作运维 — docker [ps|inspect|exec|logs|export|import|port]
容器rootfs命令 — docker [commit|cp|diff]
镜像操作
镜像管理 — docker [images|rmi|tag|build|history|save|import]
仓库操作
镜像仓库 — docker [login|pull|push|search]
举个例子(以nginx为例):
创建nginx:docker run -d --name nginx nginx;
使用挂载的方式创建nginx:docker run -d --name nginx2 -v /usr/docker/nginx:/etc/nginx/conf.d nginx;
使用端口映射的方式创建nginx:docker run -d --name nginx3 -p 80:80 nginx;
docker与宿主机之间的文件复制:docker cp nginx:/etc/nginx/conf.d/default.conf /usr/docker/nginx/
查看docker中nginx的信息:docker inspect nginx;
进入某一个容器:docker exec -it nginx /bin/bash;
查看nginx日志:docker logs nginx3
删除nginx:docker rm -fv nginx
删除镜像:docker rmi c2431d9a9f73(imageid)
-it:指的是进入人机交互界面
/bin/bash:指的是sh脚本执行
查看所有的容器:docker ps -a(docker ps是查看活着的容器)
退出不关闭容器:Ctrl+P+Q(p和q都是大写的)
docker容器的数据挂载
1、配置文件
2、生产的业务数据
3、容器的日志
容器转换成镜像
1、非主流转换法:
举例:docker commit -a "hammer" -m "test" tomcat tomcat:new (-a 提交的说明,-m 备注信息 tomcat:new新的名字)
docker run -d --name hammer -p 8082:8080 tomcat:new(用刚才转换的镜像创建一个新的容器)
2、主流转换法:
使用dockerfile。dockerfile里的内容为:
例如:
执行命令为:docker build -t tomcat:hammer2 .(hammer2后面有一个点,代表在Dockerfile路径下执行,如果不是在Dockerfile路径下执行,则加上对应路径即可)
其实dockerfile就是对生成镜像盖楼的过程,每一个命令都是盖了一层楼,最终构成一个镜像。
发布war包
1、mvn打包
2、docker build:指定镜像名字会变化,所以使用maven插件来做,docker-maven-plugin
3、docker run
使用插件build:mvn clean package docker:build
创建docker仓库
1、创建仓库:docker run -d --name reg -p 5000:5000 registry (注意:加上本地仓库后一定要在/etc/docker/daemon.json这个文件里加上“insecure-registries”:["114.215.146.169:5000"]。否则docker push时会报错,提示说必须https请求才可以)
2、镜像打包:docker tag tomcat:new 114.215.146.169:5000/tomcat:new
不过正式开发时不鼓励这么直接用命令行做,一般都是在pom文件里指定仓库版本
创建镜像并推送到阿里云私有仓库
$ sudo docker login --username=yourusername registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/hammer/myself:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/hammer/myself:[镜像版本号]
使用jenkins+docker部署项目时的shell脚本(jenkins和部署的服务在一台服务器上)
#!/bin/bash -ile
# 定义变量
echo "定义变量"
WORKSPACE=/var/lib/jenkins/workspace
project=survey-v2-check-api-0.0.1-SNAPSHOT.jar #这里需要替换成你jar包的名字
pathName=surveycheck #这里也替换成你的,每个人不一样
API_NAME="surveycheck"
API_VERSION="0.0.1"
API_PORT="8081"
IMAGE_NAME="registry.cn-hangzhou.aliyuncs.com/hammer/myself:$API_NAME$API_VERSION"
REPOSITORY="registry.cn-hangzhou.aliyuncs.com/hammer/myself"
CONTAINER_NAME=$API_NAME-$API_VERSION
# 进入target目录并复制Dockerfile文件
echo "进入target目录并复制Dockerfile文件"
cd $WORKSPACE/$pathName/target
cp classes/Dockerfile .
# 构建Docker镜像
echo "构建Docker镜像"
docker build -t $IMAGE_NAME .
# 推送Docker镜像
echo "推送Docker镜像"
docker login --username=yourusername --password=yourpassword registry.cn-hangzhou.aliyuncs.com
imageid=$(docker images $IMAGE_NAME | awk 'NR==2{print $3}')
if [ -n "$imageid" ]
then
echo "找到了imageid"
echo "docker tag [$imageid] [$IMAGE_NAME]"
echo "docker push [$IMAGE_NAME]"
docker tag $imageid $IMAGE_NAME
#docker push $IMAGE_NAME
fi
# 删除Docker容器
echo "删除Docker容器"
containerid=$(docker ps -a --no-trunc --filter name=nginxnew | awk 'NR==2{print $3}')
if [ -n "$containerid" ]
then
echo "找到了container容器"
docker stop $CONTAINER_NAME
docker container rm $CONTAINER_NAME
fi
# cid=$(docker images $REPOSITORY |awk 'NR==2{print $3}')
# if [ -n "$cid" ]
# then
# echo "找到了cid[$cid]"
# docker rmi -f $cid
# fi
# 启动Docker容器
echo "启动Docker容器"
docker run -d -p $API_PORT:$API_PORT --name $CONTAINER_NAME $IMAGE_NAME
# 删除Dockerfile文件
echo "删除Dockerfile文件"
rm -f Dockerfile