1. docker基础知识
1.1 docker架构
docker是一个client-server结构的系统,docker守护进程运行在主机,然后通过socket链接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。容器是一个运行时环境,就是集装箱。
- docker比虚拟机有更少的抽象层,其不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用实际的物理机的硬件资源,在CPU利用率,内存利用率上,有显著优势。
- docker不需要启客户os,因此创建时不需要加载一个操作系统内核,加载是秒级,虚拟机是分钟级
1.2 docker镜像加载原理
docker镜像实际是UnionFS,由一层一层的文件系统组成,主要包含bootfs,rootfs
- bootfs主要包含bootloader和kernel,bootloader引导加载kernel,linux刚启动加载bootfs,加载完后会删除bootfs,docker镜像的最底层是bootfs
- rootfs在bootfs之上,包含linux的/dev, /bin, /etc等,rootfs就是各种不同操作系统发行版本,Ubuntu centos等
1.3 docker 镜像原理
一个Docker镜像Images由多个可读的镜像层Read Layer,然后运行的容器会在这个Docker的镜像上多加一层可写的容器层Read-Write Layer,任何对文件的更改都只存在于此容器层,因此任何对容器的操作均不会影响到镜像。
参考连接连接1
1.4 Docker分层结构
容器是如何获取镜像层文件而又不影响镜像层的呢?
Docker中如果需要获取某个文件,容器层会从上到下去下一层的镜像层中去获取文件,如果该层文件不存在,那么就会去下一层镜像中寻找,直到最后一层。对于用户而言,用户面对的是一个叠加后的文件系统。
任何对于文件的操作都会记录在容器层,例如:修改文件时容器层会把在镜像层找到的文件拷贝到容器层然后进行修改,删除文件时则会在容器层内记录删除文件的条目。
1.4 阿里云配置
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
https://zm4mtcet.mirror.aliyuncs.com
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://zm4mtcet.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.基础操作
2.1 镜像命令
2.1.1 docker images
docker images: 列出本地的镜像
docker images options:
- docker images -a 列出本地所有镜像,含中间映像层
- docker images -q 只显示镜像ID
- docker images --digests 显示镜像的摘要信息
- docker images --no-trunc 显示完整的镜像信息
2.1.2 docker search
- https://hub.docker.com里搜索
- docker search [options] 镜像名字
- options: --no–trunc 显示完整的镜像描述, -s 列出收藏数不小于指定数的镜像, --automated 只列出automated build镜像
2.1.3 docker pull
docker pull,下拉
2.1.4 docker rmi 删除镜像
docker rmi 分为以下几种
- docker rmi -f一个镜像(不写版本号,删除的是latest)
- docker rmi -f 镜像名1:TAG 镜像名2:TAG
- docker rmi -f $(docker images -q) 删除全部镜像
2.2 docker version,info,–help
docker version显示docker版本等信息
$ docker version
Client:
Version: 1.8.2
API version: 1.20
Go version: go1.4.2
Git commit: 0a8c2e3
Built: Thu Sep 10 19:19:00 UTC 2015
OS/Arch: linux/amd64
Server:
Version: 1.8.2
API version: 1.20
Go version: go1.4.2
Git commit: 0a8c2e3
Built: Thu Sep 10 19:19:00 UTC 2015
OS/Arch: linux/amd64
docker info : 显示 Docker 系统信息,包括镜像和容器数。。
$ docker info
Containers: 12
Images: 41
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 66
Dirperm1 Supported: false
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-32-generic
Operating System: Ubuntu 14.04.1 LTS
CPUs: 1
Total Memory: 1.954 GiB
Name: iZ23mtq8bs1Z
ID: M5N4:K6WN:PUNC:73ZN:AONJ:AUHL:KSYH:2JPI:CH3K:O4MK:6OCX:5OYW
docker --help 帮助文档
2.3 容器命令
2.3.1 docker run
docker run [OPTIONS] IMAGE [COMMAND][ARG...]
-name= "容器新名字":为容器指定一个名称(docker run -it --name mycentos centos)
-d: 后台运行容器,并返回容器ID,也即启动守护式容器
-i: 以交互模式运行容器,通常与-t同时使用
-t: 为容器重新分配一个伪输入终端,通常与-i同时使用
-P: 随机端口映射
-p: 指定端口映射,有以下四种格式
--rm临时起一个容器,退出后自动删除
docker run
2.3.2 docker ps查看运行容器
docker ps [options] 列出当前正在运行的容器
-a: 列出当前所有正在运行的和历史运行的容器
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q: 静默模式,值显示容器编号
--no-trunc:不截断输出
2.3.3 容器退出
有两种退出方式:
- exit 容器停止退出
- ctrl+P+Q 容器不停止退出
2.3.4 容器启动,重启
docker start 容器ID或者容器名(exit把container停了之后,start重新启动了起来)
docker restart 重启,查看up时间,会有变化
2.3.4 容器停止
docker stop容器ID或者名,等待镜像一层一层关闭
docker kill 容器ID或者名,强制关闭
2.3.4 容器删除
docker rm 容器ID或者名,删除已关闭的容器
docker rm -f 容器ID或者名, 删除正在运行的容器
docker rm -f $(docker ps -nq 2)或者(docker ps -qa)批量删除
2.3.5 容器后台运行
docker run -d ,docker ps -a 会发现其已经关闭,docker后台运行必须要有前台进程,否则会自动退出
2.3.6 查看容器日志
docker logs -f -t --tail 容器ID
-t 加入时间
-f 跟随最新的日志打印
–tail 数字显示最后多少条
2.3.7 查看容器内运行的进程
docker top 容器id
容器内运行了centos,查看进程,因为容器可以理解为一个简化版的linux环境和运行在其中的应用程序!
2.3.8 查看容器内的细节
docker inspect 容器ID
2.3.8 进入正在运行的容器并以命令行交互
docker exec -it 容器ID bashshell // 在容器中打开新的终端,且可以启动新的进程
docker attach 容器ID // 直接进入容器启动命令的终端,不会启动新的进程
2.3.9 容器文件拷贝到主机上
docker cp [options]容器ID:容器内路径 目的主机路径
注意容器ID:容器内路径,:与路径之间不能有空格
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
2.3.10 docker commit提交镜像成容器
docker commit提交容器副本使其成为一个新的镜像,提交到本地仓库
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:标签名
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
2.3.11 数据卷V添加
关于docker volume的使用,参考这个链接https://www.jianshu.com/p/ef0f24fd0674
docker run -it -v /host:/dataVolumeContainer1:ro centos
docker run -it -v 宿主机地址:容器内地址 镜像名或者ID,将宿主和镜像的数据连起来,实现数据共享,可以设置ro或者wo,只读只写,通过docker inspect ID 查看
注意,由于-v操作必须知道宿主机的文件地址,但是由于不同宿主机文件目录可能不一致,所以,可以用VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"],将容器中的文件绑定到一个默认地址去。要注意:
== v操作是bind,而volume则是volume的type==
docker run -it -v /data/lxz/meison:/myvolumesConatiner:ro hellomeison2:123
与下面相等操作
docker run -it --volume /data/lxz/meison:/myvolumesConatiner:ro hellomeison2:123
2.3.12 容器数据卷 --volumes-from(继承)
其他容器通过挂载该数据卷,实现数据共享,挂载数据卷的容器,称为数据卷容器
即使容器被关闭了,其数据任然是共享的
使用2.4 生成的image
docker run -it --name dc01 lxz/centos //生成dc01容器,含有dataVolumeContainer1,dataVolumeContainer2
cd /dataVolumeContainer1
touch dc01_add.txt
docker run -it --name dc02 --volumes-from dc01 lxz/centos
cd /dataVolumeContainer1
ll //发现存在dc01_add.txt
touch dc02_add.txt
docker run -it --name dc03 --volumes-from dc01 lxz/centos
cd /dataVolumeContainer1
ll //发现存在dc02_add.txt,dc01_add.txt
2.4 Dockerfile编写
1.第一步
#volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]//表示新建两个容器卷,与宿主默认/var/lib/docker/volumes/连接
CMD echo "finished"
CMD /bin/bash
上述是和 docker run -itv /host1:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 /bin/bash类似
2.第二步
使用docker build [OPTIONS] PATH | URL | - 执行: docker build -f /mydocker/Dockerfile -t lxz/centos .,生成lxz/centos的image
3 docker可视化操作
- 宿主机
sudo apt-get install x11-xserver-utils
xhost +
开放权限,允许所有用户,当然包括docker,访问X11 的显示接口,每次重新开机,需要在本机操作一次
- 容器
-v //tmp/.X11-unix:/tmp/.X11-unix \ #共享本地unix端口
-e DISPLAY=unix$DISPLAY \ #修改环境变量DISPLAY
- 测试
在容器里运行如下,安装xarclock
sudo apt-get install xarclock #安装这个小程序
xarclock #运行,如果配置成功,会显示出一个小钟表动画