docker是什么:
docker是 Linux 容器的一种封装,提供了简单易用的容器使用接口。
容器和虚拟机的区别:

docker三要素:
镜像
docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像是分层的,每层镜像都有一个指向下层镜像的指针,所有镜像组合在一起统一对外提供服务。
个人理解: 镜像相当于OS上的一个软件。系统镜像、组件镜像、服务镜像 组合在一起提供一个定制化的只有指定服务和服务依赖的服务系统。
容器
容器 = 镜像 + 读写层。
个人理解:容器是运行起来的镜像,提供了服务的输入和产出
仓库:
仓库是镜像文件存储的地方,类似git。分共有仓库、私有仓库和本地仓库
公有仓库:相当于github,最大的公有仓库: Docker Hub。
私有仓库:相当于gitlab
本地仓库:搭建本地Docker Registry
为什么要用docker
一次构建,到处安装
普通服务的部署,在需要迁移或者部署多份时都需要从头搭建一次服务依赖环境,这可能需要耗费运维人员大量的时间。docker把服务及相关依赖封装到一个包中,部署时只需要依赖docker服务器即可,一份docker镜像可以在不同的环境中同时部署不需要除docker外的底层环境的依赖。
服务隔离
docker能够隔离服务之间对于环境的依赖,普通服务部署多个服务可能同时依赖同一个组件,在部分服务的依赖组件需要升级时,可能会影响到别的服务的运行。使用docker部署后,各个服务之间的依赖都是单独的,升级时只需要对当前服务的底层依赖升级即可。
当然, docker的好处远不止这些。我们会在使用中发现docker带给我们的更多便利。
docker怎么用
编写Dockerfile
参考链接:
https://www.cnblogs.com/panwenbin-logs/p/8007348.html
这里只列出我用到的命令,更多命令可以点击链接或者查看相关资料了解
FROM 指定基础镜像,必须为第一条命令
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
COPY、ADD 复制本地文件到镜像中
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
ENV 设置镜像环境变量
ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
CMD 设置镜像要执行的命令
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
我的第一个Dockerfile文件
FROM centos:7.4
RUN yum install -y golang
COPY 我的服务二进制文件 /
COPY 我的服务配置文件 /
ENV TZ Asia/Shanghai
CMD ["/服务可执行文件","指定服务执行所需的参数"]
构建服务镜像
docker build -t 服务名称:版本号 .
启动服务
docker run -d --net=host 服务名称:版本号
#-net=host指定容器使用宿主机IP
#-p 指定容器使用端口映射到主机相应端口
问题
这样我每次更新服务都需要重git上拉取最近代码,然后编译成二进制文件,再复制到docker目录下构建docker影响,最后在查询当前容器ID,停到当前容器的运行后再部署新的容器,仍旧是个很麻烦的流程,并没有给我的上线流程减轻负担。并且旧的容器及镜像还需要在清除。
优化
编写一个上线脚本,把所有的相关操作都集成到一个shell脚本中,每次git上代码更新时只需要执行一次脚本就OK了
cd 文件原路径
git pull
go build
mv s服务可执行文件 docker目录下
cd docker目录
sudo docker ps -a | grep 服务名 | awk '{printf $1 "\t"}'| xargs sudo docker kill | xargs sudo docker rm #停用旧容器,并删除容器
sudo docker images | grep 服务名 | awk '{printf $3 "\t"}'| xargs sudo docker rmi #删除旧镜像
sudo docker build -t 服务名:$1 .
sudo docker run -d --net=host 服务名:$1
执行脚本 带上最新版本号作为参数
以上,成功把服务迁移到docker上部署,并且每次上线只需要一条命令即可。服务升级时也只需要修改Dockerfile文件即可。