1、搜索镜像
docker search nginx
建议去docker hub搜索镜像,可以查看对应详细的帮助文档。
2、下载镜像
docker pull nginx
3、运行测试
[root@iZ2ze436suxwekgjxx28iaZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0901fa9da894 7 hours ago 132MB
centos latest 831691599b88 3 weeks ago
[root@iZ2ze436suxwekgjxx28iaZ /]# docker run -d --name nginx01 -p 3344:80 nginx
#说明:
#-d 后台运行;
#-name 给容器命名;
#-p 主机端口:容器内部端口
[root@iZ2ze436suxwekgjxx28iaZ /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95291ebbed54 nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:3344->80/tcp nginx01
[root@iZ2ze436suxwekgjxx28iaZ /]# curl localhost:3344
#显示 Welcome to nginx! 页面
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
docker search portainer
docker pull portainer/portainer
docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
上述命令执行完毕后,远程访问Portainer容器:http://IP:9000
(注意,需要提前打开9000对应地安全组)
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。
**bootfs(boot file system) **——主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ——在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs。
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上创建新的镜像层。在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。
以常用的操作 pull 操作为例,在下载的过程中可以看到 docker 的镜像是在一层一层地下载。
分层结构最大的一个好处就是:可以共享资源。
举个例子:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份 base 镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务。而且镜像的每一层都可以被共享。
特点:Docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层即为通常说的容器曾,容器之下的都叫做镜像层。
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名称:[TAG]
Docker 的理念:
为了实现数据持久化,在 docker 中我们使用容器数据卷技术,讲容器中产生的数据,同步到本地。(目录的挂载,将容器内的目录,挂载到linux上)
总结一句话:容器的持久化和同步操作,同时允许容器间共享数据。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
有两种方式。
即 -v 命令。
docker run -it -v -p 主机目录:容器内目录
[root@iZ2ze436suxwekgjxx28iaZ /]# docker run -it -v /home/ceshi:/home centos /bin/bash
# 查看其挂载信息
[root@iZ2ze436suxwekgjxx28iaZ ceshi]# docker inspect 8bcdefaa0ef1
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi", #主机内地址
"Destination": "/home", #容器地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
至此,指定的主机目录和容器内目录成功绑定在一起,每当在容器内部修改 /home 目录下的文件时,会自动同步到主机的 /home/ceshi 目录。(在主机操作同样也会同步到容器,即反向操作也成立)
实例:MySQL 同步数据:
# 第一步:下载mysql镜像
[root@iZ2ze436suxwekgjxx28iaZ /]# docker pull mysql:5.7
# 第二步,启动mysql容器,利用-v命令进行挂载
[root@iZ2ze436suxwekgjxx28iaZ /]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=931318132 --name mysql01 mysql:5.7
#第三步,利用navicat等软件远程访问3310,并且创建一个test数据库进行测试,发现容器和主机实现了同步
Dockerfile 是用来构建 docker 镜像的构建文件。是一个命令脚本。通过这个脚本可以生成镜像,镜像是一层一层的,对应于脚本的一个一个命令。
1、编写 dockerfile1
vim dockerfile1
#文件内容:
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end---"
CMD /bin/bash
2、构建自己的镜像
docker build -f dockerfile1 -t xingyu/centos .
其中 “volume01”,“volume02” 即为挂载的数据卷(匿名挂载)。
1、匿名挂载:-v 容器内路径
[root@iZ2ze436suxwekgjxx28iaZ /]# docker run -d -v /home/ceshi centos /bin/bash
docker volume ls :可以查看所有的卷的情况。
[root@iZ2ze436suxwekgjxx28iaZ /]# docker volume ls
DRIVER VOLUME NAME
local 9e2d3ea987fffcfd56ff29cb2a9d6d607493c0ebf483dfd5e8e2149c4ea60f51
local 9766f3fd0efda74fa2bdcac6fe09cb2e90846aa33e6208d62d3e7eec6ab8fd07
#如上情况即为匿名挂载,因为-v时只写了容器内路径,未指定容器外路径
2、具名挂载:-v 卷名:容器内路径
[root@iZ2ze436suxwekgjxx28iaZ /]# docker run -d -v haha:/home/ceshi centos /bin/bash
[root@iZ2ze436suxwekgjxx28iaZ /]# docker volume ls
DRIVER VOLUME NAME
local 9e2d3ea987fffcfd56ff29cb2a9d6d607493c0ebf483dfd5e8e2149c4ea60f51
local haha
#查看容器外挂载位置
[root@iZ2ze436suxwekgjxx28iaZ /]#docker volume inspect haha
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/卷名/_data 目录下。
通过具名挂载,可以方便的找到对应的卷,所以建议使用具名挂载。
扩展:可以通过 -v 容器内路径:ro / rw 改变读写权限。其中,ro只读/rw可读可写。一旦设置容器权限,容器对挂载出的内容就有了限制。(只要看到ro,说明这个路径只能通过主机来操作,容器内无法操作)
总结:
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v 主机路径:容器内路径 #指定路径挂载
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享(拷贝的概念),挂载数据卷的容器,称之为数据卷容器。
–volumes-from 命令。
docker run -it --name dc02 --volumes-from dc01 zzyy/centos
容器之间可以配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用它为止。但是一旦持久化到本地,这时本地的数据是不会删除的。
应用:多个 MySQL 实现数据共享。
dockerfile 是用来构建 docker 镜像的文件,命令参数脚本。
构建步骤:
1、编写一个 dockerfile 文件;
2、docker build 构建成为一个镜像;
3、docker run 运行镜像;
4、docker push 发布镜像(dockerhub、阿里云镜像仓库等)。
很多官方镜像都是基础包,很多基础功能都没有,所以通常需要自己来根据需求搭建。
基础知识:
1、每个保留关键字(指令)都必须是大写字母;
2、指令从上到下顺序执行;
3、# 表示注释;
4、每个指令都会创建提交一个新的镜像层。
dockerfile 是面向开发的,以后要发布项目或者做镜像都需要编写 dockerfile 文件。docker 镜像逐渐成为了企业工作交付的标准!