一款产品:开发——上线 两套环境!应用环境,应用配置!
开发 ———— 运维。 问题:我在我的电脑上可以运行!版本跟新,导致服务不可用!对于运维来说,考验十分大!
环境配置十分麻烦,每一个机器都要部署环境(环境!)——费时费力
发布一个项目【jar+(Redis Mysql jdk Es 等)】
项目能不能带上环境安装打包!——>Docker
传统:开发jar,运维来部署!
现在:开发打包部署上线,一套流程做完!
Docker给以上的问题,提出了解决方案!
java——jar(环境)——打包项目带上环境(镜像)——(Docker仓库:商店)——下载我们发布的镜像——直接运行
Docker的思想就来自于集装箱!
JRE——多个应用(端口冲突)——原来都是交叉的!
隔离:Docker核心思想!打包装箱!每个箱子都是相互隔离的。
Docker通过隔离机制,可以将服务器运用到极致!
虚拟机:在window中装一个Vmwar,通过这个软件我们可以虚拟出一台或多台电脑!笨重!
虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术!
vm: linux--centos原生镜像(一个电脑!) 隔离,需要开启多个虚拟机!
docker:隔离,镜像(最核心的环境 4m + jdk + mysql)十分的小巧,运行镜像就可以了!小巧!---秒级启动
聊聊Docker
Docker 是基于go语言开发的!开源的!
官网:https://www.docker.com/
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/
容器化技术:
容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机技术的不同:
DevOps(开发、运维)
更快速的交付和部署
传统:一堆的帮助文件,安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样!
项目打包——>镜像,扩展 服务器A! 服务器B
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例!服务器性能可以达到极致!!!
镜像image:
Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run===>tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)
容器container:
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建。
启动,停止,删除,基本命令!
目前可以把这个容器理解成一个简易的linux系统
仓库repository:
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub (默认国外的)
阿里云
环境准备
1.需要会一点点Linux的基础
2.CentOS 7
3.我们使用Xshell连接远程服务器操作
环境查看
# 系统内核是3.10以上的
[root@zjdzka /]# uname -r
4.18.0-193.28.1.el8_2.x86_64
# 版本
[root@zjdzka /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="8 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="8"
安装
帮助文档:
# 1.卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2.需要的安装包
yum install -y yum-utils
#3.设置镜像的仓库-阿里云
yum-config-manager \
--add-repo\ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#跟新yum软件包索引
sudo yum makecache
#4.安装docker相关 -ce社区版 ee企业版
yum install docker-ce docker-ce-cli containerd.io
#5.启动docker
systemctl start docker
#6.docker version 查看释放安装成
#7.测试hello world
docker run hello-world
#8.查看一下下载的这个 hello-world镜像
#9.卸载docker
#卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#删除资源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
1.登录阿里云找到容器服务
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://nrqtwebc.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker是怎样工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
DockerServer 接收到Docker-Client 的指令,就会执行。
Docker为什么比VM快?
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而Docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级别的。
docker version #版本信息
docker info #显示docker系统信息,包括镜像和容器的数量
docker 命令 --help #万能命令
帮助文档的地址:官网的帮助文档
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 3 weeks ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
docker images --help #后缀提示
Options:
-a, --all #列出所有的镜像
--digests
-f, --filter #过滤器
--format #格式化
--no-trunc
-q, --quiet #只显示镜像的id
docker search
#可选项
-f, --filter #过滤器
--format
--limit
--no-trunc
docker pull 镜像名 版本号
#如果不写版本,默认最新
[root@zjdzka ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
a076a628af6f: Pull complete #分层下载,docker image的核心 联合文件系统
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
#等价于它
docker pull mysql
docker pull docker.io/library/mysql:latest
#指定版本下载
docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists
f6c208f3f991: Already exists
88a9455a9165: Already exists
406c9b8427c6: Already exists
7c88599c0b25: Already exists
25b5c6debdaf: Already exists
43a5816f1617: Already exists
1831ac1245f4: Pull complete
37677b8c1f79: Pull complete
27e4ac3b0f6e: Pull complete
7227baa8c445: Pull complete
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi -f id #删除指定id
docker rmi -f $(docker images -aq) #一个一个删除
说明:有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
docker pull centos
docker run[可选参数] image
#参数说明
--name="Name" 容器名字 tomcat01 tomcat02,用来区别容器
-d 后台方式运行
-it 交互方式运行,进入容器查看内容
-p 指定容器的端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
容器端口
-P 随机指定端口
#启动,并进入容器
[root@zjdzka ~]# docker run -it centos /bin/bash
[root@623f590a560b /]
#查看容器内部的centos
[root@623f590a560b /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
#从容器退回主机
exit
#docker ps 命令
#列出当前正在运行的容器
-a #列出当前正在运行的容器+历史运行过
-n=? #显示最近创建的容器
-q #只显示容器的编号
[root@zjdzka ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
623f590a560b centos "/bin/bash" 4 minutes ago Exited (0) About a minute ago confident_yonath
fcb98c99f4c7 d1165f221234 "/hello" 2 days ago Exited (0) 2 days ago sharp_banzai
exit #容器停止并退出
Ctrl+p+q #容器不停止退出
docker rm 容器id #删除指定的容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器的操作
docker start 容器id #重启容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
#命令 docker run -d 镜像名!
[root@zjdzka ~]# docker run -d centos
f76c19278e12a02d885f6b0d174c90ddd9b925ab0b2b0ce7760e1d0df3ab94a3
#问题:docker ps 发现centos停止了?
#坑:docker 容器使用后台运行时,就必须要有一个前台进程,docker发现没有应用,就会自动停止
docker logs -tfn --tail 容器里面没有日志
#自己编写shell脚本,测试
#显示日志
-f
-t
-n --tail number #显示日志条数
top命令
[root@zjdzka ~]# docker top 95405824fd16
UID PID PPID C STIME TTY
root 3046022 3046000 0 21:38 pts/0
docker inspect 容器id
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
#命令
docker exec -it id /bin/bash
#测试
[root@zjdzka ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@zjdzka ~]# docker run -it centos /bin/bash
[root@c6f1ff97f6fa /]# [root@zjdzka ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6f1ff97f6fa centos "/bin/bash" 10 seconds ago Up 9 seconds pensive_allen
[root@zjdzka ~]# docker exec -it c6f1ff97f6fa /bin/bash
[root@c6f1ff97f6fa /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
方式二:
docker attach id
#测试
[root@zjdzka ~]# docker attach c6f1ff97f6fa
[root@c6f1ff97f6fa /]# exit
#docker exec--进入容器后开启新终端,可以在里面操作
#docker attach--进入容器正在运行的终端,不会启动新的进程
docker cp 容器id:容器内路径 目的的主机路径
# Docker命令小结
#1.搜索镜像
docker search nginx
#2.下载镜像
docker pull nginx
#启动镜像
# -d 后台运行
# --name 起名字
# -p 宿主机端口:容器内部端口
#查看镜像
docker ps
#本机测试
curl localhost:3344
#图解原理
#进入容器
docker exec -it nginx01 /bin/bash
#测试查看文档
root@d396333730c9:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@d396333730c9:/# cd /etc/nginx
root@d396333730c9:/etc/nginx# ls
conf.d koi-utf mime.types nginx.conf uwsgi_params
fastcgi_params koi-win modules scgi_params win-utf
#退出容器
exit
#停止容器
docker stop d396333730c9
思考:我们每次改动nginx配置文件,都需要进入容器内部?十分麻烦,我要是可以在容器外提供一个映射路径,达到在容器外部修改文件,容器内部就可以自动修改?—— -v数据卷技术
#1.直接启动并下载
docker run -it --rm tomcat:9.0
#官方版本,一般用于测试,容器用完即删
==============================================================
#下载
docker pull tomcat:9.0
#启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0
#测试访问没有问题
#进入容器
docker exec -it tomcat01 /bin/bash
#发现问题:1.linux命令少了;2.没有webapps 阿里云镜像的原因。默认是最小的镜像,也就是把所有的不必要都剔除掉,保证最小可运行环境
#解决问题:
#将webapps.dist文件拷贝到webapps下,即可访问出网页
**思考:**我们以后部署项目,如果每次都要进入容器是不是很麻烦?我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了!
什么是portainer?
Docker的图形化界面管理工具!提供一个后台面板供我们操作
# 搜索镜像
docker search portainer/portainer
# 拉取镜像
docker pull portainer/portainer
# 运行镜像
docker run -d -p 8088:9000 -v /root/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name dev-portainer portainer/portainer
展示:
操作参考链接:
http://www.senra.me/docker-management-panel-series-portainer/