企业运维之 docker 的介绍和部署

Posted 123坤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了企业运维之 docker 的介绍和部署相关的知识,希望对你有一定的参考价值。

企业运维之 docker 的介绍和部署

1. Docker 简介

  1. 什么是 Docker?
    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
    Docker为应用打包、部署平台,而非单纯的虚拟化技术。

一个完整的 Docker 由以下几个部分组成:

DockerClient 客户端
Docker Daemon 守护进程
Docker Image 镜像
DockerContainer 容器
  1. Container 与 VM 的对比

在这里插入图片描述

从上图可以知道,虚拟机比 docker 容器多了 Guest OS (Guest Operating System),也就是多云西宁虚拟机时需要多消耗内核存储,因为只要虚拟机开启就会消耗内存;而docker 没有这个,运行时是一个进程,所以不会消耗太多的资源。

  1. 传统虚拟化与容器技术对比
    在这里插入图片描述
  2. docker容器的优势
    1)更高效的利用系统资源
    2)更快速的启动时间
    3)一致的运行环境
    4)持续支付和部署
    5)更轻松的迁移
    6)更轻松的维护和拓展

容器的出现对于开发人员来说,一次构建任何地方都可以运行;
对于运维人员来说,一次构建就可以运行任何。

  1. 容器工作的原理

在这里插入图片描述

Docker 使用客户端 - 服务器(C/S)架构,使用远程API管理和创建Docker 容器。Docker 客户端与 Docker 守护进程通信,后者负责构建,运行和分发 Docker容器。Docker客户端和守护进程可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用REST API,通过UNIX套接字或网络接口进行通信。

Client:客户端通过命令行或其他工具与守护进程通信,客户端会将这些命令发送给守护进程,然后执行这些命令。命令使用Docker API,Docker客户端可以与多个守护进程通信。

Docker daemon:Docker守护进程(docker daemon)监听Docker API请求并管理Docker对象,如镜像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。

Docker Host:Docker Host 是物理机或虚拟机,用于执行Docker守护进程的仓库。

Docker Registry:Docker仓库用于存储Docker镜像,可以是Docker Hub这种公共仓库,也可以是个人搭建的私有仓库。使用docker pull或docker run命令时,将从配置的仓库中提取所需的镜像。使用docker push命令时,镜像将被推送到配置的仓库。

2 . Docker 容器的部署

  1. 安装
    官方站点:https://docs.docker.com/
    阿里云开源镜像站:https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

此处用已经下载好的版本来完成安装:
将下载好的软件包放在真机的 apache 默认发布目录中,然后在虚拟机中编辑原件仓库即可;

[root@server1 ~]# vim /etc/yum.repos.d/docker.repo
[root@server1 ~]# cat /etc/yum.repos.d/docker.repo
[docker]
name=docker-ce
baseurl=http://172.25.25.250/docker-ce
gpgcheck=0
[root@server1 ~]# yum repolist		##列出软件仓库的信息
[root@server1 ~]# yum install docker-ce -y		##安装docker 软件包
[root@server1 ~]# systemctl enable --now docker.service		##设定开机自启 
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@server1 ~]# docker info		##查看信息

在这里插入图片描述
开启容器之后,在当前主机上会开启一个桥接接口;此处所有容器的网关为docker0 上的信息;

在这里插入图片描述

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

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.15
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-957.el7.x86_64
 Operating System: Red Hat Enterprise Linux Server 7.6 (Maipo)
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 1.952GiB
 Name: server1
 ID: TLHU:36PR:7S7W:JCMA:EQ4D:6GM3:376K:LFRV:A4CP:TCNF:HQ6A:FCSC
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

注:此处查看到的信息有两个警告信息;这是容器桥接的问题,是防防火墙的原因,因为容器需要防火墙的支持。

[root@server1 ~]# sysctl -a | grep bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.docker0.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
[root@server1 ~]# cd /etc/sysctl.d/
[root@server1 sysctl.d]# vim docker.conf
[root@server1 sysctl.d]# cat docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@server1 sysctl.d]# sysctl --system	##使其识别
[root@server1 sysctl.d]# docker info	##此时再次查看就没有警告信息
  1. docker 的简单命令

Docker通过镜像创建容器,而镜像存储在仓库中;
容器内包含自己需要的内容和设置,与外部交互需要进行端口映射。

[root@server1 sysctl.d]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

此时没有镜像,可以用命令docker pull nginx来拉去 nginx 的镜像,在拉取的过程中可能网速的原因并不是很快,所以可以做加速器来使用国内的镜像;

[root@server1 sysctl.d]# cd /etc/docker/
[root@server1 docker]# ls
key.json
[root@server1 docker]# vim daemon.json
[root@server1 docker]# cat daemon.json 
{
	"registry-mirrors": ["https://vo5twm71.mirror.aliyuncs.com"]
}
[root@server1 docker]# systemctl reload docker.service 		##重启服务之后,此时便可以查看到其加速地址
[root@server1 docker]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.15
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-957.el7.x86_64
 Operating System: Red Hat Enterprise Linux Server 7.6 (Maipo)
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 1.952GiB
 Name: server1
 ID: TLHU:36PR:7S7W:JCMA:EQ4D:6GM3:376K:LFRV:A4CP:TCNF:HQ6A:FCSC
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://vo5twm71.mirror.aliyuncs.com/		##使用加速器的地址
 Live Restore Enabled: false

