05节 docker中的名词概念
06节 安装Docker
#01卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#02需要的安装包
yum install -y yum-utils
#03 设置腾讯云(阿里云)镜像加速
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io
systemctl start docker
使用docker --version
docker run hello-world
显示如下, 表示安装成功
表示
docker images
卸载docker
1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
2.删除目录
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
docker的默认工作路径:/var/lib/docker
07节 配置腾讯云镜像加速
- 执行以下命令,打开
/etc/docker/daemon.json
配置文件。vim /etc/docker/daemon.json
- 按 i 切换至编辑模式,添加以下内容,并保存。
{ "registry-mirrors": [ "https://mirror.ccs.tencentyun.com" ] }
- 执行以下命令,重启 Docker 即可。示例命令以 CentOS 7 为例。
sudo systemctl restart docker
08节 Run的流程和Docker原理
通过客户端docker命令到守护进程,通过守护进程去启动容器,操作资源
容器跟linux系统相关隔离,端口外界无法直接访问(eg:localhost:8080,localhost:3061)
09节 镜像的基本命令
docker images -aq
docker search mysql
docker search mysql --filter=STARS=3000 #搜索stars数超过3000的mysql镜像
docker rmi -f 镜像id #删除指定
docker rmi -f 镜像id 镜像id 镜像id #删除指定多个镜像
docker rmi -f $(docker images -qa) #删除全部容器镜像
eg:docker rmi -f 2fb283157d3c
10节 容器的基本命令
运行并进入容器:docker run -it centos /bin/bash
删除容器
docker rm 容器id #删除指定容器,不能删除正在运行中的容器,如果强制删除,用rm -rf
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 镜像名
#问题docker ps,发现centos停止了;
#常见的坑:docker容器使用后台运行,就必须要有一个前台进程(eg:-it),docker 发现没有应用,就会自动停止(没应用,就自杀)
#nginx容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了(tomcat可以这么玩)
查看日志
docker run -d centos /bin/bash -c "while true;do echo kuangshen;sleep 1;done"
docker logs -tf --tail 10 addb09ee2801
docker run -d centos /bin/bash -c "while true;do echo kuangshen;sleep 1;done"
查看容器中进程信息
#docker top 容器id
pid:父id
查看镜像中的元数据
命令:docker inspect 容器id
#docker inspect a489ba50930a
[root@VM_0_16_centos ~]# docker inspect a489ba50930a
[
{
"Id": "a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9",
"Created": "2021-03-24T08:37:43.333345402Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 22991,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-03-24T08:37:43.716232265Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9/hostname",
"HostsPath": "/var/lib/docker/containers/a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9/hosts",
"LogPath": "/var/lib/docker/containers/a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9/a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9-json.log",
"Name": "/zealous_easley",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/0a86e715a7f1cc752b40eceb112e130e48aadb6fe86b42de36687077a3b56c33-init/diff:/var/lib/docker/overlay2/998a87f7085f44d579517bbc31c1e7ed50f596fba0562154890f609f0498ed5a/diff",
"MergedDir": "/var/lib/docker/overlay2/0a86e715a7f1cc752b40eceb112e130e48aadb6fe86b42de36687077a3b56c33/merged",
"UpperDir": "/var/lib/docker/overlay2/0a86e715a7f1cc752b40eceb112e130e48aadb6fe86b42de36687077a3b56c33/diff",
"WorkDir": "/var/lib/docker/overlay2/0a86e715a7f1cc752b40eceb112e130e48aadb6fe86b42de36687077a3b56c33/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "a489ba50930a",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20201204",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "d1db6c63680657edd4cc2950425ce576283de63a75bc5d1f56605d0e759df8a4",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/d1db6c636806",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "458af88e9f1dca244eb7356514ebe2d322f1bd61e8dbbd2a34198e6134a72ee7",
"Gateway": "172.18.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:12:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "aacc55cb12e85f7680d15f828c04d69cf00785f34cd40a1c344261ccb43cef2c",
"EndpointID": "458af88e9f1dca244eb7356514ebe2d322f1bd61e8dbbd2a34198e6134a72ee7",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:02",
"DriverOpts": null
}
}
}
}
]
[root@VM_0_16_centos ~]#
12 进入容器的命令和拷贝命令
#我们通常容器都是通过使用后台方式运行,需要进入容器,修改一些配置
#方式一
#命令
docker exec -it 容器id bashShell
#测试
#方式二
#命令
docker attach 容器id
#测试
#docker exec #进入命令后开启一个新的终端,可以在里面操作(常用)
#docker attach #进入容器正在执行的终端,不会启动新的终端;
#从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
#容器内拷出来比较常用,外面拷贝进容器一般是通过挂载实现;
#拷贝是个手动过程,未来我们使用-v 卷技术,可以实现,自动同步
学习方式:将我的所有命令全部敲一遍,自己记录铭记;
13 常用命令小结
docker的命令十分的多,上面我们学习的那些都是做常用的容器和镜像的命令,之后我们还会学习很多命令;
接下来是一堆得练习
14作业一:部署nginx
docker安装nginx
#1搜索镜像 search 建议大家去docker搜索,可以看到帮助文档;
#2 下载镜像 pull
#03 运行测试
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口:容器内部端口
3344是主机端口,可以开放给公网访问,80是docker容器内部接口;
#端口暴露的概念
#在容器内部是一个单独的小的linux环境,简化版的linux,所以也有防火墙;
15作业二:部署tomcat
安装tomcat
#官方的使用
docker run -it --rm tomcat:9.0
#我们之前的启动都是后台,停了容器后容器还是可以查到,docker run -it --rm tomcat:9.0,一般用来测试,用完即删;#镜像还在,停止时容器自动销毁
#下载启动
docker pull tomcat
#启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
16作业三:部署ES+Kibana
#es暴露的端口多,十分耗内存,es的数据一般需要放置到安全目录;
#--net somenetwork网络配置
#启动elasticsearch
#docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#es十分耗内存,1.xG 1核2G
#查看docker stats
#测试es是否成功;
#赶紧关闭,增加内存的测试;
#赶紧关闭,增加内存的测试,-e环境配置修改;
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
#使用Kibana连接es,思考:网络如何才能连过去;
#容器内部端口互相隔离
17 Protainer可视化面板安装
可视化
#portainer(先用这个)
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试:http://ip:8080什么是portainer?
docker图形化界面管理工具!提供一个后台面板供我们操作。
#rancher(CI/CD再用)
#进入控制面板
#可视化面板平时很少用,测试玩玩即可
18 镜像原理之联合文件系统
所有的应用,直接打包成docker镜像,就可以直接跑起来!
如何获得镜像:
从远程仓库下载;
朋友拷贝给你;
自己制作一个镜像DockerFile
我们下载时看到的一层层的就是介个;
虚拟机是分钟级的,容器是秒级的启动
19 镜像原理之分层下载
分层的镜像
#我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层下载的。
#命令:
docker image inspect redis:latest
20 commit镜像
docker commit -a="kuangshen" -m="add webapps app" e71be6fa6e2a tomcat02:1.0
# 测试结果
#分层思想
#学习方式说明:理解概念(可以模糊),但是一定要实践,最后实践和理论相结合一次搞定这个知识。
#企业实战
#DockerCompose:yaml一键run所有镜像;
#DockerSwarm:docker 集群;
#CI/CD Jenkins:持续集成,持续部署,流水线
21 容器数据卷的使用
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷
方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来我们可以通过:docker inspect 容器id
#测试文件的同步
#停掉docker,linux主机(宿主机)修改test.java,启动docker后,该docker容器的/home/test.java同步修改(容器内的数据依旧是同步的);
好处:我们以后修改只需要在本地修改,容器内会同步修改!
22 实战 Mysql同步数据
思考:mysql的数据持久化问题
#获取镜像
docker pull mysql:5.7
#启动容器时需要做数据挂载,安装启动mysql需要配置密码的
#官方测试
#docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#-d:后台运行;-p:端口映射;-v:数据卷挂载;-e:环境配置;--name:容器名字;
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
#启动成功后,本地使用sqlyog来测试一下;
#sqlyog --h -u -p :连接到服务器的3310和容器内的3306映射,这个时候我们就可以连接上了
#删除容器后,挂载到本地的数据卷依旧没有丢失,这就实现容器数据持久化功能
23 具名和匿名挂载
#匿名挂载
-v 容器路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有volume情况
docker volume ls
#具名挂载
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
#通过 -v 卷名:容器内路径
#查看一下这个卷
#docker的工作目录:/var/lib/docker/
#所有docker内的卷,没有指定目录情况下都是放在:/var/lib/docker/volumes/xxx/_data
我们通过具名挂载可以方便找到我们的一个卷,大多数情况都是使用具名挂。
#如何确定是具名挂载,匿名挂载,还是指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:/容器内路径 #指定路径挂载
拓展
#通过-v 容器内路径:ro rw改变读写权限
ro readonly #只读
rw readwrite #可读可写
#一旦设置容器权限,容器对我们挂载出来的内容就有限定了;
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
#ro 只要看到ro就说这个路径只能通过宿主机操作,容器内部无法操作!
24 数据卷之Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!体验一下!
(ps:之前我们是通过方式1:commit来构建我们的镜像的)
通过这个脚本可以生成镜像,镜像是一层层的,脚本是一条条命令,每个命令都是一层;
#创建一个dockerfile文件,名字可以随机,建议Dockerfile
#文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end---"
CMD /nin/bash
docker build -f /home/docker-test-volume/dockerfile1 -t kuangshen/centos:1.0 .
#这里的每个命令,就是镜像的一层
25 数据卷容器
多个mysql同步数据
26 DockerFile介绍
Docker容器:就是镜像运行起来提供服务的!
27 dockerfile指令说明
28 实战:构建自己的centos
官方的centos是简化版的,很多命令都被删除
#1 编写DockerFile的文件
FROM centos
MAINTAINER kuangshen<24736743@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
#2 通过这个文件构建镜像
#命令 docker build -f dockerfile文件路径 -t 镜像名:[tag]
eg:
docker build -f mydockerfile-centos -t mycentos:0.1 .
#构建成功标志
#WOKEDIR $MYPATH # 一进入docker的目录
#3 测试运行
docker run -it mycentos:0.1
#列出本地镜像的变更历史
#我们平时拿到一个镜像,可以研究下它是怎么做到的,命令:docker history 镜像id
30 实战:DockerFile制作tomcat镜像
[root@VM_0_16_centos tomcat]# cat Dockerfile
FROM centos
MAINTAINER kuangshen<24736743@qq.com>
COPY readme.txt /usr/localreadme.txt
ADD apache-tomcat-9.0.22.tar.gz /usr/local
ADD jdk-8u11-linux-x64.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin/:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
docker run -d -p 9090:8080 --name kuangshentomcat -v /home/kuangshen/bulid/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/kuangshen/bulid/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs diytomcat
31 发布镜像到DockerHub
32 发布镜像到阿里云服务器上
#登录阿里云
#创建命名空间
命名空间:一般指一个很大项目,而这个项目里会有很多镜像
#创建镜像仓库
5 浏览阿里云
33 docker所有流程小结
34 docker0网络详解
清空所有环境
docker run -d -P --name tomcat01 tomcat
docker exec -it tomcat01 ip addr
#思考,linux能不能ping通容器内部
linux系统ping容器内部,发现可以ping通
docker容器之间ip地址在同一网段(docker0 172.18.0.1/16,tomcat01:172.18.0.2/16 ),彼此间可以ping通。
2.再启动一个容器测试,发现又多了一对网卡
docker run -d -P --name tomcat02 tomcat
3.测试下tomcat01和tomcat02能否ping通!
容器tomcat02 ping 容器tomcat01
容器tomcat01 ping 容器tomcat02
#结论:容器和容器之间是可以相互ping通的
#docker0:类似路由器功能(注册or广播:只有目标ip回反馈)
结论:tomcat01和tomcat02是共用一个路由器docker0
所有容器不指定网络情况下,都是docker0路由,docker会给我们容器分配一个默认的可用ip
docker使用的是linux 桥接技术,宿主机中是docker容器的网桥docker0,不指定网络都是docker分配,最多分配65535个ip!
docker中所有的网络接口都是虚拟的,虚拟的转发效率高.
35 容器互联link
#通过--link就可以解决网络连通问题
docker run -d -P --name tomcat03 --link tomcat02 tomcat
#反向可以ping通吗:不可以
#查看当前网卡详情
docker network inspect 712d72214db9
本质探究:--link 就是我们在tomcat03的host配置中增加了一个172.18.0.3 tomcat02 a783de4437e1
现在玩docker已经不建议使用--link了
自定义网络!不支持docker0!
docker0问题:他不支持容器名连接访问。
36 自定义网络
#删除所有容器,保持干净环境
docker rm -f $(docker ps -qa)
#自定义一个网络
#--driver bridge
#--subnet 192.168.0.0/16 192.168.0.2-192.168.255.255
#--gateway 192.168.0.1 路由器的地址
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#我们自己的网络就创建好了,之后的服务就可以放在我们自己创建的网络里
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
docker network inspect mynet
#现在不使用--link也可以ping名字了