Docker入门学习教程
- 0x01 关于Docker 你应该了解的
- 1.1 Docker 解决了什么问题?
- 1.2 Docker 是什么?
- 1.3 为什么不用虚拟机?
- 1.4 虚拟机和Docker 的区别是什么?
- 1.5 Docker, Docker Desktop, Docker Hub , Kubernetes(k8s) 什么关系?
- 1.6 Docker 和image 什么关系?
- 1.7 Docker 适用于什么场景?
- 1.8 Docker 收费还是付费?
- 0x02 Docker Desktop如何安装?
- 0x03 如何使用Docker?
- 0x04 Docker 常用命令
- 4.1 列出下载到本地机器的镜像
- 4.2 列出所有正在运行的容器列表
- 4.3 编译构建Docker 镜像
- 4.4 如何启动一个Docker容器
- 4.5 停止一个Docker容器
- 4.6 查看Docker容器日志
- 4.7 删除一个Docker容器
- 0x05 参考资料
0x01 关于Docker 你应该了解的
1.1 Docker 解决了什么问题?
我们知道当我们开发一个应用程序后发布到生产环境,如果想让它正常运行,往往还需要配置这个应用程序所需要的各种环境,比如安装JRE, 配置环境变量等,而且不同操作系统部署又有些差异,部署成本相对来说比较繁琐。
那么有没有什么比较好的办法呢?
答案是肯定的,那就是使用Docker
1.2 Docker 是什么?
Docker是供开发人员和系统管理员使用容器构建,运行和共享应用程序的平台.
我的理解是:Docker 是一个将应用程序和运行环境一起打包部署的工具库。
1.3 为什么不用虚拟机?
虚拟机(virtual machine)其实也是带环境安装的一种解决方案,但是它和Docker相比起来,所需要的硬件配置更高,而且因为它是一个独立的系统,除了运行你的应用程序,还需要其他一些程序运行来保持操作系统保持正常运行,在加上启动慢的缺点,所以最好的解决方案是使用Docker 而不是虚拟机。
1.4 虚拟机和Docker 的区别是什么?
虚拟机和Docker 的一个很显著的差别是:虚拟机是对整个操作系统的打包,而Docker 只是对所需要的组件进行打包。
左边是Docker ,右边是虚拟机。
Docker 是一个虚拟化软件容器,怎么理解呢?
我觉得我们可以把它当作一个箱子,我们把自己的应用程序和它运行所需要的东西都放到这个箱子里,那么换另一个地方仍然可以正常使用它,而不是再进行各种繁琐的应用程序部署配置。
1.5 Docker, Docker Desktop, Docker Hub , Kubernetes(k8s) 什么关系?
这四者之间有什么关系呢?
如果你足够细心的话,我想你应该可以在Docker 官网提供了两个产品。
一个是Docker Desktop ,另外一个是Docker Hub.
- Docker 是一个软件虚拟化容器,可以将应用程序和运行环境打包发布。
- Docker Desktop 就是一个本地开发工具库,可以帮助我们将应用程序和环境打包,更新,发布。
- Docker Hub 就相当于一个代码仓库,也可以理解为商店,我们的应用程序可以发布到上面,供其他人下载使用。
- Kubernetes 我想可能是音译过来就是K8s ,因此很多人这么简称它,Docker 如果说是一个微服务和运行环境的打包,那么k8s 就是对这些很多打包成Docker 的微服务进行服务编排管理的一个工具
1.6 Docker 和image 什么关系?
- 从根本上讲,一个容器不过是一个正在运行的进程,并对其应用了一些附加的封装功能,以使其与主机和其他容器隔离。
- 容器隔离的最重要方面之一是每个容器都与自己的专用文件系统进行交互。 该文件系统由Docker Image提供。
- image包括运行应用程序所需的一切-代码或二进制文件,运行时,依赖项以及所需的任何其他文件系统对象。
容器理解成一个个隔离进程的箱子,镜像则是将应用程序和运行环境打包的盒子
1.7 Docker 适用于什么场景?
Docker 适用于如下场景:
- 持续构建和持续交付
- 更加自动,轻量,快捷的DevOps(开发和部署)流程
- 弹性云服务的动态扩容与缩容。
- 搭建微服务架构
1.8 Docker 收费还是付费?
打开官网价格页面,我们可以看到这个问题的答案
也就是说,分为两种:
- 个人使用
- 团队使用
如果你是个人,想要免费的话可以使用Docker 开发的基础功能和拥有一个私有仓库,其他发布的Docker 必须是公开的。
如果你想体验更好的服务,比如并行构建和无限制的私有仓库,那么你需要每个月付费7美元。
折合人民币是多少钱呢?如果有兴趣可以看https://www.baidu.com/s?wd=7%E7%BE%8E%E5%85%83
如果你是团队,最低每月7美元起步,具体价格就是越贵,提供服务越好
适用于团队的高级协作和管理工具,包括具有基于角色的访问控制,并行构建和私有存储库的组织和团队管理。
0x02 Docker Desktop如何安装?
- 打开Docker 官网我们可以看到这样的界面
-
点击Download for Mac 即可下载Mac OS X 操作系统上的Docker 安装包
-
点击Download for Windows ,即可下载windows 操作系统上的Docker 安装包。
具体安装的过程,我就不啰嗦了。
0x03 如何使用Docker?
3.1 验证是否安装成功
安装完Docker 要做的第一件事就是验证我们的Docker 有没有安装成功。
验证方法很简单,只需要在我们的命令行中输入如下命令:
docker --version
如果看到类似下面的内容,就说明安装成功了
3.2 如何运行一个Docker 容器
想要运行一个Hello world Docker 容器命令很简单,只需要输入如下命令即可:
命令语法:
docker run 应用程序名称
由于应用程序的名称是hello-world 因此我们输入如下命令:
docker run hello-world
值得注意的是,Docker hub 仓库中存在写好的Hello World 应用程序,如果第一次运行它需要先从Docker hub 仓库中下载到你的电脑里,然后才能运行。
因此我们可能会看到这样的内容
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:ca0eeb6fb05351dfc8759c20733c91def84cb8007aa89a5bf606bc8b315b9fc7
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
如果运行成功可以看到类似下面这样的内容:
3.3 如何编译和运行一个image镜像?
前面步骤我们已经安装了Docker Desktop, 因此现在我们可以用它来开发容器化的应用程序。
通常步骤流程是:
- 创建image 镜像文件,为应用程序的每个组件创建和测试单独的容器。
- 将容器和支持基础结构组装成一个完整的应用程序
- 测试,共享和部署完整的容器化应用程序
3.3.1 使用git 下载一个实例项目
- 假设你的电脑已经安装好了git,那么我们可以选择一个文件夹下,然后执行如下命令下载一个示例项目。
git clone https://github.com/dockersamples/node-bulletin-board
3.3.2 用Dockerfile定义一个容器
编写Dockerfile是容器化应用程序的第一步.
- 下载完成后我们输入如下命令进入这个node-bulletin-board 文件夹
cd node-bulletin-board/
node-bulletin-board项目是一个简单的公告板应用程序,使用Node.js编写。
在此示例中,假设我们编写了此应用,现在正尝试对其进行容器化。
然后再进入bulletin-board-app 文件夹
cd bulletin-board-ap/
接下来我们可以看到这样一个Dockerfile
文件,为了更容易理解,这里图形用户界面展示下
- 使用vi 命令或者文本编辑器打开这个文件
vi Dockerfile
文件内容增加英文注释后如下所示:
# Use the official image as a parent image
FROM node:current-slim
# Set the working directory
WORKDIR /usr/src/app
# Copy the file from your host to your current location
COPY package.json .
# Run the command inside your image filesystem
RUN npm install
# Inform Docker that the container is listening on the specified port at runtime.
EXPOSE 8080
# Run the specified command within the container.
CMD [ "npm", "start" ]
# Copy the rest of your app's source code from your host to your image filesystem.
COPY ..
可能你会好奇这些内容是什么意思呢?
FROM node:current-slim
:这是一个由node.js供应商构建的官方镜像,并已由Docker验证为包含Node.js长期支持(LTS)解释器和基本依赖项的高质量image镜像。WORKDIR
:可以指定所有后续操作均应从镜像文件系统中的/usr/src/app
目录中执行(而不是主机的文件系统中)。COPY
:将文件package.json
从主机复制到镜像中的当前位置,这里会复制到/usr/src/app/package.json
)RUN
: 在镜像文件系统中运行命令npm install
(将读取package.json以确定应用程序的节点依赖性,然后安装它们)COPY
: 将应用的其余源代码从主机复制到镜像文件系统。CMD
指令是在图像中指定一些元数据的第一个示例,该元数据描述了如何基于该图像运行容器。在这种情况下,这就是说该镜像应支持的容器化过程是npm start
。EXPOSE 8080
通知Docker该容器在运行时正在监听8080端口
上面就是一个构建一个Dockerfile 的简单示例,更多用法请参考Dockerfile reference
Dockerfile 文件的编写规则:
始终以FROM命令开头,然后按照步骤构建我们的私有文件系统,并以任何元数据规范作为结束。
3.3.3 构建和测试我们的应用程序
我们需要在node-bulletin-board/bulletin-board-app
目录下执行如下命令:
docker image build -t bulletinboard:1.0 .
执行成功如下所示:
如果能看到Successfully tagged bulletinboard:1.0
说明构建成功了。
3.3.4 将镜像当作一个容器来运行
输入如下命令运行刚才构建的镜像
docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
这里有三个参数
--publish
:要求Docker将主机端口8000上传入的流量转发到容器的端口8080。容器具有自己的专用端口集,因此,如果要从网络访问某个端口,则必须以这种方式将流量转发到该端口。否则,作为默认的安全状态,防火墙规则将阻止所有网络流量到达您的容器.--detach
:要求Docker在后台运行此容器--name
:指定一个应用程序别名,您可以在后续命令中使用该名称来引用我们的容器
另请注意,我们并没有指定要运行容器的进程。 我们不需要这样做,因为在构建Dockerfile时使用了CMD指令; 因此,Docker知道在启动时会自动在容器内运行npm start
进程
3.3.5 访问我们的应用程序
打开网址: http://localhost:8000/
如果成功可以看到如下内容:
3.4 如何分享我们的镜像到Docker Hub?
- 将我们镜像分享到Docker Hub 的,就需要我们注册一个账号。
打开注册地址:https://hub.docker.com/signup
填写注册信息然后通过邮件认证后我们就拥有了一个Docker hub 账号(Docker ID)
-
打开Docker 登陆网址 http://hub.docker.com/sso/start
-
登陆成功后我们可以看到如下内容
登陆成功后我们可以选择创建一个仓库,或者浏览其他官方提供的镜像,比如ningx,mongoDB,Redis 等等。 -
当我们点击Create a Repository 之后可以进入这样的界面
注意的是
- 个人免费版只能使用一个私有仓库,其他必须是公开的,如果想私有化,那么就需要我们每个月付7美元。
- 如果我们想把本地镜像推送到Docker Hub ,那么需要执行如下格式的命令
docker tag local-image:tagname new-repo:tagname
- 执行提交命令
docker push new-repo:tagname
- 相信聪明的你一定发现了,这些流程和Github 上的操作很是类似。
- 接下来我们就把刚才编译构建的应用发布出去
不同人的命令稍微有差异,由于我的情况是这样
因此应该输入如下命令:
docker image tag bulletinboard:1.0 fairyxingyun/my-first-docker-app:1.0
值得注意的上面的绑定规则必须符合
<Docker ID>/<Repository Name>:<tag>
- 将镜像推送到Docker hub
docker image push fairyxingyun/my-first-docker-app:1.0
然后只需要静静等待就可以了。
- 命令执行成功后,我们打开自己的Docker hub 首页
- 点击Public View 按钮,我们就可以看到这样的界面
- 如果别人想使用我们的镜像,那么只需要输入上图中的Docker Pull 命令即可
命令如下:
docker pull fairyxingyun/my-first-docker-app
示例地址:https://hub.docker.com/r/fairyxingyun/my-first-docker-app
0x04 Docker 常用命令
4.1 列出下载到本地机器的镜像
docker image ls
执行效果如下所示:
4.2 列出所有正在运行的容器列表
docker container ls --all
执行效果如下所示:
4.3 编译构建Docker 镜像
打包应用程序到当前位置,需要在编写有Dockerfile 的根目录下,执行如下命令
docker image build -t 应用程序名称:版本号 .
4.4 如何启动一个Docker容器
- 启动一个已存在的Docker 容器的语法
docker container start [containerID]
- 新建方式启动Docker容器的语法
docker container run [containerID]
如果新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。
4.5 停止一个Docker容器
停止一个Docker容器的语法格式:
container stop [containerID]
4.6 查看Docker容器日志
查看一个Docker容器的日志语法格式
docker container logs [containerID]
4.7 删除一个Docker容器
删除一个Docker容器的命令语法:
docker container rm --force [containerID]
--fore
加上这个参数可以删除正在运行的容器。
0x05 参考资料
本篇完~
喜欢我的博文,欢迎点赞关注或转发,感谢你的阅读~
交流即分享,分享才能进步~