此时再次拉取镜像时就会快很多;

docker 常用命令:

docker search nginx  ##上传镜像

[root@server1 docker]# docker search yakexi007	##搜索镜像
NAME                 DESCRIPTION         STARS               OFFICIAL            AUTOMATED
yakexi007/game2048                       0                                       
yakexi007/mario                          0                                       
yakexi007/nginx                          0                                       
[root@server1 docker]# docker pull yakexi007/game2048		##拉取镜像
Using default tag: latest
latest: Pulling from yakexi007/game2048
534e72e7cedc: Pull complete 
f62e2f6dfeef: Pull complete 
fe7db6293242: Pull complete 
3f120f6a2bf8: Pull complete 
4ba4e6930ea5: Pull complete 
Digest: sha256:8a34fb9cb168c420604b6e5d32ca6d412cb0d533a826b313b190535c03fe9390
Status: Downloaded newer image for yakexi007/game2048:latest
docker.io/yakexi007/game2048:latest
[root@server1 docker]# docker images		##查看镜像
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
yakexi007/game2048   latest              19299002fdbe        4 years ago         55.5MB

[root@server1 docker]# docker history yakexi007/game2048		##查看镜像的打包历史
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
19299002fdbe        4 years ago         /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "sed …   0B                  
<missing>           4 years ago         /bin/sh -c #(nop)  EXPOSE 80/tcp                0B                  
<missing>           4 years ago         /bin/sh -c #(nop) COPY dir:cb74e9c037a3d501c…   600kB               
<missing>           4 years ago         /bin/sh -c #(nop)  MAINTAINER Golfen Guo <go…   0B                  
<missing>           4 years ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B                  
<missing>           4 years ago         /bin/sh -c #(nop)  EXPOSE 443/tcp 80/tcp        0B                  
<missing>           4 years ago         /bin/sh -c #(nop) COPY file:d15ceb73c6ea776c…   1.1kB               
<missing>           4 years ago         /bin/sh -c #(nop) COPY file:af94db45bb7e4b8f…   643B                
<missing>           4 years ago         /bin/sh -c GPG_KEYS=B0F4253373F8F6F510D4217850.1MB              
<missing>           4 years ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.11.7     0B                  
<missing>           4 years ago         /bin/sh -c #(nop)  MAINTAINER NGINX Docker M…   0B                  
<missing>           4 years ago         /bin/sh -c #(nop) ADD file:7afbc23fda8b0b387…   4.8MB  
[root@server1 docker]# docker run -d --name demo -p 80:80 yakexi007/game2048
42ce251ebfa9bda76b2bce1df56783e3d034fb4fafb6ecb29a691d0dcfd2c300

其中在运行容器中加入的参数含义:
run -->创建并启动
-d --> 打入后台
–name --> 起名
-p --> 做端口影射,为了访问容器内的镜像,:前面为真实主机的端口地址,后面为容器内的端口信息。

运行之后可以查看端口信息:

[root@server1 docker]# netstat -antulp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3227/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      3329/master         
tcp        0      0 172.25.25.1:54636       172.25.25.250:80        TIME_WAIT   -                   
tcp        0      0 172.25.25.1:22          172.25.25.250:48296     ESTABLISHED 3487/sshd: root@pts 
tcp6       0      0 :::80                   :::*                    LISTEN      15345/docker-proxy  	##为docker 影射后的信息
tcp6       0      0 :::22                   :::*                    LISTEN      3227/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      3329/master         

此时在网页中访问本机的80端口时,会映射到容器中的80 端口;

在这里插入图片描述

运行容器之后可以用命令来查看容器的进程信息:

[root@server1 docker]# docker ps		##列出当前运行的容器
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                         NAMES
42ce251ebfa9        yakexi007/game2048   "/bin/sh -c 'sed -i …"   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp, 443/tcp   demo
[root@server1 docker]# docker ps -a		##列出所有的容器包括没有运行的
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                         NAMES
42ce251ebfa9        yakexi007/game2048   "/bin/sh -c 'sed -i …"   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp, 443/tcp   demo

可以用命令来回收掉正在运行的容器:

[root@server1 docker]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                         NAMES
42ce251ebfa9        yakexi007/game2048   "/bin/sh -c 'sed -i …"   7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp, 443/tcp   demo
[root@server1 docker]# docker rm -f demo
demo
[root@server1 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

当容器正在运行时必须加入 -f 参数来强制回收;也可以先关闭容器再来回收,即可不用加参数 -f 。

启动 docker:
systemctl start docker
systemctl enable docker
导入镜像:
docker load -i game2048

当运行一个容器之后可以用命令 docker inspect demo 来查看运行的容器的信息,以及分配到的ip 等信息;

在这里插入图片描述

以上是关于企业运维之 docker 的介绍和部署的主要内容,如果未能解决你的问题,请参考以下文章

企业运维之 zabbix 监控部署--监控应用

企业运维之 zabbix 监控部署--监控主机

企业运维之 zabbix 监控部署--监控主机

企业运维之七层负载均衡--Haproxy

企业运维之七层负载均衡--Haproxy

企业运维之 ELK日志分析平台(Elasticsearch)