Docker学习记录 - 概览
一、安装部署
##安装 yum -y install docker ##启动 systemctl start docker ##查看docker服务状态 systemctl status docker ##pull hello-world docker pull hello-world ##run hello-world docker run hello-world
碰到的问题
Cannot set property TasksAccounting, or unknown property.\
问题原因:主要原因还是centos系统版本兼容性问题
解决方案:将系统做更新升级,更新重启,即可解决。
##更新 yum update ##重启 systemctl restart docker
配置文件
/etc/docker/daemon.json
配置镜像加速
安装完docker后,要下载其docker镜像,可使用国内的镜像加速器来下载:使用方式: mkdir /etc/docker vim /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] }
阿里云镜像加速
https://******.mirror.aliyuncs.com
1. 登录阿里开发者平台 https://promotion.aliyun.com/ntms/act/kubernetes.html#industry 2. 点击“镜像搜索” 自动跳转到控制台的镜像搜索 3. 注册/登录后 我用的支付宝登录 进入Docker 镜像仓库 (https://cr.console.aliyun.com/#/imageList),选中加速器 Tab
腾讯云加速
https://mirror.ccs.tencentyun.com
【注意】
默认安装的不是最新版本,如有需要请安装最新版本
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast rpm --import https://mirrors.aliyun.com/docker-ce/linux/centos/gpg yum -y install docker-ce systemctl enable docker systemctl restart docker
二、常用命令
###### nginx 为示例镜像名称 ###### #版本查询 docker version #查看镜像 docker search nginx #查看已经下载的镜像 docker images #导出镜像 docker save nginx >/tmp/nginx.tar.gz #删除镜像 docker rmi -f nginx
#删除tag为<none>的镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi #导入镜像 docker load </tmp/nginx.tar.gz #运行镜像 docker run nginx
参数:
-it: 以 交互模式启动
-d: 以 附加进程方式启动
-p 8009:80 指将host 8009 端口 映射到 容器内部 80 端口
#查看运行中的镜像 docker ps #查看所有镜像 docker ps -a #查看镜像详情 docker inspect nginx #查看日志docker logs [OPTIONS] CONTAINER
Options:
--details 显示更多的信息
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
#查看日志 - 举例
docker logs -f nginx
#在运行的容器中执行命令, 进入容器并执行命令 docker exec 容器ID或容器名
例如:
docker exec -it 容器id bash
docker exec -it 容器id /bin/sh #优雅的停止容器 docker stop 容器ID或容器名 #直接关闭容器 docker kill 容器ID或容器名 #重启一个容器:不管容器是否启动,直接重启容器 docker restart 容器ID或容器名
#启动一个容器
docker start 容器ID或容器名
#删除容器
docker rm [OPTIONS] 容器ID或容器名
-f :通过SIGKILL信号强制删除一个运行中的容器
-l :移除容器间的网络连接,而非容器本身
-v :-v 删除与容器关联的卷
按照【镜像名称】批量删除镜像
docker images | grep "image-name" | awk '{print $1":"$2}' | xargs docker rmi
三、Docker的资源限制
Memory:
OOM: 对于比较重要的容器,在启动时就要调整其OOM_adj, 其值调整越小, OOM_score的评分就越低,当内核发现内存不足,发生OOM时,就优先将OOM_score得分高的优先kill掉.
默认: docker daemon会自动将自己的OOM_adj调整很低,避免内核发生OOM时,被内核kill掉.
可调整容器使用内存的限制:
-m | --memory= #限制容器能使用的物理内存大小.单位:k, m, g; 若设置一个容器可用内存为4m,若容器使用超过,将被kill掉.
--memory-swap= #要使用它,必须先使用 -m 选项,否则它不生效.
若设置: -m 7G --memory-swap=10G, 则表示Swap+Ram=10G, Swap=10-7=3G,即可使用3G的Swap内存.
若设置: -m 7G --memory-swap=7G, 则表示不使用Swap内存.即 若设置这两个参数值相同,表示禁用SWAP.
若设置: -m 7G --memory-swap=0, 则表示SWAP未设置, 则若DockerHost启用了SWAP,则表示容器可用的SWAP大小=2*RAM的大小.
若设置: -m 7G --memory-swap=-1, 则表示DockerHost上启用了Swap,则容器可使用的全部的SWAP大小.
注:
free : 在容器中使用free看到的swap空间使用情况并非上面这些参数计算出来的实际情况, 也就是说free查看容器使用的内存空间是非常不准确的。
--memory-swappiness: 设置容器使用SWAP内存的倾向性. 值的范围: 0~100, 0:能不用就不用, 100:只要能需要就使用.
--memory-reservation: 设置要预留多少内存空间。
--oom-kill-disable 设置当发生OOM时,是否禁止此容器被kill掉,它要可-m一起使用.
CPU:
默认所有容器使用CPU资源都没有限制。
--cpu-shares #CPU是可压缩性资源,若当前有A,B,C三个容器, 假如分配给他们CPU占用的比例为:1024:512:2048.
则表示,将CPU资源分2+1+4,即分成7份, 三个容器都需要CPU,则A使用2份CPU时间, B使用1份
CPU时间, C使用4份CPU时间, 若B和C当前都空闲,则A可使用全部CPU资源; 若此时A和B都需要
用CPU资源,则按照A使用2份CPU资源, B使用1份CPU时间, 若又新加了D,则再重新分割CPU时间片.
--cpus= #限制单个容器最多可使用几核CPU, 即: 假如有4个核心, 还是A,B,C, 若此时B和C都不使用CPU
在不限制的情况下,A可使用4个核心,即最大可使用400%的计算能力.若设置了单个容器的
最多可使用CPU核心数,则基本当前所有容器都不用CPU,你也只能使用限制个数的核心数.
--cpus=1.5 #表示最多可用150%,注意容器最多可使用150%的CPU计算能力,指的是
只有能限制它最多使用这么多计算能力即可,至于容器在那个CPU核心上
运行无所谓,随机分配,分到那个核心上就在那个核心上运行。但总量是不会超过150%的。
--cpuset-cpus= #这是限制容器能够运行在那个CPU核心上的, 假如:有4核心, 则用0~3来表示4个核心的编号.
--cpuset-cpus=0,1 # 则表示容器只能运行在核心0和1上,其它上面不行。
--cpu-period= #限制最多可用CPU的时间.
--cpu-quota=
以上这些选项在docker run 时可以设置。
四、使用容器需要避免的一些做法
不要在容器中保存数据(Don’t store data in containers)
将应用打包到镜像再部署而不是更新到已有容器(Don’t ship your application in two pieces)
不要产生过大的镜像 (Don’t create large images)
不要使用单层镜像 (Don’t use a single layer image)
不要从运行着的容器上产生镜像 (Don’t create images from running containers )
不要只是使用 “latest”标签 (Don’t use only the “latest” tag)
不要在容器内运行超过一个的进程 (Don’t run more than one process in a single container )
不要在容器内保存 credentials,而是要从外面通过环境变量传入 ( Don’t store credentials in the image. Use environment variables)
不要使用 root 用户跑容器进程(Don’t run processes as a root user )
不要依赖于IP地址,而是要从外面通过环境变量传入 (Don’t rely on IP addresses )
五、容器编排工具
Docker-Compose
Docker Compose是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。
使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
##安装 yum -y install docker-compose
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。
Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。
一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。
一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。
Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。
例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。
使用方法
#在docker-compose.yml 文件所在的文件夹中,执行如下命令 docker-compose up -d
Docker Machine
Docker Machine 是一个工具,它允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机,
可以使用Docker Machine在本地的MAC或者windows box、公司网络,数据中心或者AWS这样的云提供商上创建docker。
使用docker-machine命令,可以启动、审查、停止、重启托管的docker 也可以升级Docker客户端和守护程序并配置docker客户端和宿主机通信。
Docker Machine 也可以集中管理所以得docker主机。
Swarm
六、其他
问:docker pull 下来的镜像都存到了哪里?
答:docker pull 下来的命令都默认存在 /var/lib/docker/文件夹下。
问:如何查看一个docker镜像有哪些版本?
答:地址docker官方镜像仓库:https://hub.docker.com/r/library/
1、进入之后,在页面左上角搜索框搜索,例如搜索 maven
2、在搜索结果中选择相应的镜像,点击详情进入镜像详情页面
3、查看tag
参考资料:
docker rm & docker rmi & docker prune 的差异
docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面