如何部署Docker生产环境?

Docker

1 基础知识

1.1 基本概念

1.1.1 Docker的基本概念

– Docker是开发人员和系统管理员使用的容器
– Docker是用于开发,部署和运行应用程序的平台
注:
– 使用Linux容器来部署应用程序称为集装箱化
– 用于轻松部署应用程序

1.1.2 镜像(Images)

镜像的实质是一个可执行的包,包括应用程序代码、运行状态、库、环境变量和配置文件等。

1.1.3 容器(containers)

容器是镜像运行时的实例,即镜像执行是在内存中的内容

1.1.4 容器与虚拟机的区别

– 容器直接共享主机或其他容器的内核,独立运行的进程不占用任何其他可执行文件的内存,因此更轻量。
– 虚拟机运行一个完整的客户操作系统,因此需要使用更多的资源。

1.2 使用对象

– 开发人员
– 系统管理员

1.3 Docker的作用

– 用于开发
– 用于部署

1.4 Docker的特点


– 灵活,Docker能适应负责的应用程序装箱
– 轻量级,容器可直接利用并共享主机内核
– 可互换,可即时部署更新和升级
– 可扩展,可自由增加和自动分发容器副本
– 可堆叠,可垂直堆叠服务并即时堆叠服务

1.5 Docker的版本

– 社区版(CE,Community Edition),适用于个人开发人员或小团队(适用于尝试使用容器)
– 企业版(EE,Enterprise Edition),适用于企业开发和IT团队(适用于生产构建、发布和运行关键业务程序)

2 安装部署

2.1 系统环境配置

2.1.1 系统环境信息

HOST = docker0[1-n] OS = CentOS 7.x x86_64
IP Address = 10.168.0.2[10-1x]

2.1.2 部署常用工具

In docker0[1-n]

yum install -y vim wget net-tools unzip

2.1.3 设置内存权限大小

In docker0[1-n]

su -
echo 'vm.max_map_count = 262144' >> /etc/sysctl.conf
sysctl -p
sysctl -a | grep vm.max_map_count

显示如下则达成目的:

vm.max_map_count = 262144

2.1.4 关闭SELinux

In docker0[1-n]

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

2.1.5 设置时区

In docker0[1-n]

timedatectl set-timezone Asia/Shanghai

2.1.6 配置名称解析

In docker0[1-n]

echo '10.168.0.210 docker01 docker01.cmdschool.org' >> /etc/hosts
echo '10.168.0.211 docker02 docker02.cmdschool.org' >> /etc/hosts

2.2 软件环境配置

2.2.1 升级系统到指定版本

In docker0[1-n]

mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
curl http://mirrors.163.com/.help/CentOS7-Base-163.repo > /etc/yum.repos.d/CentOS7-Base-163.repo

然后使用如下命令更新,

yum -y update

然后,重启系统验证配置,

reboot

2.2.2 手动配置Docker的源(可选)

In docker0[1-n]

curl https://download.docker.com/linux/centos/docker-ce.repo > /etc/yum.repos.d/docker-centos-7-x86_64.repo

2.3.3 安装DockerCE相关包

In docker0[1-n]

yum install -y docker-ce-19.03.9

验证管理用户的创建,

grep -i docker /etc/group /etc/passwd

显示如下:

/etc/group:docker:x:972:

注:docker组已经创建,但尚未有用户加入该组

2.3.4 启动Docker并配置自启动

In docker0[1-n]

systemctl enable docker.service
systemctl start docker.service
systemctl status docker.service

2.3.5 修改Docker存储位置

In docker0[1-n] 查看存储的类型与位置

docker info | egrep -i "Docker Root Dir|Storage Driver"

显示如下:

Storage Driver: devicemapper 
Docker Root Dir: /var/lib/docker

停止Dcoker的服务

systemctl stop docker.service

迁移存储数据

mkdir -p /data/docker/
mv /var/lib/docker /data/docker/runningdata

定义新的存储位置:

vim /etc/docker/daemon.json

更改如下参数:

{
  "storage-driver": "overlay2",
  "data-root": "/data/docker/runningdata"
}

启动Dcoker的服务

systemctl start docker.service

确认钱以后的存储的类型与位置

docker info | egrep -i "Docker Root Dir|Storage Driver"

显示如下:

Storage Driver: overlay2
Docker Root Dir: /data/docker/runningdata

2.3.6 校验安装的版本

In docker0[1-n]

docker --version

2.3.7 查看更详细的版本

In docker0[1-n]

docker info

