docker学习浅谈
前言:前段时间看到K8s这玩意儿,听说可以取代docker,docker经常听,但又不知道具体是什么实现原理。
不想看概念,直接操作?点这里:确定吗?
文章目录
1.什么是docker
官方:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
2.了解docker几个要点
2.1docker服务
2.2镜像
2.3容器
2.4镜像与容器
2.5通信
2.6镜像仓库
3.浅浅了解一下原理
3.1组成架构
Docker是一个C/S结构的应用程序。主要包括客户端、服务端(守护进程)、命令行接口。
3.2启动原理
通过主机系统创建Docker Daemon守护进程,以守护进程作为引擎,读取镜像并构建对应的容器、执行容器。
Docker容器技术和虚拟机技术都属于虚拟机技术,网络上也常有人将它们进行对比,下面也根据它们的区别来促进我们对Docker的理解。
3.3LXC与AUFS(待详解,另写)
Dockers=LXC+AUFS[^3]
LXC:namespace、cgroup ------LXC负责资源管理
AUFS:Advanced UnionFS ------AUFS负责镜像管理
3.4Docker容器语言(待考证,另写)
go语言,偶然从某本书得知go语言有粒度小于线程的运行行为,叫做协程。协程独立栈,共用堆。不知道是否因为这,Docker在容器隔离方面和利用资源有着一定的优势。(待考证)
4.动手
4.1安装docker
⑤更新索引:
sudo apt-get update
⑥安装docker
sudo apt-get install docker-ce docker-ce-cli containerd.io
-
docker-ce:引擎
-
docker-ce-cli:命令行,将用户的命令转化为Restful Api形式,发送给守护进程。
-
containerd.io:守护进程
查看版本:
docker version
开机自启:
systemctl enable docker
⑦更改镜像仓库位置,提速:
sudo vim /etc/docker/daemon.json
#添加以下:
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
重启:
service docker restart
4.2基本指令
------------------------------程序员常用----------------------------------
docker search xxx 搜索xxx镜像
docker pull xxx:version 从镜像库拉取容器镜像,如果不加version,将会拉取最新latest版本
docker ps 查看正在运行的容器列表(可以看到容器ID,所映射的端口号等等)
docker ps -a 查看所有的容器(不管是否运行都能看到)
docker start/stop CONTAINER ID 开始/停止容器(CONTAINER ID 是容器的ID)
docker rm CONTAINER ID 删除容器
docker kill CONTAINER ID 直接关闭容器
-------------------------------运维大佬常用--------------------------------
docker build -t [tag]:[version] [path] 构建镜像
docker run -itd -p [hostPort]:[containerPort] --name [containerName] [tag]:[version] 创建容器
docker network create [yourNetName] 自定义网络
docker network inspect [yourNetName] 查看自定义网络信息
docker logs -f [containerName] 查看容器日志
docker inspect 查看容器信息
-------------------------------操作docker服务-----------------------------
systemctl start/stop docker 运行/停止 docker 服务
systemctl enable docker 使 docker 开机自启
4.3运行容器
小建议:为避免根路径存储空间不足,建议将docker数据存储位置改成磁盘空间大的位置。如何修改?点击直达
⑤测试容器服务:
检查主机端口是否被映射sudo netstat -ntulp | grep 3306
使用navicat测试连接:
如果连接失败,很有可能是mysql配置root无法远程登录,解决方法:参考以下第⑥点。
⑥进入容器环境:docker exec -it [容器名] bash
docker exec -it mysql_t bash
配置root可以远程登录:
mysql -uroot;
> use mysql;
> select host,user from user;
> update user set host = '%' where user = 'root';
> flush privileges;
随即可使用navicat登录成功。
运行容器总结:
docker search [镜像名称] #搜索镜像
docker pull [镜像名称]:[版本号] #拉取镜像
docker images #查看本地镜像
docker run -itd --name [容器名] -p [主机port]:[容器内port] [镜像名称] #通过镜像生产容器。-itd后台运行 --name容器名,其他参数自查
docker ps #查看正在运行的容器,查看所有容器需要加参数 -a
dicker logs -t [容器名] #查看容器日志
docker exec -it [容器名] bash #进入容器环境
4.4制作项目镜像
4.5容器间通信
查看各个容器的ip:
docker inspect -f '{{.Name}} ->>>>>>>>> {{.NetworkSettings.IPAddress }} :::::::: {{.NetworkSettings.Ports}}' $(docker ps -aq)
#/mysql_t ->>>>>>>>>>>>>>>>> \t172.17.0.3 :::::::: map[3306/tcp:[{0.0.0.0 3306}]]
容器名称 容器ip 容器服务的端口:主机映射端口
先记住以下信息:
小结:方式一和方式二其实原理一样的,方式一主要是直接请求容器,方式二主要是通过主机作为网关请求容器。如果要从中选择一种通信方式,那当然是选择后者,因为通过网关可以无视容器自身ip的变化,只需要关心端口映射。
4.6自定义网络
刚开始了解自定义网络的时候,都会有一个疑惑,为什么不直接用上述的通过宿主ip:port访问的方式就好了,何必多此一举自定义网络?那现在先摁住这个疑惑,进行学习。点击直接看答案
答:使用自定义网络,只需要记住容器的名称或者自定义网络别名,就可以无视自身ip,也不需要通过主机作为网关转发,容器间相互请求只需要通过容器名称或者自定义网络别名,这就很方便。并且如果是多个集群,那可以通过自定义网段来区分不同的集群,使得整个网络格局清晰起来。
4.7自定义文件存储路径
由于根路径/空间小,如果docker数据占满了空间,会导致服务器出现各种问题,所以建议将默认路径改为磁盘空间比较大的路径。
#查看默认路径(默认路径一般是/var/lib/docker/)
docker info |grep -i root
#停止docker服务
systemctl stop docker
#使用增量备份指令rsync,将docker原有数据迁移至指定文件夹:rsync -参数 源 目标
rsync -avzP /var/lib/docker/ /data/docker
#修改docker配置文件/etc/docker/daemon.json
vim /etc/docker/daemon.json
#添加
{
"data-root": "/data/docker"
}
#重启docker
systemctl restart docker
#再次查看数据存储路径
docker info |grep -i root
#删除原路径下的数据
rm -rf /var/lib/docker/
4.8自定义网络实验(附加)
于本文4.7中,我们创建了6个容器。
docker run -d --name xxxItemModules_1 -p 6677:6688 --network xxxItemNet springboot-demo:4.0
docker run -d --name xxxItemModules_2 --network xxxItemNet springboot-demo:4.0
docker run -d --name xxxItemModules4 --network xxxItemNet springboot-demo:4.0
docker run -d --name xxxItemModules5 -p 9999:6688 --network mynet springboot-demo:4.0
docker run -d --name mysql_3 -e MYSQL_ROOT_PASSWORD=123456 --network xxxItemNet centos/mysql-57-centos7
docker run -d --name mysql4 -e MYSQL_ROOT_PASSWORD=123456 --network xxxItemNet centos/mysql-57-centos7
容器名称 | 网段 | 备注 |
---|---|---|
xxxItemModules_1 | xxxItemNet | 有主机端口映射 |
xxxItemModules_2 | xxxItemNet | 没有主机端口映射 |
xxxItemModules4 | xxxItemNet | 没有主机端口映射,容器名没有下划线 |
xxxItemModules5 | mynet | 新网段 |
mysql_3 | xxxItemNet | 这是mysql,容器名有下划线哇 |
mysql4 | xxxItemNet | 这是mysql,容器名无下划线哇 |
5.1结语
学习docker是为了更容易上手k8s。
docker的使用远不止上述那么简单,主要还是对容器中服务的数据存储路径的熟悉和项目路径的可读写权限分配(就比如项目中的日志路径,一般指定在主机路径,方便查找),其次就是容器间数据交互的通信搭建。
5.2结语2
有没有一种可能,其实不用那么麻烦总是使用docker xxx
指令去搞上面的所有操作。^__=
有的,有很多docker面板,自己百度。
上面不使用面板,只不过是为了让读者更熟悉docker的指令操作,一定程度上加强对docker原理的理解。
author:孰知宇某
date:2022-04-24 23:22:54
blog:https://blog.csdn.net/weixin_43548748
参考文献:
[1] 苦逼运维.Docker容器 https://www.cnblogs.com/diantong/p/11498649.html
[2]水浅之.deepin安装docker https://blog.csdn.net/weixin_38331049/article/details/120026337
[3]架构师-尼恩.Docker原理 https://blog.csdn.net/crazymakercircle/article/details/120747767
[4]百度.百度搜索引擎 https://www.baidu.com