docker相关
docker
应用场景:假设用户试图基于最常见的LAMP (Linux + Apache + MySQL+ PHP)组合来运维一个网站。按照传统的做法,首先,需要安装Apache、MySQL 和PHP以及它们各自运行所依赖的环境,之后分别对它们进行配置(包括创建合适的用户、 配置参数、开放端口等),经过大量的操作后,还需要进行功能测试,看是否工作正常。
更重要的是,在开发后期测试完毕后,正式平台环境的搭建移植,以及后期维护问题,一旦需要重新部署环境或服务器迁移,又需要重新部署和调试,漫长而心烦。
而Docker提供了一种更为聪明的方式,通过容器来打包应用,封装对应的docker镜像,意味着迁移只需要在新的服务器上启动需要的容器就可以了。这无疑将节约大量的宝贵时间,并降低部署过程出现问题的风险。
注册服务器(registry)>仓库(respository)>镜像(image)>容器(container)
- 安装docker:centos7的扩展源里已经内置docker源,直接使用
#yum install -y docker 安装即可
#yum update docker 更新docker
注:若在安装过程中报错,尝试更换yum下载源试试
- 启动docker服务
systemctl start docker
开启docker服务时报错:
关键信息如下:
这是由于我安装docker使用的操作系统是Centos7发行版,Centos系统的内核为3.X,官方基于此内核构建了overlay存储驱动,但是默认情况不加载,而docker的存储驱动默认使用overlay2,由于默认不加载overlay存储驱动,安装docker以后会改变存储驱动为overlay2,然后被SElinux安全模块禁止了,所以出现如图报错,此时我们可以修改配置文件:
vi /etc/sysconfig/docker
docker启动后,使用docker info查看docker所有信息:
如上图所示:docker已经使用overlay2存储驱动,docker启动完成.
- 验证docker已经正常安装
docker run hello-world
运行一个叫hello-world的容器
- 查看本地镜像库:
docker images
- 查看所有容器
docker ps -a
- 设置docker开机启动
systemctl enable docker.service
- 下载镜像:
docker pull 镜像名:tag 从默认的docker hub远端镜像仓库下载指定tag版本的镜像,若不指定tag默认为下载latest最新版本。
注:命令中的tag和镜像仓库都可根据自己的需要进行更改,其中镜像仓库分远端(互联网共享)和本地两种。
- 查看本地已有的镜像:
docker images
- 搜寻远端仓库中的镜像:
docker search 镜像名
- 删除镜像:
注:删除镜像分为删除某个镜像对应的某个tag和镜像文件,若命令最后为镜像ID,则删除此镜像所有tag及镜像文件
一般删除镜像的步骤为:
- docker images
查看本地已有镜像,记录镜像ID及对应的tag
- docker ps -a
查询本地已有容器,若某个容器依赖对应的镜像,则无法删除,需要先移除此容器
- docker rm 容器id/name
删除容器,若要删除的容器正在运行,也需要先停止容器,P
- docker stop 容器id/name
停止容器运行,
PS:
docker stop $(docker ps -q)停止所有容器运行
docker rm $(docker ps -qa)删除所有容器
- docker rmi 镜像名:tag/镜像ID
若要强行删除某个镜像,可带-f 参数,但这样做的话,系统会重新复制一个此镜像临时附给容器使用,所以没意义,谨慎操作!
- 存储相关
- 挂载宿主机目录至容器,用于宿主机于容器共享存储
docker run -it -v /home/xuchuan:/usr/xu docker.io/centos --name centos-tomcat /bin/bash
基于docker.io/centos镜像创建一个镜像并挂载宿主机/home/xuchuan目录至容器/usr/xu目录.
挂载目录的默认权限为rw,可在容器目录后加:ro(read only)设置为只读权限,设置为只读后,用户在容器内无法更改目录内容,若要使用挂载目录作为软件数据存储,则不能设置为只读:
docker run -it -v /home/xuchuan:/usr/xu:ro docker.io/centos --name centos-tomcat /bin/bash
进入容器,访问挂载的目录,发现无法打开,报错如下图:
这是因为以宿主机作为挂载源的/home/xuchuan目录的所属用户与容器内/usr/xu目录不一致,导致centos系统里安全模块selinux把权限给禁掉了,可用以下两种方法解决:
1.更改宿主机目录所属用户uid(在此基于uid更改,不能基于用户名更改,会导致容器内因为没有相应用户也无法访问)
chown -R 1000 /home/xuchuan
2.把目录添加selinux放行规则
添加selinux规则,将要挂载的目录添加到白名单
chcon -Rt svirt_sandbox_file_t /home/xuchuan
同一个宿主机目录可同时挂载至多个容器内且同步更新,在宿主机或任一容器内对目录做了修改,其他目录也会做相应修改,但在容器中无法对目录执行删除操作,只能在宿主机中对挂载目录进行删除,删除之后,容器内对应目录也被清空。
- 创建一个数据卷当作存储的数据卷容器,用于多个容器共享一些持续更新的数据(实时同步)
docker run -it -v /usr/xu --name volume-test docker.io/centos /bin/bash
基于docker.io/centos镜像创建一个名为volume-test的数据卷,并把数据卷/usr/xu目录作为共享目录;
进入容器/usr/xu目录,创建文件aaa,添加内容:test
此时宿主机中会在/var/lib/docker/volumes目录下自动创建一个随机目录与数据卷容器/usr/xu目录进行绑定,并实时更新,
docker inspect volume-test 查看volume-test元数据
如图,mounts节点显示了宿主机上自动创建的目录/var/lib/docker/volume/lf09............/_data,
进入目录可以看出,宿主机目录内的文件及内容与数据卷容器内的一致。
- 其他容器使用--volumes-from来挂载数据卷容器
docker run -it --name db1 --volumes-from volume-test docker.io/centos /bin/bash
容器的数据卷的备份:
注:所有对于挂载目录的修改,都是独立于镜像之外的,并不会对镜像做任何修改,即使使用docker commit命令提交修改制作镜像也不会保存挂载目录的修改。
1.若采用直接挂载宿主机目录至容器的方式共享存储,则只需要备份宿主机对应的目录即可;
2.若采用创建数据卷容器的方式共享存储,有以下两种方式:
2.1新建一个容器,把宿主机目录和数据卷容器都挂载到新建的容器内,然后进行打包操作,一条命令解决,最后再
docker run --rm --volumes-from volume-test --privileged=true -v /root/xuchuan:/backup --name backup5 docker.io/centos tar -zcvf /backup/aaabbb.tar /usr/xu
基于docker.io/centos镜像创建一个名叫backup5的容器,把宿主机/root/xuchuan目录和volume-test数据卷容器同时挂载到backup5容器内,并在容器启动后执行打包命令,打包容器/usr/xu目录所有内容,最后执行-rm删除此容器。(由于宿主机/root/xuchuan和容器内/backup是挂载关系,并实时更新,所以打包完成后会在宿主机/root/xuchuan目录下同时生成aaabbb.tar)
2.2前面说过,新建数据卷容器后,docker会自动在宿主机/var/lib/docker/volume目录下创建一个目录来对应数据卷,所以我们只需要在宿主机上备份这个目录即可。
- 宿主机和容器间的数据拷贝
docker cp /etc/uar(源) 容器ID:容器内路径(目的)
将主机/home/xuchuan目录拷贝到容器96f7f14e99ab的/usr/xu目录下。
docker cp /home/xuchuan 96f7f14e99ab:/usr/xu
docker cp 96f7f14e99ab:/xu /tmp/
- 制作镜像:
- 提交修改并生成镜像:
docker commit -m/-a/-p 源镜像名/ID 新镜像名称:tag
-a 作者消息
-m 提交消息
-p 创建时暂停容器运行
用户对运行的容器做修改,但这些修改并不会影响对应的镜像,docker commit就是用来提交用户的修改并生成一个新镜像。
docker inspect 容器/镜像 查看容器/镜像的元数据
docker tag 源镜像名:tag 新镜像名:tag 新建一个带tag的镜像,镜像ID与源镜像相同,若带参数-f,则不会新建,而是覆盖源镜像
save/load 保存/载入 把镜像保存到宿主机中/从宿主机中载入镜像 此命令会保存/载入镜像中所有历史,也就是所有容器
- 保存镜像:
docker save -o centos7-nigix.tar 源镜像名:tag
- 载入镜像:
docker load -i CentOs_7.4.tar
docker save 对镜像进行保存,会保存镜像里所有的版本,每一次修改后用docker commit生成的新镜像包括初始源镜像都会被保存下来并生成一个tar包,这个包里会保存所有镜像版本和元数据。
docker commit 提交对容器的修改操作并创建一个镜像版本,生成的是一个镜像,不是tar包
了解dockerfile生成镜像,了解docker-compose 自动化部署