Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!

  创作不易,来了的客官点点关注,收藏,订阅一键三连❤  


前言

运维之基础——Linux。我是一个即将毕业的大学生,超超。如果你也在学习Linux,不妨跟着萌新超超一起学习Linux,拿下Linux,一起加油,共同努力,拿到理想offer!


系列文章

Linux进阶 | 2万字总结最详细的Docker的安装、底层隔离机制和简单使用!建议收藏,持续更新❤

Linux | 详解系统监控和常用命令(top free dstat)

Linux | 超超讲解SSH的原理与SSH的实现!建议收藏❤

Linux | 万字总结用户与组的权限那些事儿!建议收藏!


概述

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。本期内容为Docker第二期,通过本期内容将会掌握docker的如何创建容器、容器之间的网络连接、如何实现容器的数据持久化以及volume的使用。


目录

前言

概述

超超Docker学习思维导图

云服务(cloud server)

云计算(cloud computing)

nginx的初探

nginx的安装和web服务的部署

yum方式安装

使用docker启动nginx web服务

容器之间网络连接

容器的数据保存——数据持久化

容器的结构有什么问题?

容器的结构问题如何解决?

容器的数据如何保存?

正常停止容器,容器里的数据会丢失吗?

volume(数据卷)

volume是什么?

volume的常用命令

实现volume挂载的两种方法

方法一:-v

方法二:--mount

练习

练习一:volume练习题

练习二:创建centos和Ubuntu镜像的容器


超超Docker学习思维导图

Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!_第1张图片

Docker思维导图将持续更新,欢迎大家订阅Linux栏目!


云服务(cloud server)

Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!_第2张图片

Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!_第3张图片

Iass(基础设施即服务):给其他个人或企业提供虚拟机(cpu,内存,网卡等)。(卖云服务器)

Pass(平台即服务):云平台对外提供某个软件的服务,例如数据库平台,对外提供数据库服务(卖功能)

Saas(软件即服务):提供一种软件。(卖软件)

Baas:区块链服务


云计算(cloud computing)

Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!_第4张图片

云计算的好处:节约成本,集中力量做事情,集中调度

openstack :开源且免费的云计算软件,将多台服务器的资源整合,然后再分配,分配成一个个虚拟机。

公用云:公开给所有人(个人、企业、等)可以购买并使用的云。例如阿里云、谷歌云、腾讯云。

b2b:business to business 企业和企业之间做业务

b2c:business to sustomer 企业与个人做业务

私有云:只是自己使用,不对外公开的云。例如阿里云,腾讯云,华为云,ucloud,七牛云等。

混合云:一部分是公用云,另外一部分是私有云。不同业务使用不同的云,但是云之间有联系。

云原生:对于k8s而言,k8s是docker,集群容器的编排工具,K8s是用来管理不同机器上的docker容器。


nginx的初探

Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。

其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。


nginx的安装和web服务的部署

yum方式安装

1.yum命令安装

[root@docker ~]# yum install nginx -y

2.执行并查看nginx进程

[root@docker ~]# systemctl start nginx
[root@docker ~]# ps aux|grep nginx
root      347450  0.0  0.0  12324  1056 pts/0    S+   22:59   0:00 grep --color=auto nginx

3.关闭防火墙并设置开机不启动

[root@docker ~]# service firewalld stop

Redirecting to /bin/systemctl stop firewalld.service

[root@docker ~]# systemctl disable firewalld

Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.

Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

[root@docker ~]# getenforce

Enforcing

4.编辑一个网站,编辑好后直接在网站输入IP地址即可进入编辑好的页面

[root@docker ~]# cd /usr/share/nginx/html/

[root@docker html]# vim index.html

[root@docker html]# cat index.html





chaochao





name:chaochao

sex:male

tel:1517388321

reputation [root@docker html]# vim rep.html [root@docker html]# cat rep.html reputation

name:lizhichao

sex:male

tel:1517388321

girl

效果图:

使用docker启动nginx web服务

1.新建一个/web目录存放web有关文件

mkdir  /web

