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/#inst...
Windows
先进入到 Docker 的下载页面:
https://get.daocloud.io/#inst...
如果是 win10 系统就直接下载 Docker for Windows
,如果是 win10 之前的系统就下载Docker Toolbox
。下载完成之后默认一直点下一步就安装完成了。
注意:windows 运行 Docker 需要在 BIOS 中开启 Intel Virtual Technology
,如果打不开 Docker 并提示有该类错误请自行根据自己电脑型号搜索相关教程。
Ubuntu
- 可以用 Ubuntu 自带的安装源安装 Docker,只需要执行以下两条命令即可:
$ sudo apt-get update
$ sudo apt-get install docker.io
- 不过用自带安装源安装的 Docker 并不是最新版,推荐用以下方式安装最新版:
$ curl -sSL https://get.daocloud.io/docker | sh
- 安装完成之后可以用
docker version
命令查看 docker 版本信息。
注意:正常情况下,应该显示出 Client 和 Server 的信息,如果没有 Server 的信息,则代表服务没有启动。此时需要用 service docker start
命令启动它。
Ubuntu 卸载 Docker
如果装错版本了可以卸载了重新装
$ sudo apt-get remove --purge docker.io
$ 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 命令复制下来。
执行该条命令就把镜像 pull 到本地了。执行「docker images」即可查看本地镜像。
其实 docker pull nginx
这条命令是简写形式,完整命令应该是:
$ docker pull registry.hub.docker.com/library/nginx
完整的命令是在 nginx 前面加上了 注册服务器的地址
,由于 docker pull 的默认地址是这个,所以该地址是可以不加的。
为什么要说这个呢,因为从官方仓库下载镜像实在是非常的慢,有时候还下载不了。如果我们更改了这个注册服务器的地址,把它换成国内的,就可以实现加速。
镜像加速
国内有非常多的镜像仓库,本文介绍使用阿里云的,后文我们也会介绍把自己的镜像上传到阿里云,并且该服务是免费的。
访问这个地址:
https://cr.console.aliyun.com...
如果没有阿里云账号的就自己注册一个。在上面这个地址的页面就可以看到自己的专属加速地址了,并且有不同系统的安装方法,根据给的教程安装即可。
运行 nginx 容器
pull 了镜像之后,执行以下命令就可以启动它了。
$ docker run -d nginx
这条命令是后台启动 nginx ,不加 -d
就是前台启动。启动了之后我们暂时还是无法访问带它的,我们还需要将容器内的 nginx 端口映射到容器外面,才可以访问到。
映射 nginx 端口
$ docker run -d -p 8080:80 nginx
跟上条命令比起来只加了一个 -p
参数,后面跟上端口,这里我是把本机的 8080 端口映射到 容器内的 80 端口上,浏览器访问 localhost:8080
就可以看到 nginx 的欢迎页面了。
镜像和容器的基本操作
镜像操作
- 查看本地镜像
$ docker images
- 为镜像添加标签
$ docker tag old-tag new-tag
新的标签跟原标签镜像的 ID 是完全一样的,它们实际上都指向同一个镜像文件,只是别名不同而已。
- 删除镜像
$ docker rmi image-id/image-tag
注意:删除镜像需要先删除使用了此镜像的容器,虽然可以强制删除,但是并不推荐这么做。另外删除镜像,可以用 tag 或 ID 删除,如果 ID 是一样的就用 tag 删除
容器操作
- 查看正运行的容器
$ docker ps
- 停止正在运行的容器
$ docker stop container-id
容器的 ID 不需要全部输完,只要能区分两个容器就可以了。
- 查看所有容器
$ docker ps -a
- 删除容器
$ docker rm container-id
删除容器之前需要先停止它
- 将正在运行的容器保存为镜像
$ docker commit container-id image-tag
特别注意:如果更改了容器后不将它保存为新的镜像,在容器被删除后,所有的更改都不会被保存。下一文会介绍另 Docker 的数据存储可以解决这个问题。另外,此命令后面的 tag 可以不写只写名字,默认 latest。
- 进入容器内部
$ docker exec -it container bash
Docker 容器也有一个类 Linux 的文件系统,还可以用一些 linux 命令。要退出容器可输入exit
注意:有的镜像是没有带 bash 的,比如 docker pull daocloud.io/library/nginx:1.13.8-alpine-perl
,这条命令就会报错,这时就可以用 sh 建立连接:
$ docker exec -it container /bin/sh
- 复制文件到容器内
$ docker cp file container-id:newfile
- 复制容器内的文件到容器外
$ docker cp container-id:file newfile
复制容器内的文件到容器外命令是在容器外执行的
导入导出镜像和容器
导入和导出镜像
- 导出镜像
$ docker save -o name.tar image-tag
- 导入镜像
$ docker load --input name.tar
导入和导出容器
- 导出容器
$ docker export -o name.tar container-id
- 导入容器(docker import name.tar image-tag)
容器导入其实是导成了镜像。
push 自己的镜像到远程仓库
先来了解一下 docker 是如何管理仓库和镜像的。
仓库是放在注册服务器上的,一个仓库只管理一个镜像,一个镜像可以有多个版本。
push 镜像到 Docker Hub
- 访问 Docker Hub(注册服务器):
- 如果没有账号的话自己注册一个,然后点击
Create Repository
,在如下页面创建一个仓库。
- 例如我起的名字是:web-server,我的仓库名就是
stormxing/web-server
- 接着在本地用如下命令登录 Docker Hub
- 如果我们想把镜像上传到 Docker Hub,我们的镜像名字就得跟仓库名一致。要做到这一点,我们可以用为镜像创建一个新的标签。例如将 nginx 镜像重新创建一个标签
stormxing-webserver
,如果版本不填写就默认是 latest。
- 最后,直接 push 就可以了,完成之后在仓库页面的 tags 选项中可以看到自己的镜像。
push 镜像到阿里云仓库
虽然 Docker Hub 可以 push 镜像,但是速度太慢了。最好还是用国内的速度比较快,这里介绍阿里云的。
- 首先登陆这个地址,创建一个仓库,然后设置下登录密码:
- 创建仓库选择本地仓库
- 最后阿里云的操作指南非常详细,跟上面的步骤基本一致,这里就不再赘述了。
总结
本篇文章主要介绍了Docker 的作用、Docker 三大核心
(仓库、镜像、容器)的基本操作,还介绍了如何 push 自己的镜像到远程仓库。
下一篇文章 将介绍 Docker 的数据管理和用更高级的方式 Dockerfile
来创建镜像以及 docker-compose 的简单使用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。