. docker 是什么
大家都知道虚拟机吧,windows 上装个 linux 虚拟机是大部分程序员的常用方案。公司生产环境大多也是虚拟机,虚拟机将物理硬件资源虚拟化,按需分配和使用,虚拟机使用起来和真实操作系统一模一样,当废弃不用时直接删除虚拟机文件即可回收资源,很方便集中管理。
由于虚拟机非常庞大,同时对硬件资源的消耗也大,linux 发展出了另一种虚拟化技术,即 linux 容器(Linux Containers,缩写为 LXC),它并不像虚拟机那样模拟一个完整的操作系统,却提供虚拟机一样的效果。如果说虚拟机是操作系统级别的隔离,那么容器就是进程级别的隔离,可以想象这种级别隔离的优点,无疑是快速的,节省资源的。
docker 就是对 linux 容器的封装,提供简单实用的用户接口,是目前最流行的 linux容器解决方案。
下面是百科的定义:
docker 是基于 Go 语言的开源的应用容器引擎,并遵从Apache2.0协议,docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
2. docker 解决什么问题
1. 解决虚拟机资源消耗问题。
服务器操作系统之上运行着虚拟机,虚拟机上运行着客户操作系统,客户操作系统之上运行着用户的应用程序,一台服务器 80% 的资源开销都花费在了硬件虚拟化和客户机操作系统本身。
图1. 虚拟机架构与容器架构区别
如图 1 所示,如果采用 docker 容器技术,容器上运行着虚拟服务器,虚拟服务器中运行着用户的应用程序,虚拟服务器和服务器操作系统使用同一内核,虚拟服务器的文件系统使用物理服务器的文件系统,但做了隔离,看上去每个虚拟服务器都有自己独立的文件系统;在物理服务器上建立了虚拟网桥设备,每个虚拟服务器通过虚拟网桥设备连接网络。虚拟服务器直接使用物理服务器的CPU、内存、硬盘,并不对硬件进行虚拟化,因此没有硬件虚拟化和客户机操作系统占用的资源消耗,每一台虚拟服务器的性能接近于物理服务器性能。
一台普通家用电脑运行一个 Linux 虚拟机可能已经非常卡,但是却可以使用 docker 虚拟出几十甚至上百台虚拟的 linux 服务器。如果换成性能强劲的服务器,使用 docker 就可以提供私有云服务了。
2. 快速部署。
软件开发的难题在于环境配置,在自己电脑上运行的软件,换一台机器可能就无法运行,除非保证操作系统的设置正确,各种组件和库的正确安装。比如部署一个 Java 开发的 web 系统,计算机必须安装 Java 和正确的环境变量,可能还需要安装 tomcat、nginx。换台机器部署就要重来一次。
使用 docker 可以将应用程序及依赖打包在一个文件里(docker 镜像文件),运行这个文件就会启动虚拟服务器,在虚拟服务器启动应用程序或服务,就像在真实在物理机上运行一样,有了 docker,就可以一次部署,处处运行,也可以用于自动化发布。
3. 提供一次性的环境。
比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境,启动或关闭一个虚拟服务器就像启动或关闭一个进程一样简单和快速。
4. 提供弹性的云服务。
因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
5. 组建微服务架构。
通过多个容器,一台机器可以跑很多个虚拟服务器,因此在一台机器上就可以模拟出微服务架构,也可以模拟出分布式架构。
3. docker 安装部署与使用
本文介绍 ubuntu 18.04 系统下的安装与使用。其他操作系统请参考官方文档https://docs.docker.com/。
1. 安装 docker 引擎
获取最新版本的 Docker 安装包
aaron@ubuntu:~$ wget -qO- https://get.docker.com/ | sh
执行上述命令,输入当前用户密码,即可自动下载最新版的 docker 安装包,并自动安装。
安装完成后有个提示:
If you would like to use Docker as a non-root user, you should now consider adding your user to the "docker" group with something like: sudo usermod -aG docker aaron Remember that you will have to log out and back in for this to take effect! WARNING: Adding a user to the "docker" group will grant the ability to run containers which can be used to obtain root privileges on the docker host. Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface for more information.
当要以非 root 用户可以直接运行 docker 时,需要执行
sudo usermod -aG docker aaron
命令将用户 aaron 添加到 docker 用户组中,然后重新登陆,否则会报下面的错误:
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/create: dial unix /var/run/docker.sock: connect: permission denied. See 'docker run --help'.
执行下列命令启动 docker 引擎
aaron@ubuntu:~$ sudo service docker start
安装成功后已默认设置开机启动并自动启动,如果要手动设置,执行下面命令:
sudo systemctl enable docker sudo systemctl start docker
测试运行
aaron@ubuntu:~$ sudo docker run hello-world
2. 使用 docker
1. 理解 docker 的架构
使用前先了解下 docker 的架构,如下图所示:
docker 架构图
docker 镜象(image) 是存放在 docker 仓库(Registry)的文件,是用于创建 docker 容器 的模板。
docker 容器 是独立运行的一个或一组应用,可以理解为前述介绍的虚拟服务器。
docker 主机 是一个物理或者虚拟的机器用于执行 docker 守护进程和容器。
docker 客户端 通过命令行或者其他工具使用 docker API 与 docker 的守护进程通信。
作为用户,我们直接使用的是 docker 客户端。
2. docker 命令
查看docker 命令的帮助信息
docker --help #docker 全部命令帮助信息docker COMMAND --help #docker 具体命令COMMAND的帮助信息
查看docker 信息
docker info
可以看到容器的池、已用数据大小、总数据大小,基本容器大小、当前运行容器数量等。
搜索镜像,从网络中搜索别人做好的容器镜像。
docker search ubuntu docker search centos
ubuntu 镜像
从这里可以看出有的镜像已经集成了 php、java、ansible 等应用,我们也可以制作包含自己应用或服务的镜像文件,将此文件传给别人,别人即可直接使用 docker 打开容器,不需要任何额外的操作,也不像虚拟机那样消耗资源,即可运行你的应用或服务,是不是非常方便?!
从网络中下载别人做好的容器镜像。
docker pull centos docker pull ubuntu
导入下载好的容器镜像文件
docker load < image_xxx.tar
查看镜像
docker images docker images -a
检查镜像
docker inspect ubuntu
可以看到容器镜像的基本信息。
删除镜像,通过镜像的 id 来指定删除
docker rmi ubuntu
删除全部镜像
docker rmi $(docker images -q)
显示镜像历史
docker history ubuntu
运行容器
Docker容器可以理解为在沙盒中运行的进程,这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等。但这个沙盒默认是不会运行任何程序的,需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全停止。
运行 ubuntu 容器并进入交互式环境
aaron@ubuntu:~$ docker run -i --name="ubuntu1" --hostname="ubuntu1" ubuntu /bin/sh cat /etc/hosts127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters172.17.0.2 ubuntu1 whoami root uname -a Linux ubuntu1 4.15.0-34-generic #37-Ubuntu SMP Mon Aug 27 15:21:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
上述命令我们创建了一个名字为 ubuntu1 的容器,设置容器的主机名为 ubuntu1,进入 /bin/sh 命令后我们打印了 hosts 文件的内容,查看了内核版本(与本机操作系统版本一致),这里可以使用各种 linux 命令,就像在新的操作系统中使用命令一个样。同样的方法,我们在新的终端创建一个 ubuntu2 的容器,并使用
docker ps
查看正在运行的容器。
查看正在运行的容器
输入 exit 退出容器。
docker run -d ubuntu
会出现一串长的字母数字组成的串,为容器的 id,请注意容器要有持续运行的进程存在,否则,容器会很快自动退出。
运行容器并指定MAC地址
docker run -d --name='centos3' --hostname='centos3' --mac-address="02:42:AC:11:00:24" docker-centos6.10-hadoop-spark
列出所有的容器
docker ps -a
列出最近一次启动的容器
docker ps -l
检查容器
docker inspect centos1
可以获取容器的相关信息。
获取容器CID
docker inspect -f '{{.Id}}' centos1
获取容器PID
docker inspect -f '{{.State.Pid}}' centos1
获取容器IP
docker inspect -f '{{.NetworkSettings.IPAddress}}' centos1
获取容器网关
docker inspect -f '{{.NetworkSettings.Gateway}}' centos1
获取容器 MAC
docker inspect -f '{{.NetworkSettings.MacAddress}}' centos1
查看容器 IP 地址
docker inspect -f '{{.NetworkSettings.IPAddress}}' centos1
连接容器
ssh 容器的 IP 地址
输入密码:123456
容器运行后,可以通过另一种方式进入容器内部
docker exec -it centos /bin/sh
查看容器运行过程中的日志
docker logs centos1
列出一个容器里面被改变的文件或者目录,列表会显示出三种事件,A 增加的;D 删除的;C 被改变的
docker diff centos1
和初始容器镜像项目,用户或系统增加/修改/删除了那些目录文件,都可以查看到。
查看容器里正在运行的进程
docker top centos1
拷贝容器里的文件/目录到本地服务器
docker cp centos1:/etc/passwd /tmp/ ls /tmp/passwd
通过网络 IP 地址也可以将容器的文件拷贝到服务器,这种方式比较方便。
停止容器
docker stop centos1
停止所有容器
docker kill $(docker ps -a -q)
启动容器
docker start centos1
删除单个容器
docker stop centos1 docker rm centos1
删除容器之前要先停止该容器的运行。
删除所有容器
docker kill $(docker ps -a -q) docker rm $(docker ps -a -q)
3. 卷的概念
为了能够保存(持久化)数据以及共享容器间的数据,docker 提出了卷的概念。卷 Volume 就是容器的特定目录,该目录下的文件保存在宿主机上,而不是容器的文件系统内。
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过容器默认的文件系统,可以提供很多有用的特性:
(1)数据卷可以在容器之间共享和重用;
(2)对数据卷的修改会立马生效;
(3)对数据卷的更新,不会影响镜像;
(4)数据卷默认会一直存在,即使容器被删除。
注意:数据卷的使用,类似于 Linux下对目录进行挂载 mount,容器中被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
创建、使用数据卷
mkdir -p /root/volume1 mkdir -p /root/volume2 docker run -d -v /volume1 --name='centos5' docker-centos6.10-hadoop-spark docker run -d -v /root/volume1:/volume1 --name='centos6' docker-centos6.10-hadoop-spark docker run -d -v /root/volume1:/volume1 -v /root/volume2:/volume2 --name='centos7' docker-centos6.10-hadoop-spark docker run -d -v /root/volume1:/volume1:ro --name='centos8' docker-centos6.10-hadoop-spar
作者:清如許2018
链接:https://www.jianshu.com/p/46334b8e13bf