1. docker镜像管理

1.1. 镜像是什么

docker镜像有什么特点
docker镜像特点:非常易于扩展,一个分层的结构,由多个文件组成,多个目录,并且优化了存储空间

  • 一个分层存储的文件:由多个文件组成,这也是为什么docker的镜像占磁盘空间比较小的主要原因
  • 一个软件的环境:一个镜像封装了项目及依赖
  • 一个镜像可以创建N个容器:创建的容器都是基于这个镜像看到的内容都是镜像的内容,一个镜像就好比是一个模板,你创建容器就是使用这个模板
  • 一种标准化的交付:将项目集依赖全部打包成一个包,这个包就是一个交付物,还实现看标准化,docker引擎对这个运行这个包的环境提供了一种高度的标准化
  • 一个不包含Linux内核而又精简的Linux操作系统
  • 镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/\中。

    1.2. docker镜像默认存储在系统的位置

    Docker镜像默认存储在/var/lib/docker/\中。

    1.3. 镜像从哪里来

    Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
    地址:https://hub.docker.com/explore/

    1.4. 配置镜像加速器

    配置镜像加速器:https://www.daocloud.io/mirror
    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
    # 检查
    1. [root@centos7 ~]# cat /etc/docker/daemon.json
    2. {
    3. "registry-mirrors": ["http://f1361db2.m.daocloud.io"]
    4. }

    重启服务
    systemctl restart docker

    1.5. 镜像与容器联系

    如图,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
    如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作的,并不会修改镜像的源文件,这种方式提高磁盘利用率。若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像。

当前这个容器只是创建了一个进程,引用的镜像的内容及文件系统,所有docker镜像的一个工作原理分层的不是单个文件,所以可以很方便的引用,一个镜像来创建多个容器,
image.png

1.6. 管理镜像常用命令

docker image 常用参数↓

指令 描述
ls 列出镜像
build 构建镜像来自Dockerfile
history 查看镜像历史
inspect 显示一个或多个镜像详细信息
pull 从镜像仓库拉取镜像
push 推送一个镜像到镜像仓库
rm 移除一个或多个镜像
prune 移除未使用的镜像。没有被标记或被任何容器引用的。
tag 创建一个引用源镜像标记目标镜像
export 导出容器文件系统到tar归档文件
import 导入容器文件系统tar归档文件创建镜像
save 保存一个或多个镜像到一个tar归档文件
load 加载镜像来自tar归档或标准输入

2. 容器管理

docker container 常用选项

选项 描述
-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],在重启系统重启docker后,会自动启动容器
no,默认策略,在容器退出时不重启容器
on-failure,在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3,在容器非正常退出时重启容器,最多重启3次
always,在容器退出时总是重启容器
unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
详情
-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共享(相对权重)

