Docker简介
学习方法,理解 a.是什么 b.能干吗 c.去哪里下载 d.怎末操作 e. hello world
1、是什么
**docker解决了什么?**统一开发、测试、运维的使用的环境,确保在任何地方的运行环境一致。。并且可以快速部署。系统平滑移植
包含两方面的技术:镜像技术、镜像即应用(在不同环境仍然可以正常运行)
**docker理念?**一次镜像,处处运行;;从搬家到搬楼
可以将源码、运行环境、配置文件、特殊引导等打成一个包,即将应用打成一个镜像
spring提供单独的配置中心,这个是怎末应用的???
docker基于go语言实现的云开源项目
Docker解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
2、容器与虚拟机比较
传统虚拟机:Virtual Machine 带环境安装的一种解决方案,运行另一套系统,能够使引用程序,操作系统和硬件三者之间逻辑不变。
Docker容器是在操作系统层面上实现虚拟化,直接使用本地的操作系统,而传统虚拟机是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用面积小。
a.传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上在运行所需应用进程。
b.容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
c.每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
3、能干嘛
技术职级的改变 coder–>programmer–>software engineer–>DevOps engineer
更容易部署、扩容、缩容、运维,更高的利用资源
4、去哪里下载
官网 www.docker.com 官网有官方文档
仓库 https://hub.docker.com
Docker安装
1、Docker基本组成
镜像–Java类模板。只读模板,用来创建容器,一个镜像可以创建多个容器
容器–依据模板创建的对象。独立运行一个或者一组应用,可以看做简易版的Linux环境和运行在其中的应用程序。
仓库–镜像的存放地址。有公开的和私有的,公司内部可以有自己的仓库。
2、Docker平台架构图解
入门版:
工作原理:
Docker是一个客户端-服务结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器,是一个运行时环境,就是我们前面说到的集装箱。
架构版:整体架构以及底层通信原理
docker是一个c/s模式的架构,后端是一个松耦合架构,众多模块各司其职。
Docker运行的基本流程:
1、用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。
2、Docker Daemon作为Docker 架构中的主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求。
3、Docker Engine执行Docker 内部的一系列工作,每一项工作都是以一个Job的形式存在。
4、Job的运行过程中,当需要容器镜像时,从Docker Registry中下载镜像,并通过镜像管理驱动Graph driver将下载镜像以Graph的形式存储。
5、当需要为Docker 创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境。
6、当需要限制Docker 容器运行资源或执行用户指令等操作时,通过Exec driver 来完成。
7、Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。
3、安装
cat /etc/redhat-release
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum -y install gcc
yum -y install gcc-c++
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 不用这个镜像仓库,使用阿里云的或者网易云的
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl start docker
sudo systemctl status docker
sudo systemctl stop docker
sudo docker run hello-world
Docker常用命令
1、帮助启动类
启动:systemctl start docker
停止:systemctl stop docker
重启:systemctl restart docker
状态:systemctl status docker
开机启动:systemctl enable docker
概要信息:docker info
帮助信息:docker --help
2、镜像命令
当前主机的所有镜像:docker images
-a:显示历史的镜像
-q:只显示镜像ID
查询某个镜像:docker serach
--limit 5
拉取某个镜像:docker pull repository:tag
查看镜像/容器/数据卷所占空间:docker system df
删除镜像:docker rmi 镜像ID
-f:force delete
//delete all images:docker rmi -f $(docker images -qa)
docker虚悬镜像:镜像名称和tag都是<none>
3、容器命令
新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
常用命令:
--name:容器名字
-d:后台运行并返回容器ID,启动守护式容器
-i:以交互式运行容器
-t:为容器重新分配一个伪输入终端
-it:启动交互式容器,前台有伪终端,等待交互
-P:随机端口映射
-p:指定端口映射 外部访问:docker访问内部的端口 做一个映射
列出当前所有正在运行的容器
docker ps [OPTIONS]
-a, --all Show all containers,显示正在运行以及历史运行的所有容器
-n, --last int Show n last created containers 显示最近n个创建的容器,默认为1
-l, --latest Show the latest created container
--no-trunc Don't truncate output
-q, --quiet Only display container IDs
退出容器
exit 退出–容器停止
CTRL+P+Q 退出–容器不停止
启动已停止运行的容器
docker start container-ID or Name
重启容器
docker restart container-ID or Name
停止容器
docker stop container-ID or Name
强制停止容器
docker kill container-ID or Name
删除已停止的容器
docker rm container-ID
强制删除:docker rm -f container-ID
启动守护式容器(后台服务器)
docker run -d 镜像名称
docker 容器后台运行某些镜像,必须要求存在至少一个前台进程,否则他就会认为自己没有事情可做,立即自杀。这些镜像若想在没有前台进程时运行,需要使用命令行模式以前台交互运行。
查看容器日志
docker logs container-ID
查看容器内运行的进程
docker top container-ID
查看容器内部细节
docker inspect container-ID
进入正在运行的容器并以命令交互
docker exec -it container-ID /bin/bash
- exec是在容器中打开新的终端,并且可以启动新的进程;用exit退出,不会导致容器的停止。
docker attach container-ID
- attach直接进入容器启动命令的终端,不会启动新的进程;用exit退出,会导致容器的停止。
从容器内拷贝文件到主机上
docker cp containerID:容器内路径 目的主机路径
导入和导出容器
export | save:导出容器内的内容作为一个tar归档文件
import | load:从tar包中的内容创建一个新的文件系统再导入为镜像
docker export [OPTIONS] CONTAINER
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
docker export containerID > 镜像名称以及后缀
cat 镜像名称以及后缀 | docker import - 镜像用户/镜像名:镜像版本号
docker save [OPTIONS] IMAGE [IMAGE...]
docker load [OPTIONS]
docker save > 镜像名称以及后缀 containerNAME:containerTAG
Docker镜像
分层镜像
1、轻量级、可执行的独立软件包
2、分层的镜像
3、UnionFS(联合文件系统):分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
镜像可以通过分层来进行继承,基于基础镜像,可以制作具体的应用镜像。
特性:一次同时加载多个文件系统,从外面看,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
4、Docker镜像加载原理
镜像由层层文件组成,UnionFS
- Docker镜像层都是只读的,容器层是可写的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
Docker镜像的commit
提交容器副本使之成为一个新的镜像。
- docker commit -m=“提交的描述信息” -a=“作者” container ID 要创建的目标镜像名:[标签名]
Ubuntu 安装 vim
#更新包管理工具
apt-get update
#安装需要的工具 vim
apt-get install vim
docker commit -m="vim" -a="wxx" 14d99 xxUbuntu:0.0.2
本地镜像发布到阿里云
$ docker login --username=进击的蓉儿呀 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/wxxzz/wxxubuntu:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/wxxzz/wxxubuntu:[镜像版本号]
本地镜像发布到私有库
Docker Registry 可以自本地搭建私有库
docker pull registry
启动私有库:docker run -d -p 5000:5000 -v /wxxuse/myregistry/:/tmp/registry --privileged=true registry
将镜像推送到私有库
查看私有库的内容:curl -XGET http://ip:port/v2/_catalog
修改tag:docker tag imageName:tag host:port/repositpry:tag
修改配置文件,支持http:修改/etc/docker/daemon.json 增加 "insecure-registries":["ip:port"]
push到私有库:docker push ip:port/imageName:tag
Docker容器数据卷
1、添加–privileged=true 解决挂载权限不够的问题
2、卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System 提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据库的持久化,完全独立于容器的生存周期,因此Docker不会再容器删除时删除其挂载的数据卷。
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
3、特点
数据卷可在容器之间共享或重用数据
卷中的更改可以直接实时生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
4、读写规则映射添加说明
容器内可以读写 docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
限制容器内只读 docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
5、卷的继承和共享
容器1完成和宿主机的映射,容器2继承容器1的映射
docker run -it --privileged=true -volumes-from 容器1的名字 镜像名
Docker常规安装简介
搜索-拉取-查看-启动-停止-移除
1、tomcat高版本主页有所更改,可以使用低版本的7、8完全够用;
2、MySQL再docker的默认字符集是拉丁,不支持中文?
docker run -it --privileged=true -v /wxx/mysql/log:/var/log/mysql -v /wxx/mysql/data:/var/lib/mysql -v /wxx/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=wangxinxin --name mysql mysql:5.7
再本地的/wxx/mysq/conf下新建my.cnf,输入内容如下
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
重启容器,校验是否支持中文
3、MySQL 实例被删除,如何恢复?
已在上面的启动命令中数据卷挂载中实现。
4、启动redis,要使用自己的配置文件
docker run -p 6379:6379 --name redis -d --privileged=true
-v /app/redis/redis.conf:/etc/redis/redis.conf
-v /app/redis/data:/data
redis-server /etc/redis/redis.conf