Docker从0到1学习

1、关于Docker

1、作用

将写的代码、软件和配置文件打包成一个镜像,可以在其他地方下载运行。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。容器会将应用程序相关的环境和状态完全封装起来,解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

2、理念

一次镜像,处处运行,当制作成一个镜像后,开启多个虚拟机都可以运行。

3、容器与虚拟机的区别

容器不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置,系统因此变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。

4、在centos7安装docker

2、指令

1、启动类指令

systemctl start(restart,stop,status) docker:启动(重启,停止,查看状态)docker。docker --help:docker的帮助文档命令。

2、镜像操作指令

docker images:列出本地主机上的镜像,docker images --help,docker rmi -f + 镜像名或者镜像id:删除镜像。

3、容器操作命令

docker ps:列出运行的容器。docker ps -a:列出所有容器(正在运行的和历史运行的),docker ps -l:罗列最近运行的容器,docker ps -n 2:罗列最近运行的2个容器。docker ps -q:只显示最近运行的容器的id。exit run进去容器,exit退出,容器停止。ctrl+p+q run进去的容器,ctrl+p+q退出,容器不停止。启动容器的指令是:docker run [options] image [command] [arg],option参数:--name:容器新名字,-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行),i:以交互模式运行容器,通常与-t一起使用,-t:为容器重新分配一个伪输入终端,通常与-i使用,也即启动交互式容器,前端有伪终端,等待交互。-P:随机端口映射,-p:指定端口映射。docker kill 容器id:强制停止容器。docker rm 容器id:删除已停止的容器。docker rm -f 容器id:删除正在运行的容器。启动redis:docker run -d --name myredis redis:6.0.8。docker rmi -f ubuntu:删除ubuntu镜像。启动容器:docker run -it (--name=x) 容器名或id /bin/bash。

4、进入容器的指令

推荐:docker exec -it + 容器id /bin/bash。exit:退出。docker attach 容器id:进入,exit:退出。

5、容器的备份

docker cp id:/tmp/b.txt /tmp/a.txt:拷贝b到a。

6、docker镜像commit操作实例-扩展镜像-一层一层

docker run -it 容器id /bin/bash。vim a.txt发现not found。此时我们想给这个正在运行的容器添加vim功能,我们现在应该在ubuntu容器里面安装vim编辑器。apt-get update,apt-get -y install vim。

7、将镜像推送到阿里云

8、搭建私服

1、下载镜像Docker Registry:docker pull registry。2、运行私服容器docker run -d -p 5000:5000 -v /krisswen/myregistry/:/tmp/registry --privileged=true registry。3、将镜像推送到私服库:安装ubuntu从而安装ifconfig命令。docker pull ubuntu:重新下载一个,docker images查看。docker run -it --name=(xx) (ubuntu的id) /bin/bash。接下来完整ifconfig命令:apt-get update,apt-get install net-tools,ifconfig。安装镜像:docker commit -m="ifconfig" -a="krisswen" d911f60117c3 ubuntu1:1.1,使用curl工具验证私服上有什么镜像:curl -XGET http://192.168.150.135:5000/v2/_catalog,将新镜像修改成符合私服规范的tag:docker tag ubuntu1:1.1 192.168.150.135:5000/ubuntu1:1.1。修改docker配置文件使其支持http:vim /etc/docker/daemon.json。让"insecure-registries": ["192.168.150.135:5000"]。重启docker和registry容器后,推送镜像到私服:docker push 192.168.150.135:5000/ubuntu1:1.1。可以拉取镜像:docker pull 192.168.150.135:5000/ubuntu1:1.1。

9、Docker容器数据卷

1、数据卷可在容器之间共享或重用数据,卷中修改可以直接实时生效,数据卷中的更改不会包含在镜像的更新中。数据卷的生命周期一直持续到没有容器使用它为止。添加数据卷:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名。查看宿主机目录:cd /tmp。如何查看是否挂载成功:docker inspect (id)。上面的挂载,默认在内部的目录可以进行读写操作,如果我们只想在容器内部进行读操作,我们需要加上ro标识:docker run -it --privileged=true -v /tmp/dockerData1:ro ubuntu /bin/bash。容器数据卷还可以被继承:我们先启动一个ubuntu的容器1:docker run -it --privileged=true -v /tmp/hostData:/tmp/data --name=u1 ubuntu /bin/bash。我们再启动容器2继承容器1的规则:docker run -it --privileged=true --volumes-from父类 --name u2 ubuntu。

