Docker管理
羌俊恩 人气:0一、概述
本文旨在汇总整理Docker日常管理之知识碎片,以便日后回顾查看参考。
二、应用示例
2.1、Docker容器隔离之Namespace
Namespace:是容器虚拟化依赖的Linux 主要核心技术,用于各容器之间的隔离。主要通过以下六项隔离技术来实现:有两个伪文件系统:/proc和/sys/
● UTS: 允许每个container拥有独立的hostname(主机名)和domainname(域名),使其在网络上可以被视作一个独立的节点而非Host上的一个进程。
● IPC:contaner中进程交互还是采用linux常见的进程间交互方法,包括常见的信号量,消息队列和共享内存。container的进程间交互实际上还是host上具有相同pid中的进程交互。
● PID:不同用户的进程就是通过pid namesapce隔离开的,且不同namespace中可以有相同pid。所有的LXC(linux containers)进程在docker中的父进程为docker进程,每个LXC进程具有不同的namespace。
● NET:
● MNT:文件系统的挂载点。
● USRE:每个container可以有不同的user和groupid,也就是说可以在container内部用container内部的用户执行程序而非Host上的用户。
2.2、Docker之自由限制cgroup
eg1:docker run -it -m 200M --memory-swap 300M centos //-m或–memory:设置内存的使用限额,–memory-swap:设置swap(交换分区)的使用限额
eg2: docker run -it --name containerB -c 512 centos //containerB,cpu权重限制为512;-c或者–cpu-shares设置容器实验cpu的权重。如果不设置默认是1024
eg3: docker run -it --name testA --device-write-bps /dev/sda:30MB centos //容器testA限制该磁盘每秒写入的数量为为30MB;
其他参数:
-bps:每秒读写的数据量。byte per second
-iops:每秒io的次数。 io per second--device-read-bps:设置读取设备的bps
--device-write-bps:设置写入设备的bps--device-read-iops:设置读取设备的iops
--device-write-iops:设置写入设备的iops
2.3、给运行中的容器设置端口映射
有时我们想不停止容器的情况下,调整容器映射端口,那怎样在容器使用中,映射容器内应用的服务端口到本机宿主机器呢?
当容器中运行一些网络应用,要让外部访问这些应用时,可以通过 -P 或 -p 参数两种方式来指定端口映射。使用 -P(大) 参数时,Docker 会随机映射一个宿主本地端口到内部容器开放的网络端口上;使用 -p(小) 参数时,可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。支持的格式有:
IP:HostPort:ContainerPort
IP:ContainerPort
HostPort:ContainerPort
下面我们来分别举例说明:
eg1:docker run -d -P nginx //docker ps查看会发现,宿主机本地的随机分配了一个 3**** 端口被映射到了容器的 80 端口上,在本机浏览器访问 http://localhost:3**** 就会出现 nginx 欢迎页面
eg2:docker run -d -p 8080:80 nginx //使用 docker ps 可看到,本地主机的 8080 端口被映射到了容器的 80 端口
验证:命令格式:docker port CONTAINER [PRIVATE_PORT[/PROTO]]
使用 docker inspect + 容器ID 获取容器的具体信息:
eg3:给运行中的容器添加映射端口
docker inspect \`container_name` | grep IPAddress //将container_name 换成实际环境中的容器名,获得容器的IP地址 iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000 //将容器的8000端口映射到docker主机的8001端口 或: docker commit container_id foo/live //提交一个运行中的容器为镜像 docker run -d -p 8000:80 foo/live /bin/bash //运行镜像并添加端口映射,宿主8000到容器80,
2.4、修改运行中docker容器中的内容
docker中宿主机与容器(container)互相拷贝传递文件
docker cp mycontainer:/opt/testnew/file.txt /opt/test/ //从容器拷贝文件到宿主机 docker cp /opt/test/file.txt mycontainer:/opt/testnew/ //从宿主机拷贝文件到容器 sudo docker commit -m "描述内容" -a "author name" 32555789dd00 aipaper/devinz83:v2 //-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息 docker images //验证 REPOSITORY TAG aipaper/devinz83 v2 #修改容器配置文件yaml vi /opt/docker/yml/docker-compose-resty-redis.yml docker stack deploy --compose-file=/opt/docker/yml/docker-compose-resty-redis.yml resty_redis //使用新修改后的镜像部署了docker应用
注:不管容器有没有启动,docker cp都会生效;完成后,使用 docker commit 命令来提交更新后的副本。
之后更新容器的yml文件,更新image为新的对象:
2.5、Docker容器迁移到其他服务器
有时我们会由于各种原因,比如硬件升级、数据中心变化,资源限制等因素,需要将当前docker容器所在迁移到其他资源池或主机。
1)导出和导入容器:
导出容器:即从容器的文件系统创建压缩文件,导出的文件保存为“gzip”文件;之后通过文件传输工具(如scp或rsync)将压缩文件复制到新服务器。再在新服务器中,将这个gzip文件导入到一个新容器中。
docker export container-name | gzip > container-name.gz zcat container-name.gz | docker import - container-name docker run -d container-name /bin/bash //使用“docker run”命令访问在新服务器中创建的新容器
注:导出容器工具的一个缺点是,它不导出容器的端口和变量,也不导出包含容器的底层数据。当尝试在另一台服务器中加载容器时,这可能会导致错误。对此,我们可另考虑使用Docker镜像迁移来将容器从一台服务器迁移到另一台服务器。
2)容器镜像迁移:
即我们迁移容器关联到的镜像到新的资源池,这也是将Docker容器迁移到另一台服务器的最常用方法。对于要迁移的容器,首先使用“Docker commit”命令将其Docker镜像保存到压缩文件中。
docker commit container-id image-name //生成的镜像将被压缩
之后将上述镜像上传到新服务器上,在新服务器中,将使用“docker run”创建一个新容器。
使用此方法,数据卷不会被迁移,但它会保留,在容器内创建的应用程序的数据。
3)先保存,再加载镜像
docker镜像是应用程序的代码、库、配置文件等的包。Docker容器是由这些镜像创建的。
可以使用“docker save”压缩镜像并将其迁移到新服务器。之后在新服务器中,使用“docker load”将压缩镜像文件用于创建新镜像。
docker save image-name > image-name.tar cat image-name.tar | docker load
4)迁移数据卷:
Docker容器中的数据卷是共享目录,其中包含特定于容器的数据。卷中的数据是持久的,在容器重新创建期间不会丢失。
使用导出或提交工具将Docker容器或镜像从一台服务器迁移到另一台服务器时,不会迁移基础数据卷。在这种情况下,包含数据的目录将手动迁移到新服务器。然后在新服务器创建容器,引用该目录作为其数据卷。
另一个简单的方法是通过在“docker run”命令中传递“-volumes from”参数来备份和恢复数据卷。
docker run --rm --volumes-from datavolume-name -v $(pwd):/backup image-name tar cvf backup.tar /path-to-datavolume docker run --rm --volumes-from datavolume-name -v $(pwd):/backup image-name bash -c "cd /path-to-datavolume && tar xvf /backup/backup.tar --strip 1"
上述命令中:datavolume-name是/path/to/volume,此命令提供数据卷的备份。要指定工作目录,还可以指定-w/backup。在/backup文件夹中生成的备份可以通过scp或ftp工具复制到新服务器。然后提取复制的备份并将其还原到新容器中的数据卷中。
5)迁移整个Docker容器:
以上方法仅适用于单个容器。但是将所有容器都要从一台服务器迁移到另一台服务器的情况下,我们采用另一种方法。此方法包括将整个docker目录(“/var/lib/docker”)复制到新服务器。为了使这种方法成功,需要确定几个关键点。
1、保留文件夹的权限和所有权。
2、迁移前停止Docker服务。
3、验证两台服务器中的Docker版本是否兼容。
4、迁移前后验证容器列表和功能。
5、环境变量和其他配置文件的路径。
6、如果此方法由于任何故障而无法工作,我们将配置自定义脚本以将容器和镜像从一台服务器迁移到另一台服务器。
2.6、查看docker镜像中文件
docker attach ContainerID //需要对应的container是运行中的,不处于stop状态 ##对于未运行的,可以把Docker镜像中的文件复制到宿主来看,示例如下 sudo docker cp nginx-ubuntu-container:/etc/apt/sources.list ~/Documents/
2.7、运行容器:docker run常用选项
语法:docker run [option] 镜像名 [向启动容器中传入的命令]
常用可选参数说明:
- -i 表示以“交互模式”运行容器
- -t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
- --name 为创建的容器命名
- -v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。
- -d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
- -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
- -e 为容器设置环境变量
- --network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同
加载全部内容