使用示例:

  1. [root@centos7 ~]# docker container run -d --name web -e test=123456 -p 88:80 -h web nginx
  2. 50c1092160ebcf4e806c50cdcb672ae5205228fd8ee55cf9a82f2e57ca28e254
  3. [root@centos7 ~]# docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 50c1092160eb nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:88->80/tcp web
  6. [root@centos7 ~]# docker logs web
  7. [root@centos7 ~]# docker logs web
  8. 10.0.0.1 - - [08/Oct/2019:13:38:28 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0" "-"
  9. 2019/10/08 13:38:28 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.0.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "10.0.0.201:88"
  10. 10.0.0.1 - - [08/Oct/2019:13:38:28 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0" "-"
  11. [root@centos7 ~]#
  12. # 进入容器查看参数都设置的是否正确
  13. [root@centos7 ~]# docker exec -it web bash
  14. root@web:/# echo $test
  15. 123456
  16. root@web:/# hostname
  17. web
  18. root@web:/#

2.1. docker创建新容器是为何要加-td 才能是容器持续运行

-t 分配一个伪终端
一个容器里必须有一个前台工作在工作,像nginx镜像就有一个前台进程,nginx去帮你守护容器,linux下任何后台进程都要有一个前台能保证工作,不工作这个进程肯定是退出的
像centos镜像的,没有nginx的前台进程去守护容器,如果每加-d,启动容器就就会被退出
示例:

  1. [root@centos7 ~]# docker run -d centos
  2. 18bcd607d70f13e53964f3567f0dd1bdff0c4004516f078429fe081ea5684bff
  3. [root@centos7 ~]# docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 18bcd607d70f centos "/bin/bash" 3 seconds ago Exited (0) 1 second ago brave_kilby
  6. [root@centos7 ~]# docker start 18bcd607d70f
  7. 18bcd607d70f
  8. [root@centos7 ~]# docker ps -a
  9. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  10. 18bcd607d70f centos "/bin/bash" About a minute ago Exited (0) 2 seconds ago brave_kilby

2.2. —restart string docker容器重启策略

—restart string
1. Docker容器的重启策略

Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。

Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。

Docker容器的重启策略如下:

  1. no,默认策略,在容器退出时不重启容器<br /> on-failure,在容器非正常退出时(退出状态非0),才会重启容器<br /> on-failure:3,在容器非正常退出时重启容器,最多重启3次<br /> always,在容器退出时总是重启容器<br /> unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器<br />使用示例:
  1. [root@centos7 ~]# docker run -d --restart on-failure nginx
  2. 939bd14991e9cb54af8c910c7194008379f19724ceefd52540c3162b75433e50
  3. [root@centos7 ~]# docker run -d --restart on-failure:3 nginx
  4. a7ad40a55ffa7f86a1aa395e7868c5dea7fe87bc097a6afe74cbc2d6472b3a41
  5. [root@centos7 ~]# docker run -d --restart always nginx
  6. f378f5b2669c43278322c826516f8a935f18c384d49f2e1f63a34bbd24cd37c0
  1. Docker容器的退出状态码
    docker run的退出状态码如下:
    0,表示正常退出
    非0,表示异常退出(退出状态码采用chroot标准)
    125,Docker守护进程本身的错误
    126,容器启动后,要执行的默认命令无法调用
    127,容器启动后,要执行的默认命令不存在
    其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码

  2. docker run的—restart选项
    通过—restart选项,可以设置容器的重启策略,以决定在容器退出时Docker守护进程是否重启刚刚退出的容器。

—restart选项通常只用于detached模式的容器。

—restart选项不能与—rm选项同时使用。显然,—restart选项适用于detached模式的容器,而—rm选项适用于foreground模式的容器。

在docker ps查看容器时,对于使用了—restart选项的容器,其可能的状态只有Up或Restarting两种状态。

示例:
docker run -d —restart=always bba-208
docker run -d —restart=on-failure:10 bba-208
补充:

查看容器重启次数
docker inspect -f “{{ .RestartCount }}” bba-208
查看容器最后一次的启动时间
docker inspect -f “{{ .State.StartedAt }}” bba-208

2.3. 容器资源限制常用命令

选项 描述
-m,—memory 容器可以使用的最大内存量
—memory-swap 允许交换到磁盘的内存量,要设置的大于内存,设置时 swap>容器内存,并不是设置多少swap的内存就是多少,而是设置的swap-容器内存=swap的值
不设置时:默认值是容器内存的2倍
设置与容器内存一样时:禁用swap,容器不使用swap,swap为0
—memory-swap=-1:容器不对swap进行限制,尽可以使用的swap
—memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1)
—oom-kill-disable 禁用OOM Killer
—cpus 可以使用的CPU数量尽量不要设置超过80%
—cpus=”.6”:允许容器最多使用60%的CPU
—cpus=”2”:使用2核的cpu
—cpuset-cpus 限制容器使用特定的CPU核心,如(0-3, 0,1)
—cpu-shares CPU共享(相对权重),相对去权重:有双核cpu,默认1024两个权重都一样,创建两个容器使用cpu资源都是一样的不分伯仲,设置后根据权重及容器能使用的cpu的量不同

示例:
内存限额:
允许容器最多使用500M内存和100M的Swap,并禁用OOM Killer:
* swap的内存设置要大于容器内存
docker run -d —name nginx03 —memory=”500m” —memory-swap=”600m” —oom-kill-disable nginx
docker run -d —name web03 —memory=500M —memory-swap=600M —oom-kill-disable nginx
docker run -d —name web03 —memory=1G —memory-swap=1.1G —oom-kill-disable nginx

CPU限额:
允许容器最多使用一个半的CPU:
docker run -d —name nginx04 —cpus=”1.5” nginx

允许容器最多使用50%的CPU:
docker run -d —name nginx05 —cpus=”.5” nginx

允许容器最多使用70%的CPU:
docker run -d —name nginx05 —cpus=”.7” nginx

2.4. 禁用oom killer说明

—oom-kill-disable 禁用OOM Killer
oom killer 宿主机linux操作系统有一个机制叫om,当你的物理内存不足时,也没有swap,就会启用这个om,om的目的是找出当前linux系统进程中占用内存比较多的进程,并且把他kill掉,kill之后就不运行了,肯定会影响服务,这个就是是否选择禁用

2.5. 管理容器常用命令

选项 描述
ls 列出容器
inspect 查看一个或多个容器详细信息
exec 在运行容器中执行命令
docker exec -it 容器ID/容器名 /bin/bash
commit 创建一个新镜像来自一个容器
cp 拷贝文件/文件夹到一个容器
logs 获取一个容器日志
port 列出或指定容器端口映射
top 显示一个容器运行的进程
stats 显示容器资源使用统计
stop/start 停止/启动一个或多个容器
rm 删除一个或多个容器
ps -l 列出最新创建的一个容器
ps -a 列出所有的容器包括停止的运行的
update 更新一个或多个容器的配置,修改正在运行的容器的参数,只限于容器资源限制方面的修改

3. 管理应用程序数据

3.1. 将数据从宿主机挂载到容器中的三种方式

容器里面经常变动的数据,例如像网站根目录、数据库数据目录这些都是经常变动的,经常变动的就需要专门的存储方式来提供,这就用到了volumes和bind mounts 也就是docker中的数据卷

volumes:只要将容器中经常变动的目录挂载出来,让宿主机存储,这样删除容器,容器里的数据也不会丢失,下次在使用时直接从宿主机上挂载进去,数据还在
image.png

3.2. volume 管理volume常用命令

3.2.1. 管理卷

创建一个数据卷如果没有指定卷自动创建
docker volume create 数据卷名

  1. [root@centos7 ~]# docker volume create nginx-vol
  2. nginx-vol

列出当前数据卷
docker volume ls

  1. [root@centos7 ~]# docker volume ls
  2. DRIVER VOLUME NAME
  3. local nginx-vol

列出数据卷详细信息
docker volume inspect 数据卷名

  1. [root@centos7 ~]# docker volume inspect nginx-vol
  2. [
  3. {
  4. "CreatedAt": "2019-10-13T22:52:09+08:00",
  5. "Driver": "local", # 驱动
  6. "Labels": {}, # 标签
  7. "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data", # 宿主机挂载点
  8. "Name": "nginx-vol", #
  9. "Options": {},
  10. "Scope": "local"
  11. }
  12. ]

3.2.2. 用卷创建一个容器创建容器时将数据卷挂载到容器目录中

命令一新版命令建议使用:
创建一个容器使用数据卷挂载到容器中的指定文件/目录
docker run -d —name=nginx-test —mount src=数据卷名称,dst=容器中要挂载的文件/目录 nginx

  1. [root@centos7 ~]# docker run -d --name=nginx-test--mount src=nginx-vol,dst=/usr/share/nginx/html nginx
  2. a26f647b0e06f93932cd97e9552e5927a5985307d50707f5256b8b6f7bda1734

命令二旧版命令:
创建一个容器使用数据卷挂载到容器中的指定文件/目录
docker run -d —name=nginx-test -v 数据卷名称:容器中要挂载的文件/目录 nginx

  1. [root@centos7 ~]# docker run -d --name nginx-test02 -v nginx-vol:/usr/share/nginx/html nginx
  2. 62f38c1b2d590690ac405a560cffc86bce5f7a662884e8b446949f1fd96d4cfa

查看挂载的信息

  1. [root@centos7 ~]# docker inspect nginx01
  2. .........................................
  3. "Mounts": [
  4. {
  5. "Type": "volume",
  6. "Source": "nginx-vol",
  7. "Target": "/usr/share/nginx/html"
  8. }
  9. ],
  10. .........................................

查看挂载情况

  1. [root@centos7 ~]# ls /var/lib/docker/volumes/nginx-vol/_data/
  2. 50x.html index.html

修改容器挂载目录中文件的内容,访问nginx

  1. [root@centos7 ~]# curl 172.17.0.7
  2. 2395444211@qq.com
  3. chen_jinhang@qq.com
  4. [root@centos7 ~]# curl 172.17.0.8
  5. 2395444211@qq.com
  6. chen_jinhang@qq.com

清理:
# docker stop nginx-test
# docker rm nginx-test
# docker volume rm nginx-vol
注意:
1.如果没有指定卷,自动创建。
2.建议使用—mount,更通用。
https://docs.docker.com/engine/admin/volumes/volumes/#start-a-container-with-a-volume

3.3. Bind mounts

注意:
1.如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
2.如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。
命令一新版命令建议使用:
docker run -d -it —name=nginx01 —mount type=bind,src=宿主机目录,dst=容器目录 nginx

  1. [root@centos7 ~]# docker run -d --name nginx01 -p 88:80 --mount type=bind,src=/mnt/,dst=/usr/share/nginx/html nginx
  2. d7be2a64a2aaea05ec6fd8b0e4ecd5f22dcd60dc6986d3b16d533bedb23fbe00

检查首页文件不存在了

  1. [root@centos7 ~]# ls /mnt/
  2. [root@centos7 ~]# docker exec -it nginx01 /bin/bash
  3. root@d7be2a64a2aa:/# ls /usr/share/nginx/html/
  4. root@d7be2a64a2aa:/#

命令二旧版命令:
docker run -d —name nginx02 -p 89:80 -v 宿主机目录:容器目录 nginx

  1. [root@centos7 ~]# docker run -d --name nginx02 -p 89:80 -v /mnt/:/usr/share/nginx/html nginx
  2. 687b7efe03f9ce5d1b13ad2dba8bf9f8a97300fe7ffd3d77f151f1c2f3bbff67

验证绑定:
# docker inspect nginx-test
清理:
# docker stop nginx-test
# docker rm nginx-test
https://docs.docker.com/engine/admin/volumes/bind-mounts/#start-a-container-with-a-bind-mount

3.4. volume与bind mount特点比较

Volume特点:
多个运行容器之间共享数据。
当容器停止或被移除时,该卷依然存在。
多个容器可以同时挂载相同的卷。
当明确删除卷时,卷才会被删除。
将容器的数据存储在远程主机或其他存储上
将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

Bind Mounts特点:
从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。
当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时