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

Docker镜像加速-配置阿里云镜像仓库 

镜像加速器

腾讯云加速

https://mirror.ccs.tencentyun.com

使用 DockerHub 加速器

【注意】

默认安装的不是最新版本,如有需要请安装最新版本

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 中文指南

linux 安装docker

Docker升级到最新版本

Docker安装以及运行第一个HelloWorld

安装Docker到CentOS(YUM)

Docker及Docker-Compose的使用

Docker快速入门——Docker-Compose

docker-compose编排参数详解

Docker三剑客之Docker Machine

docker常规操作——启动、停止、重启容器实例

docker rm & docker rmi & docker prune 的差异

Docker容器进入的4种方式

docker配置文件

Docker配置文件位置

Docker配置文件daemon.json解析

docker pull 下来的镜像都存到了哪里

docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面

Docker命令详解-官方文档

Docker 命令大全 - 菜鸟学院

Docker 删除&清理镜像

docker load 命令

docker logs-查看docker容器日志

原文地址:https://www.cnblogs.com/wangwangfei/p/10338155.html