Docker的理解和基本命令详解
如何通俗解释D ocker是什么?
Docker思想来自于集装箱,集装箱解决了什么问题呢?比如,在一艘大船上,要把各种各样的货物要整理起来,集装箱(Docker)就可以做到,并且相互间不会影响。就不需要指定运输的船了(这个船运吃的那个船运穿的)。只要把货物装在集装箱里封装好,就可以用一艘大船把他们都运走。
1.Docker就是类似的理念。云计算是运输船,Docker就是集装箱。
1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。
总之docker就是集装箱原理。
4.docker就是用来存放应用的一个容器
容器管理
# docker run -it ?name vm1 ubuntu bash //创建容器 # docker ps -a //查看容器状态 # docker attach vm1 //链接容器 # docker top vm1 //查看容器进程 [root@foundation22 ~]# docker run -it ?name vm1 ubuntu root@b6e503aec1e3:/# [root@foundation17 ~]# //////用ubuntu这个镜像生成一个名为vm1的容器/// [root@foundation22 ~]# docker run -it ubuntu //未制定容器名称 [root@foundation22 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c2c94bd4ef22 ubuntu “/bin/bash” 2 minutes ago Up 2 minutes silly_curie a2798a01f075 ubuntu “/bin/bash” 4 minutes ago Up 8 seconds vm1 [root@foundation22 ~]# docker stop c2c94bd4ef22 //结束一个容器(用进程id结束) c2c94bd4ef22 [root@foundation22 ~]# docker rm c2c94bd4ef22 //删除容器(用进程id删除) c2c94bd4ef22 [root@foundation22 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a2798a01f075 ubuntu “/bin/bash” 5 minutes ago Up About a minute vm1 root@bd4961841626:/# [root@foundation17 ~]# docker attach vm1 root@bd4961841626:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr root@bd4961841626:/# touch file{1..5} root@bd4961841626:/# ls bin dev file1 file3 file5 lib media opt root sbin sys usr boot etc file2 file4 home lib64 mnt proc run srv tmp var [root@foundation22 ~]# docker pause vm1 //暂停容器 vm1 [root@foundation22 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bd4961841626 ubuntu “/bin/bash” 2 minutes ago Up 41 seconds (Paused) vm1 [root@foundation22 ~]# docker unpause vm1 //启动容器 vm1 [root@foundation22 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bd4961841626 ubuntu “/bin/bash” 3 minutes ago Up About a minute vm1 [root@foundation22 ~]# docker run -it ?name vm2 ubuntu root@aac0080d0606:/# [root@foundation17 ~]# docker run -it ?name vm3 ubuntu root@13e9f0e36ea0:/# [root@foundation17 ~]# docker run -it ?name vm4 ubuntu root@2e4adfc6ea87:/# [root@foundation17 ~]# docker run -it ?name vm5 ubuntu root@cf98619960fc:/# [root@foundation17 ~]# [root@foundation22 ~]# docker ps -aq cf98619960fc 2e4adfc6ea87 13e9f0e36ea0 aac0080d0606 bd4961841626 [root@foundation22 ~]# docker stop docker ps -aq cf98619960fc 2e4adfc6ea87 13e9f0e36ea0 aac0080d0606 bd4961841626
容器内的数据提交:(docker commit vm3 ubuntu//提交vm3容器里面的数据到ubuntu镜像放到仓库)
[root@foundation22 ~]# docker commit vm3 ubuntu sha256:ca9b1aa4a9aee738f632999bfad3baf5bda20b5a8b51de82b8f288a922cb4a66 [root@foundation22~]# docker stop vm3 vm3 [root@foundation22 ~]# docker rm vm3 vm3 [root@foundation22 ~]# docker run -it ?name vm4 ubuntu root@6cb52f07dcde:/# ls bin dev file1 file3 file5 lib media opt root sbin sys usr boot etc file2 file4 home lib64 mnt proc run srv tmp var
提交的内容是在镜像里面的内容上加一层(只读):
[root@foundation22 ~]# docker run -it ?name vm1 ubuntu root@59026e7f5104:/# ls bin dev file1 file3 file5 lib media opt root sbin sys usr boot etc file2 file4 home lib64 mnt proc run srv tmp var root@59026e7f5104:/# rm -fr file* root@59026e7f5104:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr root@59026e7f5104:/# exit exit [root@foundation22 ~]# docker commit vm1 ubuntu sha256:734d5eba88071735584a1c22519d9000d133b531df3dd7b56e6bbd0dca2abdd3 [root@foundation22 ~]# docker run -it ?name vm8 ubuntu root@e05171f7c0c7:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr [root@foundation22 ~]# docker history ubuntu //查看镜像的层(最多不能超过127层) IMAGE CREATED CREATED BY SIZE COMMENT 734d5eba8807 29 minutes ago /bin/bash 52 B ca9b1aa4a9ae 51 minutes ago /bin/bash 28 B 07c86167cdc4 14 months ago /bin/sh -c #(nop) CMD [“/bin/bash”] 0 B 220d2912ab1d 14 months ago /bin/sh -c sed -i ‘s/^#\s*(deb.*universe)$/ 1.895 kB cc77a2e3d72c 14 months ago /bin/sh -c echo ‘#!/bin/sh' > /usr/sbin/polic 194.5 kB c8fa7cdceff3 14 months ago /bin/sh -c #(nop) ADD file:b9504126dc55908988 187.7 MB
////vm1里面新建文件后,提交,vm1里面的文件提交到ubuntu之后,ubuntu里面就有记录,再用镜像ubuntu建立容器,容器内部包含有vm1里面的文件。如果删除vm1里面新建的文件,再次提交,ubuntu里面的内容就会被覆盖掉。再次用ubuntu建立容器,新建立的容器不就没有最早vm1里面建立的文件。
复制文件到容器里面需要制定路径(即容器源)
[root@foundation22~]# docker cp /etc/passwd vm1 must specify at least one container source [root@foundation22 ~]# docker cp /etc/passwd vm1:/ [root@foundation22 ~]# docker export -o vm2.tar vm1 //导出到当前目录,并命名为vm2.tar [root@foundation22 ~]# docker save -o ubuntu.tar ubuntu:v1 // 将ubuntu:v1镜像制成 ubuntu:v1文件 [root@foundation22 ~]# docker run -d ?name web -p 8000:80 nginx 3cca467e17717b7dd09dd997d7df4e2239e8505be8f0fc79ec11804c5365103d [root@foundation22 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3cca467e1771 nginx “nginx -g ‘daemon off” 15 seconds ago Up 11 seconds 443/tcp, 0.0.0.0:8000->80/tcp web [root@foundation22 ~]# netstat -antlp | grep :8000 tcp6 0 0 :::8000 :::* LISTEN 16093/docker-proxy [root@foundation22 ~]# docker diff vm1 C /root C /root/.bash_history A /passwd D /file2 D /file5 D /file1 D /file3 D /file4
D:表示删除
A:表示增加add
以上所述是小编给大家介绍的Docker的理解和基本命令详解,希望对大家有所帮助!
- [快学Python3]Number(数字)
- [快学Python3]基础知识
- [快学Python3]开发工具
- [快学Python3]解析器
- [快学Python3]函数
- [快学Python3]循环控制
- [linux][kprobe]谁动了我的文件---使用kprobe找到目标进程
- [快学Python3]if条件控制
- codeforces 767A Snacktower(模拟)
- [快学Python3]Sets(集合)
- [nptl][rwlock]pthread rwlock原理分析
- [快学Python3]Dictionary(字典)
- [快学Python3]List(列表)
- [快学Python3]Tuple(元组)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux编译C++
- 聊聊dubbo-go的tracingFilter
- JDBC - 第一天
- JavaSE - 排序算法
- JavaSE - 多态的本质
- Result Maps collection does not contain value for XXX 错误
- 当端口被占用如何kill占用端口的进程
- 将本地仓库同步到Github上的远程仓库
- 毫不留情地揭开 ArrayList 和 LinkedList 之间的神秘面纱
- 关于void QProcess::start参数问题的解决
- Python格式化输出
- 多线程 - 生产者消费者模式
- TCP的三次握手和四次挥手
- Springboot异常处理
- Excel实战技巧84: 让形状生动起来