信息显示如下:

Containers: 0
 Running: 0
 Paused: 0
[…]

3 搭建Swarm集群

3.1 Swarm集群的基础知识

– Swarm集群是一组运行Docker并加入集群中的机器
– 加入集群后,运行的Dckcek将在集群管理器中执行
– 群体中的机器可以是物理节点也可以是虚拟节点
– Swarm集群支持多种策略运行容器(例如应用运行在负载最低节点)
– 集群管理者是集群中唯一可以执行命令的机器或授权的其他机器

3.2 配置公钥认证(可选)

In docker0[1-n]

ssh-keygen

向导如下,

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
[…]

然后,使用如下命令部署公钥,

ssh-copy-id -i ~/.ssh/id_rsa.pub docker02

部署完毕后,使用如下命令测试,

ssh docker02

3.3 建立你的集群

3.3.1 配置主机防火墙

In docker0[1-n]

systemctl stop firewalld.service
systemctl disable firewalld.service

3.3.2 执行的步骤

运行“docker swarm init”启用集群模式
运行“docker swarm join”将新的节点加入集群

3.3.3 管理主机启用集群

In docker01

docker swarm init

提示如下:

Swarm initialized: current node (km3cx63bzg9pfaue0o8hbo8m9) is now a manager.

To add a worker to this swarm, run the following command:

	docker swarm join --token SWMTKN-1-2o1l0zx4ow0av23rvffgi8827t6dk8zobmscph7ypscgplm61p-ejp2a1v7665uyw2yr0yoft3zv 10.168.0.210:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

3.3.4 将成员主机加入集群

In docker0[2-n]

docker swarm join --token SWMTKN-1-2o1l0zx4ow0av23rvffgi8827t6dk8zobmscph7ypscgplm61p-ejp2a1v7665uyw2yr0yoft3zv 10.168.0.210:2377

3.3.5 查看群集成员

In docker01

docker node ls

显示如下:

ID                            HOSTNAME                 STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
km3cx63bzg9pfaue0o8hbo8m9 *   docker01.cmdschool.org   Ready               Active              Leader              19.03.9
jw10e1kylrk5pwvs1bzv0l95b     docker02.cmdschool.org   Ready               Active                                  19.03.9

4 部署Docker Registry

4.1 Registry的作用

– 严格控制镜像的存储位置
– 完全掌控镜像的分配渠道
– 可紧密将镜像的存储与分发紧密集成到内部开发工作流中

4.2 以服务的方式运行

4.2.1 配置证书目录并上传

In docker01

mkdir -p /data/docker/certs

如果没有证书,请从腾讯云申请免费证书,
https://cloud.tencent.com/product/ssl
注:以上申请后使用Nginx证书即可并保存到目录“/data/docker/certs”

4.2.3 将TLS证书与私钥保存为秘钥

docker secret create docker01.cmdschool.org.crt /data/docker/certs/docker01.cmdschool.org.crt
docker secret create docker01.cmdschool.org.key /data/docker/certs/docker01.cmdschool.org.key

检查保存的密钥:

docker secret ls

显示如下:

ID                          NAME                         DRIVER              CREATED             UPDATED
r9xmhrnhxnanzsvjpqkyxdlg7   docker01.cmdschool.org.crt                       16 seconds ago      16 seconds ago
l2gwnjrsyd9xx0fnklp4dmta0   docker01.cmdschool.org.key                       16 seconds ago      16 seconds ago

另外,配置完成后我们建议重启服务器,以避免出现不兼容的问题(可选)

ssh docker02 reboot
reboot

4.3 部署服务

4.3.1 准备镜像

In docker01

mkdir –p /data/docker/images
cd /data/docker/images
docker load -i registry_2.7.1.tar

以上命令软件包可通过以下命令获取,

docker pull registry:2.7.1
docker save registry:2.7.1 -o registry_2.7.1.tar

4.3.2 创建配置文件

vim /data/docker/yml/registry-v2-stack.yml

加入如下配置,

version: '3.6'
services:
  v2:
    image: 'registry:2.7.1'
    ports:
      - target: 443
        published: 5000
        protocol: tcp
        mode: host
    secrets:
       - docker01.cmdschool.org.crt
       - docker01.cmdschool.org.key
    environment:
      - REGISTRY_HTTP_ADDR=0.0.0.0:443
      - REGISTRY_HTTP_TLS_CERTIFICATE=/run/secrets/docker01.cmdschool.org.crt
      - REGISTRY_HTTP_TLS_KEY=/run/secrets/docker01.cmdschool.org.key
      - TZ=Asia/Shanghai
    volumes:
      - registry-data:/var/lib/registry
    logging:
      driver: "json-file"
      options:
        max-size: "20m"
        max-file: "10"
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.registry-v2==true]
volumes:
  registry-data:
    external: true
