1、简介
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包括系统。
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是 Linux 容器(LXC)等技术。在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。
从docker1.13开始,docker版本号变更为docker-ce类型
docker1.13后分为docker ee与docker ce版本:
docker ce社区版本
docker ee企业版本
2、概念
Docker虚拟化有三个概念需要理解,分别镜像、容器、仓库。
镜像:Docker的镜像其实就是模板,跟我们常见的ISO镜像类似,是一个样板。
容器:使用镜像常见的应用或者系统,我们称之为一个容器。
仓库:仓库是存放镜像的地方,分为公开仓库(Public)和私有仓库(Private)两种形式。
3、引擎结构
docker引擎是一个C/S结构的应用
server是一个常驻进程,REST API实现了client和server间的交互协议,CLI实现容器和镜像的管理,为用户提供统一的操作界面。client通过接口与server进程通信实现容器的构建、运行和发布。
4、安装
确保centos系统内核版本高于3.10
1.安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
2.添加docker软件源
yum-config-manager \
--add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.更新YUM缓存
yum makecache fast
4.安装docker-ce
yum -y install docker-ce
注意:docker使用端口tcp:2377,7946,udp:7946,4789
5.安装指定版本(非必须)
sudo yum list docker-ce --showduplicates | sort -r
sudo yum install docker-ce-18.03.0.ce
6.配置docker
vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --registry-mirror=https://jxus37ad.mirror.aliyuncs.com
7.启动docker
systemctl enable docker &&systemctl start docker
8.查看版本
docker version
9.容器监控
echo -e "GET /containers/redis-slave1/stats HTTP/1.0\r\n\ " | nc -U /var/run/docker.sock
10.daemon.json
# mkdir -pv /data/docker
tee /etc/docker/daemon.json <<EOF
{
"data-root": "/data/docker",
"registry-mirrors": ["https://jxus37ad.mirror.aliyuncs.com"],
"insecure-registries":["192.168.100.5:80"],
"exec-opts":["native.cgroupdriver=systemd"],
"storage-driver": "overlay2",
"live-restore": true,
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
}
EOF
5、镜像管理
1.简介
镜像不是一个单一的文件,而是由多层构成。我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。Docker镜像默认存在/var/lib/docker/<storage-driver>中。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。
2.镜像的工作原理
当我们启动一个新的容器时,Docker会加载只读镜像,并在其之上添加一个读写层,并将镜像中的目录复制一份到/var/lib/docker/aufs/mnt/容器ID为目录下,我们可以使用chroot进入此目录。如果运行中的容器修改一个已经存在的文件,那么会将该文件从下面的只读层复制到读写层,只读层的这个文件就会覆盖,但还存在,这就实现了文件系统隔离,当删除容器后,读写层的数据将会删除,只读镜像不变。
3.镜像来源
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。https://hub.docker.com/explore
4.镜像常用命令
ls 列出镜像
build 构建镜像来自dockerfile
history 查看镜像历史
inspect 显示一个或多个镜像详细信息
pull 从镜像仓库拉取镜像
push 推送一个镜像到镜像仓库
rm 移除镜像
prune 移除未使用的镜像,没有被标记或被任何容器引用的。
tag 创建一个引用源镜像标记目标镜像
export 导出容器文件系统到tar归档文件
import 导入容器文件系统tar归档文件创建镜像
save 保存一个或多个镜像到tar归档文件
load 加载镜像来自tar归档或标准输出
search 搜索镜像
image 查看镜像
4.1.从docker仓库搜索镜像
docker search nginx
4.2.获取镜像
docker pull nginx
4.3.查看镜像
docker image ls
4.4.查看镜像的历史分层
docker history nginx
4.5.导出一个镜像
docker image save nginx > nginx.tar
4.6.导入一个镜像
docker load < nginx.tar
4.7.删除镜像
docker image rm nginx
5.创建镜像的方法有以下3种方式:
基于已有镜像的容器创建
基于本地模板导入
基于Dockerfile创建
6、容器管理
Docker容器,可以理解为一个或多个运行进程,而这些运行进程将占有相应的内存,相应的CPU计算资源,相应的虚拟网络设备以及相应的文件系统资源。而Docker容器所占用的文件系统资源,则通过Docker镜像的镜像层文件来提供。 基于每个镜像的json文件,Docker可以通过解析Docker镜像的json的文件,获知应该在这个镜像之上运行什么样的进程,应该为进程配置怎么样的环境变量,Docker守护进程实现了静态向动态的转变。
1.当使用docker run来创建并启动容器时,Docker在后台运行的标准操作:
检查本地是否存在指定的镜像centos,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的桥接网络接口中桥接一个虚拟接口到容器中去
从地址池配置一个IP地址给容器
执行用户指定的应用程序
执行完毕后,容器被终止
2.创建容器常用选项
-i, –interactive 交互式
-t, –tty 分配一个伪终端
-d, –detach 运行容器到后台
-e, –env 设置环境变量
-p, –publish list 发布容器端口到主机
-P, –publish-all 发布容器所有EXPOSE的端口到宿主机随机端口
–name string 指定容器名称
-h, –hostname 设置容器主机名
–ip string 指定容器IP,只能用于自定义网络
–network 连接容器到一个网络
–mount mount 将文件系统附加到容器
-v, –volume list 绑定挂载一个卷
–restart string 容器退出时重启策略,默认no,可选值:[always|on-failure]
3.管理容器的常用命令
ls 列出容器
inspect 查看一个或多个容器详细信息
exec 在运行容器中执行命令
commit 创建一个新镜像来自一个容器
cp 拷贝文件/文件夹到一个容器
logs 获取一个容器日志
port 列出或指定容器端口映射
top 显示一个容器运行的进程
stats 显示容器资源使用统计
stop/start 停止/启动一个或多个容器
rm 删除一个或多个容器
3.1.创建容器
docker create -it nginx
docker ps -a
3.2.启动容器
docker start f51d7ef037f5
docker ps -a
3.3.终止容器
docker stop f51d7ef037f5 #终止容器
3.4.查看容器详细信息
docker inspect f51d7ef037f5
3.5.进入容器
docker exec -it f51d7ef037f5 /bin/bash
3.6.删除容器
docker rm f51d7ef037f5
3.7.端口映射
docker run -d -p 80:80 --name=nginx -h nginx_web nginx
3.8.查看容器日志
docker logs nginx
3.9.容器资源限制
-m,–memory 容器可以使用的最大内存量
–memory-swap 允许交换到磁盘的内存量
–memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1)
–oom-kill-disable 禁用OOM Killer
-cpus 可以使用的CPU数量
–cpuset-cpus 限制容器使用特定的CPU核心,如(0-3, 0,1)
–cpu-shares CPU共享(相对权重)
例:docker run -d -m 1G --cpus=2 nginx
docker stats c6bc3d89ea12
3.10.清理无name、无tag镜像
docker images -f "dangling=true" -q|xargs docker rmi
7、发布管理
1.静态方式
FROM tomcat
MANINTAINER herlly
COPY ./websrc /usr/local/tomcat/webapps/myproj/
docker build -t web1 -f Dockerfile1
docker run -dit -p 80:8080 web1
2.动态方式
FROM tomcat
MANINTAINER herlly
RUN mkdir -p /usr/local/tomcat/webapps/myproj
VOLUME /usr/local/tomcat/webapps/myproj
docker build -t web2 -f Dockerfile2
docker run -dit -p 80:8080 -v /usr/local/tomcat/webapps/myproj:/usr/local/tomcat/webapps/myproj web1