10、docker中常见软件的常规安装

tomcat:1、搜索镜像:docker search tomcat,2、拉取镜像:docker pull tomcat,3、docker images查看是否拉取到的tomcat,4、使用tomcat镜像创建容器实例(也叫运行镜像):docker run -d -p 8080:8080 --name t1 tomcat。下载一个免修改的tomcat8镜像:docker pull billygoo/tomcat8-jdk8。再docker run -d -p 8081:8080 --name mytomcat8 billygoo/tomcat8-jdk8。实战版下载MySQL,拉取完后执行:docker run -d -p 3307:3306 --privileged=true -v /opt/mysql/log:/var/log/mysql -v /opt/mysql/data:/var/lib/mysql -v /opt/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7。

3、Docker进阶

1、主从复制原理(安装主从复制的MySQL

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。数据库中有个binary-log的二进制文件,记录了所有sql,我们目标是把主数据库里面的binary-log的sql复制过从数据的relay-log重做日志文件中再执行一次这些sql语句即可。搭建:第一步新建主服务器实例3307:

bash 复制代码
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

然后vim my.cnf在里面输入下面代码。

bash 复制代码
[mysqld]
## 设置server_id,同一局域网中需要唯一
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog-format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库不一致
slave_skip_errors=1062

创建数据同步的用户

bash 复制代码
create user 'slave'@'%' identified by '123456';

对用户进行授权操作

bash 复制代码
grant replication slave,replication client on *.* to 'slave'@'%';

然后多开个窗口进入/mydata/mysql-master/conf

创建从服务器:

bash 复制代码
docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

然后在从机上执行

bash 复制代码
change master to master_host='192.168.150.135', master_user='slave', master_password='123456', master_port=3307, master_log_file='mysql-bin.000001', master_log_pos=154, master_connect_retry=30;

2、分布式缓存(哈希槽分区)

3、Docker中的redis集群搭建1-5,2-6,3-4

4、DockerFile

DockerFile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。是用来构建镜像的。

1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数。2、指令按照从上到下的指令执行。3、#表注释。4、每条指令都会创建一个新的镜像层并对镜像进行提交。

执行流程:1、docker从基础镜像运行一个容器。2、执行一条指令并对容器做出修改。3、执行类似docker commit的操作提交一个新的镜像层。4、docker再基于刚提交的镜像运行一个新容器。5、执行dockerfile中的吓一条指令直到所有指令都执行完成。

5、常用保留字介绍

1、FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM。如:from amazoncorretto:8-a12-jdk表示tomcat是基于amaz...这个镜像制作2、MAINTAINER:描述镜像维护者的姓名和邮箱地址。3、RUN:镜像构建的时候需要运行的命令,也就是dockerfile在构建的时候需要执行的指令。运行的指令有shell和exec两种,一般用前者。4、WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点。我们以tomcat镜像为例,让我们启动运行一个tomcat容器之后,我们观察进入容器之后的默认目录:我们发现docker run -it -p 8080:8080 tomcat /bin/bash进入容器后,默认目录是/usr/local/tomcat。5、USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root。一般我们都是以root用户去运行我们的镜像。6、ENV:用来构建镜像中设置环境变量。这个环境变量可以在后续任何RUN指令中使用。7、VOLUME:容器数据卷,用于保存和持久化工作。8、ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包。9、类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中的<源路径>文件/目录复制到新的一层的镜像内的<目标路径>位置。10、CMD:指定容器启动后的要干的事情。CMD后面跟的指令格式和RUN类似,也有两种格式。11、ENTRYPOINT:也是用来指定一个容器启动时要运行的命令,类似于CMD指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序。

6、虚悬镜像

无实际意义,要删除。

7、Docker网络

模式1、bridge:为每一个容器分配、设置ip,并将容器连接到一个名为docker0的虚拟网桥,默认为该模式。2、host:容器将不会虚拟出自己的虚拟网卡,设置自己的ip等。而是使用宿主机的ip的端口。使用--network host参数可以指定。3、container:新创建的容器不会创建自己的网卡和设置自己的ip。而是一个指定的容器共享ip端口范围。4、none:容器有独立的network namespace,并没有对其进行任何网络设置,入分配veth pair和网络桥接ip等。使用--network none参数指定。一般很少使用。

常用命令:通过docker network help查看。

docker容器ip产生规则。bridge模式:每个eth0绑定一个veth。container模式:新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新建的容器不会创建自己的网卡,配置自己的ip,而是和一个指定的容器共享ip、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。自定义网络技术:本身维护好了主机名和ip的对应关系。上面讲过,默认使用bridge网络模式,容器内部的ip在某些情况下会发生变化,如果此时通过容器的ip地址进行通信可能会遇到问题,如果我们想和某个容器之间建立通信的话,会怎么做,可以使用容器名称建立通信。(类似于微服务中通过服务名称实现服务之间的远程调用)。

8、Docker-compose容器编排

是官方的开源项目,复制实现对docker容器集群的快速编排。需要定义一个yaml格式的配置文件docker-compose.yml,写出好多个容器之间的调用关系。下载docker-compose二进制文件再chmod +x赋予可执行的权限。

Docker compose的常用基本命令

bash 复制代码
Compose常用命令
docker-compose -h 查看帮助文档
docker-compose up 启动所有docker-compose服务
docker-compose up -d 启动所有dockers-compose服务并后台运行
docker-compose down 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id     进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps  展示当前docker-compose编排过的运行的所有容器
docker-compose top 展示当前docker-compose编排过的容器进程

docker-compose logs yml里面的服务id   查看容器输出日志
docker-compose config  检查配置
docker-compose config -q  检查配置,有问题才有输出
docker-compose restart(start(stop  重启/启动/停止服务

9、Docker可视化工具Portainer

10、Docker监控CAdvisor+InfluxDB+Granfana

我们可以通过docker stats命令可以方便的看到宿主机上所有容器的CPU,内存以及网络流量等数据,一般小公司够用了。但是docker stats统计结果只能是当前宿主机的全部容器,数据资料是实时的,没有地方存储、没有健康指标过线预警功能。此时使用CAdvisor(监控收集)+InfluxDB(存储数据)+Granfana(展示图表)。

11、使用Docker Compose搭建CIG监控平台

12、Swarm mode

是内置于docker的一个工具。因此我们使用Swarm时不需要安装任何东西,Swarm已经内置在我们系统里面了,只不过我们没有运行Swarm模式下,我们一般运行在单机模式下,因此swarm就是初学者接触容器编排的一个工具。

节点:运行Docker的主机可以初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行Docker的主机就成为一个Swarm集群的节点(node)。分为管理节点和工作节点。管理节点用于Swarm集群的管理,docker swarm命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个Swarm集群可以有多个管理节点,但只有一个管理节点可以成为leader,leader通过raft协议实现。工作节点是任务执行节点,管理节点将服务service下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

服务和任务:任务是Swarm中的最小的调度单位,目前来说是一个单一的容器。服务是指一组任务的集合,服务定义了任务的属性。服务有两种模式:replicated services按照一定规则在各个工作节点上运行指定个数的任务。global services每个任务工作节点上运行一个任务。两种模式通过docker service create的--mode参数指定。

创建管理节点:docker swarm init --advertise-addr 192.168.150.135。再下面复制命令在其他docker环境运行以创建工作节点。

13、通过yaml在swram mode部署服务。

部署服务:docker stack deploy -c docker-compose.yml wordpress

相关推荐
ting94520001 小时前
动手学深度学习(PyTorch版)深度详解(1)(含实操+避坑)
pytorch·深度学习·学习
nervermore9901 小时前
3. 人工智能学习-PyTorch框架学习
人工智能·pytorch·学习
handler011 小时前
进程状态流转的本质:Linux 内核队列与底层数据结构解密
linux·运维·c语言·数据结构·c++·笔记·学习
Shan12051 小时前
大学计算机初学者之学习课程推荐
学习
Nice_Fold2 小时前
Kubernetes探针机制与Deployment控制器(自用笔记)
笔记·容器·kubernetes
memoryjs2 小时前
鸿蒙系统进一步学习(二):ArkUI底层原理揭秘
学习·华为·harmonyos
燐妤2 小时前
前端HTML编程2:深入学习表单与表格
前端·学习·html5
疯狂成瘾者2 小时前
Docker的学习路线
学习·docker·容器
for_ever_love__3 小时前
UI学习:UITableViewCell的创建及复用机制
学习·ui·objective-c