上云——docker基础篇

Docker

centos安装docker参考官方文档https://docs.docker.com/engine/install/centos/

1 怎么运转?

Docker是一个客户端-服务器结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问,类似于mysql的访问方式

所以server端收到客户端的指令就会去执行

2 相比VM优势

目前广知的虚拟机VM是需要Centos、Ubuntu这样抽象层的Guest OS,但是docker利用的是宿主机的内核,所以在创建一个容器的时候,docker不需要像虚拟机那样加载一个操作系统的内核,这是秒级的过程

3 常用命令

镜像命令

docker images

查看本机所有的镜像文件

REPOSITORY  TAG   IMAGE ID   CREATED   SIZE

REPOSITORY  镜像的仓库源
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 /]# exit

Ctrl + P +Q   # 容器不停止退出

列出所有运行的容器

# 列出所有运行的容器
[root@lv94 /]# docker ps

# 常用参数
-a     列出当前正在运行的容器,带出历史运行过的容器
-n=?   显示最近创建的容器几个(?值)容器
-q     只显示镜像的名字

# 列出之前运行的容器
[root@lv94 /]# docker ps -a

删除容器

docker rm 容器id               # 除指定容器,不能删除正在运行的容器,强制删除rm -f

docker 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.com搜索所需版本
# 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有点类似于容器的一个快照

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友培

数据皆开源!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值