devops:运维人员会在项目开发期间就介入到开发过程中,了解开发人员使用的系统架构和技术路线,从而制定适当的运维方案。而开发人员也会在运维的初期参与到系统部署中,并提供系统部署的优化建议。
DevOps的实施,促进开发和运维人员的沟通,增进彼此的理(gan)解(qing)。
docker 学什么
- docker概述
- docker安装
- docker命令
- docker镜像!
- 容器数据卷!!!
- DockerFile
- Docker网络原理
- IDEA整合daocker
- Docker Compose
- Docker Swarm(简化版K8S)
- CI/CD jenkins
docker概述
docker为什么出现?
项目阶段:开发-上线 两套环境!
应用环境、应用环境
开发 | 运维
问题:我在我电脑上可以运行! 版本更新导致服务不可用!这十分考验运维
解决:开发即运维
吐槽:java后端作为全栈真的累,要会前端,要会后台、要会运维、还要会架构
问题:环境配置麻烦,每一个机器都要部署环境(集群redis、ES、hadoop)部署麻烦,且不能跨平台!!windos,最后发布到linux
发布一个jar很简单,需要的环境(redistribution、nysqk,jdk,ES,tomcat)可能一天都部署不好
传统解决方案:开发人员提供jar,运维来部署
现在解决:发布一个项目(jar + 环境),项目带上环境安装打包。开发部署上线,一套流程做完
docker给上面问题提出了解决方案!
java -> jar => 打包项目带上环境(镜像) =》Docker仓库 =》下载发布的镜像 =》直接运行
docker的思想来自于集装箱
系统上运行多个应用,多个应用之前可能产生冲突(端口冲突、配置冲突...)
docker将应用打包装箱,每个箱子互相隔离
docker的历史
docker为什么火
相比于虚拟机技术,十分的轻巧
聊聊docker
docker是基于go语言开发的,开源项目
官网:https://www.docker.com/
仓库地址:https://registry.hub.docker.com/
docker能做什么
容器化技术
容器化技术不是模拟的一个完整的操作系统
容器之间互相隔离
devOps
- 更快速的交付和部署(docker打包镜像部署,一键运行)
- 更便捷的升级和扩缩容
-更简单的系统运维(使用docker之后,开发测试环境都是高度一致的)
-更高效的计算资源利用(docker是内核级别的虚拟化,可以在一个物理机上运行很多个容器,高效使用服务齐性能!!)
docker安装
docker的基本组成
镜像(image)
镜像是一种轻量级、可执行的独立软件包、用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容、包括代码、运行时、库、环境变量和配置文件
所有的应用,直接打包docker镜像,就可以直接运行
如何得到镜像:
- 从远程仓库拉取
- 拷贝
-自己制作一个镜像DockerFile
容器(container)
仓库(repository)
存放镜像的地方
仓库分为共有仓库和私有仓库
docker hub(默认国外)
阿里云等都有容器服务(配置镜像加速)
1. 卸载旧的版版本
$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
2. 安装yum-utils软件包(提供yum-config-manager实用程序)并设置稳定的存储库。
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo (默认国外的)
##修改为阿里云镜像地址
$ sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 安装docker引擎
更新 yum makecache fast
$ sudo yum install docker-ce docker-ce-cli containerd.io
docker-ce:社区版(推荐使用)
docker-ee:企业版
默认安装最新版本
我安装的版本sudo yum install docker-ce-18.09.3-3.el7 docker-ce-cli-18.09.9-3.el7 containerd.io
启动docker、测试
$ sudo systemctl start docker
docker version查看是否安装成功
卸载docker
卸载docker引擎 sudo rm -rf /var/lib/docker
阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://3x9xdpne.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker权限配置
通常我们使用Docker的时候都是使用的root,官方说法如下
The docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root and other users can access it with sudo. For this reason, docker daemon always runs as the root user.
To avoid having to use sudo when you use the docker command, create a Unix group called docker and add users to it. When the docker daemon starts, it makes the ownership of the Unix socket read/writable by the docker group.
docker序绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字是由root用户拥有的,其他用户可以使用sudo访问它。因此,docker守护程序始终以root用户身份运行。为了避免在使用docker命令时必须使用sudo,请创建一个名为docker的Unix组并将用户添加到其中。 docker守护程序启动时,它将使docker组可以读取/写入Unix套接字的所有权。
创建docker组
sudo groupadd docker
将当前用户加入docker组
sudo gpasswd -a ${USER} docker
重启docker服务
sudo service docker restart
或 sudo systemctl restart docker
更新用户组
newgrp docker #更新用户组
docker底层原理
docker怎么工作?
docker是一个CS结构的系统,docker的守护进程运行在主机上,通过socket从客户端访问,dockerServer接收到docker-client的指令,执行命令
docker为什么比VM快?
docker有比虚拟机更少的抽象层
- docker利用的是宿主机的内核,VM需要加载Guest OS
docker常用命令
帮助命令
docker version #显示docker版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
帮助文档地址:https://docs.docker.com/reference/
镜像命令
docker images #查看所有本地主机上的镜像
docker search #搜索镜像,默认是搜索DockerHub
docker pull #拉取镜像
docker rmi #删除镜像
docker rmi -f $(docker images -aq) #删除全部镜像
容器命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 新建容器并启动
参数说明:
--name="XXX" 容器名字
-d 以后台方式运行
-it 使用交互方式运行,进入容器查看内容
-P 指定容器端口: -p 主机端口:容器端口(常用)
-P 容器端口
容器端口
-p 随机指定端口
docker run -it centos /bin/bash #启动并进入容器
docker ps #列出当前正在运行的容器
docker ps -a #列出当前正在运行的容器 + 历史运行过的容器
docker ps -n=? #显示最近创建的容器
docker rm 容器id #删除容器
docker start 容器id #启动一个已经创建的容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行容器
docker kill 容器id #强制停止当前容器
常用其他命令
常见的坑:
docker容器使用后台运行,就必须要有前台进程,docker发现没有应用,就会自动停止
docker run -d 镜像名 #docker ps发现容器停止了,
docker logs -tf --tail n 容器id #查看容器日志
docker top 容器id[ps options] #查看容器中的进程信息!!!!!!
docker inspect [OPTIONS] NAME|ID [NAME|ID...]#查看镜像元数据!!!!!!!!!!!!!!!!!!
docker exec -it 容器id bashshell #进入当前正在运行的容器(进入容器后开启一个新的终端)!!!
docker attach 容器id #进入当前正在运行的容器(进入容器正在执行的终端)!!!
docker cp 容器id:容器内路径 宿主机路径#从容器内拷贝文件到宿主机
docker stats #查看cpu的状态
小结
docker可视化
- portainer
- ranch(CI/CD使用)!!
portainer
docker图形化界面管理工具
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
docker镜像加载原理
UnionFS(联合文件系统,UFS)
联合文件系统(Union File System):2004年由纽约州立大学石溪分校开发,它可以把多个目录(也叫分支)内容联合挂载到同一个目录下,而目录的物理位置是分开的。UnionFS允许只读和可读写目录并存,就是说可同时删除和增加内容。UnionFS应用的地方很多,比如在多个磁盘分区上合并不同文件系统的主目录,或把几张CD光盘合并成一个统一的光盘目录(归档)。另外,具有写时复制(copy-on-write)功能UnionFS可以把只读和可读写文件系统合并在一起,虚拟上允许只读文件系统的修改可以保存到可写文件系统当中。
docker镜像分层
docker镜像的结构就像花卷一样,是一层一层的,比如tomcat镜像,它有450M左右,但我们实际的tomcat却很小,为什么tomcat镜像那么大呢,是因为,tomcat镜像的最里面是kernel内核,外面的一层是centos镜像,再外面可能是jdk镜像,最外面才是暴露出来的tomcat镜像,所以这么大,docker这么做的好处就是可以实现镜像资源的共享,所有层的镜像都会在本地缓存一份,再次下载相同的镜像的时候,直接拿来使用就可以了。
commit镜像
docker commit -m="提交的描述细腻些" -a="作者" 容器id 目标镜像名:[tag] #提交容器成为一个新的副本
容器数据卷
思考: docker将应用和环境打包成一个镜像,如果数据都在容器中,如果容器删除,数据将会丢失
需求:数据库数据可以存储在本地
解决:容器间可以有一个数据共享的技术。docker容器中产生的数据,同步到本地
这就是卷技术,将容器内的目录,挂载到宿主机上,实现容器的持久化和同步操作,容器间可以实现数据共享
使用数据源
方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
eg: docker run -it -v ~/docker_practice/v_test:/home --name nginx02 nginx /bin/bash
docker volume inspect ###查看数据卷
具名挂载、匿名挂载
docker run -it -v 容器内目录 --name nginx02 nginx /bin/bash #匿名挂载
docker run -it -v ${name}:/home --name nginx02 nginx /bin/bash #具名挂载
所有的docker容器内的卷,没有指定目录的情况下都是在var/lib/docker/volumes/xxx/_data
方式二 使用Dockerfile
Dockerfile用来构建doucker镜像的构建文件,是一个脚本,通过这个脚本,可以生产一个镜像
方式三 数据卷容器 --volumes-from
docker run -it --name ${name} --volumes-from 容器 镜像
DockerFile
构建步骤
- 编写一个dockerfile文件
- docker build 构建一个镜像
- docker run 运行镜像
- docker push 发布镜像(dockerbub、阿里云镜像、私有仓库)
基础知识
1.每个保留关键字(指令)都必须大写
2.执行从上到下顺序执行
3.#表示注释
每一个指令都会创建提交一个新的镜像层,并提交
/**
*dockerfile命令
*/
FROM XXXX //基础镜像
MAINTAINER //j镜像作者,姓名+邮箱
RUN //镜像构建的时候需要运行的命令
ADD //拷贝文件到镜像中
WORKDIR //镜像的工作目录
VOLUME //挂载的目录
EXPOSE //暴露端口
CMD //指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT //指定容器启动的时候要运行的命令,可以追加命令
ONBUILD //当构建一个被继成的dockerfile,会运行ONBUILD的指令
COPY //类似ADD命令,将文件拷贝到镜像中
ENV #构建的时候设置环境变量
docker build -f xxx -t name:tag .
dockse history 镜像 #查看镜像制作步骤
发布镜像
发布到dockerhub
- 注册账号
2.在我们服务器上提交自己的镜像
3.登陆 docker login
4.提交镜像docker push
发布到阿里云镜像
4.
1.登陆阿里云,找到容器镜像服务
2.创建一个命名空间
3.创建一个容器镜像仓库
docker网络
理解docker0
每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0,桥接模式,使用的是evth-pair技术
evth-pair技术
就是一对的虚拟设备接口,一端连着协议,一端彼此相连
evth-pair充当一个桥梁,连接各种虚拟网络设备
openStack,docker容器、ovs的连接,都是使用的evth-pair技术