一款产品:开发–上线 两套环境, 两套配置
开发 和 运维 问题:在我的电脑上可以运行,版本更新,导致服务不可用!对于运维来说,考验十分的大
开发即是运维的情况下更是如此,每一个机器都要部署环境,浪费时间和人力,容器化,项目带着环境来打包,配置很麻烦,也有部分不能跨平台比如开发win,打包到linux
传统思想 : 开发jar 运维来做
现在 : 开发打包部署上线,一套流程做完
为什么docker厉害?
java --apk --发布 — 张三使用 apk — 安装即可用!
java —jar —打包项目带上环境(镜像) — (docker仓库镜像)–下载开发人员上传的镜像 – 直接就可以运行
docker根据以上的问题给出了解决方案
docker的思想来自于集装箱
JRE - -多个应用—原来是交叉的
docker的核心思想 : 隔离,打包装箱,每个箱子都是互相隔离的
Docker通过隔离机制,让服务器更好的发挥
本质 : 所有的技术都是出现了问题,我们需要去解决
2010,几个搞it的年轻人,最开始的时候并不叫 Docker dotcloud
做一些pass的云计算服务,LXC有关的容器技术
他们将自己的技术(容器化技术)同一的命名为 Docker
应为刚诞生所以没什么基础,于是乎领导人们选择了将Docker的源码开放
开源之后的Docker一瞬间就火了
为什么Docker火起来了,应为相比虚拟机,Docker要更加的轻量
虚拟机 :
一般都是再win中安装Vmware 通过这个技术我们可以虚拟出来一台电脑或者是多台电脑,但是占用过大,随便一个镜像就是十几个g,十分的笨重
虚拟机技术的缺点:
Docker :
相比之下Docker就显得格外的小巧。隔离,镜像(核心的环境4m+jdk+mysql)需要的时候我们只需要去运行镜像就可以了,大大提升了灵活性
Docker技术 :
了解了Docker的作用,可以知道我们程序员掌握Docker是十分的必要的
社区文档
Docker的社区文档是十分的详细的
文档连接 : https://docs.docker.com/
Docker仓库地址 : https://www.docker.com/products/docker-hub
DevOps(开发和运维)
他的宗旨是什么
应用更快速的交付和部署
更便捷的升级和扩容
使用了Docker之后,我们部署的应用和搭积木一样
项目打包成一个镜像,扩展到服务器A,服务器B
更简单的系统运维
在容器化之后,我们的开发,测试环境,高度的一致
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例
镜像:
Docker的镜像就像是一个模板,可以荣国这个模板来创建容器服务
例子:
tomcat ====》run ===》tomcat01容器(提供服务)
我们可以同过镜像创建多个容器(最终服务运行或者是项目运行都是在容器中的)
容器:
Docker利用容器技术,独立运行一个或者一组应用,通过容器来创建的
启动,停止,删除,等基本命令
目前我们可以把容器理解为一个建议的linux系统,项目都是跑在系统上的
仓库:
仓库就是存放镜像的地方
有私有的有共有的
DockerHub
阿里云等等厂商都有镜像服务
环境准备
确认系统环境
[root@iZwz90ps06ioyada63oiwiZ ~]# uname -r
3.10.0-957.21.3.el7.x86_64
[root@iZwz90ps06ioyada63oiwiZ ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
官方文档可以看到要求:
我们如果是用的linxu系统是 CentOS 那么必须是 7 版本以上才支持的
如果安装装过的话,建议删除之前的旧版本的docker
#1·卸载掉旧的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2 需要的安装包
sudo yum install -y yum-utils
#3设置镜像的仓库,默认是国外的(建议大家使用阿里云的镜像)
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#4 安装docker相关的内容
yum install docker-ce docker-ce-cli containerd.io
#5 安装之后测试是否安装成功
systemctl start docker
#6查看docker的版本号
docker version
之后查看我们docker的版本即可
#7 运行docker的helloword
docker run hello-world
# 8 如何查看docker下载的镜像呢?
docker images
# 就可以查看docker下载的位置了
了解 如何卸载docker
#1 卸载docker的相关内容
yum remove docker-ce docker-ce-cli containerd.io
#2 卸载docker的和我们下载容器
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
# /var/lib/docker 是 docker的默认工作路径
提升效率
docker是做什么工作的?
Docker是一个 Client server的系统,Docker是守护进程运行在主机上。通过socket从客户端访问
DockerServer接受到Docker-Client的指令,就会去执行这个命令。
Docker为什么比虚拟机快
现在的docker是都支持的
不只支持 linux,Mac OS, windows都支持
之后又docker的使用经验之后我们回过头来再看理论,就会理解的很清晰了
Docker imeages #查看所有本地的主机上有的镜像
[root@iZwz90ps06ioyada63oiwiZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 12 days ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的储存大小
#可选项
-a -all #列出所有的镜像
-q --quiet #只显示镜像的id
Docker pull 下载
#下载内容 ,默认的tag 是 latest
#可以按照版本号 ,也可以直接用mysql下载版本
[root@iZwz90ps06ioyada63oiwiZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
07aded7c29c6: Already exists #分段的下载,联合文件系统,不用重复下载,可以共用重复的部分
f68b8cbd22de: Already exists
30c1754a28c4: Already exists
1b7cb4d6fe05: Already exists
79a41dc56b9a: Already exists
00a75e3842fb: Already exists
b36a6919c217: Already exists
5e11fe494f45: Pull complete
9c7de1f889a7: Pull complete
cf6a13d05a76: Pull complete
fc5aa81f393a: Pull complete
Digest: sha256:360c7488c2b5d112804a74cd272d1070d264eef4812d9a9cc6b8ed68c3546189
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
删除命令
docker rmi -f 9f35042c6a98 #根据 镜像id 删除docker镜像
docker rmi -f images id images id images id #批量删除docker镜像
docker rmi -f $(docker images -aq) # 删除全部镜像
我们有了镜像才可以创建容器,以linux为例子,创造一个CentOS的容器
来测试学习
docker pull centos
新建容器并且启动
docker run [可选参数] image
#参数说明
--name = "name" 容器名字, tomcat 1 ,tomcat 2来区分容器
-d 后台的方式运行
-it 使用交互方式运行 ,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip :主机端口:容器端口
-p 主机端口 : 容器端口(常用)
-p 容器端口
-p 随机指定端口
#测试,并且启动进入容器
[root@iZwz90ps06ioyada63oiwiZ ~]# docker run -it centos /bin/bash
[root@aa1a02ed3f51 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
#推出容器查看
[root@iZwz90ps06ioyada63oiwiZ /]# ls
bin dev home lib64 media mynacos nginxWebdata patch project run srv tmp var
boot etc lib lost+found mnt myredis opt proc root sbin sys usr www
列出所有运行的容器
docker ps
#列出当前正在运行的容器
-a #列出当前正在运行的容器+带出历史运行过的内容
-n = ? #显示最近创建的容器
-q #只显示容器的编号
#可以看到我们之前使用的 helloworld 和 centos 容器
[root@iZwz90ps06ioyada63oiwiZ /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa1a02ed3f51 centos "/bin/bash" 3 minutes ago Exited (0) 2 minutes ago upbeat_matsumoto
0341862ece26 feb5d9fea6a5 "/hello" 8 hours ago Exited (0) 8 hours ago clever_jennings
退出容器
exit #直接容器停止并且推出
Ctrl + p + q #容器不停止 推出
删除容器
docker rm 容器id # 删除指定容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a|xargs docker rm #也可以删除所有的容器
[root@iZwz90ps06ioyada63oiwiZ /]# docker rm -f $(docker ps -aq)
aa1a02ed3f51
0341862ece26
启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #关闭容器
docker kill 容器id #强制关闭当前的容器
后台启动容器
#命令 docker run -d 镜像!
#问题 docker ps 发现centos停止了
#常见的坑 docker 容器使用后台运行,就必须要有一个前台的进程,docker发现没有前台的应用,就会自动停止
#nginx 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
docker安装nginx
#1, 搜索镜像 search 建议去docker hub 上搜索可以看到详细信息
docker search nginx
#2 拉取镜像 pull 下载镜像
docker pull nginx
#3 运行测试
#使用参数
#-d 后台运行
# --name 给容器名字
# -p 宿主机端口:容器端口
[root@iZwz90ps06ioyada63oiwiZ ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZwz90ps06ioyada63oiwiZ ~]# docker run -d --name nginx01 -p 3344:80 nginx
30361d53c7276f50adecbef37a56865b9858a0b553efa7f33689c8c9f16d927e
[root@iZwz90ps06ioyada63oiwiZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30361d53c727 nginx "/docker-entrypoint.…" 30 seconds ago Up 30 seconds 0.0.0.0:3344->80/tcp nginx01
[root@iZwz90ps06ioyada63oiwiZ ~]# curl localhost:3344
#测试通过,进入查看配置,之后停止容器
[root@iZwz90ps06ioyada63oiwiZ ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
#成功
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@iZwz90ps06ioyada63oiwiZ ~]# docker exec -it nginx01 /bin/bash
root@30361d53c727:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@30361d53c727:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@30361d53c727:/# cd /etc/nginx
root@30361d53c727:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@30361d53c727:/etc/nginx# exit
exit
[root@iZwz90ps06ioyada63oiwiZ ~]# ls
install.sh
[root@iZwz90ps06ioyada63oiwiZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30361d53c727 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:3344->80/tcp nginx01
[root@iZwz90ps06ioyada63oiwiZ ~]# docker stop 30361d53c727
30361d53c727
端口暴露的概念
docker 给我们带来的好处
我们之前部署项目,需要大量的环境搭建,使用docker之后我们可以将环境一起打包,需要的时候拉取容器,省去了繁琐的环境搭建,拉到镜像就可以直接跑,效率直线提升