Docker 是一个基于 Go 语言的开源应用容器引擎,它既能实现虚拟化,又可用于将应用服务打包成轻量、可移植的容器,从而能够发布到任何 Linux 平台。除了优秀了沙箱机制外,Docker 容器的开销也极低。
正如其名,Docker 所作的事情正是以一个集装箱的身份承载应用服务的运行,它与传统的 KVM、Xen 等基于硬件虚拟化的云计算系统不一样,而是采用了 LXC (Linux Container) 内核虚拟化的模式,使得应用服务再也不须要独立的货轮(OS)为其提供运做环境,而是装载到集装箱(Container)中运行服务。java
不少发行版的软件仓库里已经为您准备好了 Docker 相关的包——但或许您更喜欢使用最新的 Docker 版本,在这种状况下,您能够参照 Docker 官方的安装文档。官方提供了 CentOS、Debian、Fedora 和 Ubuntu 的安装源和安装说明,同时也提供了从二进制文件配置安装的方法。参照官方文档的流程安装,一般不会出错。linux
这里给出 Debian 9 - Stretch 安装 Docker 的示例。docker
sudo apt purge docker docker-engine docker.io containerd runc
# 刷新数据库 sudo apt update # 一些必要的前置 sudo apt install apt-transport-https ca-certificates \ curl gnupg2 software-properties-common # 添加 Docker 官方 GPG key curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - # 以末8位字符查找其 fingerprint,应与文档页面所列一致 sudo apt-key fingerprint 0EBFCD88 # 添加软件源,注意机器架构 arch = amd64/armhf/arm64 sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" # 刷新数据库并安装 Docker sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io # 启动 docker 服务 sudo systemctl enable docker sudo systemctl start docker # 验证安装 sudo docker run hello-world
root
权限就可以操做 Docker,咱们还须要继续如下操做:# 首先查看当前系统是否有 docker 组 grep docker /etc/group # 若没有,则创建 docker 组 sudo groupadd -g 233 docker # 将用户加入到 docker 组 # username 为用户名,可用 $USER 变量表示当前用户 sudo gpasswd -a username docker # 或新建一个用户 sudo useradd -G docker -u 2333 newuser # 重启 docker 服务 sudo systemctl restart docker # 从新登陆并验证权限 <必定要从新登陆> docker info
sudo
操做 Docker 了。要运行一个容器服务,咱们须要为其准备一个镜像。这里咱们以 Docker Hub 上的一个公共镜像:Alpine 为例,介绍容器建立和管理的相关命令。shell
# 搜索镜像 docker search alpine # 从列表中选取镜像并拉取:<镜像名:标签>。其中标签可忽略,默认 latest docker pull alpine # 或 alpine:latest # 等待拉取完成,查看已有镜像列表 docker images # 或 docker image ls # 查看镜像具体信息 <端口、挂载点等> docker inspect alpine # 新建容器并以交互模式 <-it> 运行 [/bin/ash] 命令 # ash 为 alpine 的默认 shell docker run -it [--name test] [-v /tmp/test:/root] [-p 8080:80] alpine [/bin/ash] # 也可让容器建立后在后台以挂起模式 <-d> 运行 docker run -d --name background alpine # 链接到一个已启动的容器并执行命令 docker exec -it test /bin/ash # 以交互模式从 test 容器运行终端 # 中止、启动或重启容器 docker stop/start/restart test # 删除容器 docker rm [-f] test
若是咱们要运行本身的应用服务,则须要本身构建合适的镜像。虽然从一个基础镜像构建容器并在容器内部操做也能实现应用服务的部署,甚至在此基础上还能够将容器打包为新的镜像,但这样作并不合适,其自己违背了 Docker 的初衷。Docker 镜像应当被设计为一个即插即用的模板,使得咱们只须要少许的配置就能轻松部署大规模的应用服务。故为特定的应用服务构建合适的镜像是必不可少的。数据库
为了构建一个镜像,咱们须要先准备一个空目录,并在其中新建一个 Dockerfile
文件。此目录用来存放镜像须要的全部资源,在构建操做中,整个目录都会被提交到 Docker Daemon 上,所以目录中不该包含无用的资源。若是存在大量零碎的文件,将之打包成 tar
档案是推荐的作法。安全
Dockerfile
用于指定如何构建镜像,一个 Dockerfile
一般包含这些内容:网络
# 指定基础镜像 FROM alpine # 镜像维护者信息 MAINTAINER Lost-Melody xxx@xxx.com # 环境变量 ENV HOME /root # 向镜像中添加文件目录,tar 包会自动解压 ADD dir.tar.gz /root/dir # 向镜像中添加文件,与 ADD 区别在于不会解压 tar 包 COPY files/* /root/ # 指定工做目录 WORKDIR /root/dir # 指定运行用户 USER root # 构建时执行的命令,每一个 RUN 命令都会提交一次新的镜像 # 两种方式:exec 方式、shell 方式 RUN ["/bin/sed", "-i", "s/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g"] RUN apk update && apk upgrade \ && apk add tzdata \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && apk add openjdk8 # 指定容器启动命令,可被 docker run 指定的命令覆盖。多条 CMD 只有最后一条生效 CMD echo "Hello, world!" CMD ["/bin/ash"] # 指定容器入口命令,不被 run 覆盖。多条只有最后一条生效 ENTRYPOINT ["/usr/bin/java", "-version"] ENTRYPOINT java -jar xxx.jar # 暴露容器端口以供主机映射 EXPOSE 80 # 添加挂载点 VOLUME ["/root/dir"] # 当以此镜像为基础镜像时执行命令 ONBUILD ADD dir2.tar.gz /root/dir ONBUILD RUN rm -rf /root/dir
编写好 Dockerfile
文件后,在该目录中执行 docker build -t name .
构建镜像。架构