手摸手带你Docker从入门到实践
手摸手带你 Docker 从入门到实践
在下最近遇到要在服务器上安装 Mysql、Nginx、EasyMock 等工具的场景,这里记录一下我使用 Docker 安装的过程,希望也能在类似的场景中帮助到大家~
本文前备知识需要一些 Linux 的一些基本命令,推介先看一下 <半小时搞会 CentOS 入门必备基础知识> 这篇文章。
CentOS 版本: 7.6
Nginx 版本: 1.16.1
Docker 版本: 19.03.12
你多学一样本事,就少说一句求人的话
1. 介绍
1.1 出现的原因
前后端开发到测试到生产的过程中,经常会遇到一个问题,明明我在本地跑没问题,为什么到测试环境或者生产环境就报错了了呢,常常这是因为开发、测试、生产的环境与配置不同导致的。
折腾过环境配置的人都明白其中麻烦,换一台系统、虚拟机、机器,就又要重来一次,费力费时。由于环境和配置的原因,各种奇奇怪怪因为环境和配置的 Bug,总是像打地鼠游戏里面的地鼠一样不断冒出来 🐹

配置完之后在命令行中 docker info 就可以查看到我们配置的镜像加速地址了。
|
|
如果你的系统的 Docker 没有客户端,比如 CentOS 中,可以直接修改 deamon 配置文件:
|
|
3.2 Hello World !
然后就可以快乐跑起来我们第一个 Docker 指令 Hello World 了

Good start ! 🎉
4. 镜像 & 容器 & 仓库
镜像和容器的关系就像类和类的实例,一个镜像可以同时跑多个容器,单个容器实例又可以创建新的镜像。如下图:

下面解释一下这个图里面出现的元素
| 概念 | 说明 |
|---|---|
| Docker 镜像 Images | 用于创建 Docker 容器的只读模板,比如 Ubuntu 16.04系统、Nginx 1.16.0 等,是一个特殊的文件系统,包括容器运行时需要的程序、库、资源、参数等,但不包含任何动态数据,内容在构建后也不会被改变,一个镜像可以创建多个容器 |
| Docker 容器 Container | 容器是独立运行、相互隔离的一个或一组应用,是镜像创建的运行实例,实质是进程,可以看作为一个简易版的 Linux 环境 + 运行在其中的应用程序 |
| Docker 客户端 Client | 客户端通过命令行或者其他工具使用 Docker SDK (docs.docker.com/develop/sdk…) 与 Docker 的守护进程通信 |
| Docker 主机 Host | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器 |
| Docker 仓库 Repository | 集中存放镜像文件的地方,分为公有仓库和私有仓库。 |
| Docker 注册服务器 Registry | 是一个集中存储、分发镜像的服务,官方的叫 Docker Hub。一个 Docker Registry 中可包含多个仓库,每个仓库可以包含多个标签 Tag 的镜像,不同的标签对应不同的版本 |
| Docker Machine | Docker Machine 是一个简化 Docker 安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如 VirtualBox、 Digital Ocean、Microsoft Azure |
容器的生命周期图示

容器的五个核心状态,也就是图中色块表示的:Created、Running、Paused、Stopped、Deleted:
- Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还未处于运行状态。
- Running:容器正在运行,也就是容器中的应用正在运行。
- Paused:容器已暂停,表示容器中的所有程序都处于暂停 不是停止不是停止 状态。
- Stopped:容器处于停止状态,占用的资源和沙盒环境都依然存在,只是容器中的应用程序均已停止。
- Deleted:容器已删除,相关占用的资源及存储在 Docker 中的管理信息也都已释放和移除。
本文主要关注于使用,就不太赘述这些状态的切换等,下面直接上手。
5. 基本使用
5.1 操作命令
|
|
5.2 镜像命令
|
|
5.3 容器命令
|
|
这里要特别说一下 docker run 的 option,因为最常用:
--name为容器指定一个名称;-d容器启动后进入后台,并返回容器 ID,即启动守护式容器;-P随机端口映射;-p 80:8080将本地 80 端口映射到容器的 8080 端口;bash容器启动以后,内部第一个执行的命令。这里启动 bash,保证用户可以使用 Shell;-i以交互模式运行容器,通常与-t同时使用;-t为容器重新分配一个伪输入终端,容器的 Shell 会映射到当前的 Shell,然后在本机窗口输入的命令,就会传入容器,通常与-i同时使用;--rm在容器终止运行后自动删除容器文件;--restart=always设置容器自启动;-v /xxx:/yyy映射命令,把本机的 xxx 目录映射到容器中的 yyy 目录,也就是说改变本机的 xxx 目录下的内容, 容器 yyy 目录中的内容也会改变;
比如我在 CentOS 下跑起来一个 CentOS 的 Docker 容器:
|
|
是不是很神奇,我们可以在一开始的 CentOS 下面执行 docker ps 来查看容器列表:

你会发现上面那个 ID,正是下面列表中跑起来的这个容器的 ID,镜像的 ID 也是我们前面 pull 下来的 CentOS 镜像 ID,名字也是我们起的 myCentOS0901。
如果 docker run 之后报 Conflict. The container name "xxxx" is already in use by container 就直接运行 docker rm $(docker ps -a -q) 删除已停止的容器,或者精确删除 docker rm [containerID] 也可以,就可以了。
5.4 几个常见场景的命令使用
守护式启动容器
使用 CentOS 以后台模式启动一个容器 docker run -d --name myCentOS0903 0d120b6ccaa8,启动之后 docker ps -a 查看,发现容器并不在运行中,这是因为 Docker 的运行机制:Docker 容器后台运行,必须有一个前台进程。
容器运行的命令如果不是那些一直挂起的命令,比如 top、tail ,运行结束会自动退出。所以为了让容器持续在后台运行,那么需要将运行的程序以前台进程的形式运行。
比如这里在后台运行一个命令,这个命令一直在打印 docker run -d CentOS /bin/sh -c "while true; do echo hello zzyy; sleep 2; done",然后我们 logs 查看一下:

退出容器后对容器操作
退出容器后可以通过 exec 方法对正在运行的容器进行操作:

在容器中拷贝文件到外部
拷贝文件使用 cp 命令
|
|
cp 不仅能把容器中的文件/文件夹拷贝到本机,也可以把本机中的文件/文件夹拷贝到容器。
演示一下,这里先到容器里面创建一个无聊的文件 xixi.txt,然后拷贝到本机:

实用的时候,我们可以拷贝配置、日志等文件到本地。
6. 安装 MySQL
|
|
稍微解释一下上面的参数:
-p 3307:3306将本机的 3307 端口映射到 mysql 容器的 3306 端口,根据需要自行更改;-e MYSQL_ROOT_PASSWORD=<string>设置远程登录的 root 用户密码;--name <string>可选,设置容器别名;-v xxx/mysql.d:/etc/mysql/conf.d将本地目录下设置文件夹映射到容器的/etc/mysql/conf.d-v xxx/logs:/logs将本机指定目录下的logs目录挂载到容器的/logs-v xxx/data:/var/lib/mysql将主机制定目录下的data目录挂载到容器的/var/lib/mysql
运行截图:

然后去 Navicat 中就可以连接到 MySQL 了。
这也太爽了!真的是几行命令就装好了啊,比之前真是快乐多了 😂
7. 安装 Nginx
Nginx 的安装和其他的类似,如果你还不太了解 Nginx 如何使用,可以参看 这篇文章,看完基本就了解如何使用和配置了。
|
|
{% asset_img e7763230c080498d96d5f012581b03cetplv-k3u1fbpfcp-zoom-1.jpg %}
然后创建一个临时的容器,目的是把默认配置拷贝到本机,我这里把配置文件放到 /mnt 目录下,主要是三个配置文件夹:
/etc/nginx放置 Nginx 配置文件;/var/log/nginx/放置 Nginx 日志文件;/usr/share/nginx/html/放置 Nginx 前端静态文件都放在这个文件夹;
分别把这几个目录都拷贝到本机的 /mnt 文件夹下的 nginx、nginx_logs、html 文件夹。
刚刚创建的临时容器没用了 docker rm -f [临时容器ID] 把临时容器干掉,然后 docker run 重新创建 Nginx 容器:
|
|
--privileged=true 表示容器内部对挂载的目录拥有读写等特权。
其他配置刚刚上面之前已经讲过,应该不用讲了。

然后在你自己浏览器上就可以访问了,如果是云服务器,记得开放对应端口。
8. 安装 Easy Mock
因为 Easy Mock 依赖 Redis 和 MongoDB,因此本地环境使用 docker-compose 来搭建 Easy Mock 应该算是最佳实践了。
安装 docker-compose
首先你得确定拥有 docker 环境,如果你是 Windows / Mac 用户,那么安装客户端,就会自带 docker-compose 了。
因为本次我们是在云服务器 CentOS7.6 上搭建,所以我们需要自行安装 docker-compose,运行如下命令,下载当前稳定版本的 docker-compose
|
|
修改文件权限为可执行文件
|
|
验证是否安装成功
|
|
编写 docker-compose.yml 配置文件
可以参考官方文档给出的部署文档,也可以参考我下面的配置过程。
首先新建文件 docker-compose.yml 并将下面 docker-compose 文件内容复制进入 docker-compose.yml,然后将内容中注释位置替换为自己需要的本地地址
|
|
启动 Easy Mock
在 docker-compose 文件目录下,运行如下命令:
|
|
如果遇到 easymock docker 实例报文件权限错误
|
|
要在项目根目录执行以下命令
|
|
然后就可以通过浏览器上的 你的域名.com:7300 访问到 easy-mock 了!
如果你觉得域名后面跟着端口号挺难看的,你可以通过配置 Nginx 的二级域名来访问你部署的 easy-mock,配置二级域名的方法参见 这篇文章
9. 可视化管理
关于可视化查询工具,这里就简单推介一个 LazyDocker,由于是在终端运行的,而且支持键盘操作和鼠标点击,就挺骚气的,有了这个一些查询语句可以少打几次了。

安装比较简单,运行下面的命令:
|
|
可以设置一个终端的 alias
|
|
然后你在终端输入 lzd 就可以浏览你的镜像、容器、日志、配置、状态等等内容了。
10. 结语
由于在下目前使用 Docker 的主要场景是 MySQL、Nginx 之类工具的安装,所以本文所介绍的内容也大多属于这个场景。
篇幅原因 Docker 还有一些内容本文没有介绍,但上面的内容已基本满足日常的使用,其他 Docker 的内容可以关注一下在下的后续文章~
网上的帖子大多深浅不一,甚至有些前后矛盾,在下的文章都是学习过程中的总结,如果发现错误,欢迎留言指出~
参考文档:
作者其他高赞文章:
PS:本文收录在我的博客,地址 Github - SHERlocked93/blog,也欢迎大家关注我的公众号【前端下午茶】,一起加油吧。 如果你感觉文章不错的话,也别忘了给作者点赞支持一下~