secrets:
  docker01.cmdschool.org.crt:
    external: true
  docker01.cmdschool.org.key:
    external: true

4.3.3 标记运行节点

In docker01

docker node update --label-add registry-v2=true docker01.cmdschool.org

4.3.4 部署服务

In docker01

docker stack deploy -c /data/docker/yml/registry-v2-stack.yml registry

5 部署Portainer

5.1 Portainer的基础知识

5.1.1 Portainer的简介

Portainer是一个轻量级的管理UI,可让你轻松管理Docker主机和Swarm群集

5.1.2 Portainer的作用

– 管理Docker堆栈
– 管理Docker的容器
– 管理Docker的镜像
– 管理Docker的卷
– 管理Docker的网络等

5.1.3 Portainer的兼容性

Portainer支持任何的Docker引擎

5.2 部署Portainer

5.2.1 准备镜像

In docker01

cd /data/docker/images/
docker load -i portainer-ce:2.5.0.tar
docker tag portainer/portainer-ce:2.5.0 docker01.cmdschool.org:5000/portainer/portainer-ce:2.5.0
docker push docker01.cmdschool.org:5000/portainer/portainer-ce:2.5.0
docker image rm portainer/portainer-ce:2.5.0

docker load -i portainer-agent:2.4.0.tar
docker tag portainer/agent:2.4.0 docker01.cmdschool.org:5000/portainer/agent:2.4.0
docker push docker01.cmdschool.org:5000/portainer/agent:2.4.0
docker image rm portainer/agent:2.4.0

以上命令软件包可通过以下命令获取,

docker pull portainer/portainer-ce:2.5.0
docker save portainer/portainer-ce:2.5.0 -o portainer-ce:2.5.0.tar
docker pull portainer/agent:2.4.0
docker save portainer/agent:2.4.0 -o portainer-agent:2.4.0.tar

In docker01

5.2.1 创建服务配置文件

mkdir -p /data/docker/yml/
vim /data/docker/yml/portainer-stack.yml

加入如下配置:

version: '3.6'
services:
  agent:
    image: docker01.cmdschool.org:5000/portainer/agent:2.4.0
    environment:
      # REQUIRED: Should be equal to the service name prefixed by "tasks." when
      # deployed inside an overlay network
      AGENT_CLUSTER_ADDR: tasks.agent
      # AGENT_PORT: 9001
      # LOG_LEVEL: debug
      TZ: Asia/Shanghai
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    logging:
      driver: "json-file"
      options:
        max-size: "20m"
        max-file: "10"
    networks:
      - agent_network
    deploy:
      mode: global

  portainer:
    image: docker01.cmdschool.org:5000/portainer/portainer-ce:2.5.0
    environment:
      TZ: Asia/Shanghai    
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - "9900:9000"
    volumes:
      - portainer-data:/data
    logging:
      driver: "json-file"
      options:
        max-size: "20m"
        max-file: "30"
    networks:
      - agent_network
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.labels.portainer-web == true]

volumes:
  portainer-data:
    external: true
 
networks:
  agent_network:
    driver: overlay

5.2.2 标记运行节点

In docker01

docker node update --label-add portainer-web=true docker01.cmdschool.org

5.2.3 部署服务

docker stack deploy -c /data/docker/yml/portainer-stack.yml portainer

5.2.4 创建管理员账号

http://docker01.cmdschool.org:9000
注:以上登录Portainer将会提示你创建管理员账号

参阅文档
=========================

存储驱动
—————
https://docs.docker.com/storage/storagedriver/select-storage-driver/

“/etc/docker/daemon.json”的支持文档
———————————–
https://docs.docker.com/engine/reference/commandline/dockerd/

没有评论

发表回复

Docker
如何修复连接Docker容器虚机无响应?

1 前言 一个问题,一篇文章,一出故事。 笔者最近使用如下命令连接容器发现一直没有响应, docke …

Docker
如何打包Docker Nginx?

1 前言 一个问题,一篇文章,一出故事。 由于docker hub原版本的nginx镜像过于精简,于 …

Docker
如何打包Docker MAC-Telnet?

1 基础知识 一款可以使用MikroTik RouterOS MAC-Telnet协议连接Mikro …