- Docker
- 1 怎么运转?
- 2 相比VM优势
- 3 常用命令
- 镜像命令
- 容器命令
- 4 案例
- 5 可视化
- 6 镜像详解
- 联合文件系统
- 镜像分层下载
- 提交镜像(Commit)
centos安装docker参考官方文档https://docs.docker.com/engine/install/centos/
1 怎么运转?2 相比VM优势Docker是一个客户端-服务器结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问,类似于mysql的访问方式
所以server端收到客户端的指令就会去执行
3 常用命令 镜像命令目前广知的虚拟机VM是需要Centos、Ubuntu这样抽象层的Guest OS,但是docker利用的是宿主机的内核,所以在创建一个容器的时候,docker不需要像虚拟机那样加载一个操作系统的内核,这是秒级的过程
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.java4 案例
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 stats5 可视化
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 # 上面的每一层次去下载(之前下载过的不会再去下载)
提交镜像(Commit)还有去理解一点:Docker的镜像都是只读的,当容器启动的时候,一个新的可写层被加载到镜像的顶部。可以这样理解,比如mysql镜像,当你执行pull mysql的时候,mysql镜像被拉来,作为只读层次,但我们的操作会在该层上新建一个层次用来操作,最后我们可将这两层合并打包作为image发布
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有点类似于容器的一个快照