欢迎来到ChAn的博客

光終會灑在小陳身上,小陳也會燦爛一場
扩大
缩小

Docker的实际应用

一、 数据持久化

我们什么情况下要做数据持久化呢? 一定是在做容器之前先预判好哪些文件是要永久存储的,
而不会跟着它容器的一个生命周期而消失。

比如说配置文件、 日志文件、 缓存文件或者应用数据等等。 数据初始化有三种类型。 第一种
volumes, 这个是最推荐的, 也是最好的一种方式。 第二种是 bind—mount, 第三种是 tmpfs。

方式一: volumes

是官方比较推荐也是大型的集群比较常见的一种方式。 可以理解为在自己的宿主机或者云端或者在某一个区域创建一块磁盘专门去存放容器里的数据或文件。 把这个容器里边的数据或者文件还有目录等都规划好, 再去启动容器。 正常在老一些的版本里边首先必须要去创建 volumes,否则是没有办法创建成功的。 新版本好像不写命令也可以创建成功, 具体可以查询官方关于 volumes 的文档

使用:

docker volume create test1
docker run -itd -p 8800:80 -v test1:/usr/share/nginx/html nginx:v1
创建: docker volume create
删除某个卷: docker volume rm 卷名
删除所有未使用的卷: docker volume prune
列出所有卷: docker volume ls
查看某个卷的信息: docker volume inspect 卷名
挂载到容器: -v 或–volume。 如果是 Docker17.06 或更高: 推荐使用–mount。 (同 bind mount)
挂载类型: key 为 type, value 为 bind、 volume 或 tmpfs
挂载源: key 为 source 或 src, 对于命名卷, value 为卷名, 对于匿名卷, 则忽略
容器中的挂载点: key 为 destination、 dst 或 target, value 为容器中的路径
读写类型: value 为 readonly, 没有 key
volume-opt 选项, 可以出现多次。 比如 volume-driver=local,volume-opt=type=nfs,…
第一个域: 对于命名卷, 为卷名; 匿名卷, 则忽略, 此时会创建匿名卷
第二个域: 容器中的挂载点
第三个域: 可选参数, 由’ ,'隔开, 如 ro
-v 或—volume: 由 3 个域组成, ’ :’ 分隔
—mount: 由多个’ ,’ 隔开的键值对组成

方式二: bind—mount

将宿主机中的文件、 目录 mount 到容器上。 质上是宿主机、 container 之间共享宿主机文件系
统。 这种持久化方法更导致 container 与宿主机的耦合过于紧密, 所以不推荐使用。

使用:

docker run -itd -p 8801:80 -v /var/log/cont/apache1:/var/log/httpd/
apache:new2
挂载到容器: -v 或—volume。 如果是 Docker17.06 或更高: 推荐使用—mount。 (同 volume
s)
-v 或–volume: 由 3 个域组成, ’ :'分隔
第一个域: 对于命名卷, 为卷名; 匿名卷, 则忽略, 此时会创建匿名卷
第二个域: 容器中的挂载点
第三个域: 可选参数, 由’ ,'隔开, 如 ro
–mount: 由多个’ ,'隔开的键值对=组成:
挂载类型: key 为 type, value 为 bind、 volume 或 tmpfs
挂载源: key 为 source 或 src, value 为主机中文件或目录的路径
容器中的挂载点: key 为 destination、 dst 或 target, value 为容器中的路径
读写类型: value 为 readonly, 没有 key
bind-propagation 选项: key 为 bind-propagation, value 为 rprivate、 private、 rshared、shared、 rslave 或 slave

方式三: tmpfs

将数据存于宿主机内存中。 docker 可将用户名与密码等敏感数据保存在某个数据库中, 当启动需要访问这些敏感数据的 container 或者 service 时, docker 会在宿主机上创建一个 tmpfs,然后将敏感数据从数据库读出写到 tmpfs 中, 再将 tmpfs mount 到 container 中, 安样能保证数据安全。 当容器停止运行时, 则相应的 tmpfs 也从系统中删除。

docker run -itd --name tmptest --tmpfs /root nginx:latest

二、docker的概述

docker的优点

隔离性:docker每个容器都是相互隔离的,当一个容器出现问题,并不会影响到其他容器。
轻量级:docker基于半解耦 ,有namespace(名称空间)六项隔离。并不是完全型解耦。
部署方便:使用docker部署服务 直接是秒级别的。
快速回滚:docker支持回滚版本。

docker能干嘛

传统虚拟机

虚拟机技术缺点:

1、资源占用十分多,因为传统虚拟机技术是完全虚拟化。
2、冗余步骤多。
3、启动很慢。

容器技术

容器化技术不是模拟一个完整的操作系统,容器都是运行在宿主机的内核,每个容器里面的数据都是隔离的。

