> 技术文档 > Docker_Docker与虚拟机的区别

Docker_Docker与虚拟机的区别


镜像命令

docker version                        #查看docker版本
docker info                             #系统信息
docker 命令 --help                  #万能命令  帮助
docker  rmi   容器id                #删除镜像
docker pull                             #下载镜像

容器命令

docker run [可选参数]  image
参数说明
--name=\"Name\"  容器名字
--d                          后台方式运行
--it                         试用交互方式运行,进入容器查看内容
-p                           指定容器的端口  -p   8080:8080
                                (宿主机端口:容器端口)
-P(大写)              随机指定端口
-a所有容器
-q只显示容器id

docker ps查看运行容器
whereis nginx  #查看配置文件
curl localhost:端口号

--name:给容器命名

进入和退出容器

docker run -it centos /bin/bash    #进入容器
exit          #退出容器并停止
ctrl+P+Q   #退出不停止

删除容器

docker rm 容器id  

docker rm -f(强制意思) $(docker ps -aq)

启动和停止容器

docker    start 容器id   #启动容器
docker    restart    容器id     #重启容器
docker    stop     容器id      #停止当前正在运行的容器
docker    kill     容器id      #强制停止容器

常用其他命令

后台启动

docker run -d   镜像名

#问题docker ps,发现centos 停止了
#常见的坑;Docker容器使用后台运行,就必须要有一个前台进程(比如要it进去),容器发现没有就会自动停止!

常看日志
 

-t 时间戳

-f打印跟随最新的日志

--tail 数字显示最后多少条

docker logs -tf --tail 10  容器id
#没有日志自己写一段shell脚本
\"while true;do echo maoyun;sleep 1;done\"

[root@iZbp11rgqf9v8t1rlvtz6jZ ~]# docker run -d centos /bin/sh -c \"while true;do echo maoyun;sleep 1;done\"

[root@iZbp11rgqf9v8t1rlvtz6jZ ~]# docker ps
CONTAINER ID  
6ac21bb94529   

查看容器进程信息
 

docker top 容器id
UID                 PID                 PPID                C                   STIME             TTY                 TIME    
root                7879                24922               0                   09:49                ?                   00:00:00  
root                24922               24900               0                   09:35               ?                   00:00:00            

查看镜像的元数据
 

docker inspect 容器id             

进入容器

方式1:docker exec -it 容器id /bin/bash             跟run区别是不会创建新的容器
方式2:docker attach 容器id
             #正在执行当前代码...

docker exec #进入容器会开启一个新终端,可以在里面操作(常用)

docker attach #进入容器正在执行的终端,不会有新进程!

从容器上拷贝到主机

docker cp 容器id:容器的路径  目的的路径
touch 文件 
rm  文件

总结

port # 查看映射端口对应的容器内部源端口
pause # 暂停容器 ps # 猎户容器列表
pull # 从docker镜像源服务器拉取指定镜像或者库镜像
push # 推送指定镜像或者库镜像至docker源服务器
restart # 重启运行的容器 rm # 移除一个或多个容器
rmi # 移除一个或多个镜像 (无容器使用该镜像才可删除,否则需要删除相关容器才可继续或 -f 强制删除)
run # 创建一个新的容器并运行一个命令
save # 保存一个镜像为一个 tar 包【对应 load】
search # 在 docker hub 中搜索镜像
start # 启动容器 stop # 停止容器
tag # 给源中镜像打标签
top # 查看容器中运行的进程信息
unpause # 取消暂停容器
version # 查看 docker版本号
wait # 截取容器停止时的退出状态值

kibana怎么连es?

什么是portainer?

dokcer的图形化界面管理工具!提供一个后台面板供我们操作!
docker run -d -p 8088:9000\\
--restart=always -v /var/run/docker.sock:/var/run/docker/sock --privileged=true portainer/portainer
一般不用随便玩玩就好了!

comiit镜像!!!

docker run -it -p 8080:80 tomcat
把webapps复制到webapps里面
docker commit -a=“maoyun” -m=“add webapps app” 容器id  tomcat02::版本号
docker commit -a=\'maoyun\' -m=\'add webapps app\' 9091951e0202 tomcat02:1.6

**容器数据卷**

什么是容器数据卷?

docker理念:将应用和环境打包成一个镜像!
如果把数据都放在容器中,当容器删除,数据就丢失了,所以我们要把数据持久化!==需求==
mysql容器也一样。==Mysql数据可以存在本地==
容器之间可以有一个共享的技术!Docker容器产生的数据同步到本地!
这就是卷技术!把容器的目录挂载到Linux上面!

总结:容器之间也可以共享数据,把数据同步到Linux主机上,可以自定义文件夹

使用容器卷

-v类似-p

方式一:直接使用命令来挂载  -v

docker run -it -v 主机目录:容器目录

好处:以后我们就可以直接在主机上修改,容器会同步!

安装Mysql

tag:版本号      
-e 环境配置 密码

docker run --name  别名 -e MYSQL_ROOT_PASSWORD=pw -d mysql:tag

具名和匿名挂载

#匿名挂载

docker run -d -P --name nginx01 -v /ect/nginx nginx
#查看所有的volume的情况
docker volume ls

#这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径! 

#具名挂载(大多数用这个)

通过-v  卷名:容器内路径

任何确定具名挂载还是匿名挂载?

-v 容器路径                                #匿名挂载
-v 卷名:容器内面                        #具名挂载
-v /宿主机路径:容器内路径       #指定路径挂载

