写给前端的docker简明教程

大家好,我是前端dog君,一名95后前端小兵。2019年毕业于北京化工大学,天津人,不知道有校友和老乡嘛?对前端的热爱,让我们在此相聚,希望这篇文章,能帮助到您,也同时希望能交到志同道合的小伙伴,共同发展,一起进步。我的微信号dm120225,备注简书,期待您的光临。

大家注意,这是一篇写给前端的docker简明教程,亦可以说是dog君对最近对docker的简单总结。谈到的是一些基础内容,不涉及docker的一些高级用法或k8s容器编排等技术,旨在前端开发工程师扩展知识面,为全栈开发打好基础。dog君水平有限,如果有一些地方写的不太好,您可以联系dog君或评论,dog君非常愿意倾听您的建议,交个朋友嘛~

下面我们就一起来学习docker,揭开docker的神秘面纱。

docker介绍

引言

在我们日常开发中,可能会遇到以下问题:

1.我本地运行没问题啊
环境不一致
2.哪个哥们又写死循环了,怎么这么卡
在多用户的操作系统下,会相互影响
3.淘宝在双11的时候,用户量暴增
运维成本过高的问题
4.学习一门技术,学习安装成本过高
关于软件成本过高

相信大家在日常的开发过程中,也没少遇到这样的问题。以上的问题呢,也是我们工作中的一些场景,很是头疼。那么这就有一款神器,docker来帮助我们解决这些问题。

docker 的由来

2010年的时候,有一帮年轻人创业,创办了一家公司,他们是专门做PASS平台的。那时候市场上PASS平台还比较少,这家公司也是混的风生水起。
但是到了2013年的时候,各大公司也都注意到了PASS这块肉,像亚马逊,微软,Google 等都竞相开始做PASS平台,导致这家公司的营业额直线下降,濒临破产。
那么最后呢,创始人一狠心,既然我们干不过他们,那么我们就为人类做做贡献把。说时迟那时快,2013年,这家公司将核心技术对外开源,那么这个核心技术,就是docker。
docker开源之后,立刻获得了一大片追捧。深受资本家的喜爱。
于是乎,到了2014年的时候,得到了C轮的融资,4000w美元
到了2015年的时候,得到了D轮的融资,9500w美元
这不就有钱了嘛?这家公司开始全神贯注的维护docker。

docker的思想

不是说我们很多情况下是因为环境不一致导致的问题嘛,那么好,我们直接将环境打包,这样就不会出现问题了吧。那么将环境打包都会分为几个步骤呢?这就是docker 的思想。
docker将本地环境打包,发布到远程的一个中央大仓库,其他的用户通过docker拿到其他用户发布上去的环境,运行在自己的机器上,这就是docker的思想。

介绍几个概念吧

1.集装箱
会将所有需要的内容放到不同的集装箱中,谁需要这些环境,直接拿这个集装箱就可以了。
2.标准化:
运输的标准化:Docker 有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接指派docker去搬运这个集装箱就可以了。
命令的标准化:Docker提供了一系列的命令,帮助我们去获取集装箱等等操作。
提供了REST的API:衍生出很多的图形化界面 如Rancher
3.隔离性:
Docker在运行的集装箱内的内容时,会在Linux的内核中,单独的开辟一片空间,这片空间不会影响到其他程序。

注册中心:超级码头,上面放的就是集装箱
镜像:集装箱
容器:运行起来的镜像

docker 基本操作

安装docker

那么我们来聊聊docker的基本操作。我们想要使用docker,首先需要下载docker。因为windows操作系统下载docker需要docker专业版,并且安装过程相对比较麻烦,所以说我们在服务器上来使用下,服务器操作系统是CentOS 7,下面附CentOS 7 安装docker的一些操作步骤,这里给出链接,按照步骤一步步来就可以了。在安装docker的过程中可能会遇到一些问题,这里也给出参考链接,如下:

CentOS 7 安装docker

安装好后,我们在控制台输入docker run hello-world,出现如下信息,即为安装成功

Docker的中央仓库

我们上面说到docker的思想,是即可。那么我们从哪里下载docker镜像呢?这里我们推荐三个地址:

1.Docker官方的中央仓库:这个仓库是镜像最全的,但是下载速度较慢,还需要登录,也有可能被墙。
地址: http://hub.docker.com
2.国内的镜像网站:网易蜂巢,daoCloud......
网易蜂巢:也是需要进行登录,操作也比较繁琐一点
地址:http://c.163yun.com/hub#/home
daoCloud:免登陆,国内镜像,下载速度较快,推荐使用
地址:http://hub.daocloud.io
3.在公司内部会采用私服的方式拉取镜像,但是需要添加一些配置

# 需要在/etc/docker/daemon.json
{
  "registry-mirrors":["https://registry.docker-cn.com"],
  "inscure-registries":["ip:port"],
}

