Docker 的前世今生
Docker 的核心理念是 Build, Ship, and Run Any App, Anywher ,即一次封装,到处运行。
从前,我们在服务器配置一个应用的运行环境,要安装各种组件,就拿 JavaWeb 的环境来说吧,要安装 Tomcat、MySQL 等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在 Windows 上安装的这些环境,到了 Linux 又得重新装。况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。
Linux 容器技术 的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器 上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
Docker 的安装配置
这里我主要介绍一下 Docker 在 Ubuntu 和 Windows 中的安装。其他的操作系统可自行搜索安装教程。
由于 Docker 官网在国内的访问速度不好,所以这里推荐去「DaoCloud」下载镜像,速度非常快:
https://get.daocloud.io/#install-docker
Windows
先进入到 Docker 的下载页面:
https://get.daocloud.io/#install-docker-for-mac-windows
如果是 win10 系统就直接下载「Docker for Windows」,如果是 win10 之前的系统就下载「Docker Toolbox」。下载完成之后默认一直点下一步就安装完成了。
注意: windows 运行 Docker 需要在 BIOS 中开启「Intel Virtual Technology」,如果打不开 Docker 并提示有该类错误请自行根据自己电脑型号搜索相关教程。
Ubuntu
1$ sudo apt-get update2$ sudo apt-get install docker.io
1$ curl -sSL https://get.daocloud.io/docker | sh
注意: 正常情况下,应该显示出 Client 和 Server 的信息,如果没有 Server 的信息,则代表服务没有启动。此时需要用「service docker start」命令启动它。
Ubuntu 卸载 Docker
如果装错版本了可以卸载了重新装
1$ sudo apt-get remove --purge docker.io2$ rm -rf /var/lib/docker
Docker 核心概念
Docker 有三大核心概念:
仓库(repository)
镜像(image)
容器(container)
Docker 利用仓库管理镜像的设计与 Git 非常相似。我们要配置的应用运行环境就是镜像,如 nginx 镜像,当我们本地没有该镜像的时候,就需要从远程仓库 pull 下来,当我们启动这个镜像时,就会有一份镜像被复制并运行在容器中。如果我们改动了容器里面的内容,也可以将其 commit 保存成新的镜像。
第一个 Docker 实例
这里以 Nginx 为例来演示在 docker 中启动一个应用的过程。
启动 Nginx 分为 三步:
pull nginx 镜像
运行 nginx 容器
映射 nginx 端口
pull 镜像
首先要 Docker 官方仓库 里搜索 nginx,找到带有「official」字样的,点进去把 pull 命令复制下来。
https://hub.docker.com
执行该条命令就把镜像 pull 到本地了。执行「docker images」即可查看本地镜像。
其实「docker pull nginx」这条命令是简写形式,完整命令应该是:
1$ docker pull registry.hub.docker.com/library/nginx
完整的命令是在 nginx 前面加上了「注册服务器的地址」,由于 docker pull 的默认地址是这个,所以该地址是可以不加的。
为什么要说这个呢,因为从官方仓库下载镜像实在是非常的慢,有时候还下载不了。如果我们更改了这个注册服务器的地址,把它换成国内的,就可以实现加速。
镜像加速
国内有非常多的镜像仓库,本文介绍使用阿里云的,后文我们也会介绍把自己的镜像上传到阿里云,并且该服务是免费的。
访问这个地址:
https://cr.console.aliyun.com/?spm=5176.1971733.0.2.duOGn4#/accelerator
如果没有阿里云账号的就自己注册一个。在上面这个地址的页面就可以看到自己的专属加速地址了,并且有不同系统的安装方法,根据给的教程安装即可。
运行 nginx 容器
pull 了镜像之后,执行以下命令就可以启动它了。
1$ docker run -d nginx
这条命令是后台启动 nginx ,不加「-d」就是前台启动。启动了之后我们暂时还是无法访问带它的,我们还需要将容器内的 nginx 端口映射到容器外面,才可以访问到。
映射 nginx 端口
1$ docker -d -p 8080:80 nginx
跟上条命令比起来只加了一个「-p」参数,后面跟上端口,这里我是把本机的 8080 端口映射到 容器内的 80 端口上,浏览器访问「localhost:8080」就可以看到 nginx 的欢迎页面了。
镜像和容器的基本操作
镜像操作
1$ docker images
1$ docker tag old-tag new-tag
新的标签跟原标签镜像的 ID 是完全一样的,它们实际上都指向同一个镜像文件,只是别名不同而已。
1$ docker rmi image-id/image-tag
注意: 删除镜像需要先删除使用了此镜像的容器,虽然可以强制删除,但是并不推荐这么做。另外删除镜像,可以用 tag 或 ID 删除,如果 ID 是一样的就用 tag 删除
容器操作
1$ docker ps
1$ docker stop container-id
容器的 ID 不需要全部输完,只要能区分两个容器就可以了。
1$ docker ps -a
1$ docker rm container-id
删除容器之前需要先停止它
1$ docker commit container-id image-tag
特别注意: 如果更改了容器后不将它保存为新的镜像,在容器被删除后,所有的更改都不会被保存。下一文会介绍另 Docker 的数据存储可以解决这个问题。另外,此命令后面的 tag 可以不写只写名字,默认 latest。
1$ docker exec -it container bash
Docker 容器也有一个类 Linux 的文件系统,还可以用一些 linux 命令。要退出容器可输入「exit」
注意: 有的镜像是没有带 bash 的,比如「docker pull daocloud.io/library/nginx:1.13.8-alpine-perl」,这条命令就会报错,这时就可以用 sh 建立连接:
1$ docker exec -it container /bin/sh
1$ docker cp file container-id:newfile
1$ docker cp container-id:file newfile
复制容器内的文件到容器外命令是在容器外执行的
导入导出镜像和容器
导入和导出镜像
1$ docker save -o name.tar image-tag
1$ docker load --input name.tar
导入和导出容器
1$ docker export -o name.tar container-id
容器导入其实是导成了镜像。
push 自己的镜像到远程仓库
先来了解一下 docker 是如何管理仓库和镜像的。
仓库是放在注册服务器上的,一个仓库只管理一个镜像,一个镜像可以有多个版本。
push 镜像到 Docker Hub
https://hub.docker.com/
push 镜像到阿里云仓库
虽然 Docker Hub 可以 push 镜像,但是速度太慢了。最好还是用国内的速度比较快,这里介绍阿里云的。
cr.console.aliyun.com
总结
本篇文章主要介绍了Docker 的作用、「Docker 三大核心」(仓库、镜像、容器)的基本操作,还介绍了如何 push 自己的镜像到远程仓库。
下一篇文章将介绍 Docker 的数据管理和用更高级的方式「Dockerfile」来创建镜像。
关注我
zhisheng