扩展

初始Dockerfile

DockerFile就是用来构建docker镜像的构建文件!命令脚本!之前用得是commit。
镜像是一层一层的,所以脚本也是一个个命令,每个命令都是一层!
方式2:docker build -f dockerfile -t maoyun/contos .
-f:表示脚本的路径    
-t:给镜像去新名字
.是生成到哪个位置

总结步骤:
1、先创建一个dockerfile文件,名字可以随意,建议dockerfile
2、文件中的内容指令(大写)参数

简单理解,这里的每个命令,就是镜像的一层!

启动自己的容器

要是没有挂载需要我们手动挂载 -v 卷名:路径

数据卷容器

通过--volumes-from进行容器共享

如图

多个mysql共享


结论:
容器之间配置信息传递,数据卷容器的生命周期一直持续到没有容器使用为止。
一旦你持久到本地,本地的数据是不会被删除!

**DockerFile**

dockerfile构建过程

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件!
步骤:开发,部署,运维。。。缺一不可
dockerFile:构建文件,定义了一切的步骤,源代码
dockerImages:通过dockerFile构建生成的镜像,最终要发布和运行的产品。
Docker容器:容器就是镜像运行起来提供服务器

FROM                                            #基础镜像,一切从这里开始构建
MAINTAINER(maintainer)               #镜像是谁写的,姓名+邮箱
RUN                             #镜像构建的时候需要运行的命令
ADD                             #添加内容,要干什么事比如tomacat镜像
WORKDIR(workdir)                   #工作的目录
VOLUME                     #存东西地方,挂载卷
EXPOSE                      #对外暴露端口
RUN                              #启动

CMD                                            #启动时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT(entrypoint)             #启动时候要运行的命令,可以追加命令。
ONBUILD                                     #当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令。触发指令。
CORY                                           #类似ADD,将我们文件拷贝到镜像中。
ENV                                               #构建的时候设置环境变量

实战测试

/home/dockerfile/mydockerfile

## Base images 基础镜像FROM centos## MAINTAINER 维护者信息MAINTAINER maoyun## 配置环境变量ENV MYPATH=/usr/local## WORKDIR 进入工作目录(相当于cd命令)WORKDIR $MYPATH## RUN 执行命令(安装vim和ifconfig命令)RUN yum -y install vimRUN yum -y install net-tools## EXPOSE 暴露交互端口EXPOSE 80 ## CMD 构建容器后执行命令CMD echo $MYPATHCMD echo \"----- END -----\"CMD /bin/bash

提示报错vim

ERROR: failed to solve: process \"/bin/sh -c yum -y install vim\" did not complete successfully: exit code: 1

可能是没有联网原因!或者yum仓库不可用

解决:
 

FROM centosMAINTAINER maoyun# 修复 YUM 仓库配置RUN sed -i \'s/mirrorlist/#mirrorlist/g\' /etc/yum.repos.d/CentOS-* && \\ sed -i \'s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g\' /etc/yum.repos.d/CentOS-*ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vim net-tools && \\ yum clean allEXPOSE 80CMD echo \"Working directory: $MYPATH\" && \\ echo \"---end---\" && \\ /bin/bash

实战tomcat镜像

  1. 准备镜像文件tomca压缩包,jdk压缩包
  2. 编写dockerfile文件

镜像发布到阿里云

  1. 登录阿里云
  2. 找到容器镜像服务
  3. 创建命名空间
  4. 创建镜像仓库

小结:

**Docker网络**(容器编排 集群部署)

ip addr   #查询内部网络地址

理解Docker0

docker会分配一个docker0。linux可以ping到容器内部

evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连接着协议,一段彼此相连。
正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备

docker使用的是Linux的桥接,宿主机就是Docker的网桥

自定义网络

容器互连!

查看网络 docker network ls

网络模式:
bridge:桥接模式(默认)
none:不配置网络
host:与宿主机共享网络

Docker0(默认也就是桥接),域名不可用,但是--link可以打通(有局限性),麻烦不能反向访问比如2访问1,1不能访问2,他原理就是在2的host去配置了1的桥接

创建自定义网络:
--driver bridge
--subnet 192.168.0.0/16 网关从192.168.0.2-192.168.255.255
--gateway 192.168.0.1

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

跨网络操作别人要连通
docker network connect   网络(mynet) tomcat01

实战部署redis集群

Docker Compose容器编排工具

使用YAML文件来配置所有需要运行的Docker容器,名称为docker-compose.yml

从 GitHub 下载最新版 Docker Compose 的二进制文件:

curl -L \"https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose#赋予执行权限sudo chmod +x /usr/local/bin/docker-compose(可选)创建符号链接将二进制文件链接到 /usr/bin 目录,方便全局调用:sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-composedocker-compose --version

在线不行就离线下载

https://github.com/docker/compose/releases

将其执行文件改名放到/usr/local/bin下

或者:

sudo curl -L \"https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -oP \'tag_name\": \"\\K(.*)(?=\")\')/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose

启动容器:docker-compose up -d

几百个微服务一个一个启动麻烦死!

docker swarm init --advertise-addr ip地址

docker swarm init:初始化节点

docker swarm joji:加入一个节点

获取令牌

docker swarm join-token manager

docker swarm join-token worker

总结步骤:

1、生成主节点init
2、加入(管理者,worker)

扩展到k8s

云原生时代(趋势)
云应用

docker history 容器id  可以查看别人镜像是咋做的