Linux云计算架构-部署docker容器虚拟化平台(1)

Linux云计算架构-部署Docker容器虚拟化平台(1)

1. Docker概述

Docker 是一个开源的应用容器引擎,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统。

Docker 是 dotCloud 公司开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于 go语言并遵从 Apache2.0 协议开源。

LXC(Linux Container),即Linux容器技术,是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。主要通过kernel的namespace实现每个用户实例之间的相互隔离。通过cgroups实现对资源的配额和度量。

Docker的宗旨: docker镜像一次构建,到处运行。

Docker官网https://www.docker.com/

在这里插入图片描述

docker服务器可看作是鲸鱼,container容器可看作鲸鱼上的集装箱。

docker容器和虚拟机都是虚拟化技术,docker不涉及Hypervisor虚拟机,所以docker效率比虚拟机高。 启动一个docker实例大概1-2秒。

虚拟机技术:
在这里插入图片描述
docker容器技术:
在这里插入图片描述

2. Docker架构

2.1 Docker工作原理

在这里插入图片描述

2.2 Docker核心技术

技术1:namespace【实现container的进程、网络、消息、文件系统、主机名的隔离】

技术2:cgroup【实现对资源的配额和度量,如分配cpu和内存】

特点:
文件系统隔离:每个进程容器运行在一个完全独立的根文件系统中
网络隔离:每个进程容器拥有自己的网络、虚拟接口、IP地址
日志隔离:docker会收集和记录每个进程容器的标准流,用于实时检索和批量检索。
变更管理:容器文件系统的变更可以提交到新的镜像,可重复使用以创建更多的容器。
资源隔离:系统资源按需分配,相互隔离。用cgroup配置
交互式shell:docker可以分配一个虚拟终端并关联到任何容器的标准输入流上
优点:
1、比vm小,比vm快,启动一个容器实例只需1-2秒
2、docker是一个开放的平台,用于构建、发布、运行分布式应用程序。
3、可在公司局域网、云、虚拟机上使用docker
4、开发人员不用关心应用程序使用的是哪个操作系统
5、可在Unix/Linux、Windows、Mac等操作系统上使用docker
缺点:
1、docker用于应用程序时最有用,但不包括数据。日志、跟踪、数据库是放到docker容器外的。一个容器的镜像往往很小,不适合存大量数据,存储可以通过外部挂载来实现。【docker只用于计算,存储交给别人】
2、mysql和oracle数据库就不适合用docker来运行,存储数据太多。

3. Docker部署

老名字:docker、docker-engine【yum install docker】【yum install docker-engine】

新名字:docker-ce(开源)、docker-ee(闭源)

安装docker:

