Docker
Docker简介
容器化技术:一个不完整的操作系统。
Docker为什么比虚拟机快?
- Docker有着比虚拟机更少的抽象层
- Docker利用的是宿主机的内核
所以说,新建容器时,docker不需要像虚拟机一样重新加载一个操作系统,避免引导。
VM是硬件虚拟化,Docker是OS虚拟化。
VM会有5-20%的性能损耗,Docker是物理机性能。
常用指令
docker version
docker info
docker –help
docker pull [] 下载镜像
docker search [] 搜索镜像
docker rmi [] 删除镜像
docker rmi -f $(docker images -aq) 删除所有镜像
docker images 查看镜像
新建容器并启动
docker run [可选参数] [image]
–name=”name01″ 容器名字
-d 后台方式运行
-it 使用交互式运行,进入容器查看内容
-p 指定容器端口,-p 8080:8080(主机端口:容器端口)
-P 随机端口
列出所有运行的容器
docker ps [-a] 带出历史运行过的,[-n=?]最近运行的n个
-q 只显示容器编号
退出容器
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容器使用后台运行时(docker run -d [镜像名]),如果没有前台进程,就会立即停止。例如nginx,容器启动后,发现自己没有提供服务就会立即停止,就是没有程序了。
查看日志
docker logs [-tf] 显示全部带时间戳
–tail + num 查看日志数量
查看容器中进程信息
docker top 容器id
查看镜像元数据
docker inspect 容器id
进入当前正在运行的容器
我们通常容器都使用后台运行,需要进入容器,修改一些配置。
docker exec -it 容器id bashshell
docker attach 容器id
exec 进入容器后开启新的终端,可进行操作
attach 进入容器正在执行的终端,不开启新进程
从容器内拷贝文件到主机
docker cp 容器id:容器内路径 目的的主机路径
查看CPU状态
docker stats
可视化(protainer)
Docker图形化界面
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
复制代码
访问方式:http://IP:8088
commit镜像
docker commit 提交镜像成为一个新的副本
docker commit -m=”提交内容” -a=”作者名” 容器id 目标镜像名:[TAG]
容器数据卷
容器间可以有一个数据共享的数据。Docker容器中产生的数据同步到本地。
总结:容器持久化和同步操作,容器间也可以共享数据。
使用:docker run -it -v 主机目录:容器目录 bashshell
举例:MySql数据持久化
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
复制代码
docker run 后台运行 端口映射 卷挂载 环境配置 容器命名 镜像名
容器和镜像的区别
镜像是只读的不能被保存或修改,一个镜像可以构建在另一个镜像之上,这种层叠关系是多层的。
容器就是在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态和停止态。从运行态到停止态,我们对它所做的一切都会永久地写到容器的文件系统中,注意不是镜像中。可以用一个镜像启动多个容器,各个容器间相互隔离。
具名挂载和匿名挂载
- 匿名挂载:docker run -d -P -v /etc/nginx
- 具名挂载:docker run -d -P -v name01:/etc/nginx
查看卷列表
docker volume ls
复制代码
查看卷信息
docker volume inspect 卷名
-v 容器内路径 匿名挂载
-v 卷名:容器内路径 具名挂载
-v 宿主机路径:容器内路径 指定路径挂载
-v 容器内路径:ro(只读) rw(可读可写)
容器间数据共享
–volumes -from 容器名
容器间的数据共享 容器数据卷之间的挂载
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但一旦持久化到本地,本地数据不会被删除。
DockerFile
用来构建docker镜像的构建文件,命令脚本。通过这个脚本可以生成镜像,镜像是一层层的,脚本是一个个的命令,每个命令都是一层。
Docker构建步骤
- 编写一个dockerfile文件
- docker build构建成一个镜像
- docker run运行镜像
- docker push发布镜像(DockerHub,阿里云……)
DockerFile指令
指令 | 说明 |
---|---|
FROM | 基础镜像,一切从这里开始 |
MAINTAINER | 镜像是谁写的,姓名+邮箱 |
RUN | 运行命令 |
ADD | 添加内容,可解压tar包(不同于COPY的地方) |
WORKDIR | 镜像工作目录 |
VOLUME | 挂载的目录 |
EXPOSE | 指定暴露端口(同-P指令) |
CMD | 指定容器启动时运行的命令 |
ENTRYPOINT | 同CMD,CMD只有最后一个指令会生效,可被替代,ENTRYPOINT可追加命令 |
ONBUILD | 当构建一个被继承DockerFile这个时候就会运行ONBUILD指令。触发指令 |
COPY | 类似ADD,将我们的文件拷贝到镜像中 |
ENV | 构建时设置环境变量 |
DockerHub中99%的镜像都是FROM scratch
DockerFile例子
创建一个自己的centos
FROM centos
MAINTAINER jy<jy@test.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
复制代码
运行DockerFile文件
docker build -f 文件路径 -t 镜像名:[TAG] . 最后要加一个.
docker history 镜像id 可以看镜像的构建过程
编写dockerfile文件,官方命名Dockerfile,build就会自动找,不需要-f指定文件了
CMD和ENTRYPOINT
CMD ["ls","-a"]
复制代码
run时执行 ls -a
当Dockerfile中有CMD命令时
docker run 镜像id ls -al
追加的命令会替换CMD语句,所以如果追加-l会出错,相当于CMD [“-l”]
但如果是
ENTRYPOINT ["ls","-a"]
复制代码
docker run 镜像id -l
就不会出错,会追加在ENTRYPOINT指令上
发布自己的镜像
docker login -u xx -p xx
docker push 镜像id:[TAG]
复制代码
阿里云的镜像容器,可参考阿里云官网
Docker网络
理解Docker0(使用ip addr查看网卡信息)
原理:
- 我们每启动一个docker容器,docker就会给容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0。
- 桥接模式,使用的技术是veth-pair技术。
- 这个容器带来的网卡都是一一对应的。
- veth-pair就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连。
- 正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备的。
如图,tomcat01和tomcat02是公用的一个路由器,docker0所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP。
Docker中的所有网络接口都是虚拟的。虚拟的转发效率高!只要删除容器,对应的一对网桥就没了。
–link
不需要用ip直接用容器名(服务名)ping
docker exec -it tomcat02 ping tomcat01
复制代码
上面的无法ping通!
docker run -d -P --name tomcat03 --link tomcat02 tomcatdocker exec -it tomcat03 ping tomcat02
复制代码
此时就可以ping同通
原理:
docker exec -it tomcat03 cat /etc/hosts
复制代码
总结:
–link就是在hosts配置中增加一个映射
查看网络信息
docker network lsdocker network inspect 网络ID
复制代码
网络模式
bridge:桥接模式(默认)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通(用得少,局限大)
docker run -d -P --name tomcat01 --net bridge tomcat
复制代码
docker0特点:默认,域名不能访问,–link可以打通
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
复制代码
解释:docker network create 桥接的网络模式 子网 网关 名称
docker run -d -P --name tomcat01 --net mynet tomcat
复制代码
可以直接互相ping通
docker exec -it tomcat01 ping tomcat02
复制代码
网络连通
docker network connect mynet tomcat00
复制代码
不同网络下的容器也能互相连通,tomcat00是其他网络下的容器