Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。它能大大提高开发、测试、运维人员的工作效率,不用再把时间浪费在环境配置、用户权限等等问题上。
一、Docker的三个概念
1.1、镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个cnetos镜像就是一个包含centos操作系统环境的模板。
1.2、容器(Container):类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。
1.3、仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。
(ps:概念引用笑虎的文章https://zhuanlan.zhihu.com/p/23599229# Docker的安装)
用简单可爱的方式来表述一下就是,镜像是一只鲸鱼,每个仓库就是一个港口,每个容器就是一个集装箱,程序员就是码头工人。码头工人在集装箱(容器)中将程序写好后进行打包,个个容器之间互不影响,码头工人再将集装箱放到鲸鱼身上(镜像),鲸鱼就可以通过各个港口(仓库)环游世界,而且集装箱(容器)里的东西(代码)都是一模一样的不会发生改变。同时鲸鱼可以在各个港口来回快速的游动,保证码头工人的生产效率。
二、Docker的安装
实验环境:centos8
2.1、连接远程服务器后,先将环境内老版本的docker删除,现在的docker引擎被称为docker-ce。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.2、安装yum-utils包
sudo yum install -y yum-utils
2.3、设置稳定存储库
①docker自己有一个存储库,但是速度会比较慢
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
②我们可以使用阿里云的镜像加速器。
2.4、开始安装docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io
2.5、启动 Docker
sudo systemctl start docker
2.6、通过运行hello-world 映像验证 Docker Engine 是否已正确安装。
sudo docker run hello-world
三、Docker拉取nginx
3.1、在仓库中查询nginx镜像
docker search nginx
3.2、下载nginx镜像
docker pull nginx
3.3、通过docker的nginx镜像启动一个简单的nginx服务
docker run -it -d -p 80:80 --name zlx-ngnix nginx
docker run -it -d -p [映射端口] --name [容器名称] nginx[版本(可指定)]
3.4、在云服务器设置安全组,开放端口



3.5、开放好端口后我们就可以来查看页面啦~
在网页输入你的公网IP,例如:8.130.181.50

3.6、通过nginx访问页面
①先来配置一下我们的nginx,新建文件夹,conf和conf.d分别用于保存配置文件,html用于放置静态文件,logs用于保存日志
mkdir -p /home/docker/nginx/conf/conf.d
mkdir -p /home/docker/nginx/html
mkdir -p /home/docker/nginx/logs
②查看我们的docker进程,找到zlx-ngnix容器所对应的ID拷贝
docker ps
③拷贝容器中默认的配置文件
docker cp [容器ID]:/etc/nginx/nginx.conf /home/docker/nginx/conf/nginx.conf
docker cp [容器ID]:/etc/nginx/conf.d /home/docker/nginx/conf
docker cp [容器ID]:/usr/share/nginx/html /home/docker/nginx
④拷贝完之后就停止并删除容器
docker stop [容器ID]
docker rm [容器ID]
⑤启动服务
docker run \
-p 80:80 \
--name zlx-ngnix \
--restart=always \
-v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/docker/nginx/html:/usr/share/nginx/html \
-v /home/docker/nginx/logs:/var/log/nginx \
-d \
nginx
⑥进入容器、容器重启、重新加载
docker exec -it 容器id /bin/bash
docker exec -t 容器id nginx -t
docker exec -t 容器id nginx -s reload
⑦添加一个hello.html文件,并在页面显示hello nginx
cd /home/docker/nginx/html
vim hello.html
⑧查看我们的页面

四、Docker数据管理
docker在容器中管理数据主要有两种方式:
- 数据卷(Volumes)
- 挂载主机目录(Bind mounts)
4.1、数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除Docker中提供了两种挂载方式,-v和-mount
① 创建数据卷
docker volume create mydata
② 查看所有数据卷
docker volume ls
③ 查看数据卷信息

④ 查看数据卷信息
可以看到主机数据卷挂载在/var/lib/docker/volumes/mydata/_data 上 Docker所有的数据卷默认在/var/lib/docker/volumes/ 目录下
docker volume inspect mydata

注:Mountpoint为数据在本机存储的位置,如果磁盘存储空间不足可修改此位置
⑤ 挂载主机目录
//docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer centos
⑥ 进行测试,在容器内进行数据更改是否会影响主机的数据。


4.2、 Dockerfile中设置数据卷
我们可以在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。下面使用Dockerfile构建一个新的镜像,dockerfile1文件的内容,匿名挂载了dataVolumeContainer1和dataVolumeContainer2两个目录:
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,-----OK"
CMD /bin/bash
// 新建一个镜像
docker build -f ./acca_centos -t zlx/centos:1.2 .
// 查询镜像
docker images
//完成镜像的生成后,启动自己生成的容器可以看到自动挂载的数据卷目录。
docker run -it [容器ID]
ls -l
下面查看对应宿主机的数据卷目录
docker inspect [容器ID]
可以看到Mounts下有宿主机的挂载目录。因为dockerfile中没有指定宿主机目录,所以属于匿名挂载,在/var/lib/docker/volumes/目录下生成了随机命名的路径。
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
- ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
- ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
CMD类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
4.3、容器数据卷
容器数据卷是指建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。首先启动容器1,dataVolumeContainer1、dataVolumeContainer2为挂载目录。
[root@dev myDataVolume]# docker run -it --name dc01 zlx/centos
[root@7765508a5b4a /]# ls
bin dataVolumeContainer1 dataVolumeContainer2 dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@7765508a5b4a /]# cd dataVolumeContainer2
[root@7765508a5b4a dataVolumeContainer2]# ls
[root@7765508a5b4a dataVolumeContainer2]# touch dc01_add.txt
然后启动容器2,通过参数--volumes-from,设置容器2和容器1建立数据卷挂载关系。
[root@dev myDataVolume]# docker run -it --name dc02 --volumes-from dc01 zlx/centos
[root@da277b941ec3 /]#
在容器2中的dataVolumeContainer2目录中就可以看到dc01的dc01_add.txt文件
[root@da277b941ec3 /]# cd dataVolumeContainer2
[root@da277b941ec3 dataVolumeContainer2]# ls
dc01_add.txt
[root@da277b941ec3 dataVolumeContainer2]#
五、Docker镜像上传到云端仓库
5.1、我们先进入到阿里云的容器镜像服务

5.2、创建个人实例、镜像仓库、命名空间
成功后会得到一个镜像仓库


5.3、按照操作指南,登录阿里云Docker Registry
docker tag [容器ID] registry.cn-hangzhou.aliyuncs.com/ipseach/acca:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/ipseach/acca:[镜像版本号]
5.4、成功后即可得到一个镜像版本

5.5、通过pull命令又可以拉取到你的镜像了
docker pull registry.cn-hangzhou.aliyuncs.com/ipseach/acca:[镜像版本号]
六、简单介绍K8s的概念及生命周期
k8s的概念:
k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈,例如一个服务器挂了,可以自动将这个服务器上的服务调度到另外一个主机上进行运行,无需进行人工干涉。
k8s的全生命周期管理:
在k8s进行管理应用的时候,基本步骤是:创建集群,部署应用,发布应用,扩展应用,更新应用。