泾阳网站建设,鹤山市城乡住房建设部网站,石碣企业网站建设公司,网站设置超链接Docker学习笔记
一、Docker概述
为什么会出现Docker?
安卓开发流程#xff1a;apk(java开发的)发布到应用商店#xff0c;用户安装apk即可使用。
后端开发流程#xff1a; jar(java开发的)带上环境发布到Docker仓库#xff0c;用户从Docker仓库拉取镜像并部署。
总结…Docker学习笔记
一、Docker概述
为什么会出现Docker?
安卓开发流程apk(java开发的)发布到应用商店用户安装apk即可使用。
后端开发流程 jar(java开发的)带上环境发布到Docker仓库用户从Docker仓库拉取镜像并部署。
总结Docker解决了环境部署的问题。
总结Docker通过隔离机制可以将服务器利用到极致
Docker和虚拟机的区别是什么? 一、虚拟机 1.传统的虚拟机是通过在物理机上安装虚拟化软件VMware来创建和管理虚拟机。每个虚拟机都运行着一个完整的操作系统需要分配一定的CPU、内存和磁盘空间因此需要占用较多的系统资源。 2.因为每个虚拟机都需要启动独立的操作系统所以虚拟机的创建、启动和关闭操作比较耗时需要几分钟甚至更长时间才能完成。 3.隔离性较好。 二、Docker 1.Docker采用了轻量级的虚拟化技术-容器相比于虚拟机容器共享宿主机的操作系统和硬件资源。 2.因为每个容器只包含应用程序所需文件和库而不需要启动独立的操作系统所以容器的创建和启动速度非常快需要几秒钟的时间。 3.由于容器共享宿主机的操作系统容器之间可以相互访问和影响隔离性相对较弱。
注意: Docker不需要Hypervisor实现硬件资源虚拟化运行在Docker容器上的程序直接使用的是物理机的硬件资源。
Docker架构图(Docker的基本组成) Docker使用客户端-服务器(C/S)架构模式。 Docker客户端只需要向Docker服务器或者Docker守护进程发出请求(Socket请求)Docker服务器或者Docker守护进程将完成所有工作并返回结果。
二、Docker常用命令 1.镜像命令
docker images #查看镜像
# docker images -a #列出所有镜像详细信息
# docker images -aq #列出所有镜像的id
docker search mysql #搜索镜像
docker pull mysql #下载镜像
# docker pull mysql等价于docker pull docker.io/library/mysql:latest
docker rmi 2c9028880e58 #删除镜像2.容器命令
docker run -it 镜像id /bin/bash #新建容器并启动(-it表示使用交互方式运行进入容器查看内容)
docker ps #列出当前正在运行的容器
docker rm 容器id #删除指定容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
docker top 容器id #查看容器内的进程信息
docker inspect 容器id #查看容器的元数据(重要!!!)
docker exec -it 容器id bin/bash #进入当前正在运行的容器(重要!!!)
docker cp 容器id:容器内路径 主机目的路径 #从容器内拷贝数据到主机3.容器命令练习
# -d 后台运行 --name 给容器命名 -p 宿主机端口:容器内部端口
docker run -d --name nginx01 -p 3344:80 nginx #安装Nginx
curl localhost:3344 #测试Nginx三、Docker镜像加载原理
1.如何得到一个镜像?
从仓库中拉取镜像: docker pull
从本地文件中载入镜像: docker load
由容器生成新的镜像: docker commit
自己构建新的镜像: docker build2.Docker镜像加载的原理是什么?
2.1 联合文件系统UnionFs
联合文件系统UnionFs是一种分层、轻量级且高性能的文件系统支持对文件系统的修改作为一次提交来一层层的叠加同时可以将不同目录挂载到同一个虚拟文件系统下。
联合文件系统UnionFs是Docker镜像的基础。镜像可以通过分层来进行继承基于基础镜像可以制作各种具体的应用镜像。
特性一次同时加载多个文件系统但从外面看起来只能看到一个文件系统联合加载会把各层文件系统叠加起来这样最终的文件系统会包含所有底层的文件和目录。
2.2 Docker镜像加载的原理是什么?
Docker的镜像实际上由一层一层的文件系统组成。
Linux操作系统由内核空间和用户空间组成。 Linux刚启动时会加载内核空间的bootfs文件系统主要包含bootloader和kernel其中bootloader主要是引导加载kernel。 在bootfs文件系统之上是用户空间的rootfs文件系统包含常用的/dev/bin等目录。
对于一个镜像rootfs可以很小只需要包含最基本的命令、工具和程序库就可以了底层直接用宿主机的内核。
2.3 为什么Docker镜像要采用这种分层的结构呢?
资源共享。比如有多个镜像都从相同的Base镜像构建而来那么宿主机只需在磁盘上保留一份base镜像同时内存中也只需要加载一份base镜像这样就可以为所有的容器服务了而且镜像的每一层都可以被共享。
四、容器数据卷
1.什么是容器数据卷?
卷技术说白了就是目录的挂载将容器内的目录挂载(映射)到宿主机上。
容器数据卷可以实现容器内数据的持久化和同步。
2.如何使用数据卷?
docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口 /bin/bash #进行挂载
docker inspect 容器id #查看是否挂载成功3.数据卷作业练习
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 --name mysql01 mysql:5.7 # 配置文件的挂载和数据文件的挂载4.数据卷容器实现多个MYSQL同步数据
docker run -it --name mysql1 b1y0nd/centos
docker run -it --name mysql2 --volumes-from mysql1 b1y0nd/centos
docker run -it --name mysql3 --volumes-from mysql1 b1y0nd/centos
# 此时在mysql1的volume01中创建文件在mysql2的volume01中可以查看到已经成功同步数据。5.如何利用Dockerfile构建Docker镜像?
Dockerfile就是用来构建Docker镜像的构建文件。
通过这个脚本可以生成镜像脚本是一个个的命令每个命令都是一层所以镜像是一层一层的。
FROM centos #基础镜像
VOLUME [volume01,volume02] #匿名挂载
CMD echo -----end-----
CMD /bin/bash
# 注意
# 1.每个指令都必须是大写字母。
# 2.执行从上到下
# 3.#表示注解
# 4.每一个指令都会创建一个新的镜像层并提交。比如第一层rootfs基础镜像(centos)第二层镜像(jdk)第三层镜像(tomcat)。docker build -f dockerfile -t b1y0nd/centos . #构建镜像6.Dockerfile实战练习创建Tomcat镜像
1.准备Tomcat和JDK的压缩包 2.编写Dockerfile文件
# 基础镜像centos
FROM centos
# 作者信息编写
MAINTAINER b1y0nd2543031567qq.com
# 复制当前目录下readme.txt文件到容器/usr/local中
COPY readme.txt /usr/local/readme.txt
# 添加JDKADD 命令会自动解压到/usr/local目录
ADD jdk-8u291-linux-x64.tar.gz /usr/local/
# 添加TomcatADD 命令会自动解压到/usr/local目录
ADD apache-tomcat-9.0.46.tar.gz /usr/local/
# 安装vim命令
RUN yum -y install vim
# 设置MYPATH
ENV MYPATH /usr/local
# 工作目录
WORKDIR $MYPATH
# 配置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_291
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.46
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.46
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 设置暴露的端口
EXPOSE 8080
# 设置默认命令这里设置了启动指定目录下的startup.sh程序以及日志
CMD /usr/local/apache-tomcat-9.0.46/bin/startup.sh tail -F /usr/local/apache-tomcat-9.0.46/logs/catalina.out 3.构建镜像
docker build -t b1y0nd:tomcat .五、Docker网络
1.Docker0是什么?
当我们在Linux宿主机中安装了Docker服务器:
宿主机中就会配置Docker0网卡Docker0使用的是桥接模式使用的技术是Veth-pair技术。每启动一个Docker容器Docker服务器就会给Docker容器分配一个ip一对虚拟网卡。宿主机就是个路由器的角色。 当我们进行测试时发现:
宿主机可以直接ping通容器容器也可以直接ping通宿主机。容器Tomcat1也可以直接ping通容器Tomcat2容器Tomcat2也可以直接ping通容器Tomcat1。
注意: Docker中所有的网络接口都是虚拟的因为虚拟网卡转发效率高传输文件快。只要容器删除分配给它的一对虚拟网卡自动消失。
2.Docker的网络模式有哪些?
bridge: 桥接(默认) none: 不配置网络 host: 和宿主机共享网络 container: 容器网络连通
3.容器互联的方式有哪些?
容器互联解决的问题: 修复了不能通过容器名ping通容器的问题。
方式一: Link方式
docker run -d --name tomcat1 b1y0nd/tomcat
# tomcat2可以ping通tomcat1但是tomcat1不能ping通tomcat2。根本原因是tomcat2的hosts文件中写入了172.17.0.2 tomcat1 b71a0a6566a3
docker run -d --name tomcat2 --link tomcat1 b1y0nd/tomcat方式二: 自定义网络
# 以前使用的都是默认网络Docker0。docker run -d --name tomcat1 b1y0nd/tomcat等价于docker run -d --name tomcat1 --net bridge b1y0nd/tomcat
# 现在创建一个自定义网络名字是mynet。
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 创建两个Tomcat使用自定义网络。
docker run -d --name tomcat1 --net mynet b1y0nd/tomcat
docker run -d --name tomcat2 --net mynet b1y0nd/tomcat
# 测试发现tomcat1可以ping通tomcat2tomcat2也可以ping通tomcat1。
docker exec -it tomcat1 ping tomcat2
docker exec -it tomcat2 ping tomcat1自定义网络的应用: 不同的集群(比如Redis集群和Mysql集群)使用不同的网络可以保证集群式安全和健康的。
4.不同的自定义网络如何连通?
问题: Docker0网络和mynet网络网段不同容器如何连通? 或者说 问题: Docker0网络的tomcat1想访问mynet网络的tomcat3应该怎么实现? 解决: tomcat1先联络上mynet再通过mynet联络上tomcat3。
# 打通tomcat1和mynet
docker network connect mynet tomcat1
# 查看网络配置发现: 打通tomcat1和mynet本质上是把tomcat1加入mynet网络。(tomcat1一个容器拥有两个IP地址)
docker network inspect mynet
# 测试连通(tomcat1不仅可以通信tomcat3也可以和mynet网络中任何一个容器通信)
docker exec -it tomcat1 ping tomcat3Linux学习笔记
一、文件和目录管理命令
▐ find - 按照名称查找文件或目录
# 查找/home下以.txt结尾的文件
find /home -name *.txt▐ ln - 创建硬链接或者软链接
# 创建f1的一个硬链接文件f2。
# 硬链接: A是B的硬链接A和B都是文件名则A和B的目录项中的inode节点号相同即两个文件名指向同一个文件。
ln f1 f2
# 创建f1的一个符号链接文件f2。
# 软链接A是B的软链接A和B都是文件名则A和B的目录项中的inode节点号不同A的数据存放的是B的路径相当于快捷方式。
ln -s f1 f3二、文件内容操作命令
▐ grep - 在文件中搜索文本
# 搜索file1.txt中匹配pattern的内容
grep pattern file1.txt
# 搜索command输出中匹配pattern的内容
command | grep pattern▐ wc - 统计文件的行数、字数和字节数
# 统计file1.txt的行数
wc -l file1.txt三、文件权限管理命令
Linux文件权限包括三个部分文件的所有者、文件所属的组以及其他用户。每个部分都有三种权限
权限通常表示为一个十位的字符串如 -rwxr-xr--其中
第一位表示文件类型例如- 表示普通文件d 表示目录。接下来的九位分为三组每组三位分别表示所有者、组、其他用户的权限。
查看文件权限通常使用 ls 命令
ls -l输出示例
-rw-r--r-- 1 user group 4096 May 19 12:34 file.txt▐ chmod - 修改文件或目录的权限
chmod ux file.txt # 为文件所有者添加执行权限
chmod g-w file.txt # 移除组的写权限
chmod or file.txt # 设置其他用户只读权限
chmod ar file.txt # 为所有用户添加读权限八进制模式
mode 是一个三位的八进制数每位代表不同的权限 读r4写w2执行x1
# 设置文件权限为 -rwxr-xr-x
chmod 755 file.txt
# 设置文件权限为 -rw-r--r--
chmod 644 file.txt四、进程管理命令
▐ ps显示当前运行的进程
# 显示所有进程的详细信息
ps -ef
# 显示所有进程的详细信息
ps -aux▐ top实时显示系统资源使用情况
五、压缩和归档命令
六、用户管理命令
▐ who显示当前登录的用户
▐ useradd添加新用户
七、网络管理命令
▐ ifconfig显示或配置网络接口
# 显示所有网络接口的信息
ifconfig
# 启动网络接口eth0
ifconfig eth0 up
# 配置网络接口eth0的IP地址、子网掩码和广播地址
ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255▐ traceroute显示数据包到目标主机的路径
# 跟踪到目标主机的路由
traceroute www.example.com ▐ netstat显示进程的网络连接
# 显示所有连接和监听端口并显示每个连接相关的进程ID
netstat -ano八、磁盘管理命令
▐ df显示文件系统的磁盘空间使用情况
# 以人类可读的格式显示所有挂载的文件系统的磁盘使用情况
df -h▐ fdisk磁盘分区管理
# 显示所有磁盘及其分区信息
fdisk -l ▐ mount挂载文件系统
# 将设备/dev/sda1挂载到/mnt目录
mount /dev/sda1 /mnt