# 重启两个服务
systemctl daemon-reload
systemctl restart docker

# 这样我们就在公司内部搭建起来docker的私有中央仓库。具体的一些实践操作,还需要大家来操作哈。

镜像的操作

下面我们开始进行镜像的操作。首先我们回顾下docker的思想:用户上传制作好的镜像,发布到中央仓库,我们从中央仓库下载镜像,运行起来变成一个容器。我们一步步的来。

拉取镜像到本地

docker pull 镜像名称[:tag]

举个例子,我们想从中央仓库拉取tomcat的镜像

  • 输入tomcat 查找
  • 点击版本,找到8.5.14-jre8


  • 点击拉取

  • 复制命令,控制台执行 docker pull daocloud.io/library/tomcat:8.5.14-jre8,控制台显示镜像安装过程

这样我们的镜像就从中央仓库拉取到了我们本地

查看全部本地的镜像

docker images

这里我们可以看到本地的全部镜像,包括tomcat和hello-world

删除本地镜像

docker rmi 镜像的标识

比如说,删除我们刚才下载的tomcat镜像 docker rmi a0

我们在查看下所有镜像


发现tomcat镜像已经被我们从本地删除了

这里我们说下镜像的标识,我们可以看到IMAGE ID这个字段,就是镜像的ID,我们不用全部输入好,只需要前面几位,保证它在我们本地的镜像中是唯一的就好了。

镜像的导入导出

这是一种不规范的行为,但是如果我们遇到外网环境下载,内网环境使用的场景的时候,我们可以采用这种方法。

# 将本地的镜像导出
docker save -o 导出的路径 镜像id
# 加载本地的镜像文件
docker load -i 镜像文件
# 修改镜像名称
docker tag 镜像id 新镜像名称:版本

举个例子,我们将tomcat 镜像导出后再导入到我们本地

  • 拉取tomcat镜像(看上面操作)
  • 查看本地所有镜像,找到tomcat的镜像id


  • 将本地的镜像导出
docker save -o ./tomcat.images a0
  • 删除已有的tomcat 镜像
docker rmi a0
  • 导入制作好的tomcat镜像
docker load -i tomcat.images

我们可以看到,镜像已经成功被我们导入进去了。但是并没有名字和版本号,这里我们修改下

  • 修改名称和版本号
docker tag a0 tomcat:1.0.0

名称已经被我们成功修改过来了

容器的操作

我们来说说容器的操作。老规矩,我们还是来回顾下docker的思想。用户将制作好的镜像发布到中央仓库,我们从中央仓库拉取镜像到本地,运行镜像变成一个容器。
我们运行镜像变成容器后,这个镜像就可以正常的使用了。

运行容器

  • 简单操作
docker run 镜像的标识|镜像名称[:tag]
  • 常用参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]

# -d:代表后台运行容器
# -p:宿主机端口:容器端口:为了映射当前的Linux的端口和容器的端口
# --name 容器名称:指定容器名称

我们直接使用参数来运行起来我们刚才制作的tomcat镜像

docker run -d -p 8081:8080 --name tomcat a0

然后我们通过浏览器访问下tomcat服务 ip:+8081


正常显示出tomcat服务,表示我们的镜像运行成功,变成一个容器

查看正在运行的容器

docker ps [-qa]

# -a:查看全部容器
# -q:只查看容器的标识

我们来看看目前我们正在运行的容器有哪些docker ps

这里我们看到运行中的容器是tomcat,所有的容器还包含我们之前安装docker使用过的hello-world容器

查看容器日志

docker logs -f 容器id
# -f:可以滚动查看日志的最后几行

进入到容器内部

docker exec -it 容器id bash

比如说,我们进入tomcat容器,查看容器内部样子docker exec -it 4d bash

可以看到,docker容器相当于一个小虚拟机,一些详细内容大家自行查阅相关资料,这里就不做介绍了哈~

删除容器

我们在删除容器前,如果这个容器正在运行,需要先停止当前容器

# 停止指定的容器
docker stop 容器id
# 停止所有容器
docker stop $(docker ps -aq)
# 删除指定容器
docker rm 容器id
# 删除所有容器
docker rm $(docker ps -aq)

我们一起来删除下tomcat还有之前的hello-world容器

  • 停止所有容器docker stop $(docker ps -aq)

我们可以看到,这时已经没有正在运行中的容器了,并且我们用浏览器访问也访问不到

  • 删除所有容器 docker rm $(docker ps -aq)

我们可以看到,所有的容器已经全部删除

那么我们想启动停止的容器怎么办呢

docker start 容器id
  • 运行tomcat镜像docker run -d -p 8080:8080 --name tomcat a0
  • 查看当前运行容器docker ps

  • 停止当前运行的容器docker stop ee

  • 启动停止的容器 docker start ee

  • 我们用浏览器访问下: ip:+8080


