Docker入门

目录

第一章 Docker安装与卸载

docker安装

docker卸载

第二章 Docker常用命令

第三章 es、nginx、tomcat部署

(1)nginx部署

(2)tomcat部署

(3)es部署

可视化

commit镜像    

第四章 DockerFile

CMD与ENTRYPOINT的区别

实验

第五章 容器数据卷

MySQL数据持久化

具名挂载与匿名挂载

Docker File挂载

数据卷容器

第六章 镜像发布

第七章 Docker网络

自定义网络

网络连通


第一章 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中的所有的网络接口都是虚拟的。虚拟的转发效率高!(内网传递文件!)只要容器删除,对应网桥一对就没了!
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 连通!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值