标签:linu 完整 关闭 kernel 利用 json sock 安装nginx 方案
@
一款产品:开发--》上线,需要两套环境!应用环境,应用配置!
开发---运营之间产生问题:我在我的电脑上可以运行!版本更新导致服务不可用!对于运维就很难
开发即运维!
环境配置十分麻烦,每一个机器都要部署环境(集群Redis、ES、Hadoop。。。)---费时费力。
vm: x需要一个原生镜像(一个电脑)产生隔离:需要多台虚拟机 几个G 几分钟启动
产生隔离: 镜像(最核心的环境 4M+jdk+mysql)十分小巧,运行镜像就可以了(其余部件都是使用宿主机的) 几M 开机秒级启动
之前的虚拟机技术:运行环境(lib)公用
虚拟机技术缺点:
lib: 运行环境
kernel:内核
容器化技术:单独的运行环境(lib)
容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机技术的不同
DevOps(开发、运维)
应用更快速的交互和部署
传统:一堆帮助文档,安装程序
Docker:一键运行打包镜像发布测试,一键运行
客户端的指令要在服务器运行,进入docker deamon(docker的守护进程),守护进程运行指令要首先通过images(镜像),镜像好比Java的class,而运行起来后产生的容器就相当于类运行产生的对象,通过多个容器可以搭载一个集群,但是本质上还是通过镜像来运行的,而镜像支援来自于网络仓库
docker build 构建一个容器
docker pull 拉取一个容器
docker run 运行一个容器
docker daemon(docker的守护进程)main方法(不是很恰当)
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像>run>romcat01容器(提供服务器),可以通过这个镜像创建多个容器。(最终服务运行就是在容器中的)
docker利用容器技术,独立运行一个或则一组应用,通过镜像来创建的。容器可以 启动、停止、删除
目前就可以把这个容器理解为一个简易的linux系统
存储image镜像
仓库分为公有仓库和私有仓库
docker hub类似于git hub
docker hub(默认是国外的)
阿里云、腾讯云等等。。。都有容器服务器(配置镜像加速)
环境准备
环境查看
#系统内核是 3.10以上的
[root@izbp1cu6acsu857v0gt1v5z ~]# uname -r
3.10.0-1127.19.1.el7.x86_64
系统版本
安装
查看帮助文档
# 卸载旧的版本
$ yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 需要的安装包
$ yum install -y yum-utils
# 设置镜像的仓库
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ##默认是国外的,非常慢
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo /推荐使用阿里云镜像
# 卸载旧的版本
$ yum install -y yum-utils
# 更新yum软件包索引
yum makecache fast
# 安装docker相关的 docker-ce是社区版的 ee 企业版
$ yum install docker-ce docker-ce-cli containerd.io
# 启动docker
$ systemctl start docker
# 查看docker版本
$ docker version
# 测试docker
$ docker run hello-world
# 查看下载的镜像
$ docker images
# 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#删除目录(资源)
rm -rf /var/lib/docker docker的默认工作(资源)路径
sudo mkdir -p /etc/docker //新建一个docker
sudo tee /etc/docker/daemon.json <<-‘EOF‘
{
"registry-mirrors": ["https://4s1c1hdi.mirror.aliyuncs.com"]
}
EOF 配置镜像地址
sudo systemctl daemon-reload 镜像重启
sudo systemctl restart docker docker重启
docker是怎么工作的?
docker是一个client-server结构的系统,docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令
Docker为什么比虚拟机快?
docker启动
systemctl start docker
service docker start
重启docker服务
systemctl restart docker
sudo service docker restart
关闭docker
systemctl stop docker
service docker stop
查看是否启动成功
docker ps -a
docker version //显示docker的版本信息
docker info //显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help //万能命令
[root@izbp1cu6acsu857v0gt1v5z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest db2b37ec6181 2 weeks ago 545MB
hello-world latest bf756fb1ae65 10 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
#可以选项
-a, --all Show all images (default hides intermediate images) 列出所有镜像 ------常用
--digests Show digests //格式化
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don‘t truncate output
-q, --quiet Only show numeric IDs 只显示镜像的id------常用
# 可选项
## 通过收藏来过滤
docker search mysql --filter=STARS=3000 搜索出来的镜像就是STARS大于3000的
默认最新版本
分层下载是docker iamges的核心,联合文件系统
也可以指定mysql版本
说明:我们有了镜像草可以创建容器,
docker pull centos
docker rum [可选参数] image
# 参数说明
--name="name" name为容器名字 tomcat01,tomcat02,用来区分容器
--d 后台方式运行,
--i、p 使用交互的方式运行,进入容器查看内容
--p 指定容器的端口 -p 8080:8080和主机映射
-p ip:主机端口:容器端口
-p 主机端口:容器端口**(常用)**
-p 容器端口
容器端口
--P(大写) 随机指定端口
# 测试,启动并进入容器
[root@izbp1cu6acsu857v0gt1v5z ~]# docker run -it centos /bin/bash
[root@9956160c8343 /]# ls #查看容器内的centos,是基础版本,很多命令都不完善
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
- 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 镜像名
查看日志
docker logs
docker logs -ft --tail number(要查看的条数) 容器id
docker logs -tf 容器id 显示所有日志
查看容器中进程信息 ps
docker top 容器id
pid:当前进程 ppid:父进程
查看容器的元数据
docker inspect 容器id
进入一个正在运行中的容器
方式一
通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
docker exec -it 容器id bashShell
方式2
docker attach 容器id
方式1和方式2的对比
docker exec进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach:进入容器正在执行的终端,不会启动新的进程!
docker cp 容器id:容器内路径 目的主机路径
下载镜像
docker pull nginx
创建容器
docker run -d --name nginx01 -p 3309:80 nginx
-d 后台运行
--name 给容器命名
-p 宿主机端口:容器内端口
理解端口暴露的概念 -p
容器中操作nginx
docker exec -it nginx1 /bin/bash
whereis nginx //查看nginx的相关文件路径
nginx.conf在 /etc/nginx中
官方使用
$ docker run -it --rm tomcat:9.0
我们之前的启动都是后台,停止了之后,容器还是可以查到 ,docker run -it --rm一般用来测试,用完(输入ctrl+c)即删除 (删除容器)
思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?要是可以在容器外提供一个映射路径,就可以在外部部署webapps中的项目,就自动同步到内部就好了
$ docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
--net somenetwork 网络配置
docker图形化界面管理工具!提供一个后台面板供我们操作!
输入ip+端口访问
Docker使用Portainer搭建可视化界面
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
所有的应用直接打包一个docker镜像,就可以直接运行起来
如何得到镜像?
UnionFS(联合文件系统)一步步的进行分层
下载的时候看到的一层层的就是这个
Docker镜像加载原理
为什么Docker比一般的虚拟机小很多?
为什么Docker镜像要采用这种分层的结构能?
理解
特点
Docker镜像都是只读,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层
如何提交自己的镜像?
docker commit 提交容器成为一个新的镜像
命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像民:[TAG]
实战测试
1. 启动一个默认的tomcat
2. 发现这个默认的tomcat是没有webapps应用,原因是官方的tomcat镜像的webapps下面默认是没有文件的!
3. 自己在webapps.dist拷贝进去基本文件
4. 将我们修改后的容器通过commit提交为一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己修改过的镜像
学习方式:理解概念,但一定要时间,最后实践和理论相结合一次搞定
如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像
就好比我们以前学习VM时候的快照
到了这里才算入门docker
Docker数据卷,DockerFile,Docker网络是Docker的精髓
Docker Compose
Docker Swarm 集群部署
CI/CD Jenkins 流水线
docker理念回顾
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据的可持续化
MySQL:容器删了,数据也就删除了需求:MySQL的数据可以存储在本地
容器之间可以有数据共享的技术!Docker容器中产生的数据,同步到本地
以上就是数据卷技术
目录的挂载,将我们容器内的目录,挂载到Linux上面
总结:容器数据的持久化和同步操作!容器间也是可以数据共享的
只能在创建容器的时候创建数据卷
方式一:直接使用命令来挂载 -v (volum)
docker run -it -v 主机目录:容器内部目录
# 测试
docker run -it -v /home/ceshi:/home centos /bin/bash
输入docker inspect 容器id 查看元数据
思考:MySQL的数据持久化问题
# 获取镜像
#运行容器,需要做数据挂载 #安装启动mysql,需要配置密码
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
docker run -itd -v /home/docker/mysql01/conf:/etc/mysql/conf.d -v /home/docker/mysql01/data:/var/lib/mysql -p 3308:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
匿名挂载
docker run -d -p --name nginx01 -v /ect/nginx nginx
docker volume ls
具名挂载
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/XXXX(卷名)/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况都使用具名挂载
如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
拓展:ro和rw
通过 -v 容器内路径:ro rw 改变读写权限
ro readonly 只能从宿主机来操作,容器内部无法操作
rw readwrite
一旦设定了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
在构建镜像的时候直接进行挂载
dockerfile就是用来构建镜像的构建文件!命令脚本!先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层
#创建一个dockerfile文件,名字可以随机,建议为Dockerfile
#文件中的内容 指令(大写)和参数
FROM centos
VOLUME ["volume01","volume02"] 匿名挂载
CMD echo "----end----"
CMD /bin/bash
这里的每个命令,都是镜像的一层
docker01
docker02: 继承docker01
当把docker01删除了,查看一下docker02和docker03是否可以访问这个文件
测试依旧可以访问
这样就可以实现两个容器数据同步
结论:
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
基础知识:
docker镜像逐渐成为了企业交互的标准
dockerfile:构建文件,定义了一切的步骤,源代码
dockerimages:通过dockerfile构建生成的镜像,最终发布和运行的产品,原来是kar war
docker容器:容器就是镜像运行起来提供服务的
通过这个文件构建镜像
CMD 和 ENTRYPOINT的区别
标签:linu 完整 关闭 kernel 利用 json sock 安装nginx 方案
原文地址:https://www.cnblogs.com/psyduck/p/13997900.html