设为首页 收藏本站
查看: 1088|回复: 0

[经验分享] docker之容器管理篇

[复制链接]

尚未签到

发表于 2019-2-21 09:08:55 | 显示全部楼层 |阅读模式
一、创建容器常用选项

1.1常用选项如下表:
  选项    描述

-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
1.2实例演示:
  创建nginx容器:

[root@localhost ~]# docker container run -d nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
be8881be8156: Pull complete
32d9726baeef: Pull complete
87e5e6f71297: Pull complete
Digest: sha256:6ae5dd1664d46b98257382fd91b50e332da989059482e2944aaa41ae6cf8043a
Status: Downloaded newer image for nginx:latest
e7155844c2a27d9a9beb52307fba95c63fbaeec4aa8adaecc8e30c6968209e9c
  列出当前正在运行的容器:

[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e7155844c2a2        nginx               "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        80/tcp              priceless_jones
  字段说明:

CONTAINER ID - 随机生成的容器ID
IMAGE - 基于哪个镜像创建的
COMMAND - 启动容器运行的命令
CREATED - 创建时间
STATUS - 运行状态
  列出所有容器,包括已停止的:
[root@localhost ~]# docker container ls -a
  指定容器名称、主机名和设置环境变量:

[root@localhost ~]# docker container run -d --name nginx01 -e TEST=123 -h nginx01 nginx
dd29208fbfd70eec6797d523a4ef8436ebd6f6818d89c139a949f15fafabc38c
[root@localhost ~]#
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
dd29208fbfd7        nginx               "nginx -g 'daemon of…"   13 seconds ago      Up 12 seconds       80/tcp              nginx01
e7155844c2a2        nginx               "nginx -g 'daemon of…"   8 minutes ago       Up 8 minutes        80/tcp              priceless_jones
[root@localhost ~]#
[root@localhost ~]# docker container exec -it nginx01 bash
root@nginx01:/#
root@nginx01:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@nginx01:/# echo $TEST
123
  容器创建了,怎么让用户访问呢?那就用到-p选项了,从宿主机暴露一个端口到容器:

[root@localhost ~]# docker container run -d --name nginx02 -p 88:80 nginx
a5e10362acc39efcdd8d3dccdca0b8ae8dd1bb824c259a3ebada70ec73b8b6e4
[root@localhost ~]#
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
a5e10362acc3        nginx               "nginx -g 'daemon of…"   18 seconds ago      Up 17 seconds       0.0.0.0:88->80/tcp   nginx02
dd29208fbfd7        nginx               "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        80/tcp               nginx01
e7155844c2a2        nginx               "nginx -g 'daemon of…"   12 minutes ago      Up 12 minutes       80/tcp               priceless_jones
[root@localhost ~]#
  此时多个一个PORTS字段,代表宿主机监听0.0.0.0的88端口,转发到该容器80端口。
打开浏览器输入:http://宿主机IP:88
  下面设置允许容器nginx03最多使用50M内存和30M的SWAP,并禁用OOM Killer

[root@localhost ~]# docker container run -d --name nginx03 --memory="50m" --memory-swap="80m" --oom-kill-disable nginx
8cb80b28450d05e1e3cd5437b73bb791daa6603412961fb6da55b78f66d69ad7
[root@localhost ~]#
  开启,关闭,重启,删除容器:

[root@localhost ~]# docker container stop  nginx03
停止容器nginx03
[root@localhost ~]# docker container start  nginx03
重启容器
[root@localhost ~]# docker container restart  nginx03
删除一个容器:
[root@localhost ~]# docker container rm nginx03
Error response from daemon: You cannot remove a running container 8cb80b28450d05e1e3cd5437b73bb791daa6603412961fb6da55b78f66d69ad7. Stop the container before attempting removal or force remove
[root@localhost ~]#
[root@localhost ~]# docker  stop nginx03
nginx03
[root@localhost ~]# docker container rm nginx03
nginx03
  使用 docker stats 查看当前容器内存限制及使用:

[root@localhost ~]# docker stats --no-stream nginx03
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
8cb80b28450d        nginx03             0.00%               3.98MiB / 50MiB     7.96%               648B / 0B           0B / 0B             0
[root@localhost ~]#
[root@localhost ~]# docker stats nginx02
  查看nginx02容器的实时的内存,网络I/O CPU, 磁盘IO的使用情况
CPU限额:
允许容器最多可以使用一个半的CPU:

docker container run -d --name nginx01 --cpus=".5"  --memory="50m" --memory-swap="80m" --oom-kill-disable nginx
建议:设置-memory再禁用OOM Killer,CPU使用不超过50%。
  2、管理应用程序数据
  前面讲到过容器删除,容器里产生的数据也会删除,并且在容器里操作是在可写层,会经过存储驱动管理,这种额外的抽象会降低性能。
容器的可写层存储数据,有一些缺点:

A、当容器停止运行时,数据将不会持续存在,如果另一个进程需要这些数据,则很难将数据从容器中取出。并且容器删除后,数据也会随着删除。
B、容器的可写层与容器运行的宿主机紧密耦合,无法轻松地将数据移动到其他地方。
C、容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供的联合文件系统,与直接在宿主机上写入文件相比,这种额外的抽象会降低性能。
Docker提供三种方式将数据从宿主机挂载到容器中:
D、volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
E、bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
F、  tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。

2.1 volumes
  特点:
A、多个运行容器之间共享数据。
B、当容器停止或被移除时,该卷依然存在。
C、多个容器可以同时挂载相同的卷。
D、当明确删除卷时,卷才会被删除。
  管理卷:

[root@localhost ~]# docker volume create nginx-vol
nginx-vol
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               nginx-vol
[root@localhost ~]# docker volume inspect nginx-vol
[
{
"CreatedAt": "2018-08-05T05:05:51+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
[root@localhost ~]# cd /var/lib/docker/volumes/nginx-vol/_data
[root@localhost _data]# ls
  运行一个容器使用上面创建的卷:

[root@localhost _data]# docker container run -d --name=nginx-vol --mount source=nginx-vol,destination=/usr/share/nginx/html nginx
7587ed948f95eb885a2bd5e2739da2d7e767e0efed01d9c69685ce4b83521c7b
[root@localhost _data]#  ls /var/lib/docker/volumes/nginx-vol/_data
50x.html  index.html
[root@localhost _data]# docker container exec -it nginx-vol bash
root@7587ed948f95:/#
root@7587ed948f95:/# cd /usr/share/nginx/html
root@7587ed948f95:/usr/share/nginx/html# ls
50x.html  index.html
root@7587ed948f95:/usr/share/nginx/html# pwd
/usr/share/nginx/html
  可以看到容器中的数据已经存储到了nginx-vol数据卷中:
注:-v选项在早期Docker版本已经支持,而--mount是在17 CE版本后才引入的选项,初学者建议使用--mount。
  清理:

[root@localhost _data]# docker container stop nginx-vol
nginx-vol
[root@localhost _data]# docker container rm nginx-vol
nginx-vol
[root@localhost _data]# docker volume rm nginx-vol
nginx-vol
[root@localhost _data]# docker volume ls
DRIVER              VOLUME NAME
  也可以使用NFS外部存储,例如:

[root@localhost opt]# docker volume create --driver local     --opt type=nfs     --opt o=addr=192.168.0.10,rw     --opt device=:/opt/container_data     nginx-vol
2.2bind mounts
  特点:
A、从主机共享配置文件到容器。
B、在Docker主机上的开发环境和容器之间共享代码。
C、当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时。
  运行一个容器挂载宿主机目录:

[root@localhost ~]#  mkdir -p /app/wwwroot
[root@localhost ~]# docker container run -d --name=nginx-bind --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
a35a2407b7c10f82d8431fe83bbd68a3fea1680823facec5b634f9de0f7f5db1
[root@localhost ~]#
  或者:

docker container run -d --name=nginx-bind -v /app/wwwroot:/usr/share/nginx/html nginx
  验证绑定:

[root@localhost ~]# docker container inspect nginx-bind|grep -A 9  Mounts
"Mounts": [
{
"Type": "bind",
"Source": "/app/wwwroot",
"Target": "/usr/share/nginx/html"
}
],
"MaskedPaths": [
"/proc/acpi",
"/proc/kcore",
--
"Mounts": [
{
"Type": "bind",
"Source": "/app/wwwroot",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
[root@localhost ~]#
验证测试:

[root@localhost ~]# cd /app/wwwroot/
[root@localhost wwwroot]# echo 123456 >>test001
[root@localhost wwwroot]# cat test001
123456
[root@localhost wwwroot]# docker container exec -it nginx-bind bash
root@a35a2407b7c1:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@a35a2407b7c1:/# cd usr/share/nginx/html/
root@a35a2407b7c1:/usr/share/nginx/html# ls
test001
root@a35a2407b7c1:/usr/share/nginx/html# cat test001
123456
  参考博文链接:http://blog.运维网.com/13659253/2156975




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675141-1-1.html 上篇帖子: 微服务资源springboot、springcloud、docker、dubbo项目实战等倾心分享 下篇帖子: 跟我一起学docker(15)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表