- 1. docker镜像管理
- 重启服务
systemctl restart docker - 2. 容器管理
- -t 分配一个伪终端
一个容器里必须有一个前台工作在工作,像nginx镜像就有一个前台进程,nginx去帮你守护容器,linux下任何后台进程都要有一个前台能保证工作,不工作这个进程肯定是退出的
像centos镜像的,没有nginx的前台进程去守护容器,如果每加-d,启动容器就就会被退出
示例: - 3. 管理应用程序数据
- 创建一个数据卷如果没有指定卷自动创建
docker volume create 数据卷名 - 列出当前数据卷
docker volume ls - 列出数据卷详细信息
docker volume inspect 数据卷名 - 查看挂载的信息
- 查看挂载情况
- 修改容器挂载目录中文件的内容,访问nginx
- 检查首页文件不存在了
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
# 检查[root@centos7 ~]# cat /etc/docker/daemon.json{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
重启服务
systemctl restart docker1.5. 镜像与容器联系
如图,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作的,并不会修改镜像的源文件,这种方式提高磁盘利用率。若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像。
当前这个容器只是创建了一个进程,引用的镜像的内容及文件系统,所有docker镜像的一个工作原理分层的不是单个文件,所以可以很方便的引用,一个镜像来创建多个容器,
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共享(相对权重) |
使用示例:
[root@centos7 ~]# docker container run -d --name web -e test=123456 -p 88:80 -h web nginx50c1092160ebcf4e806c50cdcb672ae5205228fd8ee55cf9a82f2e57ca28e254[root@centos7 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES50c1092160eb nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:88->80/tcp web[root@centos7 ~]# docker logs web[root@centos7 ~]# docker logs web10.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" "-"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.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" "-"[root@centos7 ~]## 进入容器查看参数都设置的是否正确[root@centos7 ~]# docker exec -it web bashroot@web:/# echo $test123456root@web:/# hostnamewebroot@web:/#
2.1. docker创建新容器是为何要加-td 才能是容器持续运行
-t 分配一个伪终端
一个容器里必须有一个前台工作在工作,像nginx镜像就有一个前台进程,nginx去帮你守护容器,linux下任何后台进程都要有一个前台能保证工作,不工作这个进程肯定是退出的
像centos镜像的,没有nginx的前台进程去守护容器,如果每加-d,启动容器就就会被退出
示例:
[root@centos7 ~]# docker run -d centos18bcd607d70f13e53964f3567f0dd1bdff0c4004516f078429fe081ea5684bff[root@centos7 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES18bcd607d70f centos "/bin/bash" 3 seconds ago Exited (0) 1 second ago brave_kilby[root@centos7 ~]# docker start 18bcd607d70f18bcd607d70f[root@centos7 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES18bcd607d70f 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容器的重启策略如下:
no,默认策略,在容器退出时不重启容器<br /> on-failure,在容器非正常退出时(退出状态非0),才会重启容器<br /> on-failure:3,在容器非正常退出时重启容器,最多重启3次<br /> always,在容器退出时总是重启容器<br /> unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器<br />使用示例:
[root@centos7 ~]# docker run -d --restart on-failure nginx939bd14991e9cb54af8c910c7194008379f19724ceefd52540c3162b75433e50[root@centos7 ~]# docker run -d --restart on-failure:3 nginxa7ad40a55ffa7f86a1aa395e7868c5dea7fe87bc097a6afe74cbc2d6472b3a41[root@centos7 ~]# docker run -d --restart always nginxf378f5b2669c43278322c826516f8a935f18c384d49f2e1f63a34bbd24cd37c0
Docker容器的退出状态码
docker run的退出状态码如下:
0,表示正常退出
非0,表示异常退出(退出状态码采用chroot标准)
125,Docker守护进程本身的错误
126,容器启动后,要执行的默认命令无法调用
127,容器启动后,要执行的默认命令不存在
其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码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:只要将容器中经常变动的目录挂载出来,让宿主机存储,这样删除容器,容器里的数据也不会丢失,下次在使用时直接从宿主机上挂载进去,数据还在
3.2. volume 管理volume常用命令
3.2.1. 管理卷
创建一个数据卷如果没有指定卷自动创建
docker volume create 数据卷名
[root@centos7 ~]# docker volume create nginx-volnginx-vol
列出当前数据卷
docker volume ls
[root@centos7 ~]# docker volume lsDRIVER VOLUME NAMElocal nginx-vol
列出数据卷详细信息
docker volume inspect 数据卷名
[root@centos7 ~]# docker volume inspect nginx-vol[{"CreatedAt": "2019-10-13T22:52:09+08:00","Driver": "local", # 驱动"Labels": {}, # 标签"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data", # 宿主机挂载点"Name": "nginx-vol", #"Options": {},"Scope": "local"}]
3.2.2. 用卷创建一个容器创建容器时将数据卷挂载到容器目录中
命令一新版命令建议使用:
创建一个容器使用数据卷挂载到容器中的指定文件/目录
docker run -d —name=nginx-test —mount src=数据卷名称,dst=容器中要挂载的文件/目录 nginx
[root@centos7 ~]# docker run -d --name=nginx-test--mount src=nginx-vol,dst=/usr/share/nginx/html nginxa26f647b0e06f93932cd97e9552e5927a5985307d50707f5256b8b6f7bda1734
命令二旧版命令:
创建一个容器使用数据卷挂载到容器中的指定文件/目录
docker run -d —name=nginx-test -v 数据卷名称:容器中要挂载的文件/目录 nginx
[root@centos7 ~]# docker run -d --name nginx-test02 -v nginx-vol:/usr/share/nginx/html nginx62f38c1b2d590690ac405a560cffc86bce5f7a662884e8b446949f1fd96d4cfa
查看挂载的信息
[root@centos7 ~]# docker inspect nginx01........................................."Mounts": [{"Type": "volume","Source": "nginx-vol","Target": "/usr/share/nginx/html"}],.........................................
查看挂载情况
[root@centos7 ~]# ls /var/lib/docker/volumes/nginx-vol/_data/50x.html index.html
修改容器挂载目录中文件的内容,访问nginx
[root@centos7 ~]# curl 172.17.0.72395444211@qq.comchen_jinhang@qq.com[root@centos7 ~]# curl 172.17.0.82395444211@qq.comchen_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
[root@centos7 ~]# docker run -d --name nginx01 -p 88:80 --mount type=bind,src=/mnt/,dst=/usr/share/nginx/html nginxd7be2a64a2aaea05ec6fd8b0e4ecd5f22dcd60dc6986d3b16d533bedb23fbe00
检查首页文件不存在了
[root@centos7 ~]# ls /mnt/[root@centos7 ~]# docker exec -it nginx01 /bin/bashroot@d7be2a64a2aa:/# ls /usr/share/nginx/html/root@d7be2a64a2aa:/#
命令二旧版命令:
docker run -d —name nginx02 -p 89:80 -v 宿主机目录:容器目录 nginx
[root@centos7 ~]# docker run -d --name nginx02 -p 89:80 -v /mnt/:/usr/share/nginx/html nginx687b7efe03f9ce5d1b13ad2dba8bf9f8a97300fe7ffd3d77f151f1c2f3bbff67
验证绑定:
# 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主机的文件或目录结构保证与容器所需的绑定挂载一致时