tomcat容器又重新启动了

docker 应用

现在我们已经掌握了一些基本的docker操作,那就一起来实践一下吧!我们写一个html文件,部署到服务器上运行感受下,这里我们以tomcat为例。

那么tomcat如何部署web应用呢?我们只需要将编写好的index.html文件放在tomcat的webapps目录下即可正常访问。好,我们首先制作一个index.html文件,这里我们用vim 查看下 vim index.html

  • 启动tomcat容器 docker run -d -p 8080:8080 --name tomcat a0

  • 用浏览器访问下可以正常访问

  • 将index.html 文件放到tomcat容器的webapps目录下tomcat目录下
    1.进入tomcat容器 docker exec -it ee bash
    2.新建tomcat目录 mkdir tomcat
    3.从tomcat容器退出 exit
    4.将index.html放入tomcat容器中

docker cp 文件名称 容器id:容器内部路径

docker cp index.html ee:/usr/local/tomcat/webapps/tomcat

现在我们已经可以看到tomcat容器中已经有了我们编写的index.html文件,下面我们访问下把! ip:8080/tomcat

显示成功!

那么我们这么操作会不会很麻烦呢?实际上,我们去进入到容器中,修改容器内部的文件是不规范的,因为当我们删除容器,再次运行时,我们的文件就丢失了,达不到持久化的目的。那怎么办呢?这里介绍一个数据卷的概念。

数据卷

我们将容器内部的一些文件夹或目录,和宿主机进行一个映射,我们在宿主机去做一些操作,容器内部也会同步修改,并且当我们删除容器后,再次运行时,只需要指定数据卷,那么这个容器就又会重新加载我们保留在宿主机上的文件了,达到了持久化的目的。下面我们一起来看下数据卷如何使用把!

创建数据卷
docker volume create 数据卷名称
# 创建数据卷后,默认会存放在一个目录下 /var/lib/docker/volumes/数据卷名称/_data

我们来创建一个tomcat数据卷 docker volume create tomcat

进入目录查看 cd /var/lib/docker/volumes/tomcat/_data

我们可以看到,数据卷已经创建成功,目前是空的,没有任何数据。

查看全部数据卷
docker volume ls

我们可以看到刚才创建的tomcat数据卷

查看某个数据卷的详细信息
docker volume inspect 数据卷名称

我们也可以拿到数据卷存放的目录

删除数据卷
docker volume rm 数据卷名称

我们删除下tomcat数据卷看看

我们可以看到,tomcat数据卷已经全部删除

应用数据卷
# 当你映射数据卷时,如果数据卷不存在,Docker会帮助我们自动创建,会将容器内部自带的文件,存储在默认路径中。
docker run -v 数据卷名称:容器内部路径 镜像id
# 直接指定一个路径作为数据卷的存放位置,这个路径下是空的
docker run -v 路径:容器内部路径 镜像id

下面我们以tomcat为例,分别来看下这两种的效果

  • Docker自动创建数据卷:

1.查看当前所有镜像docker images


2.自动创建数据卷方式,启动tomcat容器

docker run -d -p 8080:8080 --name tomcat -v tomcat:/usr/local/tomcat/webapps a0

我们可以看到,docker为我们自动创建了tomcat数据卷。我们查看下tomcat数据卷信息,进入到目录看下

我们可以看到,tomcat容器的数据已经保存到宿主机上面了

3.将index.html放到tomcat数据卷的tomcat目录中

mkdir tomcat
cp /dev/project/index.html ./tomcat

我们访问下看看

页面正常显示

4.删除tomcat容器,重新启动看页面是否还能正常显示

docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker images
docker run -d -p 8080:8080 --name tomcat -v tomcat:/usr/local/tomcat/webapps a0

我们的页面仍然正常显示。说明数据卷具有持久化容器数据能力

我们来试试第二种,将数据卷保存到自定义路径下

  • 将数据卷保存到自定义路径下
# 我们先根据如下命令删除容器和数据卷
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker volume rm tomcat
# 以自定义路径方式保存数据卷(本地路径只能使用绝对路径)
# 我们在/dev/project 目录下进行
# 在该目录下新建webapps目录
mkdir webapps
docker images
docker run -d -p 8080:8080 --name tomcat -v /dev/project/webapps:/usr/local/tomcat/webapps a0
cd webapps
docker exec -it fe bash
cd webapps

我们可以看到,宿主机的webapps和容器内的webapps都没有文件

我们在宿主机webapps目录下新建ROOT,将index.html复制一份到ROOT目录下

cd /dev/project/webapps
mkdir ROOT
cd ROOT
cp /dev/project/index.html /dev/project/webapps/ROOT

此时我们通过浏览器访问 ip:8080

同样,我们能够正常访问,这也方便我们对容器数据,或者容器日志更好的管理。

