Docker的实际应用

科技资讯 投稿 22900 0 评论

Docker的实际应用

一、 数据持久化

而不会跟着它容器的一个生命周期而消失。

volumes,这个是最推荐的,也是最好的一种方式。 第二种是 bind—mount,第三种是 tmpfs。

方式一: 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

案例一

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

[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.概述

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

2.Dockerfile 的规则

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

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

3.指令

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

RUN 指令用于在容器中执行命令。 我们常用来安装基础软件。
镜像安装软件依赖包都可以放在 run 中。

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

ADD 指令是用来将宿主机某个文件或目录放到(复制) 容器某个目录下面。
官方不推荐 ADD,高级复制功能,需求不精准,推荐使用 COPY。

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

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

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

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

构建过程

测试截图

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

编程笔记 » Docker的实际应用

赞同 (114) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