时间:2020年11月2日 Docker官网:https://www.docker.com/ 在线Docker实验室:https://labs.play-with-docker.com/ 需要自己注册账号 登录即可 帮助文档: https://docs.docker.com/ https://docs.docker.com/engine/install/centos/
准备工作
首先查看系统内核版本
代码语言:javascript复制uname -r
然后查看系统版本
代码语言:javascript复制cat /etc/os-release
常见命令
启动docker
代码语言:javascript复制systemctl start docker
或者:docker restart
关闭docker
代码语言:javascript复制systemctl stop docker
查看docker的运行状态
代码语言:javascript复制systemctl status docker
Docker安装
先卸载docker 以及相关的所有内容
代码语言:javascript复制sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
安装需要安装的安装包
代码语言:javascript复制sudo yum install -y yum-utils
安装docker
代码语言:javascript复制yum -y install docker // -y 是指不询问是否安装
代码语言:javascript复制curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun(自己提前安装的)
查看是否安装了docker
代码语言:javascript复制docker version
安装docker引擎与容器
代码语言:javascript复制sudo yum install docker-ce docker-ce-cli containerd.io
查看docker是否安装列表
代码语言:javascript复制yum list installed | grep docker
设置docker开机自启动
代码语言:javascript复制systemctl enable docker.service
更新软件包索引
代码语言:javascript复制yum makecache fast
安装后 配置阿里云镜像加速
代码语言:javascript复制vi /etc/docker/daemon.json
里面添加:
{
"registry-mirrors": ["https://v2ltjwbg.mirror.aliyuncs.com"]
}
然后重新加载配置文件
代码语言:javascript复制systemctl reload daemon
如果这个不行 切换这个
sudo systemctl daemon-reload
然后重启Docker
代码语言:javascript复制systemctl restart docker
或者:docker restart
启动docker
代码语言:javascript复制systemctl start docker
查看是否启动状态
代码语言:javascript复制docker stats
测试docker
代码语言:javascript复制docker run hello-world
查看下docker的镜像
代码语言:javascript复制docker images
卸载docker
代码语言:javascript复制sudo yum remove docker-ce docker-ce-cli containerd.io
卸载docker不会删除映像、容器、卷、自定义配置文件
要删除所有图像,容器和卷
代码语言:javascript复制sudo rm -rf /var/lib/docker
自定义配置文件 需要手动删除
docker默认工作路径
代码语言:javascript复制可以从docker info 查看Docker的系统信息
一般是这个位置:/var/lib/docker
docker run 镜像名 /bin/bash
选取本地查找镜像,有就运行,没有就远程dockerHUB中拉取,最后找到了就运行,找不到就报错
Docker为什么比虚拟机快
- docker比虚拟机更少的抽象层(跳过系统运行)
- 小巧、共用一套lib(用的是宿主机的内核,VM使用的是Guest OS)
所以说 新建一个容器的时候,docker不需要像虚拟机一样重新加载操作系统内核,避免引导,VM是加载GuestOS,分钟级别的,而docker使用的是宿主机内核,避免复杂的过程,更加的快。
Docker 概念
镜像是什么?
镜像是一种轻量级、可执行的独立软件包,它包含某个软件运行所需的所有内容
包括代码、运行时、库、环境变量、配置文件 等等
Docker 镜像加载原理
UnionFS(联合文件系统)
将镜像拆成一个个组件,每次下载镜像的时候,重复的组件,就不需要再次下载!
比如:完整Tomcat镜像需要centos镜像的某些文件,Mysql运行也需要,如果提前下载了centos的镜像,再下载tomcat、mysql等就不需要额外下载了。
当你删除某个容器的时候,某个组件被其他镜像所使用,删除就不会删除公用的部分。当最后一个使用公用组件的镜像删除时,此公共文件才会被同时删除!
Docker常用命令
代码语言:javascript复制docker version # 查看docker版本
docker info # 查看更加详细系统的信息,包括镜像与容器的数量
docker --help # docker帮助
镜像命令
查看所有镜像
代码语言:javascript复制docker images
- 展示列表所带来的含义
- RESPOSITORY 镜像的仓库源
- TAG 奖项的标签
- IMAGE ID 镜像的ID
- CREATED 镜像的创建时间
- SIZE 镜像的大小
docker images --help # 查看镜像帮助
docker images -qa # 查看所有镜像的ID
搜索命令:docker search 镜像Name
代码语言:javascript复制例如:搜索MySql镜像
docker search mysql
代码语言:javascript复制docker search --help
代码语言:javascript复制# 查询DockerHub中 大于标星3000的Mysql
docker search mysql --filter=STARS=3000
# 下载镜像 (tag代表版本,不写 默认就是latest)
docker pull tag
# 下载最新版本的Mysql
docker pull mysql
docker pull --help
安装Mysql案例 & 详解:
代码语言:javascript复制[root@localhost ~]# docker pull mysql
Using default tag: latest # 使用默认的latest版本
latest: Pulling from library/mysql
bb79b6b2107f: Pulling fs layer # 分层下载 docker images核心 联合文件系统
49e22f6fb9f7: Pull complete
842b1255668c: Pull complete
9f48d1f43000: Pull complete
c693f0615bce: Pull complete
8a621b9dbed2: Pull complete
0807d32aef13: Pull complete
a56aca0feb17: Pull complete
de9d45fd0f07: Pull complete
1d68a49161cc: Pull complete
d16d318b774e: Pull complete
49e112c55976: Pull complete
Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 下载的真实地址
得出结论:
代码语言:javascript复制# 不指定tag
docker pull mysql
# 等价于
docker pull docker.io/library/mysql:latest
指定版本下载(对比一下上面的案例分析)
代码语言:javascript复制docker pull mysql:5.7
代码语言:javascript复制[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql //下面蓝色表注的 正是之前lastest版本的mysql
bb79b6b2107f: Already exists
49e22f6fb9f7: Already exists //这里就体现出来docker文件系统优势
842b1255668c: Already exists
9f48d1f43000: Already exists
c693f0615bce: Already exists
8a621b9dbed2: Already exists
0807d32aef13: Already exists
f15d42f48bd9: Pull complete
098ceecc0c8d: Pull complete
b6fead9737bc: Pull complete
351d223d3d76: Pull complete
Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
删除镜像
代码语言:javascript复制docker rmi -f 镜像的id # 删除指定id的镜像
docker rmi -f 镜像id 镜像id 镜像id # 删除多个指定id的镜像
docker rmi -f $(docker images -qa) # 删除全部镜像
同样的道理 当有一个lastest 与5.7的mysql时候,删除mysql5.7的时候 不会全部删除mysql5.7 会先删除mysql5.7对比lastest版本独有的地方 当全部删除mysql时才会全部删除所有的共同部分
容器命令
代码语言:javascript复制docker run [可选参数] 镜像名字
可选参数说明:
- –name=”Name” 指定容器的名字
- -d 后台方式运行
- -it 使用交互方式运行,进入容器,可查看内容
- -p 指定端口 例如-p 8080:8080
- -p 主机端口:容器端口 (常用)
- -p 容器端口
- -p 主机ip:端口:容器端口
案例 Docker 安装CentOS
代码语言:javascript复制[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@localhost ~]# docker run -it centos
[root@fc4e5fcea052 /]# ls
bin dev etc home lib lib64 lost found media mnt opt proc root run sbin srv sys tmp usr var
[root@fc4e5fcea052 /]# exit
exit
[root@localhost ~]# ls
anaconda-ks.cfg Desktop Documents Downloads Music original-ks.cfg Pictures Public Templates Videos
对比一下 主机centos 与docker运行的centos 文件是不一样的
代码语言:javascript复制docker ps [参数] # 查看正在运行的docker容器
-a # 查看当前运行的容器,以及历史运行过的容器
-n=? # 查看最近创建的容器 n代表几个
-q # 查看容器的编号
退出容器
代码语言:javascript复制exit # 停止容器并退出
Ctrl P Q # 退出不停止容器
删除容器
代码语言:javascript复制docker rm 容器id #删除一个指定id的容器 不能删除运行中的容器
docker rm -f $(docker ps -aq) #删除所有容器 可以删除所有运行非运行的容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq) # 停止全部容器并删除,如果没有容器会报错
常用命令
代码语言:javascript复制docker start 容器id #启动容器
docker resrart 容器id #重启容器
docker stop 容器id #停止容器
docker kill 容器id #杀死容器
docker -d 容器id #后台启动一个容器
常见的坑 docker容器后台运行 必须要有一个前台进程,docker发现没有应用,就会自动停止
nginx 容器启动后 发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志命令
代码语言:javascript复制docker logs [参数]
- -t #显示时间
- -f
- –tail num #显示num条
- –tail=num #显示num条
# 容器mynginx从2016年7月1日后的最新10条日志。
docker logs --since="2016-07-01" --tail=10 mynginx
docker logs --since="2016-07-01" --tail 10 mynginx
自己写shell脚本
docker run -d centos /bin/sh -c “while true;do echo kuangshen;sleep 1;done”
docker logs -ft –tail 10 218
docker top 容器ID #查看容器运行情况
docker inspest 容器id #查看容器元数据
进入正在运行的容器
容器我们通常都是后台运行的,需要进入容器,修改一些配置
#命令
代码语言:javascript复制方式1
docker exec -it 容器id /bin/sh
方式2
docker attach 容器id #一旦写入死循环 你将出不来,不建议使用
对比:
- exec 开启一个新的终端,可以在里面操作
- 而attach是进入正在执行的终端
将容器内拷贝到主机上
代码语言:javascript复制docker cp 容器id:/容器文件 主机位置
docker cp 容器id:/home/test.java /home 将容器内部的home下test.java 拷贝到主机上的home下 ,容器运不运行无关
未来可以可以使用数据卷的技术 实现自动同步
上手实验 部署Nginx
代码语言:javascript复制docker search nginx --filter=Stars=3000 #建议去dockerhub 可以看到更多的信息
docker pull nginx
docker run -d --name nginx001 -p:公网端口:容器运行端口
#如果是本地测试的环境,需要开启本地服务器的防火墙,如果是云服务器,可能还要有安全组需要开放!
#干掉防火墙 就跑起来了
systemctl stop firewalld.service
docker exec -it 镜像id /bin/bash
Whereis nginx
说明:如果使用的在线的网页版docker 再开一台实例即可,他们俩在一个网段,可以直接互通,代替公网访问!
查看到nginx后 可以进行修改配置文件,达到修改nginx配置文件,但是目前修改文件的命令,我们需要使用数据卷技术,来实现修改文件的目的,在Docker 高级中会讲解!
不过想看单独在此镜像的内容,请输入
代码语言:javascript复制nginx -help
部署Tomcat (切换镜像加速下载快)
代码语言:javascript复制# 拉取镜像
docker pull tomcat
# 用完即删除,一般用于做测试
docker run -it --rm tomcat
# 启动tomcat
docker run -d --name tomcat001 -p8080:8080 tomcat
curl 127.0.0.1:8080 #一定会看到404
# 发现镜像的tomcat的webapps里没有Root文件夹,所以无法查看相关web
docker exec -it 镜像id /bin/bash
# Root文件夹在 "webapps.dist"文件夹里面 复制到tomcat的webapp文件夹下 就可以访问了!
cp -r webapps.dist/ROOT webapps
curl 127.0.0.1:8080 #这次需要等待一会进入,就不再示404了
Ctrl P Q 退出
部署ElastcSearch Kibana
首先先去DockerHub 查找一下ElastcSearch:https://hub.docker.com/_/elasticsearch
#下载加启动ElastcSearch 注意,此命令敲后,内存会激增,ElasticSerarch大约被使用了1.28G了 但是Docker自身占用了内存也会变高。
代码语言:javascript复制docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#发现ElastcSearch有些卡
代码语言:javascript复制#查看先Docker运行状态
docker stats
#查看ES 是否启动
代码语言:javascript复制curl localhost:9200
#停止下search服务
代码语言:javascript复制docker stop 镜像id
docker start 镜像id或名字 启动镜像
#增加内存对ES的限制 (这里要修改下名字,不然容器名字一样不允许)
代码语言:javascript复制docker run -d --name elasticsearch002 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
其中加入的-e ES_JAVA_OPTS=”-Xms64m -Xmx512m” 表述的指定内存参数最小64M 最大512m 但是内存越小运行越慢。
#查看ES 是否启动
代码语言:javascript复制curl localhost:9200
可视化 portainer(暂时使用这个 读音 pro Ti na)
Docker 图形化界面管理工具 镜像名就是:portainer/portainer
代码语言:javascript复制docker run -d -p:8088:9000 --restart=always -v "/var/run/docker.sock:/var/run/docker.sock" --privileged=true portainer/portainer
既然提示让我们操作
那我们就按照指令操作
代码语言:javascript复制docker run -d --name portainer -p:8088:9000 --restart=always -v "/var/run/docker.sock:/var/run/docker.sock" portainer/portainer
第一次需要注册一个账号即可。如果无法连接本地 请检查run 命令 最好自己重新打一遍!
直接访问 127.0.0.1:8088
将 容器 变成 镜像
代码语言:javascript复制docker commit -m="提交的信息" -a="作者" 容器id 目标镜像名:tags
然后 docker images 就会出现了新的镜像了
到这里就是Docker 入门(精髓在下面) !
https://cloud.tencent.com/developer/article/1937239
特殊说明:
解决问题的光鲜,藏着磕Bug的痛苦。
万物皆入轮回,谁也躲不掉!
以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!