比较docker和虚拟机技术不同

传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,探后在这个系统上安装和运行软件。
docker容器内应用直接运行在宿主机的内核,容器是没有自己内核的,也没有虚拟硬件,所以轻便了。
每个容器间都是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响。

应用更快速的交付和部署

传统虚拟机:一堆文档,安装程序
docker:打包镜像发布测试,一键运行

更便捷的升级和扩缩容

服务器A资源不足 ,可以将项目打包成一个镜像,然后放到服务器B上去。

更简单的运维

在容器化之后,我们开发,测试环境都是高度一致的。

更高效的计算资源利用

docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例!服务器的性能可以被压榨到极致。

三、Docker的安装

https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.2cd51b11WkmEUk

docker的组成

镜像(image):

docker镜像就好比是一个模板,可以通过这个模板来创建容器,通过镜像可以创建多个容器(最终服务和项目运行在容器里面)

容器(container):

docker利用容器技术,独立运行一个或一组应用,通过镜像来创建。
可以将容器看做是一个简易的Linux操作系统。

仓库(repository):

仓库就是存放镜像的地方!
仓库分为私有仓库和公有仓库!

四、底层原理

docker是怎么工作的?

docker 是一个 client-server 结构的系统 , docker的守护进程运行在主机上。 通过socket从客户端访问。
docker server 接收到这个 docker-client的指令,就会运行这个命令!

docker为什么比虚拟机快?

1、docker有着比虚拟机更少的抽象层。
2、Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。

案例一

1、查看 busybox 镜像,确保是官方镜像

[root@template ~]# docker search busybox

2、拉取并查看镜像

[root@template ~]# docker pull busybox
[root@template ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      latest    7cfbbec8963d   5 weeks ago   4.86MB
[root@template ~]# docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      latest    7cfbbec8963d   5 weeks ago   4.86MB

3、给镜像创建一个软链接并改名 box:v1 并检查是否成功

[root@template ~]# docker tag busybox:latest box:v1
[root@template ~]# docker tag busybox:latest box:v2
[root@template ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
box          v1        7cfbbec8963d   5 weeks ago   4.86MB
box          v2        7cfbbec8963d   5 weeks ago   4.86MB
busybox      latest    7cfbbec8963d   5 weeks ago   4.86MB

查看 ImageID,如果一样则软连接成功

4、删除 box:v2 镜像

[root@template ~]# docker rmi box:v2

至此, 第一个案例就此完成。

案例二

1、下载 centos:7 镜像。并用该镜像启动容器,命名为 centostest,暴露 6446

宿主机端口, 映射容器内 999 端口

[root@template ~]# docker run -it -d --name centostest -p 6449:999 centos:7

2、查看容器是否启动成功

[root@template ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
busybox      latest    7cfbbec8963d   5 weeks ago     4.86MB
centos       7         eeb6ee3f44bd   19 months ago   204MB
[root@template ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS                                     NAMES
d080931aaf96   centos:7   "/bin/bash"   28 seconds ago   Up 27 seconds   0.0.0.0:6449->999/tcp, :::6449->999/tcp   centostest

3、将宿主机/root/test.txt,复制到容器内/usr/local/

[root@template ~]# touch /root/test.txt
[root@template ~]# docker cp /root/test.txt centostest:/usr/local

4、进入容器查看是否cp过来

[root@template ~]# docker exec -it centostest /bin/bash
[root@d080931aaf96 /]# ll /usr/local/

5、再从该容器内的/root/study.txt 文件复制到宿主机/tmp

[root@d080931aaf96 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  study.txt  sys
[root@d080931aaf96 /]# exit
exit
[root@template ~]# docker cp centostest:/study.txt  /tmp
Successfully copied 1.536kB to /tmp
[root@template ~]# ll /tmp/
total 0
-rw-r--r--. 1 root root 0 Apr 25 20:58 study.txt

6、删除该容器前先停止容器

[root@template ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS                                     NAMES
d080931aaf96   centos:7   "/bin/bash"   11 minutes ago   Up 11 minutes   0.0.0.0:6449->999/tcp, :::6449->999/tcp   centostest
[root@template ~]# docker stop centostest
centostest
[root@template ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
busybox      latest    7cfbbec8963d   5 weeks ago     4.86MB
centos       7         eeb6ee3f44bd   19 months ago   204MB

7、删除容器和镜像

[root@template ~]# docker rmi centos:7
[root@template ~]# docker images
[root@template ~]# docker ps -a

三、 Dockerfile

1.概述

dockerfile 可以理解为一个制作镜像的脚本, 但远没有脚本复杂。 他根据某种格式自定义内容,就可以快速创建出需求的镜像。

docker 容器启动的时候在最上层挂载了一个可写层, 比如说我在容器里面创建一个文件, 这个文件是存放在可写层的, 这时候容器要是销毁了, 那么我们对容器的一些写入操作也就没了,我这个文件也会随着容器销毁而销毁了, 我们要是想要保存我们对容器的一些写入操作的话,可以使用 commit 命令然后将容器制作成一个镜像, 这样下次 run 起来该镜像的时候, 我们之前的写入操作就还存在了。

除了使用 commit 方式制作镜像, 还有一种方式就是编写 Dockerfile 然后使用 build 命令来制作镜像了。

2.Dockerfile 的规则

格式:
指令建议要大写, 内容小写

执行顺序:
docker 是按照 Dockerfile 指令顺序依次执行的, 也就是说从上到下

3.指令

1) FROM: 底层镜像(如系统)
这个 FROM 指令是 dockerfile 的第一个指令, 然后指定了基础镜像, 后面的所有指令都是运行在该基础镜像环境上的 MAINTAINER 该指令是描述的维护者信息。底层的系统镜像用的是什么, 使用 from 指定, 绝大部分情况都用的底层有个系统或者基础的环境用的是什么, 对 docker 不熟练使用 centos 镜像即可。

2) RUN: 构建时容器内运行的命令。
RUN 指令用于在容器中执行命令。 我们常用来安装基础软件。
镜像安装软件依赖包都可以放在 run 中。

3) COPY: 复制 docker 目录中的文件到镜像中。
COPY 指令类似 ADD 指令, 但是 ADD 指令范围更广些, ADD 能够自动解压文件, 能够访问网络资源, 而 COPY 指令做不到。
非目录需要重新指定, 放在目录中非常便利, 属于好的一种习惯, 值得推荐使用目录。

4) ADD: 复制 docker 目录中的文件到镜像中。 (过程可以解压)
ADD 指令是用来将宿主机某个文件或目录放到(复制) 容器某个目录下面。
官方不推荐 ADD,高级复制功能, 需求不精准, 推荐使用 COPY。

5) EXPOSE: 声明开放端口。
EXPOSE 指令用于暴露容器里的端口, 我们在 3.5 里面演示过了, nginx 暴露的端口是 80, 但是启动容器的时候需要指定宿主机端口来映射你暴露的端口。 需要暴露多个端口的话可以使用
多个 EXPOSE, 也可以一个 EXPOSE 指令后面跟多个端口, 端口之间用空格隔开。声明不是变更, 变更使用-p 构建容器时候使用。

6) ENV: 设置环境变量。
ENV 指令是用于设置环境变量的 。
底层环境变量需要需提前设置。

7) CMD: 容器启动时执行的命令, 最多只能执行一条。
CMD 指令是你在容器启动的时候帮你运行的命令, 而 RUN 这个指令是构建镜像的时候帮你运行的命令。
容器启动时执行命令, 最多执行一条。

