Docker 介绍
docker是什么
操作系统级别的虚拟化,基于linux内核的namespace和cgroup
docker 与虚拟机对比
启动秒级,虚拟机是分钟级别
磁盘几M,虚拟机G级别
隔离程度相比虚拟机较低
应用场景
打包程序发布
部署微服务
测试
持续集成
应用程序隔离,环境的一致性,迁移方便
安装配置
官网 www.docker.com
安装文档:docs.docker.com
操作系统:centos7 注:6只支持一些老版本,要想使用好docker 内核版本要在3.8以上。
docker 版本
CE 社区版
EE 企业版
老的版本安装名就是docker ,新版本是 docker-ce
早期的docker 版本号是1.13.x这种形式 : 大版本号.小本版本号.bug版本号,从17年开始版本号命名就是年年.月月.xx 形式,从这时候开始区分为社区版本和企业版。所以18.09.3 表示18年九月发行的版本。
安装
关闭防火墙/selinux
安装过程参照官方文档:
yum -y install yum-utils yum-config-manager --add-repo=http://... yum list docker-ce --show-duplicates 显示所有版本,然后安装制定版本(如果直接yum install默认按照的是最新版本) yum -y install docker-ce-版本号
注:如果是内网安装可以采用二进制方式,去官网下载二进制包,把这些包放在/usr/bin即可,复制docker.service 到/usr/lib/systemd/system/ 下
执行命令systemctl daemon reload systemctl start docker 即可
配置
Docker的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致,在 Ubuntu 中的位置是:/etc/default/docker,在 CentOS中的位置是:/etc/sysconfig/docker。
docker是1.12或以上的版本,可以修改(或新建)daemon.json文件。修改后会立即生效,不需重启docker服务。
mkdir /etc/docker/ vi /etc/docker/daemon.json { "data-root":" "/data/docker-root", #docker服务的根目录"storage-driver": "overlay2", #早期存储驱动是overlay "insecure-registries": ["registry.kzf.com"], #私有镜像仓库地址访问一般证书都是自签的,为了跳过验证证书不合法的步骤,配置此项 "exec-opts": ["native.cgroupdriver=systemd"], #后期上k8s 的话,cgroup的驱动要与kubelet 一致 “live-restore”: true#容器进程挂了,但是容器还存活 }
关于docker 根目录,是docker 所有数据存储的统一目录(镜像、容器、卷等),17及最新版本都是用 `data-root`代替`graph`了,这里的修改请一定确认好你的docker版本,最新的有最新的要求和规
启动/加入自启:systemctl start docker ...
docker info
如果安装配置正常就会输出info 信息
docker version
创建/启动容器
docker run -it nginx
#run 启动并且运行,it 当前终端启动,nginx 镜像名,默认先从本地寻找,如果没有就去官方仓库下载镜像并且启动为容器,不加tag 默认就是最新版本的
docker ps #查看当前启动的容器
镜像
镜像仓库
默认是国外镜像源,可以更改为国内的官方镜像源。
vi /etc/docker/daemon.json #通用配置方法,无论新旧版本 #添加如下镜像源 { "registry-mirrors": ["http://registry.docker-cn.com"] } systemctl restart docker tips: 一般注册的镜像仓库都是公共读私有写。也就是pull 无需认证,push 需要登录认证。
镜像名字结构
registry-address/prject-group/image-name:tag # 镜像仓库地址/镜像分组组名/镜像名字:镜像版本号
镜像仓库登陆/拉取和推送
首先需要去镜像仓库网站注册一个账号,然后才能登陆,注册地址 https://hub.docker.com/ docker loginxxxx #xxxx镜像仓库地址
docker push sadp/nginx:1.12 #没有指定镜像地址,那么默认推送的就是默认的镜像仓库地址
docker push registry-asdf.com/sadp/nginx:1.12 #镜像名字里面有地址,就是推送到 registry-asdf.com 仓库的sadp组下面
注意:在docker push之前必须登录,一次认证后docker 会记住对应 registry 的登陆信息,下次push 无需登陆。登录信息存储在用户 Home 下的 .docker 文件夹下的config.json信息如下:
{
"auths": {
"registry.sensedeal.wiki:8443": {
"auth": "bGljaGVuOlNasdfwefdMjA="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.09.3 (linux)"
}
echo "bGljaGVuOlNasdfwefdMjA=" | base64 -d #可以解密出来 用户名和密码
镜像构成
镜像是分层的,查看镜像构建历史 docker history nginx,docker 数据目录是/var/lib/docker/
里面存储着镜像和容器。
存储驱动
存储镜像的驱动,不同操作系统支持的驱动类型不一样,性能最好的是overlay2。
容器管理命令
说明:新版相比老版本加入了管理的子命令 : image、container等,可以通过docker container --help 查看子命令的使用方法。
docker help
镜像相关命令
docker image help #查看镜像相关命令 docker info#显示信息包括镜像地址信息 docker images #查看本地仓库存在的镜像(注意只是本地的镜像) 镜像名字结构 registry-address/prject-group/image-name:tag # 镜像仓库地址/镜像分组组名/镜像名字:镜像版本号 tips: 一般注册的镜像仓库都是公共读私有写。也就是pull 无需认证,push 需要登录认证。 镜像仓库登陆/拉取和推送 首先需要去镜像仓库网站注册一个账号,然后才能登陆,注册地址 https://hub.docker.com/ docker loginxxxx #xxxx镜像仓库地址 docker research nginx #搜索镜像 docker pull nginx #如果没有指定地址那么就是默认镜像仓库地址,如果没有指定tag那么tag 就是默认的latest docker tag nginx:v1 nginx:v1.1#更改镜像tag ,实际上更改后的镜像与原镜像的id 一样 docker push sadp/nginx:1.12#没有指定镜像地址,那么默认推送的就是默认的镜像仓库地址 docker push registry-asdf.com/sadp/nginx:1.12 #镜像名字里面有地址,就是推送到 registry-asdf.com 仓库的sadp组下面。如果没有地址就是默认的地址 注:如果是官方的docker 地址,那么拉区推送镜像的时候默认的就是library 组下,例如docker pull nginx 等同于 docker pull docker.io/library/nginx 当无法使用镜像仓库的时候可以通过把其他主机上镜像到处再上传到无法使用镜像主机,再倒入本地,具体命令如下: docker image save nginx:1.12 > nginx.tar#把容器导出为文件 docker image load -i < nginx.tar#把文件导入到镜像仓库 docker image export 容器ID > name.tar#把容器导出为文件 docker image import name.tar#导入文件为镜像到本地仓库 构建镜像 docker build -t registry.cn-beijing.aliyuncs.com/asdf/image-name:tag -f /.../path/Dockerfile path #根据dockerfile在本地仓库生成镜像,注意registry..地址只是镜像名一部分,不表示镜像生成在阿里云。 -t 指定创建镜像索引路径和名称 -f 指定Dockerfile 路径如果不写默认就是后面path路径下的名字为Dockerfile 文件 path 上下文路径:就是Dockerfile 中命令执行的路径,例如复制文件就是在这个路径下寻找要复制的文件的。 docker push registry.cn-beijing.aliyuncs.com/asdf/image-name:tag #把本地仓库镜像推送到远程仓库,远程仓库地址会根据本地镜像名字识别(registry.cn-beijing.aliyuncs.com.. 表示远程仓库为阿里云,如 果本地镜像名字中不包含镜像地址信息就会默认推送到docker 配置文件中配置的仓库。 删除镜像 docker rmi asdfasdfsd #可以删除镜像名字也可以是id docker rmi -f id #如果两个镜像tag相同那么需要强制删除才可以
docker commit -p container-name img-new:tag #提交修改。保存当前容器内的更改,生成新的镜像img-new:tag
容器相关
docker container --help docker container run -itd -e a="kobe" -p 8080:80 --name nginx-container nginx # -i 交互式 -t 分配一个伪终端,-d 后台运行,如果不加此参数就会占用当前终端。-e 定义一个变量传递到容器里面。-p 把宿主机端口8080映射到容器内部80, --name 容器命名, nginx 镜像名字 器里面80 端口映射到宿主机的8080端口 docker container start/stop/restart #启动/停止容器 docker ps #查看正在运行的容器,-a 表示查看包括已经停止的容器在内的所有容器 docker container attach container-name #进入容器,直接退出会导致容器终止,可以ctrl+p+q 退出。有时候会卡住因为会与容器里面的进程争抢当前终端,所以最好用exec 进入容器。 docker container exec -it nginx-1 bash #交互式打开容器执行一个命令,最后面参数必须是一个要在容器中执行的命令,如果不是bash/sh 那么指挥执行一次就退出容器。sh/bash 会进入 容器,再次退出不会终止容器运行 docker logs nginx-1 #查看容器日志, -f 表示持续实时接收日志。 /var/lib/docker/containers/xxxxx.json.log #容器日志保存位置 docker rm asdfas/docker-name #删除容器根据容器id或者名字,-f 可以强制删除正在运行的容器,不加则无法删除正在运行容器 docker container inspect container-id#查看容器详细信息 docker cp /root/a.txt container-name:/opt/#把当前目录文件复制到容器当中 docker contianer commit contianer-name image-name:tat #把当前容器提交保存到当前仓库存为一个镜像。不建议这么做,一般这种需求可用dockerfile 实现。 docker stats container-name #查看实时资源使用情况 docker port container-name #查看容器端口映射情况 docker update #在线更改容器资源使用配置 容器启动的一些参数 docker run .. --name 给容器命名,如果没有会随机生成名字 --rm 当容器推出的时候就会删除容器,docker ps -a 就无法查找到了 --restart 重启策略,默认为no ,on-failure 在容器非正常退出时(退出状态非0),才会重启容器,always 不管退出状态码是什么,始终重启容器,当指定always时,docker daemon将无数次的重启容器,容器也会在daemon启动时尝试重启,不管容器的状态如何。 限制宿主机资源使用如下参数 --cpus #设置使用的cpu 核数 --cpuset-cpus #指定使用特定的cpu --cpu-shares #cpu 使用的权重值 --memory #限制使用的内存大小,默认使用的swap 分区大小为此值的2倍。 其他参数 -p 映射端口,8080:80前面宿主机端口,后面容器端口 -v 挂载数据卷,把宿主机磁盘目录挂到容器内,如果容器内目录不为空那么宿主机数据会覆盖之 -e 传递环境变量到容器内
宿主机数据挂载到容器
三种方式
volumes
所有目录都是在/var/lib/docker/volumes目录下挂载,现在此目录下创建挂载卷以供容器挂载
docker volume create nginx-vol #创建数据卷 ls /var/lib/docker/volumes/nginx-vol/#在此目录会有一个目录名 docker run -it --name=nginx-test --mount type=volume,src=nginx-vol,dst=/usr/share/nginx/html nginx #挂载,如果不指定src 会自动创建卷,会把容器要挂载目录自带的数据自动放到宿主机要挂载的目录
bind
只要宿主机存在的目录都可以挂载到volumes中,当容器中目录存在数据,那么此目录挂载后会隐藏里面的数据。
docker run -itd --name=nginx-cv --mount type=bind,src=/app/html,dst=/usr/share/nginx/html nginx
docker run -itd --name=nginx-cv -v /app/html:/usr/share/nginx/html nginx # 这个命令与上面命令效果一样
两者比较
volumes 相比于bind 性能更好,因为它绕过了存储。如果读写数据频繁的场景最好挂载到volumes。
网络模式
bridge模式结构
每一个容器都会获取一个独立的namespace,同一个网桥下的容器网络是互通的
相关命令
yum -y install bridge-utils brctl show docker network ls
host 模式
与宿主机处于同一个命名空间,无需像bridge模式一样需要端口映射,直接占用宿主机的端口。
docker run -itd --name test1 --net host nginx docker exec -it test1 bash ifconfig #执行命令后宿主机的网卡也会同时显示
none 模式
获取独立的命名空间,但是不配置网络,可以后期指定网段。
container 模式
与指定的container 共用一个network namespace,网卡配置也是相同的
自定义
可以通过自定义生成一个网桥,实际还是bridge模式