cp /usr/share/nginx/html/*  /web

2.运行命令

命令:

docker run --name sc-nginx-1 -v /web:/usr/share/nginx/html:ro -d -p 8080:80  daocloud.io/nginx

命令行解释:

docker run  --> 启动容器

--name sc-nginx-2  --> 指定容器的名字

-v /web:/usr/share/nginx/html:ro  -->  数据卷: 可以实现宿主机和容器直接的数据共享

/web  --> 是宿主机里的目录,需要自己新建

/usr/share/nginx/html  -->  是容器里的系统的目录的路径

ro  --> 只读

-d  --> deamon,在后台启动一个容器进程 

-p 8080:80 --> 端口的映射:通过iptables的DNAT实现,8080:80 访问宿主机的8080端口,转发到容器里的80端口

daocloud.io/nginx  -->  到daocloud.io网站去下载nginx的镜像,可以直接用nginx镜像

示例:

[root@docker web]# docker run --name chaochao-1 -v /web:/usr/share/nginx/html:ro -d -p 8070:80  daocloud.io/nginx
a7d27274426109a6644991560dd20b2e4ac6bd818b1c80cb20e49e7f008be63f

注:若命令执行失败,需要重新启动docker

[root@sc-docker web]# service docker restart 
Redirecting to /bin/systemctl restart docker.service
#重启 docker 服务 ,会重新去添加docker自定义链在iptables里

容器之间网络连接

作用:网络端口的映射不是唯一的方法使一个container访问另外一个container,容器之间可以使用主机名访问 。但Docker也具有一个linking system,我们可以将多个container连接在一起,相互之间发送连接信息。当container被连接,关于来源container的信息将被发送给接收container。这将是接收信息放能够看到来源container的信息。

命令:docker run -d --name chao-nginx-1 --link chao-redis-1:redis nginx

# 将chao-redis-1这个容器起一个别名叫redis,目的是在chao-nginx-1这个容器的/etc/hosts添加一个解析记录。

[root@docker ~]# docker run -d --name chao-redis-1 -p 6379:6379 redis

4f06900d478807c9839991566051cf25439f9a46d9adcbeb308bed10afed1db0

[root@docker ~]# docker ps

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                           NAMES

4f06900d4788   redis          "docker-entrypoint.s…"   6 seconds ago   Up 3 seconds   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp       chao-redis-1

[root@docker ~]# docker run -d --name chao-nginx-1 --link chao-redis-1:redis nginx

# 查看:

[root@docker ~]# docker exec -it chao-nginx-redis1 /bin/bash

root@7123e3a3b5c1:/# cat /etc/hosts

127.0.0.1        localhost

::1        localhost ip6-localhost ip6-loopback

fe00::0        ip6-localnet

ff00::0        ip6-mcastprefix

ff02::1        ip6-allnodes

ff02::2        ip6-allrouters

172.17.0.7        redis 4f06900d4788 chao-redis-1

172.17.0.8        7123e3a3b5c1

root@7123e3a3b5c1:/#

容器的数据保存——数据持久化

容器的结构有什么问题?

1.关闭或重启容器,该容器的数据不会被影响,但是删除该容器,数据就会丢失,因为容器的数据是不会影响到镜像
2.存在于联合文件系统中,不易于宿主机的访问
3.容器间数据共享不方便

容器的结构问题如何解决?

实现数据持久化,将容器的数据保存到磁盘中

容器的数据如何保存?

启动Docker时发现存储目录依旧是/var/lib/docker,但是实际上是存储在数据盘(volume)的,你可以在数据盘上看到容量变化。

正常停止容器,容器里的数据会丢失吗?

不会。会保存到/var/lib/docker/volumes/。

volume(数据卷)

volume是什么?

Docker Volume,通常翻译为数据卷,用于保存持久化数据。当我们将数据库例如MySQL运行在Docker容器中时,一般将数据通过Docker Volume保存在主机上,这样即使删除MySQL容器,数据依然保存在主机上,有效保证了数据的安全性。这篇博客将通过简单的实践帮助大家理解什么是Docker Volume。

volume的常用命令

查看volume: docker volume ls

查看卷的详细信息:docker volume inspect 数据卷名

新建volume: docker volume create chaochao

示例:

[root@docker web]# docker volume ls

DRIVER    VOLUME NAME

local     1845f87e990a3184728530d26a7b0d2c273c1de20ac3c88ff0e37d13e7f0a54c

[root@docker web]# docker volume create chaochao

chaochao

[root@docker web]# docker volume ls

DRIVER    VOLUME NAME

local     1845f87e990a3184728530d26a7b0d2c273c1de20ac3c88ff0e37d13e7f0a54c

local     chaochao

[root@docker web]# docker volume inspect chaochao

[

    {

        "CreatedAt": "2021-08-12T22:33:25+08:00",

        "Driver": "local",

        "Labels": {},

        "Mountpoint": "/var/lib/docker/volumes/chaochao/_data",

        "Name": "chaochao",

        "Options": {},

        "Scope": "local"

    }

实现volume挂载的两种方法

方法一:-v

[root@docker web]# docker run -d --name xuzz-3  -v chaochao:/usr/share/nginx/html nginx

58d99df640b7662f4ff625e7cde9d0e7f40250992f8fd1ad39bc48aeca162ddb

# 需要80端口才可以访问web服务,chaochao是创建的volume

效果:

Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!_第5张图片

方法二:--mount

[root@docker web]# docker run -d --name lizhichao-nginx --mount source=chaochao,target=/usr/share/nginx/html/ -p 8060:80 nginx:latest

2710b596777b80fc9755a43a4070494b6fb7d682a2fa895a91d690e63bfed04d

[root@docker web]# cd /var/lib/docker/volumes/

[root@docker volumes]# ls

1845f87e990a3184728530d26a7b0d2c273c1de20ac3c88ff0e37d13e7f0a54c  chaochao

backingFsBlockDev                                                 metadata.db

[root@docker volumes]# cd chaochao/

[root@docker chaochao]# ls

_data

[root@docker chaochao]# cd _data/

[root@docker _data]# cp /web/* . 

cp:是否覆盖'./index.html'? y

[root@docker _data]# ls

1.jpg  50x.html  index.html  rep.html

效果图:

Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!_第6张图片

练习

练习一:volume练习题

1.创建一个卷,在卷里创建一个index.html首页文件,内容welcome to chaochao

2.创建2个容器名字自己定义:rose-1 rose-2,启动nginx,使用新建卷

3.测试访问

[root@docker ~]# docker volume ls

DRIVER    VOLUME NAME

local     1845f87e990a3184728530d26a7b0d2c273c1de20ac3c88ff0e37d13e7f0a54c

local     chaochao

[root@docker ~]# docker volume create lizhichao

lizhichao

[root@docker ~]# docker volume ls

DRIVER    VOLUME NAME

local     1845f87e990a3184728530d26a7b0d2c273c1de20ac3c88ff0e37d13e7f0a54c

local     chaochao

local     lizhichao

[root@docker ~]# docker volume inspect lizhichao

[

    {

        "CreatedAt": "2021-08-12T23:08:58+08:00",

        "Driver": "local",

        "Labels": {},

        "Mountpoint": "/var/lib/docker/volumes/lizhichao/_data",

        "Name": "lizhichao",

        "Options": {},

        "Scope": "local"

    }

]

[root@docker ~]# cd /var/lib/docker/volumes/lizhichao/_data

[root@docker _data]# ls

[root@docker _data]# vim index.html

[root@docker _data]# ls

index.html

[root@docker _data]# docker run -d --name chao-nginx1 -p 8001:80 --mount source=lizhichao,target=/usr/share/nginx/html/ nginx:latest

e88ca98c52cb0e4c1c51771dc70de93f8958387c3067dd0fbb0cfd5fecb71f6b

[root@docker _data]# docker run -d --name chao-nginx2 -p 8002:80 --mount source=lizhichao,target=/usr/share/nginx/html/ nginx:latest

4cb9497e4b830a0eec6406d5be362adaf643982dc16a9cbcb68781b7d746bef2

测试效果:

Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!_第7张图片

Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!_第8张图片

练习二:创建centos和Ubuntu镜像的容器

1.拉取centos:7和Ubuntu的镜像,并进入其中一个镜像创建的容器

2.在里面安装软件 tree,nginx

3.镜像导出

4.在另外一台机器里导入

centos7

[root@docker ~]# docker pull centos/python-35-centos7 #下载centos7镜像

在容器内自己安装镜像:

[root@docker ~]# docker run -it -d --name lizhichao -p 8880:66 centos:7  #-p 做端口映射的时候,其实背后就是在iptables里添加DNAT和SNAT策略

Unable to find image 'centos:7' locally

7: Pulling from library/centos

2d473b07cdd5: Pull complete

Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e

Status: Downloaded newer image for centos:7

67b50ec7b21b899725a05c5fab60106dfc2cdb4239db7a92a0addd1c5e6d9389

[root@docker ~]# docker ps

CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS                                   NAMES

67b50ec7b21b   centos:7   "/bin/bash"   24 seconds ago   Up 20 seconds   0.0.0.0:8880->66/tcp, :::8880->66/tcp   lizhichao

进入交互式环境:

[root@docker ~]# docker exec -it lizhichao /bin/bash

[root@67b50ec7b21b /]# hostname

67b50ec7b21b

[root@67b50ec7b21b /]# yum install tree -y

Loaded plugins: fastestmirror, ovl

Determining fastest mirrors

Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container error was

连不上网,下载不了,怎么办?解决步骤如下!

[root@docker ~]# echo 1 >/proc/sys/net/ipv4/ip_forward

[root@docker ~]# service docker restart

Redirecting to /bin/systemctl restart docker.service

接着作答:

[root@docker ~]# docker run -it -d --name lizhichao2 -p 8888:68 centos:7 

5f13988c81497674e2d8c8c7fe52ceec66e99b6ca6d9054372ce9fef452355ca

 # 在centos7镜像创建lizhichao2容器

[root@docker ~]# docker ps

CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS                                   NAMES

5f13988c8149   centos:7   "/bin/bash"   5 seconds ago   Up 3 seconds   0.0.0.0:8888->68/tcp, :::8888->68/tcp   lizhichao2

[root@docker ~]# docker exec -it lizhichao2 /bin/bash  # 进入容器

[root@5f13988c8149 /]# hostname

5f13988c8149

[root@5f13988c8149 /]# ping www.baidu.com #检查是否能上网

PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.

64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=127 time=28.9 ms

64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=127 time=28.0 ms

^C

--- www.a.shifen.com ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1004ms

rtt min/avg/max/mdev = 28.010/28.490/28.971/0.509 ms

[root@5f13988c8149 /]# yum install tree vim -y 下载tree、vim包

[root@5f13988c8149 /]# vim chaochao.sh

[root@5f13988c8149 /]# bash chaochao.sh  # 检验是否成功

i am chaochao

ubuntu:

lizhichao@chaochao:~$ sudo docker pull ubuntu #拉去Ubuntu镜像

lizhichao@chaochao:~$ sudo docker run -it --name ubuntu-chaochao-1 -d ubuntu  #创建一个容器并进入交互环境

d21b0ebe1fd336a346da6fdf47dd1dbc1f12f1c1a6c0585455ca6135c89fe46e

lizhichao@chaochao:~$ hostname

chaochao

lizhichao@chaochao:~$ sudo docker exec -it ubuntu-chaochao-1 /bin/bash #进入新建容器的交互式环境

root@d21b0ebe1fd3:/# hostname

d21b0ebe1fd3

root@d21b0ebe1fd3:/# cat /etc/issue

Ubuntu 20.04.2 LTS \n \l

ubuntu导出:

lizhichao@chaochao:~$ sudo scp ubuntu-chao.tar [email protected]:/root  #scp传递到另外一台服务器上

The authenticity of host '192.168.232.132 (192.168.232.132)' can't be established.

ECDSA key fingerprint is SHA256:H9UmgdDuOZykWs7ysydLjxzCS2tyNNrbylAGIa6pBgc.

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Warning: Permanently added '192.168.232.132' (ECDSA) to the list of known hosts.

[email protected]'s password:

ubuntu-chao.tar                                                                    100%   72MB  44.0MB/s   00:01 

在centos上面查看并接收:

[root@docker ~]# cd /root

[root@docker ~]# ls

anaconda-ks.cfg  ubuntu-chao.tar

[root@docker ~]# docker load -i ubuntu-chao.tar

7555a8182c42: Loading layer [==================================================>]  75.16MB/75.16MB

Loaded image: ubuntu:lates

创作不易,客官点个赞,评论一下吧!超超和你一起加油❤

你可能感兴趣的:(Linux,docker,运维,nginx,volume,云原生)