一 docker
1 历史的进化
物理机应用安装比较麻烦:部署非常慢,成本高,资源浪费(比方说有的计算耗费cpu不占内存)难于
扩展和迁移
(windows系统向lunix迁移) 受限于硬件
虚拟机模拟资源实现跨平台(jvm) vmware:所谓虚拟化就是在一个主机上创建不同的系统,分配自
己独立的硬件资源,实现一个电脑上运行多个系统,多部署;资源池与资源隔离;很容易扩展缺点vm
需要安装操作系统(系统需要占用很多资源)
容器化技术:不需要安装操作系统,docker上直接创建容器,不需要安装操作系统,节省了资源
总结:容器化是软件层面的隔离,虚拟机是物理机层面的隔离
2 容器化的优点
1 开发和运维工作协调,统一协调工具
2 对于运维来说:实现统一的部署标准,一键发布
3 docker 实现了监控功能
3 运用场景
标准化的迁移方式
统一的参数配置
自动化配置
应用集群监控
开发与运维之间沟通桥梁
4 centos7 下安装docker
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-confifig-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-c
e.repo
sudo yum makecache fastsudo yum -y install docker-ce
sudo service docker start
docker version
docker pull hello-world
docker run hello-world
5 docker体系结构
docker提供了开发,打包,运行应用的平台;
5.1 docker总体架构
如上图docker引擎获取物理机上的资源然后创建并发布可以用的容器
5.2 docker引擎如下:
上图说明安装了docker 就会启动docker daemon 这个守护进程,所有dokcer都是尤其完成,server端
中间层restapi对外提供服务(和客户端通信时候有restapi完成)
6 容器和镜像
1 镜像就是文件,是只读的,提供了运行程序的完整的数据,是应用程序的集装箱
2 容器:镜像的运行的环境 迷你的“lunix操作系统” 由docker负责创建,容器之间互相隔离
7 docker执行流程
如上图:docker pull 镜像时候现在本机上找有没有redis镜像有的话直接放到集装箱中使用,没有去远
程镜像中找,在没有就报错
8 docker配置阿里云镜像
vim /etc/docker/daemon.json
{ "registry-mirrors": ["https://fcpq2phy.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
9 docker安装案例
9.1 安装tomcat
docker pull tomcat
docker run -d -p 80:8080 -v /etc/localtime:/etc/localtime --restart=always tomcat
9.2 安装mysql
docker pull mysql:5.7
docker run -p 3306:3306 --name mysql -v /mydata/mysql/log:/var/log/mysql -v
/mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql -e
MYSQL_ROOT_PASSWORD=123456 -d --restart=always mysql:5.7
9.3 docker安装hadoop
首先关闭防火墙
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
下载hadoop镜像
docker pull sequenceiq/hadoop-docker:2.6.0
查看镜像
docker images
运行hadoop
docker run -i -t -p 50070:50070 -p 9000:9000 -p 8088:8088 -p 8040:8040 -p
8042:8042 -p 49707:49707 -p 50010:50010 -p 50075:50075 -p 50090:50090
sequenceiq/hadoop-docker:2.6.0 /etc/bootstrap.sh -bash
测试是否安装成功
先进入hadoop容器
docker exec -it ${CONTAINER ID} /bin/bash
执行完成docker run 也就是上一步,该步骤可以省略
cd /usr/local/hadoop-2.6.0
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep
input output 'dfs[a-z.]+'
如果执行mapreduce程序说明安装成功
可以打开浏览器查看
宿主机IP:50070
docker安装完毕
为了正常使用还需安装以下东西
vi /etc/profile
10 利用dockerfifile构建自定义镜像
·10.1 DockerFile是image镜像的描述文件,用于构建自定义镜像
10.2 使用命令创建自定义镜像
在最底部加入下面内容
export HADOOP_HOME="/usr/local/hadoop-2.6.0"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
保存:wq
使得配置生效
source /etc/profile
查看命令行是否能用
hadoop version
docker命令行安装完毕
测试jar文件在hadoop中启动
上传一个jar到宿主机
我用hadoop-mapreduce-examples-2.6.0.jar(这个可以自己在网上下一个)
拷贝jar文件到容器
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
docker cp /root/hadoop-mapreduce-examples-2.6.0.jar
b7d7f88574fb:/usr/local/hadoop-2.6.0
查看是否成功
docker exec -it b7d7f88574fb /bin/bash
cd /usr/local/hadoop-2.6.0
ls
上传一个文件到hdfs
vi a.txt
输入下面内容
canglaoshi is mylove
xiaoze is mylove
wutenglan is mylove
保存
hadoop创建文件夹
hadoop fs -mkdir -p /wordcount/input
hadoop fs -put a.txt /wordcount/input
hadoop jar hadoop-mapreduce-examples-2.6.0.jar wordcount /wordcount/input
/wordcount/output
查看输出内容
hadoop fs -cat /wordcount/output/part-r-00000
#利用FROM命令设置基准镜像
FROM tomcat:latest
#cd /usr/local/tomcat/webapps
WORKDIR /usr/local/tomcat/webapps
#ADD用于复制本地文件到镜像中
ADD docker-web ./docker-webdocker build -t mytomcat /opt/docker
10.3 运行镜像
docker run -d -p 8080:8080 mytomcat
10.4 访问
http://at3:8080/docker-web/a.jsp
11 dockerfifile基础命令
from
from这个指令是基于基准镜像来设计的。什么叫基于基准镜像?顾名思义,我们在构建新镜像时候,你
要依托于哪个原有的镜像进行扩展。比方说在这里我书写
前面的from自然是Dockerfifile的命令,而后面的centos则是centos远程仓库的镜像。在制作的时候,自
然基于centos:lastest,也就是最新版本来进行扩展。 但是有一些特殊的场景,假设我们并不需要任何
系统,只希望从零开始构建一个镜像的话,这时在我们的文件第一行你可以书写
代表不依赖任何基准镜像,从零开始,这种情况是非常少见的。 而下面的这个事例更说明问题
冒号后面是一个版本,好,这又是什么意思呢?作为from tomcat都知道这是拿tomcat镜像,后面如果
增加了冒号以后,则指明我们要下载某个特定的版本。 在这里9.0.22-jdk8-openjdk就是远程仓库给我
们提供了对应版本。在前面的centos这个位置上,我们没有写冒号,它默认就会给我们下载lastest最新
版,这是Docker的默认规则。 对于from基准镜像来说,这里有一个建议,作为Docker来说,尽量开发
的时候,基于官方提供的Base image基准镜像来进行。 因为官方提供的我们可以认为它是安全的,如
果是由其他第三方所提供的,这里他做了什么手脚我们就不清楚了。
label
label就是说明信息,如果放在程序中就是注释了。label没有任何功能性,它的作用就是写Dockerfifile里
边用于说明.
比方说这里我写了三个label,第一个说明我们的作者是谁?第二个label代表了当前Dockerfifile的版本
号,而第三个说明了当前镜像的用途和描述。这就是label的作用。别小看label的作用,虽然它没有任
何功能,但是却为我们程序维护性提供了极大的便利。试想一下,你看到一年前你自己写的,
Dockerfifile还能想起来它的作用吗?如果此时有这些描述信息,那是多么的方便。
workdir
workdir设置工作目录,它和我们linux的cd命令非常的相似,就是用于设置当前的工作目录,
from centos
from scratch
from tomcat:9.0.22-jdk8-openjdk
label maintainer = "itlaoqi"
label version = "1.0"
label description = "ITLAOQI应用镜像"代表的我们将当前工作目录设置为usr/local,作为这个目录如果不存在的话,默认规则workdir会对其
进行创建。
workdir具备了创建目录的功能,在使用的时候我的建议是workdir虽然可以像cd一样来进行相对路径的
跳转,但我更加建议在使用时使用绝对路径,也就是所有路径都以斜杠开头,书写完整的地址。
add©
add©。这个是两个命令,我放在一块来说,它们功能非常的相似,主要用于复制文件。那么大多数情
况下这里出现ADD你也可以把它替换成copy。
这条语句的作用就是指将hello这个文件复制到我们linux的根路径下。
同样的ADD还有一个高级的功能,就是自动解压缩,如果我们指向的是一个test.tar.gz压缩包的话,后
面跟的路径,它会自动将这个文件解压缩以后放在这个目录中。
那么ADD除了复制功能以外,它比起copy还具备着去拉取远程文件的功能。这和我们在linux系统中使
用的curl或者wget命令非常的相似,可以说ADD它是我们平时构建镜像时非常常用的一个命令,帮助我
们将文件从物理机复制到镜像当中去。
env
ENV设置环境常量,什么是环境常量呢?其实非常好理解。以前我们都在做java,如果jdk要使用的话,
是不是要在系统中设置一个名为java_home的这么一个环境变量,那么在docker中也有类似的设置,这
里使用env再加上环境常量的名字,后面再增加具体的值就行了。
就拿这个例子,env Java_home后边加上这个路径说明java_home它指向了这个地址,也就是
java_home就指代了后面的路径。 那么在使用时可以使用run来运行某个linux的指令,只不过在这使用
${}加上我们环境常量来进行替代。它具体的作用就相当于执行了open jdk8 bin目录下的java应用,并
执行了test.jar。在这儿我们又涉及到了一个新的命令run,run用于执行linux的命令,不过现在我们先不
去讲它,下一节要对它进行详细的讲解。 作为env我们推荐优先去使用,因为它可以提高我们程序的维
护性。 假设在dockerfifile中出现了多处需要执行Java命令的地方,我们只需要设置java_home便可以进
行指代。 假设未来环境发生变化,jdk被放到了其他的位置上,没有关系,只需要改这一处,所有的应
用都会生效。
expose
workdir /usr/lcoal
workdir ./local
ADD hello / #复制到根路径
ADD test.tar.gz / #添加根目录并解压
ENV JAVA_HOME /usr/local/openjdk8
RUN ${JAVA_HOME}/bin/java -jar test.jarexpose暴露容器端口expose它的作用是将我们容器内部的端口对外暴露。书写办法也非常简单,就是
这个单词后边增加对应的端口号就行了。 作为expose,它的作用就是将容器内端口暴露给物理机。
来,我们看一下这张图,作为外侧的红的部分,可以认为这是我们的一台服务器物理机。而内侧我们启
动了一个tomcat容器。这里如果dokcerfifile中定义了expose 8080的话,就相当于在内侧的容器中对外
暴露了8080端口。 同时我们在创建容器的时候。
可以看到这里我做了一个-P8000:8080,它的作用是在物理机也就是外侧的地方,用8000映射到内侧
的8080端口。这样内侧的服务一旦启动,在外侧我们浏览器中输入localhost:8000的话,就可以访问到
内部的8080端口提供的web应用了。这便是expose的用法。 作为Dockerfifile,刚才我给大家演示了最
基础,也是最常见的几个指令,但是这并不能足够支撑我们构建一个镜像,因为在除了复制切换目录暴
露端口之外,还有大量的Linux的命令需要执行。
12 docker的分层
演示镜像分层
EXPOSE 8080
docker run -p 8000:8080 tomcat docker build -t layer /opt/docker-layer/
如上分成四层,每层堆叠
增加内容再次运行
结论:已经创建的镜像层利用缓存 ,没有的继续创建
13 Dockerfifile运行指令
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
6910e5a164f7: Pull complete
Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b
Status: Downloaded newer image for centos:latest
---> 831691599b88
Step 2/4 : RUN ["echo" , "好好学习"]
---> Running in 726aa64b5ba2
好好学习
Removing intermediate container 726aa64b5ba2
---> 9cd71311b9c7
Step 3/4 : RUN ["echo" , "天天向上"]
---> Running in 9e7d983ffd01
天天向上
Removing intermediate container 9e7d983ffd01
---> 3bb480b54705
Step 4/4 : RUN ["echo" , "文体两开花"]
---> Running in a24c48ee170b
文体两开花
Removing intermediate container a24c48ee170b
---> f087da4a2cf2
Successfully built f087da4a2cf2
Successfully tagged layer:latest
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM centos
---> 831691599b88
Step 2/5 : RUN ["echo" , "好好学习"]
---> Using cache
---> 9cd71311b9c7
Step 3/5 : RUN ["echo" , "天天向上"]
---> Using cache
---> 3bb480b54705
Step 4/5 : RUN ["echo" , "文体两开花"]
---> Using cache
---> f087da4a2cf2
Step 5/5 : RUN ["echo" , "人人"]
---> Running in 7f657f9e3b05
人人
Removing intermediate container 7f657f9e3b05
---> 2acf52472d87
Successfully built 2acf52472d87
Successfully tagged layer:latest13.1 run 命令
shell命令格式
run yum -y install -y vim
Exec
run ["yum","install","-y","vim"]
使用shell执行时候,当前shell是父进程,生成一个子shell 进程
在子shell执行脚本。脚本执行完后,退出子shell。回到当前的shell
使用exec方式会替换当前的shell进程,并且保持pid不变
指向完毕直接退出 不会到之前的shell环境
13.2 ENTRYPOIT命令
1 ENTRYPOINT(入口点)用于容器启动时候的执行名
2 Dockerfifile中只用最后一个ENTRYPOINT会被执行
3 ENTRYPOINT 推荐使用Exec的格式
13.3 CMD默认命令
1 CMD 用于设置默认执行的命令
2 Dockerfifile中出现多个CMD 只有最后一个会被执行
3 若容器启动时候增加附加的命令 CMD就会被忽略
4 CMD["ps","-ef"] 推荐使用Exec 命令
13.4 验证CMD和RUN命令
Dockerfifile如下 docker build -t runtest /opt/shell/run/
如上CMD中的内容不会被输出
docker run runtest 在容器运行时候CMD中的命令会被执行
容器启动
14 Dockerfifile安装mysql
执行命令创建容器
docker build -t mysqltest /opt/shell/mysql/
执行命令运行容器
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d --restart=always
mysqltest
15 容器间的单向通信
容器创建后自动分配ip并且ip之间互通过,但是如果mysql换了后在用ip链接就会连不上
FROM centos
RUN echo "image building!!"
# ENTRYPOINT ["ps"]
CMD ["echo","容器启动"]
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM centos
---> 831691599b88
Step 2/3 : RUN echo "image building!!"
---> Running in 9692e538625d
image building!!
Removing intermediate container 9692e538625d
---> dd4dc8c44f8c
Step 3/3 : CMD ["echo","容器启动"]
---> Running in 8e1571ffa3dd
Removing intermediate container 8e1571ffa3dd
---> 3276d2487614
Successfully built 3276d2487614
Successfully tagged runtest:latest执行命令
docker run -d -p 9000:8080 --name weblink --link mysql12 mytomcat
进入容器
docker exec -it f9741ca9acf9 /bin/bash
测试
ping mysql2
16 Bridge网桥双向通信
把需要通信的容器放到一个网桥上,所有容器就可以互通互联了
1 展示docker中的网桥
docker network ls
2 创建网桥
docker network create -d bridge mybrige
3 查看就可以看到网桥
4把容器放到创建的网卡中去
docker network connect mybrige weblink
docker network connect mybrige lucid_mirzakhani
5测试容器之间的互通
17 容器存储数据共享
docker run -d -p 9876:8080 --name gongxiang -v /etc/profifile:/etc/profifile mytomcat
18 docker -Compose
1 单机多容器部署工具
2 通过yml文件定义多容器如何部署
3 mac默认提供doker compose,lunix需要安装
19 docker常用命令
systemctl restart docker : 重启docker
systemctl start docker : 启动docker
docker run -it 75835a67d134 以id启动 centos
docker run -it --name mycentos01 centos 启动给容器实例起别名
docker ps 列出所有正在运行的容器
docker ps -l 上次运行的
docker ps -lq 上次运行的id docker stop ea819607411f 温柔停止
docker rm -f mycentos02 强制删除 容器
docker rm -f $(docker ps -a -q) 删除所有的容器
docker rm $(docker ps -a -q) 删除已经停止的容器
docker pull tomcat:latest :latest 是 默认的 下载镜像
docker rmi tomcat 下载镜像
docker rmi -f hello-world 强制删除
docker rmi -f hello-world nginx 级联删除
docker run -it -p 6666:8080 tomcat 启动tomcat
docker run -it -P tomcat :随机访问tomcat 的端口 docker的端口随意
docker run -d -p 7777:8080 tomcat -d 后台启动tomat
docker inspect nginx (查看镜像) (副容器)
docker run -it --name centos2 --volumes-from centos1 centos(元镜像)地方hj
docker run -it --name centos5 --volumes-from centos4 centos
docker run -it -v /mydatavalue:/datavalue centos v 后面第一个是宿主机的目录 :/是容器里面的
docker ps -l 最近关闭的容器
docker start 40163807b5b 再次运行
docker attach 40163807b5bc 进入容器
docker rm $(docker ps -qf status=exited) 删除容器 已经停止
1 创建镜像 dockerfifile方式
docker build -f /mydocker/dockerfifile -t mydockert . (注意最后一定有一个点)
1 创建镜像
docker build -f /mydocker/dockerfifile -t mydockert . (注意最后一定有一个点)
docker exec -it 80dab0358349 /bin/bash 进入容器 查看错误日志
crtl +P+Q 退出容器
systemctl enable docker 开机启动
docker ps -qf status=exited //查找停止的容器
//容器内 vim 命令不可以使用的解决
1)进入容器后用命令apt-get update下源库
2)然后执行apt-get install vim命令
2.重新启动一个容器
[root@localhost ~]# docker start ovcer_the_container
ovcer_the_containerdocker run -it -w /opt/docker/tomcat -v /etc/localtime:/etc/localtime -d -p 80:8080 --
restart=always tomcat //带有重启泽洛的启动nginx
docker run -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone -d -p 9095:8080 --
restart=always tomcat
前面是 宿主机 后面是容器内部
docker inspect -f "{{ .RestartCount }}" 17e398306157 //查看重启次数
docker run -d -p 9091:8080 -p 9096:8080 -p 9098:8080 --restart=always tomcat 一次启动多个端
口