基础篇"/>
上云——docker基础篇
文章目录
- Docker
- 1 怎么运转?
- 2 相比VM优势
- 3 常用命令
- 镜像命令
- 容器命令
- 4 案例
- 5 可视化
- 6 镜像详解
- 联合文件系统
- 镜像分层下载
- 提交镜像(Commit)
Docker
centos安装docker参考官方文档/
1 怎么运转?
Docker是一个客户端-服务器结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问,类似于mysql的访问方式
所以server端收到客户端的指令就会去执行
2 相比VM优势
目前广知的虚拟机VM是需要Centos、Ubuntu这样抽象层的Guest OS,但是docker利用的是宿主机的内核,所以在创建一个容器的时候,docker不需要像虚拟机那样加载一个操作系统的内核,这是秒级的过程
3 常用命令
镜像命令
docker images
查看本机所有的镜像文件REPOSITORY TAG IMAGE ID CREATED SIZEREPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小-a,--all 列出所有的镜像
-q,--quit 只显示镜像的id
docker search搜索镜像
比如 docker search mysql
NAME DESCRIPTION STARS
可以查出和mysql相近的镜像
# 可以添加过滤的条件
--filter=STARS=3000 # 搜索出来的镜像就是STARS大于3000的
docker pull下载镜像
默认最新版
比如docker pull mysql
[root@lv94 ~]# docker pull mysql
Using default tag: latest #默认是最新的版本 可以后接tag(版本),类似于docker pull mysql:latest
latest: Pulling from library/mysql
b380bbd43752: Pull complete
f23cbf2ecc5d: Pull complete
30cfc6c29c0a: Pull complete
b38609286cbe: Pull complete
8211d9e66cd6: Pull complete
2313f9eeca4a: Pull complete
7eb487d00da0: Pull complete
4d7421c8152e: Pull complete
77f3d8811a28: Pull complete
cce755338cba: Pull complete
69b753046b9f: Pull complete
b2e64b0ab53c: Pull complete
Digest: sha256:6d7d4524463fe6e2b893ffc2b89543c81dec7ef82fb2020a1b27606666464d87 # 签名防伪
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实的地址# 所以上面的等价于
docker pull mysql
docker pull docker.io/library/mysql:latest# 比如我们要选择mysql5.7(注意必须是docker镜像里面有的)
docker pull mysql:5.7
# 在我们下载5.7的时候可以发现有些数据上面下载最新版已经下载,这些数据检查完后发现存在就不会去下载,这就是所谓的联合文件系统
docker remove删除镜像
[root@lv94 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest ecac195d15af 2 weeks ago 516MB
hello-world latest feb5d9fea6a5 6 weeks ago 13.3kB
[root@lv94 ~]# docker rmi ecac195d15af #根据镜像id删除
docker rmi -f $(docker images -aq) #递归删除所有镜像
容器命令
有了镜像才可以创建容器
# 下载centos最新镜像
docker pull centos # 下载成功启动容器
docker run [可选参数] image# 参数说明
--name="Name" 容器的名称,用来区分容器
-d 后台的方式,类似于nohup
-it 使用交互的方式运行,进入容器查看内容
-p 指定容器的端口-p:8080(小p)-p 主机ip:主机端口:容器端口-p 主机端口:容器端口(映射到主机端口)-p 容器端口
-P 随机指定端口(大P)# 启动并进入容器
[root@lv94 ~]# docker run -it centos /bin/bash
[root@b085f87c3e51 /]# # 这样就相当于在服务器/虚拟机中又建立一个小型服务器/虚拟机(容器)
退出容器
# 直接停止容器并退出
[root@b085f87c3e51 /]# exitCtrl + P +Q # 容器不停止退出
列出所有运行的容器
# 列出所有运行的容器
[root@lv94 /]# docker ps# 常用参数
-a 列出当前正在运行的容器,带出历史运行过的容器
-n=? 显示最近创建的容器几个(?值)容器
-q 只显示镜像的名字# 列出之前运行的容器
[root@lv94 /]# docker ps -a
删除容器
docker rm 容器id # 除指定容器,不能删除正在运行的容器,强制删除rm -fdocker rm -f $(docker ps -aq) # 递归删除所有的容器docker ps -a -q|xargs docker rm # 删除所有的容器,利用管道查出每个容器的id作为参数(xargs)传递
启动容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止容器
docker kill 容器id #强制停止/杀除容器
注意错误点
如果使用后台启动docker的进程 docker run -d centos
再执行docker ps会发现没有启动
# 原因是docker在使用后台运行的时候,必须要有一个前台的进程,docker发现没有应用,就会自动停止,所以可以给一个nginx服务
查看容器的日志 docker logs -f -t --tail 容器,没有日志# 自己编写一段循环的qianshell脚本
[root@lv94 /]# docker run -d centos /bin/sh -c "while true;do echo xiaoyoupei;sleep 1;done"
# 相当于有一个前台服务
之后用docker ps 发现这个容器是在启动的,我们再查看日志
[root@lv94 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d7d02a003b7 centos "/bin/sh -c 'while t…" 2 seconds ago Up 1 second unruffled_franklin# ,3d7d02a003b7-->容器id
[root@lv94 /]# docker logs -tf --tail 10 3d7d02a003b7
常用命令
# 查看容器的详细信息,3d7d02a003b7-->容器id
[root@lv94 /]# docker inspect 3d7d02a003b7# 交互式进入某个容器
# 方式一 命令行终端
[root@lv94 /]# docker exec -it 3d7d02a003b7 /bin/bash# 方式二 这样进入会进入正在执行的程序,比如上面写了循环,这样进入会卡死(如果没有执行就会直接进入容器内)
[root@lv94 /]# docker attach 3d7d02a003b7
容器内部cp文件到主机器
docker cp 容器id:容器内路径 目的的主机路径# 案例
# 1、进入docker容器内部,在容器内/home目录下新建一个文件test.java
# 2、退出容器,在任意位置执行
docker cp 3d7d02a003b7:/home/test.java /home
# 3、会发现主机home目录下多了一个test.java
4 案例
docker安装nginx
# 1、搜索nginx镜像,可以hub.docker搜索所需版本
# 2、pull下载,默认最新版
# 3、启动nginx容器,主机端口3344(在使用端口不可)映射容器端口80
[root@lv94 docker]# docker run -d --name nginx01 -p:3344:80 nginx
# 4、查看容器是否运行 docker ps
# 5、主机端口访问
[root@lv94 docker]# curl localhost:3344# 如果每次都需要进入容器内修改配置的相关文件是不是很麻烦,有没有什么直接在容器外修改———— -v 数据卷(看进阶)
docker安装tomcat
# 官方针对测试有一种用完即删的操作,下面启动玩完后退出就会发现docker ps是没有的
docker run -it --rm tomcat:9.0
# 1、下载
docker pull tomcat:9.0
# 2、启动
docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0
# 3、主机器访问失败?
# 原因是因为镜像默认是最小的(踢出了不必要的),保证最小可用环境# 4、进入该容器将webapps.dicts下的全部文件cp到webapps下再刷新网页即可显示
cp -r webapps.dist/* webapps
这样的话是不是十分麻烦?每次都要修改路径
docker安装es+Kibana
# 1、es下载启动命令
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 2、主机查看端口是否成功启动es
# 3、修改es启动环境配置
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# 4、查看docker占用的资源
docker stats
5 可视化
portainer
# 1、运行命令
docker run -d -p 8089:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer# 2、主机端口进行访问测试
6 镜像详解
联合文件系统
我们可以这样去理解,docker的镜像是一个
分层
的结构,一层一层的叠加,bootfs是刚启动的时候会加载,类比装机时的boot,所以boottfs在整个分层结构的最底层,当boot加载完毕后整个内核在内存中,此时内存的使用权就由bootfs转交给内核,此时系统也会卸载bootfs,对于rootfs是在bootfs之后的层级,主要就是包含一些linux系统的文件和目录
镜像分层下载
[root@lv94 bin]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
7d63c13d9b9b: Pull complete
a2c3b174c5ad: Pull complete
283a10257b0f: Pull complete
7a08c63a873a: Pull complete
0531663a7f55: Pull complete
9bf50efb265c: Pull complete
Digest: sha256:a89cb097693dd354de598d279c304a1c73ee550fbfff6d9ee515568e0c749cfe
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest# 上面的每一层次去下载(之前下载过的不会再去下载)
还有去理解一点:Docker的镜像都是只读的,当容器启动的时候,一个新的可写层被加载到镜像的顶部。可以这样理解,比如mysql镜像,当你执行pull mysql的时候,mysql镜像被拉来,作为只读层次,但我们的操作会在该层上新建一个层次用来操作,最后我们可将这两层合并打包作为image发布
提交镜像(Commit)
docker commmit提交容器成为一个新的副本
docker commit -m="提交的信息" -a="作者" 容器id 目标镜像名,[TAG]
举例
# 启动一个tomact镜像,并将webapps.dist下的文件cp到webapps下
# exit 退出
# 上传镜像
[root@lv94 bin]# docker commit -a="xiaoyoupei" -m="tomcat test" 628d548b3d35 tomcat_test:1.0
sha256:89422e30211db25f7880923b62cfcef600112106c48c8ff1d8753bb804634a40
[root@lv94 bin]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat_test 1.0 89422e30211d 6 seconds ago 684MB
tomcat 9.0 43e421a14aec 2 weeks ago 680MB
tomcat latest b0e0b0a92cf9 2 weeks ago 680MB
redis latest 7faaec683238 4 weeks ago 113MB
nginx latest 87a94228f133 4 weeks ago 133MB
centos latest 5d0da3dc9764 8 weeks ago 231MB
portainer/portainer latest 580c0e4e98b0 7 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 19 months ago 791MB# 这个commit有点类似于容器的一个快照
更多推荐
上云——docker基础篇
发布评论