保持了跨环境的统一性和可移植性
不同的应用程序可能会有不同的应用环境,当开发者运用的是Ubuntu系统进行开发的程序,那么centos运行这个程序就相当的麻烦;当两个软件发生冲突的时候,解决方法也很麻烦。所以,docker即解决了跨环境的统一性,又能有效的进行隔离,分开部署同时,开发者可以把开发的程序构建成镜像,那么,只要有docker的机器,就可以利用这个镜像再生成一个容器进行运用。
1.安装docker的先决条件
Docker CE支持64位版本CentOS 7并且要求内核版本不低于3.10。
centos升级内核版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
·官方源
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
·国内源
yum-config-manager \
--add-repo \
https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce
.repo
鉴于国内网络问题,建议使用国内源
·yum直接安装
yum install docker-ce
·脚本自动安装
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
systemctl enable docker #开机自启
systemctl start docker #启动docker-ce
或service docker start
·默认情况下,docker命令会使用Unix socket与Docker引擎通讯。
而只有root用户和docker组的用户才可以访问Docker引擎的Unixsocket。
出于安全考虑,一般系统上不会直接使用 root 用户。
因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
roupadd docker #创建docker组
usermod -aG docker $USER #将用户加入到docker组
docker run hello-world #官方测试镜像hello-world
·鉴于国内网络问题,后续拉取Docker镜像十分缓慢,强烈建议安装Docker之后配置国内镜像加速。
链接: link.
tee -a /etc/sysctl.conf <<-EOF #添加内核参数
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p #重新加载sysctl.conf
·国内从Docker Hub拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker官方和国内很多云服务商都提供了国内加速器服务
·我们以Docker官方加速器https://registry.docker-cn.com为例
CentOS 7
vim /etc/docker/daemon.json #配置加速器地址
{
"registry-mirrors":
[
"https://registry.docker-cn.com"
]
}
systemctl daemon-reload #运用生效
systemctl restart docker #重新启动docker
从Docker镜像仓库获取镜像的命令是docker pull其命令格式为:
docker pull 镜像名称 #例如:docker pull centos7
或
docker pull 仓库名:标签名 #例如:docker pull centos:centos7
docker run
启动交互式容器:
docker run -it centos:centos7 bash #启动centos7
·-it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
·--rm :这个参数是说容器退出后随之将其删除
查看容器内部版本
cat /etc/os-release
退出容器
exit
docker image ls
REPOSITORY:仓库名 TAG:标签 IMAGE ID:镜像ID CREATED:创建时间 SIZE:占用空间大小
docker system df
TYPE:类型 TOTAL:共计 ACTICE:活跃的 SIZE:大小
空镜像:标签为 < none > 的镜像
docker image rm 镜像名/ID
docker exec -it 容器名 bash #以交互式bash命令进入容器
docker attach
docker diff 容器名 #查看容器具体的改动
镜像是一个特殊的文件系统,docker设计时,充分利用Union Fs技术,将其设计为分层存储的架构,镜像只是一个虚拟概念,其实际体现并非由一个文件组成,而是由一组文件系统构成,或者说有多层文件系统联合而成。同时,从左边可以看到,镜像是由一堆只读层叠加到一起组成的。
Dockerfile 定制镜像
docker commit 命令生成镜像
如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。
镜像来源FROM
FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
在 Docker Hub 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,
如 nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat等;
也有一些方便开发、构建、运行各种语言应用的镜像,如node 、 openjdk 、 python 、 ruby 、 golang 等。
可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。
如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,
如 ubuntu 、 debian 、 centos 、 fedora 、 alpine 等,这些操作系统的软件库为我们提供了更广阔的扩展空间。
例如:
FROM centos:centos7
执行命令RUN
RUN 指令是用来执行命令行命令的。由于命令行的强大能力, RUN 指令在定制镜像时是最常用的指令之一。
格式有两种
shell 格式: RUN <命令> ,就像直接在命令行中输入的命令一样。
RUN echo 'Hello, Docker! ’ > /usr/share/nginx/html/index.html
exec 格式: RUN [“可执行文件”, “参数1”, “参数2”] ,这更像是函数调用中的格式。
RUN就像Shell脚本一样可以执行命令,可以像Shell一样把脚本的一条一条命令与RUN一一对应
例如:
RUN yum update
首先,之前所有的命令只有一个目的,就是编译、安装 redis 可执行文件。
因此没有必要建立很多层,这只是一层的事情。
因此,这里没有使用很多个 RUN 对一一对应不同的命令,而是仅仅使用一个 RUN 指令,并使用 && 将各个所需命令串联起来。将之前的 7 层,简化为了1 层。
在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建。
并且,这里为了格式化还进行了换行。
Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,
以及行首 # 进行注释的格式。良好的格式,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯。
此外,还可以看到这一组命令的最后添加了清理工作的命令,删除了为了编译构建所需要的软件,清理了所有下载、展开的文件,
并且还清理了 apt 缓存文件。这是很重要的一步,
镜像是多层存储,每一层的东西并不会在下一层被删除,会一直跟随着镜像。
因此镜像构建时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉。
很多人初学 Docker 制作出了很臃肿的镜像的原因之一,就是忘记了每一层构建的最后一定要清理掉无关文件。
很多运行时不需要的东西,都被装进了镜像里,比如编译环境、更新的软件包等等。
结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。
例如这样:
FROM centos:centos7
RUN yum update \
&& yum install -y vim
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
#例如:docker commit Mariadb1 mariadb:mariadb1
生成仓库名为mariadb标签为mariadb1的镜像
!慎用!docker commit原因
使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。
首先,如果仔细观察之前的 docker diff webserver 的结果,你会发现除了真正想要修改的 /usr/share/nginx/html/index.html 文件外,由于命令的执行,还有很多文件被改动或添加了。
这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。
此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。
而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,
但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。
而且,镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,
换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。
如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿原因
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
一个具有注脚的文本。1
Markdown将文本转换为 HTML。
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
这将产生一个流程图。:
我们依旧会支持flowchart的流程图:
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