目录
第一章 Docker安装与卸载
docker帮助文档地址:https://docs.docker.com/engine/reference/commandline/
docker安装
1.如果之前有安装docker请看这里(如果是新环境请忽略这一步)
先卸载旧版本
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
2.安装所需安装包
yum install -y yum-utils
3.设置镜像的仓库
这里推荐使用阿里云镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum软件包素引
yum makecache fast
5.安装dokcer
docker-ce是社区ee是企业版
yum install docker-ce docker-ce-cli containerd.io
6.设置为开机启动
systemctl enable docker
7.启动docker
systemctl start docker
在完成docker的安装重启后可以看到多了一个docker0 网桥
所有容器的启动如果在docker run的时候没有指定网络模式的情况下都会挂载到docker0网桥上。这样容器就可以和主机甚至是其他容器之间通讯了。这个在后面会介绍。
docker卸载
1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
2.删除资源
rm -rf /var/lib/docker
解释:/var/lib/docker是docker 的默认工作路径
第二章 Docker常用命令
systemctl start docker #启动docker
systemctl status docker #查看docker运行状态
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
帮助文档地址:https://docs.docker.com/engine/reference/commandline/
镜像命令
docker images #查看所有本地的主机上的镜像
-a,--all #列出所有镜像
-q,--quiet #只显示镜像的id
docker search #搜索镜像
--filter=stars=1000 #搜索stars>1000的镜像
docker pull 镜像名[:tag] #下载镜像
例如:docker pull mysql:5.7 ;如未选择tag则默认latest最新版
即 docker pull mysql <=> docker pull docker.io/library/mysql:latest
docker rmi 删除镜像
-f 镜像id #强制删除指定容器镜像
-f 容器镜像id 容器镜像id 容器镜像id ... #强制删除多个容器镜像
-f $(docker images -aq) #强制删除全部的容器镜像
容器命令
tips:有镜像才能创建容器,下面以centos镜像为例
docker pull centos
docker run [可选参数] images #指令模板
--name="Name" #容器名字如tom1,tom2,用来区分容器
-d #后台方式运行
-it #使用交互方式运行,进入容器查看内容
-p #指定容器的端口
ip:主机端口:容器端口
主机端口:容器端口
容器端口
-P #随机指定端口
docker run -it centos /bin/bash #启动容器并进入容器
docker ps #列出正在运行的容器
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-q #只显示容器编号
exit #直接停止容器并退出(Ctrl+D也可以)
Ctrl + P + Q #容器不停止退出
docker rm 容器id #删除指定的容器,不能删除正在运行的的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
docker run -d centos /bin/bash -c "while true;do echo xzyx;sleep 1;done" #编写容器中的shell脚本
docker logs -tf --tail [number要显示的条数] [容器id]
docker top [容器id] #查看容器中进程信息
docker inspect 容器id #查看镜像的元数据
docker exec -it 容器id bashShell #进入当前正在运行的容器,进入后开启一个新的终端,可以在里面操作
例如:docker exec -it 容器id /bin/bash
或 docker attach 容器id #进入容器正在执行的终端,不会启动新的进程
docker cp 容器id:/xx/xx /主机路径
docker network ls #查看所有docker网络
umount /var/lib/docker #取消挂载
docker volume ls #查看所有挂载情况
第三章 es、nginx、tomcat部署
(1)nginx部署
docker pull nginx #下载nginx
docker images #查看nginx容器
docker run -d --name nginx01 -p 3344:80 nginx #以后台方式启动docker,起别名nginx01,端口3344可访问
docker ps #查看docker内容器的运行情况
curl localhost:3344 #查看nginx的html
docker exec -it nginx01 /bin/bash #进入正在运行的nginx容器
whereis nginx #查看nginx位置
(2)tomcat部署
docker run -it --rm tomcat:9.0 #我们之前的启动都是后台,停止了容器之后,容器还是可以查到docker run -it --rm,一般用来测试,用完就删除
docker pull tomcat #下载tomcat9.0版本
docker images #查看本机所有镜像
docker run -d -p 3355:8080 --name tomcat01 tomcat #以后台方式启动tomcat,命名为tomcat01,端口:3355
docker exec -it tomcat01 /bin/bash #进入tomcat01容器
cp -r webapps.dist/* webapps #将webapps.dist里面的文件复制到webapps中去
Ctrl + P + Q #退出但不关闭tomcat
docker restart tomcat01 #重启tomcat01,通过3355端口可访问到
(3)es部署
#es的端口很多!
# es十分的耗内存
#es 的数据一般需要放置到安全目录!挂载
===================================================
#下载elasticsearsh的7.6.2版本,以后台方式启动elasticsearch,端口为9200,设置环境变量discovery.type=single-node,
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
curl localhost:9200 #测试查看es是否启动成功,查看完尽快关闭,增加内存限制!
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2 #启动es并分配空间资源
docker stats #查看es运行状况
可视化
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
http://ip:8088/ #访问测试
commit镜像
提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
docker images #查看docker所有镜像
docker run -d -p 3355:8080 tomcat #后台方式启动tomcat镜像
docker exec -it CONTAINER ID /bin/bash #进入tomcat容器
cp -r webapps.dist/* webapps #复制
docker commit -a="xzyx" -m="add webapps app" feee65e1eaf5 tomcat02:1.0 #提交
docker images #此时可以看到提交的镜像,并且该镜像webapps下有文件,直接启动,在浏览器输入地址即可看到tomcat
第四章 DockerFile
DockerFile是用来构建docker镜像的构建文件
1.编写一个dockerfile文件
2.docker bulid 构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜像
#
1.每个保留关键字都是必须大写字母
2.执行从上到下顺序执行
3.#表示注释
4.每一个指令都会创建提交一个新的镜像层
===========================================================
cd home
mkdir dockerfile
vim mydockerfile-centos
----------------------------------
FROM centos:7 #基础镜像,如果写成centos则可能会因版本过高导致报错!2022.8.29!
MAINTAINER xzyx<1594338218@qq.com> #作者:姓名+邮箱
ENV MYPATH /usr/local #设构建时设置环境变量
WORKDIR $MYPATH #镜像的工作目录
RUN yum -y install vim #构建镜像是运行安装vim的指令
RUN yum -y install net-tools #构建镜像时运行安装ifconfig命令
EXPOSE 80 #保留端口配置
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
----------------------------------
docker build -f mydockerfile-centos -t mycentos:0.1 . #创建镜像文件
docker run -it centos 或mycentos:1.0 #分别运行centos与mycentos对比ifconfig、vim、pwd工作目录
exit #退出
docker history 镜像id #查看镜像构建运行过程
CMD与ENTRYPOINT的区别
区别简述:
CMD:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT:指定这个容器启动的时候要运行的命令,可以追加命令
实验:
=====
CMD
#1.编写dockerfile文件
vim dockerfile-cmd-test
---
FROM centos:7
CMD ["ls","-a"]
---
#2.构建镜像文件
docker build -f dockerfile-cmd-test -t cmd-test .
#3.run运行,发现ls -a命令生效
docker run 镜像id
#4.尝试追加命令
docker run 镜像id -l #运行后发现报错!在CMD的清理下,-l命令替换了CMD ["ls","-a"]命令,由于-l不是命令所以报错!
=====
ENTRYPOINT
1.vim dockerfile-entrypoint-test
---
FROM centos:7
ENTRYPOINT ["ls","-a"]
---
2.docker build -f dockerfile-entrypoint-test -t entrypoint-test .
3.docker run 镜像id
4.docker run 镜像id -l #指令追加成功!
实验
#1.准备压缩包
cd /home/xzyx/build/tomcat #保证该目录下有jdk、tomcat压缩包
touch readme.txt
#2.编写dockerfile文件
vim Dockerfile #编写dockerfile文件,官名Dockerfile,build会自动寻找这个文件,不需要-f指定!
---
FROM centos:7
MAINTAINER xiongzyx<1594338218@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u121-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.67.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_211
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.65
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.65
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
#tail -F等同于--follow=name --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪。
CMD /usr/local/apache-tomcat-9.0.65/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.65/bin/logs/cataline.out
---
#3.构建镜像
docker build -t diytomcat .
#4.启动镜像
docker run -d -p 9090:8080 --name xzyxtomcat -v /home/xzyx/build/tomcat/test:/usr/local/apache-tomcat-9.0.65/webapps/test -v /home/xzyx/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.65/logs diytomcat
#5.进入镜像进行访问测试
docker exec -it 容器id /bin/bash
#6.发布项目
/home/xzyx/build/tomcat/test/WEB_INF/web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
/home/xzyx/build/tomcat/test/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>xzyx-test</title>
</head>
<body>
Hello World
<%
out.println("你的IP地址--->"+request.getRemoteAddr());
%>
</body>
</html>
7.访问
192.168.145.131:9090/test
8.日志查看
cd /home/xzyx/build/tomcat/tomcatlogs
cat cataline.out
第五章 容器数据卷
docker run -it -v 主机目录:容器目录 #直接使用命令来挂载
docker run -it -v /home/ceshi:/home centos /bin/bash #测试,需要在主机home下创建ceshi目录
MySQL数据持久化
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag #测试
例如 docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/msyql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
用navicat测试连接3310端口
在主机下/home/mysql目录可以看到mysql的conf、data信息
具名挂载与匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx #匿名挂载,随即指定端口
docker volume ls #查看所有volume情况
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx #具名挂载
docker volume ls #查看所有volume情况
docker volume inspect juming-nginx #查看元数据;所有的docker容器内的卷,没有指定目录的情况下是在/var/lib/docker/volumes/xxx/_data;
#我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的是 具名挂载
tips
-v 容器内路径 #匿名挂载
-v 卷名:容器 #具名挂载
-v /宿主机路径:/容器内路径 #指定路径挂载
ro readonly #只读,只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的
rw readwrite #可读可写
#一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
Docker File挂载
cd home #去到home目录下
mkdir docker-test-volume #创建目录docker-test-volume
vim dockerfile01 创建dockerfile01文件
#写入指令
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
docker build -f /home/docker-test-volume/dockerfile01 -t xzyx/centos:1.0 . #创建镜像文件
docker inspect 容器id #查看卷挂载路径
数据卷容器
docker run -it --name docker01 15175d1b5c77 #启动3个容器,通过刚才创建的镜像文件启动
#在volume01目录下创建一个docker01文件,可以看到在docker03、docker02中相同目录下也有该文件
docker run -it --name docker02 --volumes-from docker01 15175d1b5c77 #创建docker02
docker run -it --name docker03 --volumes-from docker01 15175d1b5c77 #创建docker03
第六章 镜像发布
1.注册自己的账号http://hub.docker.com
2.确定这个账号可以登录
3.在服务器上提交自己的镜像
docker login -u xxx
Password:
Login Succeeded
4.push镜像到服务器上
docker push [OPTIONS] NAME[:TAG]
5.docker logout
第七章 Docker网络
ip addr #查看ip,1:本机回环地址,2:服务器地址,3:docker0地址
docker run -d -P --name tomcat01 tomcat #起一个tomcat
docker exec -it tomcat01 ip addr #查看其ip,会报错!解决方案:进入tomcat容器,执行指令apt update,退出后再进去,执行指令apt install -y iproute2,再退出即可
ping 172.17.0.2 #ping eth0@if5 下面的路径,可以ping通。
ip addr #可以发现多了vethef54801@if4这一对网卡;我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!
docker run -d -P --name tomcat02 tomcat #再起一个tomcat看看
docker exec -it tomcat02 ping 172.17.0.2 #看看tomcat02能否ping通tomcat01(两个容器间是否可以ping通,结果:能ping通!)
(有时候需要我们进入容器执行apt-get update 和 apt -y install iputils-ping才能使用ping命令,
再加上 apt install net-tools 命令才能执行ifconfig命令
执行apt update && apt install -y iproute2安装才能执行ip addr 命令,
)
结论: tomcat01和tomcat02是公用的一个路由器,dockerO。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP255.255.0.1/16域局域网!
宿主机---NAT---docker0---veth---tomcat01
---veth---tomcat02
---veth---...
docker network ls #查看网桥,name为bridge
docker network inspect [bridge id] #查看bridge信息;可以看到以下部分信息
"Config":[
{
"Subnet":"172.17.0.0/16", #/16--->255*255
"Gateway": "172.17.0.1" #docker0
}
]
Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高!(内网传递文件!)只要容器删除,对应网桥一对就没了!
link
docker exec -it tomcat02 ping tomcat01 #t2 ping t1 发现报错:ping: tomcat01: Name or service not known
docker run -d -P --name tomcat03 --link tomcat02 tomcat #t3 连接 t2
docker exec -it tomcat03 ping tomcat02 #发现t3可以ping通t2
docker network ls #查看网络信息
docker network inspect [bridge id] #查看bridge信息
docker exec -it tomcat03 cat /etc/hosts #查看t3的host配置
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 tomcat02 9b88bf3e82f6
172.17.0.4 3dfc4667f657
本质探究:--link就是我们在hosts配置中增加了一个172.18.0.3 tomcat02 9b88bf3e82f6
不建议使用--link
docker0问题:他不支持容器名连接访问!
自定义网络
docker network ls
bridge : 桥接(默认)
none : 不配置网络
host : 和宿主机共享网络
container : 容器网络连通(用的少)
docker run -d -P --name tomcat01 diytomcat
docker run -d -P --name tomcat01 --net bridge diytomcat #网桥,而这个就是docker0;docker0特点:默认,域名不能访问,--link可以打通连接!
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet #自定义网络
docker network ls #可以看到自定义网络mynet存在
docker network inspect mynet #查看mynet元数据,可以看到Subnet、Gateway设置成功
docker run -d -P --name tomcat-net-01 --net mynet diytomcat #建立连接
docker run -d -P --name tomcat-net-02 --net mynet diytomcat #建立连接
docker network inspect mynet #可以看到两个tomcat-net的信息
docker exec -it tomcat-net-01 ping 192.168.0.3 #发现可以ping通
docker exec -it tomcat-net-01 ping tomcat-net-02 #发现也可以ping通
#我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!
#好处︰
#redis -不同的集群使用不同的网络,保证集群是安全和健康的mysql - -不同的集群使用不同的网络,保证集群是安全和健康的
网络连通
docker network ls
docker network inspect [bridge id] #可以看到tomcat01的ip为172.17.0.3/16
docker exec -it tomcat01 ping tomcat-net-01 #发现ping不通
docker network --help #查看network帮助文档
docker network connect --help
connect Connect a container to a network #可以看到connect的信息
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect mynet tomcat01 #建立mynet与tomcat01的连接
docker network inspect mynet #可以看到tomcat01已经加入到了mynet
docker exec -it tomcat01 ping tomcat-net-01 #此时可以ping通!
结论︰假设要跨网络操作别人,就需要使用docker network connect 连通!