# 安装docker环境依赖
[root@server ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

# 配置国内docker的yum源,这里使用aliyun的
官方源:https://download.docker.com/linux/centos/docker-ce.repo
阿里源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清华源:https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

# 安装docker
[root@server ~]# yum install docker-ce docker-ce-cli containerd.io -y

# 启动并开机自启
[root@server ~]# systemctl start docker && systemctl enable docker

# 查看docker的版本信息、系统信息(容器和镜像个数)
[root@server ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 17:03:45 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.13
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       4484c46d9d
  Built:            Wed Sep 16 17:02:21 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.3.7
  GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

[root@server ~]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 0    -- 容器个数
  Running: 0      -- 运行的容器个数
  Paused: 0       -- 终止的容器个数
  Stopped: 0      -- 停止的容器个数
 Images: 0        -- 镜像个数
 Server Version: 19.03.13

docker的简单使用:拉取镜像
在这里插入图片描述

# docker的使用
# 搜索image,OFFICIAL为OK才是安全可用的。
[root@server ~]# docker search centos

# 从docker hub上下载image到docker服务器
[root@server ~]# docker pull centos
=================================================================
pull的四种方法:
法1:使用阿里云docker镜像加速器,提升pull的速度
创建配置文件 /etc/docker/daemon.json【推荐使用】
{
    
    "registry-mirrors": ["https://e9yneuy4.mirror.aliyuncs.com"] }
修改docker服务启动脚本【不推荐使用】
# 重新加载systemd服务脚本
systemctl daemon-reload
# 重启docker服务
systemctl restart docker

法2:使用网易镜像https://c.163.com/hub#/m/home/

法3:将image导入容器 
docker load -i /root/docker.io-centos-lastest-image.tar

法4:下载其他站点的应用程序
docker pull hub.c.163.com/library/tomcat:latest
=================================================================
# 列出本地所有镜像,通过info可以看到有一个镜像,通过images可以看到具体是哪个镜像。
[root@server ~]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 1
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0d120b6ccaa8        8 weeks ago         215MB

# 删除镜像前必须删除使用该镜像创建的容器,否则只会删除镜像的TAG
[root@server ~]# docker rmi 0d120b6ccaa8

docker镜像包括程序以及程序依赖的库或二进制文件。

# 开启NAT网络转发功能
[root@server ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@server ~]# sysctl -p    # NAT立即生效
net.ipv4.ip_forward = 1
[root@server ~]# cat /proc/sys/net/ipv4/ip_forward
1

# 启动docker实例
[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0d120b6ccaa8        8 weeks ago         215MB
[root@server ~]# docker run -it centos:latest /bin/bash
# 新开一个终端查看正在运行的docker容器,可以看到有一个容器实例正在运行。
[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
19c2d3353908        centos:latest       "/bin/bash"         16 seconds ago      Up 15 seconds                           elastic_proskuriakova

# 关闭firewalld防火墙后,需重启docker服务,否则ip包转发功能无法使用。
[root@server ~]# systemctl stop firewalld
[root@server ~]# systemctl restart docker

4. Docker容器虚拟化平台的使用

运行命令 含义
docker images 查看有什么docker镜像
docker run -it centos:latest bash 运行一个容器,并加载镜像centos,启动一个docker实例环境,在实例中执行bash命令
exit 退出实例环境
参数 含义
-i 以交互模式运行容器,通常与-t同时使用
-t 为容器重新分配一个伪输出终端,通常与-i同时使用。
-d 后台运行容器,并返回容器ID
-c 后面跟待完成的命令
docker logs 容器ID|容器短ID 从一个容器中获取日志,查看输出的内容,可用于后期检查docker实例在标准输出中弹出的错误信息或正常的信息。
docker ps 列出所有运行中的容器
docker ps -a 列出所有容器,包括沉睡或退出状态的容器。
kill 杀死一个容器
run 创建并运行一个容器实例
stop 停止实例
start 启动实例
restart 重启实例
docker exec -it 容器名|容器ID /bin/bash 进入容器
rm 删除实例,前提是实例已停止
rm -f 强制删除,可以是正在运行的实例。

实战演练:

# 后台运行一个容器实例,并在容器中的终端执行命令df -h,返回值是容器ID
[root@server ~]# docker run -d centos:latest /bin/bash -c "df -h"
3e5930e087a17e6f11298a1786844da22facb390e90115d7a8ff57cce0b33a09
[root@server ~]# docker logs 3e59
Filesystem                      Size  Used Avail Use% Mounted on
overlay                          17G  6.1G   11G  36% /
tmpfs                            64M     0   64M   0% /dev
tmpfs                           910M     0  910M   0% /sys/fs/cgroup
shm                              64M     0   64M   0% /dev/shm
/dev/mapper/centos_master-root   17G  6.1G   11G  36% /etc/hosts
tmpfs                           910M     0  910M   0% /proc/acpi
tmpfs                           910M     0  910M   0% /proc/scsi
tmpfs                           910M     0  910M   0% /sys/firmware
# 启动一个容器实例
[root@server ~]# docker run -it centos:latest /bin/bash
[root@397d90de57b3 /]# 
# 新开一个终端,杀死启动的容器实例
[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
397d90de57b3        centos:latest       "/bin/bash"         37 seconds ago      Up 36 seconds                           recursing_jepsen
[root@server ~]# docker kill 397d90de57b3
397d90de57b3
# 启动一个容器实例
[root@server ~]# docker run -it centos:latest /bin/bash
# 新开终端
[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
21a11864b0ad        centos:latest       "/bin/bash"         13 seconds ago      Up 12 seconds                           sad_albattani
[root@server ~]# docker stop 21a11864b0ad
21a11864b0ad
[root@server ~]# docker start 21a11864b0ad
21a11864b0ad
[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
21a11864b0ad        centos:latest       "/bin/bash"         56 seconds ago      Up 17 seconds                           sad_albattani
# 进入容器
[root@server ~]# docker exec -it 21a11864b0ad /bin/bash
[root@21a11864b0ad /]# 
# 查看所有的容器
[root@server ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
21a11864b0ad        centos:latest       "/bin/bash"              2 hours ago         Up 2 hours                                   sad_albattani
3e5930e087a1        centos:latest       "/bin/bash -c 'df -h'"   3 hours ago         Exited (0) 3 hours ago                       gracious_aryabhata
# 进入到某个容器
[root@server ~]# docker exec -it 21a11864b0ad /bin/bash
# 删除某个容器
[root@server ~]# docker rm 3e
3e
[root@server ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
21a11864b0ad        centos:latest       "/bin/bash"         3 hours ago         Up 3 hours                              sad_albattani

5. Docker制作镜像

安装apache服务:

[root@21a11864b0ad /]# cat /etc/redhat-release 
CentOS Linux release 8.2.2004 (Core) 
[root@21a11864b0ad /]# yum install -y httpd

为了把容器的当前状态保存下来,可以将当前容器制作成镜像。

Docker Image 的制作两种方法:
#保存container的当前状态到image后,然后生成对应的image【快照】
方法 1:docker commit 容器ID 新镜像名[repository:tag]
[root@server ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
21a11864b0ad        centos:latest       "/bin/bash"         3 hours ago         Up 3 hours                              sad_albattani
[root@server ~]# docker commit 21a11864b0ad centos:httpd
sha256:a1b9cc833f6c02944fdd0a4021179bbe4ce28008ddc46d0d4852e3c9e65991bb
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              httpd               a1b9cc833f6c        9 seconds ago       254MB
centos              latest              0d120b6ccaa8        8 weeks ago         215MB

#使用Dockerfile文件自动化制作image
方法 2:docker build    

方法2具体实现:

1. 创建工作目录和Dockerfile文件
[root@server ~]# mkdir /opt/docker
[root@server ~]# cd /opt/docker/
[root@server docker]# touch Dockerfile

2. 编辑Dockerfile
[root@server docker]# vim Dockerfile
FROM centos:latest        # 基于哪个镜像制作镜像
MAINTAINER <[email protected]>   # 镜像创建者
RUN yum install -y httpd
ADD start.sh /usr/local/bin/start.sh    # 本地文件替换容器内的对应路径中的文件
ADD index.html /var/www/html/index.html
CMD /usr/local/bin/start.sh             # 终端执行脚本,一个Dockerfile文件中仅有一个CMD语句,存在多个时最后一个有效。

3. 创建start.sh启动脚本启动apache服务和apache首页index.html文件
root@server docker]# echo "/usr/sbin/httpd" > start.sh
[root@server docker]# chmod a+x start.sh
[root@server docker]# echo "docker image apache" > index.html

4. 使用build命令创建新的镜像
docker build -t 原镜像名[repository:tag] ./
[root@server docker]# docker build -t centos:httpd ./

5. 查看镜像
[root@server docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              httpd               1e0cccb31310        10 seconds ago      254MB
centos              latest              0d120b6ccaa8        8 weeks ago         215MB

6. Docker的发布

两种发布docker 镜像的方法:
①save image to tarball

docker save -o tar包名 镜像名[repository:tag]  # 导出
docker load -i tar包名    #导入

# 导出镜像
[root@server ~]# docker save -o docker-centos-httpd.tar.gz centos:httpd
[root@server ~]# ll docker-centos-httpd.tar.gz 
-rw------- 1 root root 262351872 10月  8 13:07 docker-centos-httpd.tar.gz

# 导入镜像
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              httpd               1e0cccb31310        6 minutes ago       254MB
centos              latest              0d120b6ccaa8        8 weeks ago         215MB
[root@server ~]# docker rmi centos:httpd
Untagged: centos:httpd
Deleted: sha256:1e0cccb3131058019c071b7c93f69c149482fa9cf1f0332a25b8c6711c4da94a
Deleted: sha256:ac16f03b97984ee900ef5d031f164cfaeaa6cd8dc019ce72cc959dff632501a8
Deleted: sha256:c9abe0f55ae1426a5e07f09cd9dc7ed854fe9811463871408c7c96c23160a4e2
Deleted: sha256:8764928fbf45abca97f14c34ef943767a5c9501f8e4711bd3a14c8e08b319934
Deleted: sha256:6560e60c44efb0f75384dce5c108bbe657268454aed3931f0e65c42f620e2294
Deleted: sha256:6201f9e06a0712f85fb608bcf920f6faaeb90fafa715f5de45e037f7d1e38805
Deleted: sha256:8735743637ddd6750349b5cf46d4e09663979b0f5bf9d25ceda53d865b8f55b0
Deleted: sha256:986b70081cb31f68b2aa7d32129bdb9babbc4ca2f0a55ecae18c7463bedbc206
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0d120b6ccaa8        8 weeks ago         215MB
[root@server ~]# docker load -i docker-centos-httpd.tar.gz 
45dcccff5e24: Loading layer  39.97MB/39.97MB
4d2bed0847aa: Loading layer  3.584kB/3.584kB
78d2cfc17a25: Loading layer  3.584kB/3.584kB
Loaded image: centos:httpd
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              httpd               1e0cccb31310        7 minutes ago       254MB
centos              latest              0d120b6ccaa8        8 weeks ago         215MB

②push image to docker hub

1. 注册账号:https://hub.docker.com/
2. 标记本地镜像,将其归入某一仓库。
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              httpd               b5c91959b65d        About an hour ago   254MB
centos              latest              0d120b6ccaa8        8 weeks ago         215MB
[root@server ~]# docker tag centos:httpd abong123/centos:httpd    # 为镜像分类,仍为同一镜像。
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
abong123/centos     httpd               b5c91959b65d        About an hour ago   254MB
centos              httpd               b5c91959b65d        About an hour ago   254MB
centos              latest              0d120b6ccaa8        8 weeks ago         215MB
3. 登录到docker hub
[root@server ~]# docker login -u abong123 -p123456
4. 上传镜像
[root@server ~]# docker push abong123/centos:httpd
5. 删除centos:httpd镜像
[root@server ~]# docker rmi abong123/centos:httpd
Untagged: abong123/centos:httpd
Untagged: abong123/centos@sha256:64b4e1a73d1bb959e222a6098bf45cec472b23a0b95be779a9f427168b8eb3bb
6. 下载镜像
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              httpd               b5c91959b65d        2 hours ago         254MB
centos              latest              0d120b6ccaa8        8 weeks ago         215MB
[root@server ~]# docker pull abong123/centos:httpd
httpd: Pulling from abong123/centos
Digest: sha256:64b4e1a73d1bb959e222a6098bf45cec472b23a0b95be779a9f427168b8eb3bb
Status: Downloaded newer image for abong123/centos:httpd
docker.io/abong123/centos:httpd
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
abong123/centos     httpd               b5c91959b65d        2 hours ago         254MB
centos              httpd               b5c91959b65d        2 hours ago         254MB
centos              latest              0d120b6ccaa8        8 weeks ago         215MB

7. Container容器端口映射

容器端口映射原理:运行容器的应用占用某个端口号,通过NAT网络地址转换,映射到docker服务器上的某个未使用的端口号上,然后就可以通过访问docker服务器地址以及端口号,访问到容器中的应用的内容。

启动container容器并进行端口映射:

# -p 物理机80端口:容器实例的80端口
# 把容器中的80端口号映射到物理机的80端口上,这样可以使得容器中的内容可以外部访问。
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              httpd               b5c91959b65d        32 minutes ago      254MB
centos              latest              0d120b6ccaa8        8 weeks ago         215MB
[root@server ~]# docker run -it -p 80:80 centos:httpd
[root@f4ad69e99787 /]# netstat -antup |grep 80
bash: netstat: command not found
[root@f4ad69e99787 /]# ifconfig
bash: ifconfig: command not found
[root@f4ad69e99787 /]# yum install net-tools -y    # 安装网络软件包
[root@f4ad69e99787 /]# netstat -antup | grep 80
[root@f4ad69e99787 /]# /usr/sbin/httpd 
[root@f4ad69e99787 /]# netstat -antup | grep 80      # docker容器要正常监听80端口号
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      29/httpd   
[root@f4ad69e99787 /]# vi /etc/httpd/conf/httpd.conf 
     98 ServerName localhost:80
[root@2531def57c03 /]# exit
exit
[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@server ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                           PORTS               NAMES
f4ad69e99787        centos:httpd        "/bin/bash"         8 minutes ago       Exited (0) 10 seconds ago                            xenodochial_chandrasekhar
21a11864b0ad        centos:latest       "/bin/bash"         13 hours ago        Exited (255) About an hour ago                       sad_albattani
[root@server ~]# docker start f4ad69e99787
f4ad69e99787
[root@server ~]# docker ps    # 容器要正常运行
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
f4ad69e99787        centos:httpd        "/bin/bash"         8 minutes ago       Up 2 seconds        0.0.0.0:80->80/tcp   xenodochial_chandrasekhar

[root@server ~]# netstat -antup | grep 80           # docker服务器上的80端口号被占用     
tcp6       0      0 :::80                   :::*                    LISTEN      27806/docker-proxy  

访问docker服务器地址http://192.168.43.178/

在这里插入图片描述
若是无法正常打开物理机地址,可以检查以下内容
①物理机的80端口号是否允许外部访问,即防火墙是否开放80端口号。
②物理界的80端口号是否被其他应用占用。
③容器的80端口号是否被占用以及apache服务是否开启
④是否开启NAT网络转发功能,可用命令cat /proc/sys/net/ipv4/ip_forward查看,结果是1即开启。
⑤容器是否正常运行,可用docker ps查看

进入正在运行的容器实例:

# 进入容器
docker exec -it 容器名|容器ID /bin/bash

查看容器的网络:

# 进入容器中,安装net-tools包
[root@d0d20c406c83 ~]# yum install net-tools -y
[root@d0d20c406c83 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 163  bytes 343276 (335.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 124  bytes 8554 (8.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

8. 学习心得(1)

docker容器的学习,可以把镜像(image)看作是一个模板,存放在模板库(docker hub)中,我们应该从模板库中拉取(pull)一个模板,然后使用该模板创建一个容器实例(container)。这时,这个容器实例就是我们用来运行应用或服务的载体。容器可以创建运行(run)启动(start)停止(stop)重启(restart)删除(rm)查看(ps),也可以用来制作镜像,而镜像可以发布到模板库中存放以便后期使用。容器中某个服务或应用所占用的端口号,可以NAT映射到物理机的某个端口号,以便外部访问。

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/108861134