docker自定义镜像

下面我们来说说docker自定义镜像。老规矩,我们还是来一起回顾下docker的思想。用户将制作好的镜像发布到中央仓库,我们从中央仓库拿到镜像,运行,变成一个容器。

我们之所以能从中央仓库下载镜像,是因为中央仓库的镜像,也都是用户上传上去的,那么这里我们一起来制作一个自定义镜像。

1.创建一个Dockerfile文件,并且指定自定义镜像信息。
Dockerfile文件中常用的内容:
from:指定当前自定义镜像依赖的环境
copy:将相对路径下的内容复制到自定义镜像中

其他的像workdir cmd run expose等命令在这里就不一一给大家介绍了,下面这个参考链接,可以给大家答案。
Dockerfile文件详解

前面我们演示了使用tomcat部署一个index.html页面,那么我们就制作一个tomcat_index镜像,运行后,我们可以直接访问。一起来看下操作步骤吧。

  • 删除所有镜像和容器
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -aq)
  • 创建Dockerfile文件并编写如下内容

我们是在/dev/project/目录下操作的,我们看下该目录都有什么

  • 打包镜像
docker build -t 镜像名称:[tag] .

我们执行docker build -t tomcat:1.0.0 .

注意最后面还有一个. 这个. 的作用就是指明Dockerfile文件所在目录

我们来看下当前所有镜像docker images

已经有了我们的tomcat镜像,下面我们运行起来看下

docker run -d -p 8080:8080 --name tomcat 66

在浏览器中正常访问。

docker-compose 使用

来,老规矩,我们一起来回顾下docker的思想。用户将制作好的镜像发布到一个中央仓库,我们从中央仓库下载好镜像到我们本地,运行镜像变成一个容器。到此为止呢,其实我们已经掌握了docker的基本用法。但是我们有没有发现一个问题,就是在操作docker的时候,有点繁琐,命令太多。我们能不能实现只编写一次,后面直接使用呢?当然可以,这就是我们的docker-compose。我们先来看下它可以解决什么问题。

之前运行一个镜像,需要添加大量的参数
可以通过docker-compose编写这些参数
docker-compose可以帮助我们批量的管理容器
只需要通过一个docker-compose.yml文件去维护即可

安装docker-compose

我们进入github,输入docker/compose,点击进入

我们点击红框内容,找到发行版本

就拿最新版1.28.2 为例。因为我们是在centos 7环境下,我们选择如下画红框部分,点击下载

下载完毕后,我们通过scp命令发送到centos 7 中。这是一个可执行文件,所以我们需要修改一下权限

# 首先修改下名字
mv docker-compose-Linux-x86_64 docker-compose
chmod 777 docker-compose

# 现在我们已经可以使用docker-compose命令了。为了方便后期操作,配置一个环境变量

# 将docker-compose 文件移动到/usr/local/bin  
mv docker-compose /usr/local/bin
# 修改/etc/profile 文件
vim /etc/profile 

如果没有的话,加上即可。
最后我们应用一下配置文件 source /etc/profile

在任意目录下使用docker-compose

打印出一下信息,说明我们的docker-compose安装完毕

使用docker-compose管理tomcat容器

下面我们就一起来使用docker-compose管理我们的tomcat容器把!

前面提到,使用docker-compose管理我们的容器需要一个docker-compose.yml文件。关于这个文件的配置,这里只做简单的介绍,详细的配置同Dockerfile给出参考链接,大家自行学习哈~

docker-compose.yml 文件详解

我们新建docker-compose.yml文件,编写内容如下:

我们一起来看下docker-compose的一些常用命令把!

在使用docker-compose的命令时,默认会在当前目录下找docker-compose.yml文件
1.基于dockr-compose.yml启动管理的容器
docker-compose up -d
2.关闭并删除容器
docker-compose down
3.开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart
4.查看由docker-compose管理的容器
docker-compose ps
5.查看日志
docker-compose logs -f

我们使用下docker-compose管理tomcat容器
控制台执行docker-compose up -d

我们在浏览器访问下

浏览器能够正常访问。

我们的docker-compose还可以配合Dockerfile来管理自定义镜像,这里我们就不做介绍了,就留给大家去探索吧!

总结

到此为止呢,我们的docker基础教程就结束了。使用docker呢,方便我们安装和管理各种各样的软件,免去了繁琐的配置问题,并且对于我们前端工程师来说,这也是进击大前端和全栈开发的必经之路。

参考链接:
千锋教育-2020版-Docker最新超详细版教程通俗易懂

我是前端dog君,一名95后前端小兵。对前端的热爱,让我们在此相聚,希望这篇文章,能帮助到您,也同时希望能交到志同道合的小伙伴,共同发展,一起进步。我的微信号dm120225,备注简书,期待您的光临。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容