8) WORKDIR: 声明工作目录。 类似 cd。
WORKDIR 是指下面的指令都在 WORKDIR 指定目录下面工作, 这个与 linux 里面的 cd 差不多。
切换目录使用 WORKDIR。
做容器轻量级最好, 比较小就很好, 使用一条命令就不要使用两天命令。

dockerfile案例

1、用 dockerfile 创建并启动一个 centos 的 apache 镜像。 指定自定义内容

[root@template ~]# mkdir dockerfile
[root@template ~]# cd dockerfile/
[root@template dockerfile]# mkdir apache
[root@template dockerfile]# cd apache/
[root@template apache]# vim dockerfile
[root@template apache]#
[root@template apache]# echo "test page ..." >  index.html

[root@template apache]# cat dockerfile
FROM centos:7
RUN yum -y install httpd
EXPOSE 80
COPY index.html /usr/share/httpd/noindex/index.html
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

2、构建镜像

[root@template apache]# docker build -t apache:v1 .

3、测试

[root@template apache]# docker run  -it -d --name web1 -p345:80  apache:v1
ee9f31c43a84190d3db5dd85d6d53e799c16224eab5ea18ecabc96c411cc4e71
[root@template apache]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                 NAMES
ee9f31c43a84   apache:v1   "/usr/sbin/httpd -D …"   6 seconds ago   Up 6 seconds   0.0.0.0:345->80/tcp, :::345->80/tcp   web1

4、浏览器测试

5、用 dockerfile 创建并启动一个 centos7 的 nginx 镜像

[root@template apache]# cat dockerfile
FROM centos:7
RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum -y install nginx
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
[root@template apache]# docker build -t nginx:v1 .
[root@template apache]# docker run  -itd --name web2 -p 789:80 nginx

构建过程

测试截图

最后放平心态, 为自己赚一个好未来,准备秋招,好好沉淀

posted on 2023-04-25 21:47  ChAnAn  阅读(178)  评论(0编辑  收藏  举报

导航