DevOps记录

目录

 

CI/CD

Docker

安装

镜像的常用命令

容器的常用命令

常见其他命令

命令小结

用Dockerfile构建镜像

数据卷

docker-compose

docker-compose yml 配置指令参考

version

build

cap_add,cap_drop

cgroup_parent

command

container_name

depends_on

deploy

devices

dns

dns_search

entrypoint

env_file

environment

expose

extra_hosts

healthcheck

image

logging

network_mode

restart

secrets

security_opt

stop_grace_period

stop_signal

sysctls

tmpfs

ulimits

volumes

网络 

Docker开发 + 阿里云容器镜像服务

Kubernetes

Kubernetes Dashboard

Ansible 

Ansible Tower

Terraform


CI/CD

CI/CD,即Continuous Integration/Continuous Delivery。在公司采用的是 Jenkins 企业版,搭建 pipeline 流程是 Github 代码仓库,构建,单元测试,代码扫描(SonarQube),发布到私库 Nexus,自动部署,回归测试(Fitnesse),邮件通知等。

Docker

安装

Docker是一个开源的应用容器引擎,基于Go语言。镜像注册中心(Docker Registry,eg: Docker Hub)可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像,标签常用于对应该软件的各个版本,latest是默认标签。

公司的Docker和Kubernetes里需要配置相应proxy和vpc,跟我自己电脑安装过程差不多,但公司我是通过Docker从Nexus3里pull相应Kubernetes需要的文件,去使Docker和Kubernetes运行成功。官方下载 Docker Desktop 程序,等待 Docker Desktop is running。

Linux安装的话,可以参考官方文档: Install Docker Engine on CentOS | Docker Documentation

docker version

docker info

docker 命令 --help

Docker命令的使用也可以直接看参考手册:

也可以直接看参考手册: https://docs.docker.com/engine/reference/commandline

镜像的常用命令

1. docker images

2. docker pull

DevOps记录_第1张图片

docker pull mysql

等价于 docker pull docker.io/library/mysql:lastest 

3. docker build -t <镜像名称> -f .

注意“."表示当前目录

4. docker rmi

5. docker search <镜像名字> (或者 Docker Hub中搜索)

容器的常用命令

docker run [可选参数] image

DevOps记录_第2张图片

-i 选项:标准输入设备(STDIN)。

-t 选项:伪终端(Terminal)。

-d 选项:daemon后台方式运行。

-p 选项:多种指定端口方式。

/bin/bash参数:表示运行容器中的bash应用程序。

以root超级管理员身份进入容器,@后面跟的是容器id,/表示所在的路径。

DevOps记录_第3张图片

# -q 表示仅列出 CONTAINER ID

docker ps -a -q

DevOps记录_第4张图片DevOps记录_第5张图片 

DevOps记录_第6张图片

常见其他命令

  • 查看日志:docker logs [Options]

  • 查看容器元数据:docker inspect  
  • 查看容器内进程:docker top  
  • 进入正在运行的容器:

        方式一:docker exec -it /bin/bash

                                (可以再进一步 ps -ef 查看容器内进程)

        方式二:docker attach

        区别:

  • 从容器中拷贝文件到主机上:

这种拷贝是手动的,可以使用 -v 卷技术进行容器和主机的自动同步 。

命令小结

DevOps记录_第7张图片

 

用Dockerfile构建镜像

命令 描述 例子
FROM <仓库名称:标签名> 用于指定基础镜像,定制镜像一定是以一个基础镜像开始,必备且必须是第一条指令。 FROM centos:lastest
MAINTAINER 镜像的作者。 MAINTAINER "cxf"
ADD 复制文件,从宿主机的来源路径到容器内路径,必须是绝对路径。注意会自动解压来源中的压缩包,将解压后的文件复制到目标目录中。 ADD /c/Users/cxf/jdk-11.tar.gz /opt
COPY  复制文件。 COPY /c/Users/cxf/jdk-11.tar.gz /opt
RUN 执行命令,可多条RUN命令。 RUN ls -l
CMD 

只允许一次CMD命令,使用多个会抵消之前所有的命令,只有最后一个命令生效。

有3种形式:

CMD ["executable", "param1", "param2"]

CMD ["param1", "param2"]

CMD command param1 param2

# 容器启动时执行的命令

CMD /opt/jdk-11/bin/java -version

CMD java -jar app.jar

ENTRYPOINT 执行命令,可追加命令 ENTRYPOINT ["ls","-a"]

注意:将Dockerfile文件与需要添加到容器的文件放在同一个目录下。

(1)ADD 和 COPY 的区别:

  • add 和 copy 都是复制文件 / 文件夹
  • add 可以从网络 / 本地复制; copy 仅从本地复制, 语义更明确, 推荐使用 copy。

(2)CMD 和 ENTRYPOINT 的区别:

ENTRYPOINT可追加。

数据卷

容器的持久化和同步操作,容器间可以数据共享。卷技术把容器的目录挂载到Linux宿主机上。

方式一(命令):

-v 主机目录:容器内目录

方式二(Dockerfile):

VOLUMN ["volumn1", "volumn2"] # 匿名挂载

docker volumn ls 查看数据卷

docker volumn inspect <卷名> 可查看卷具体挂载的位置,即"Mountpoint"。

具名挂载与匿名挂载:

匿名挂载可以只指定容器内目录。所有的数据卷如果没指定宿主机目录的情况下,默认挂载在/var/lib/docker/volumns/<卷名>/_data

具名挂载可通过 <卷名>:<容器目录> 指定数据卷的具体名字。

扩展:

-v 容器内目录:ro rw 可以改变读写权限,ro:readonly,rw:readwrite读写。

--volumn-from <容器名字> 可以实现容器间数据共享。

docker-compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。

  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

# yaml 配置实例
version: '3'
services:
  web:
    build: .
    ports:
   - "5000:5000"
    volumes:
   - .:/code
    - logvolume01:/var/log
    links:
   - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Compose 安装

Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。

运行以下命令以下载 Docker Compose 的当前稳定版本:

$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

要安装其他版本的 Compose,请替换 v2.2.2。

Docker Compose 存放在 GitHub,不太稳定。

你可以也通过执行下面的命令,高速安装 Docker Compose。

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

将可执行权限应用于二进制文件:

$ sudo chmod +x /usr/local/bin/docker-compose

创建软链:

$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功:

$ docker-compose --version
cker-compose version 1.24.1, build 4667896b

注意: 对于 alpine,需要以下依赖包: py-pip,python-dev,libffi-dev,openssl-dev,gcc,libc-dev,和 make。

macOS

Mac 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Mac 用户不需要单独安装 Compose。

windows PC

Windows 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Windows 用户不需要单独安装 Compose。

使用

1、准备

创建一个测试目录:

$ mkdir composetest
$ cd composetest

在测试目录中创建一个名为 app.py 的文件,并复制粘贴以下内容:

composetest/app.py 文件代码

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)


def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)


@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

在此示例中,redis 是应用程序网络上的 redis 容器的主机名,该主机使用的端口为 6379。

在 composetest 目录中创建另一个名为 requirements.txt 的文件,内容如下:

flask
redis

2、创建 Dockerfile 文件

在 composetest 目录中,创建一个名为 Dockerfile 的文件,内容如下:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

Dockerfile 内容解释:

  • FROM python:3.7-alpine: 从 Python 3.7 映像开始构建镜像。
  • WORKDIR /code: 将工作目录设置为 /code。
  • ENV FLASK_APP app.py
    ENV FLASK_RUN_HOST 0.0.0.0

    设置 flask 命令使用的环境变量。

  • RUN apk add --no-cache gcc musl-dev linux-headers: 安装 gcc,以便诸如 MarkupSafe 和 SQLAlchemy 之类的 Python 包可以编译加速。
  • COPY requirements.txt requirements.txt
    RUN pip install -r requirements.txt

    复制 requirements.txt 并安装 Python 依赖项。

  • COPY . .: 将 . 项目中的当前目录复制到 . 镜像中的工作目录。
  • CMD ["flask", "run"]: 容器提供默认的执行命令为:flask run。

3、创建 docker-compose.yml

在测试目录中创建一个名为 docker-compose.yml 的文件,然后粘贴以下内容:

docker-compose.yml 配置文件

# yaml 配置
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

该 Compose 文件定义了两个服务:web 和 redis。

  • web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 5000。此示例服务使用 Flask Web 服务器的默认端口 5000 。
  • redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。

4、使用 Compose 命令构建和运行您的应用

在测试目录中,执行以下命令来启动应用程序:

docker-compose up

如果你想在后台执行该服务可以加上 -d 参数:

docker-compose up -d

docker-compose yml 配置指令参考

https://docs.docker.com/compose/compose-file/

version

指定本 yml 依从的 compose 哪个版本制定的。

build

指定为构建镜像上下文路径:

例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:

version: "3.7"
services:
  webapp:
    build: ./dir

或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:

version: "3.7"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
      labels:
        - "com.example.description=Accounting webapp"
        - "com.example.department=Finance"
        - "com.example.label-with-empty-value"
      target: prod
  • context:上下文路径。
  • dockerfile:指定构建镜像的 Dockerfile 文件名。
  • args:添加构建参数,这是只能在构建过程中访问的环境变量。
  • labels:设置构建镜像的标签。
  • target:多层构建,可以指定构建哪一层。

cap_add,cap_drop

添加或删除容器拥有的宿主机的内核功能。

cap_add:
  - ALL # 开启全部权限

cap_drop:
  - SYS_PTRACE # 关闭 ptrace权限

cgroup_parent

为容器指定父 cgroup 组,意味着将继承该组的资源限制。

cgroup_parent: m-executor-abcd

command

覆盖容器启动的默认命令。

command: ["bundle", "exec", "thin", "-p", "3000"]

container_name

指定自定义容器名称,而不是生成的默认名称。

container_name: my-web-container

depends_on

设置依赖关系。

  • docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
  • docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
  • docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意:web 服务不会等待 redis db 完全启动 之后才启动。

deploy

指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。

version: "3.7"
services:
  redis:
    image: redis:alpine
    deploy:
      mode:replicated
      replicas: 6
      endpoint_mode: dnsrr
      labels: 
        description: "This redis service label"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

可以选参数:

endpoint_mode:访问集群服务的方式。

endpoint_mode: vip 
# Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
endpoint_mode: dnsrr
# DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。

labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。

mode:指定服务提供的模式。

  • replicated:复制服务,复制指定服务到集群的机器上。

  • global:全局服务,服务将部署至集群的每个节点。

  • 图解:下图中黄色的方块是 replicated 模式的运行情况,灰色方块是 global 模式的运行情况。

    DevOps记录_第8张图片

replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。

resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。

restart_policy:配置如何在退出容器时重新启动容器。

  • condition:可选 none,on-failure 或者 any(默认值:any)。
  • delay:设置多久之后重启(默认值:0)。
  • max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。
  • window:设置容器重启超时时间(默认值:0)。

rollback_config:配置在更新失败的情况下应如何回滚服务。

  • parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。
  • delay:每个容器组回滚之间等待的时间(默认为0s)。
  • failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。
  • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
  • max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)。
  • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。

update_config:配置应如何更新服务,对于配置滚动更新很有用。

  • parallelism:一次更新的容器数。
  • delay:在更新一组容器之间等待的时间。
  • failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
  • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
  • max_failure_ratio:在更新过程中可以容忍的故障率。
  • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)。

:仅支持 V3.4 及更高版本。

devices

指定设备映射列表。

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

dns

自定义 DNS 服务器,可以是单个值或列表的多个值。

dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 9.9.9.9

自定义 DNS 搜索域。可以是单个值或列表。

dns_search: example.com

dns_search:
  - dc1.example.com
  - dc2.example.com

entrypoint

覆盖容器默认的 entrypoint。

entrypoint: /code/entrypoint.sh

也可以是以下格式:

entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

env_file

从文件添加环境变量。可以是单个值或列表的多个值。

env_file: .env

也可以是列表格式:

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

environment

添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。

environment:
  RACK_ENV: development
  SHOW: 'true'

expose

暴露端口,但不映射到宿主机,只被连接的服务访问。

仅可以指定内部端口为参数:

expose:
 - "3000"
 - "8000"

extra_hosts

添加主机名映射。类似 docker client --add-host。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:

162.242.195.82  somehost
50.31.209.229   otherhost

healthcheck

用于检测 docker 服务是否健康运行。

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
  interval: 1m30s # 设置检测间隔
  timeout: 10s # 设置检测超时时间
  retries: 3 # 设置重试次数
  start_period: 40s # 启动后,多少秒开始启动检测程序

image

指定容器运行的镜像。以下格式都可以:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 镜像id

logging

服务的日志记录配置。

driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项

driver: "json-file"
driver: "syslog"
driver: "none"

仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。

logging:
  driver: json-file
  options:
    max-size: "200k" # 单个文件大小为200k
    max-file: "10" # 最多10个文件

当达到文件限制上限,会自动删除旧得文件。

syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

network_mode

设置网络模式。

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks

配置容器连接的网络,引用顶级 networks 下的条目 。

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
      other-network:
        aliases:
         - alias2
networks:
  some-network:
    # Use a custom driver
    driver: custom-driver-1
  other-network:
    # Use a custom driver which takes special options
    driver: custom-driver-2

aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。

restart

  • no:是默认的重启策略,在任何情况下都不会重启容器。
  • always:容器总是重新启动。
  • on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
  • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

注:swarm 集群模式,请改用 restart_policy。

secrets

存储敏感数据,例如密码:

version: "3.1"
services:

mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
  secrets:
    - my_secret

secrets:
  my_secret:
    file: ./my_secret.txt

security_opt

修改容器默认的 schema 标签。

security-opt:
  - label:user:USER   # 设置容器的用户标签
  - label:role:ROLE   # 设置容器的角色标签
  - label:type:TYPE   # 设置容器的安全策略标签
  - label:level:LEVEL  # 设置容器的安全等级标签

stop_grace_period

指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。

stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒 

默认的等待时间是 10 秒。

stop_signal

设置停止容器的替代信号。默认情况下使用 SIGTERM 。

以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。

stop_signal: SIGUSR1

sysctls

设置容器中的内核参数,可以使用数组或字典格式。

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

tmpfs

在容器内安装一个临时文件系统。可以是单个值或列表的多个值。

tmpfs: /run

tmpfs:
  - /run
  - /tmp

ulimits

覆盖容器默认的 ulimit。

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

volumes

将主机的数据卷或着文件挂载到容器里。

version: "3.7"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"

网络 

可参考:

Docker网络详解与实战_Code0cean的博客-CSDN博客_docker网络

Docker开发 + 阿里云容器镜像服务

1Dockerfile

#基础镜像

FROM centos:centos7

#将jdk8包放入/usr/local/src并自动解压,jdk8.tar.gz 需要到oracle官方下载,注意解压后的java版本号

ADD jdk8.tar.gz /usr/local/src

COPY tailbaseSampling-1.0-SNAPSHOT.jar /usr/local/src

WORKDIR /usr/local/src

COPY start.sh /usr/local/src

RUN chmod +x /usr/local/src/start.sh

ENTRYPOINT ["/bin/bash", "/usr/local/src/start.sh"]

 

2、start.sh

if [ $SERVER_PORT ];

then

/usr/local/src/jdk1.8.0_251/bin/java -Dserver.port=$SERVER_PORT -jar /usr/local/src/tailbaseSampling-1.0-SNAPSHOT.jar &

else

/usr/local/src/jdk1.8.0_251/bin/java -Dserver.port=8000 -jar /usr/local/src/tailbaseSampling-1.0-SNAPSHOT.jar &

fi

tail -f /usr/local/src/start.sh

 

3IDE + Cloud Toolkit

推荐使用  Alibaba Cloud Toolkit 进行操作。Cloud Toolkit 与主流 IDE 及阿里云容器镜像服务无缝集成,可以简化操作。 这里以在 IntelliJ IDEA 中使用 Alibaba Cloud Toolkit 为例。只需配置一次,之后都可一键推送~

a. 在本地 IDE 中安装 Alibaba Cloud Toolkit 并进行阿里云账户配置。参见:

在 IntelliJ IDEA 中安装和配置 Cloud Toolkit

b. 设置用于打包本地镜像的 Docker 环境。

§ 在 IntelliJ IDEA 工具栏单击 Tools > Alibaba Cloud > Preferences… 。

§ 在 Settings 对话框的左侧导航栏中单击 Docker。

§ 在 Docker 界面中设置 Cloud Toolkit 需要连接的 Docker 环境。

□ 本地为 Mac 或 Linux 操作系统,勾选 Unix Socket,然后单击 Browse,输入unix:///var/run/docker.sock。

□ 本地为 Windows 操作系统,勾选 TCP Connection,然后在 URI 右侧文档框输入本地 Docker 的 URI,如 http://127.0.0.1:2375。

□ 远程 Docker 环境:勾选 Tcp Connection,在 URI 右侧的文本框里输入远端的 Docker 环境的 URI(包括 IP 地址和端口),如 http://x.x.x.x:2375,并确保远程主机的 HTTP 服务开启。

单击 Test Connection 进行连接测试。

注意:如果出现连接测试报错,可进入 Docker 的 Settings 界面,单击左侧导航栏中的 General,然后选择 Expose daemon on tcp://localhost:2375 without TLS。

DevOps记录_第9张图片

 

c. 构建并上传应用

§ 在 IntelliJ IDEA 的菜单栏中选择 File > Open… ,选择参赛的工程文件。

§ 在 IntelliJ IDEA 界面左侧的 Project 中右键单击您的 Docker 应用工程名,在弹出的下拉菜单中选择 Alibaba Cloud > Deploy to Registry

§ 在 Deploy to Registry对话框中进行以下配置。

□ 在 Image 页签中选择 Context Directory 和 Dockerfile。

□ Context Directory:参赛的工程文件所在的目录,例如上文中的 tianchi 。

□ Dockerfile:选择上文中创建的 Dockerfile。

□ Version:对上传的工程文件做版本标记。例如 1.0

□ 在 Image Repositories 区域选择上文中创建的容器镜像服务的地域、命名空间和镜像仓库。

§ 单击RUN

d. IDE + Cloud Toolkit的截图:

DevOps记录_第10张图片

DevOps记录_第11张图片DevOps记录_第12张图片

DevOps记录_第13张图片

Push镜像成功:

DevOps记录_第14张图片

 

DevOps记录_第15张图片

DevOps记录_第16张图片

 

第二次替换了1.0版本:

DevOps记录_第17张图片

4. 启动过程 

Chens-MacBook-Pro:tianchi_submit_demo cxf$ docker login --username=beth阿同 registry.cn-shanghai.aliyuncs.com

Password: 

Login Succeeded

密码就是跟PC电脑一样的

docker pull registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0

docker run --rm -it --net host -e "SERVER_PORT=8000" --name "clientprocess1" -d registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0

docker run --rm -it --net host -e "SERVER_PORT=8001" --name "clientprocess2" -d registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0

docker run --rm -it --net host -e "SERVER_PORT=8002" --name "backendprocess" -d registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0

docker pull registry.cn-hangzhou.aliyuncs.com/cloud_native_match/scoring:0.1

docker run --rm --net host -e "SERVER_PORT=8081" --name scoring -d registry.cn-hangzhou.aliyuncs.com/cloud_native_match/scoring:0.1

docker ps

bethxfchen:~ cxf$ docker ps

CONTAINER ID        IMAGE                                                              COMMAND                  CREATED             STATUS              PORTS               NAMES

f00a5f153d95        registry.cn-hangzhou.aliyuncs.com/cloud_native_match/scoring:0.1   "/bin/bash /usr/loca…"   3 seconds ago       Up 3 seconds                            scoring

517c820d0368        registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0    "/bin/bash /usr/loca…"   3 minutes ago       Up 3 minutes                            backendprocess

9f88820a7919        registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0    "/bin/bash /usr/loca…"   4 minutes ago       Up 4 minutes                            clientprocess2

b5d364cf54b1        registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0    "/bin/bash /usr/loca…"   4 minutes ago       Up 4 minutes 

查看log: docker log --follow

Kubernetes

在 Docker Desktop 中 Preferences => Kubernetes => Enable Kubernetes 后,如果一直停留在 Kubernetes is starting 的状态,是因为相关 images 没有下载完全,可以用 k8s-for-docker-desktop 来安装,安装好重启等待几分钟就好。

解决方式如下,

1、卸载docker(看具体情况)
卸载之后别忘了配置阿里源

{
  "experimental": true,
  "debug": true,
  "registry-mirrors": [
    "https://xxx.mirror.aliyuncs.com"
  ]
}

2、查看hosts

127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost

#Added by Docker Desktop
#To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
#End of section

3、删除相关文件

rm -rf ~/.docker
rm -rf ~/.kube
rm -rf ~/Library/Group\ Containers/group.com.docker/pki/

4、安装相关images文件
到k8s-for-docker-desktop上面clone项目,在 Mac 上执行如下脚本,

./load_images.sh

5、安装完成后,重启Docker和Kubernetes等待时间完成即可

可看到桌面角标提示 Kubernetes is running

DevOps记录_第18张图片

输入 kubectl proxy 命令,查看 127.0.0.1:8001:

bethxfchen:~ cxf$ kubectl proxy

Starting to serve on 127.0.0.1:8001

DevOps记录_第19张图片

输入 kubectl 探索常见命令:

bethxfchen:~ cxf$ kubectl

kubectl controls the Kubernetes cluster manager.



 Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/



Basic Commands (Beginner):

  create        Create a resource from a file or from stdin.

  expose        Take a replication controller, service, deployment or pod and expose it as a new Kubernetes Service

  run           Run a particular image on the cluster

  set           Set specific features on objects



Basic Commands (Intermediate):

  explain       Documentation of resources

  get           Display one or many resources

  edit          Edit a resource on the server

  delete        Delete resources by filenames, stdin, resources and names, or by resources and label selector



Deploy Commands:

  rollout       Manage the rollout of a resource

  scale         Set a new size for a Deployment, ReplicaSet or Replication Controller

  autoscale     Auto-scale a Deployment, ReplicaSet, or ReplicationController



Cluster Management Commands:

  certificate   Modify certificate resources.

  cluster-info  Display cluster info

  top           Display Resource (CPU/Memory/Storage) usage.

  cordon        Mark node as unschedulable

  uncordon      Mark node as schedulable

  drain         Drain node in preparation for maintenance

  taint         Update the taints on one or more nodes



Troubleshooting and Debugging Commands:

  describe      Show details of a specific resource or group of resources

  logs          Print the logs for a container in a pod

  attach        Attach to a running container

  exec          Execute a command in a container

  port-forward  Forward one or more local ports to a pod

  proxy         Run a proxy to the Kubernetes API server

  cp            Copy files and directories to and from containers.

  auth          Inspect authorization

  debug         Create debugging sessions for troubleshooting workloads and nodes



Advanced Commands:

  diff          Diff live version against would-be applied version

  apply         Apply a configuration to a resource by filename or stdin

  patch         Update field(s) of a resource

  replace       Replace a resource by filename or stdin

  wait          Experimental: Wait for a specific condition on one or many resources.

  kustomize     Build a kustomization target from a directory or a remote url.



Settings Commands:

  label         Update the labels on a resource

  annotate      Update the annotations on a resource

  completion    Output shell completion code for the specified shell (bash or zsh)



Other Commands:

  api-resources Print the supported API resources on the server

  api-versions  Print the supported API versions on the server, in the form of "group/version"

  config        Modify kubeconfig files

  plugin        Provides utilities for interacting with plugins.

  version       Print the client and server version information



Usage:

  kubectl [flags] [options]



Use "kubectl  --help" for more information about a given command.

Use "kubectl options" for a list of global command-line options (applies to all commands).

比如 kubectl get namespace 等,更详细的其他信息可以查看 kubectl get --help:

Kubernetes Dashboard

可参考官方GitHub:https://github.com/kubernetes/dashboard 

Deploy Dashboard,执行以下命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml

访问 UI:http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login

我们采用令牌的方式进行登录,首先创建管理员角色,新建一个名为k8s-admin.yaml的文件,内容如下:

apiVersion: v1

kind: ServiceAccount

metadata:

  name: dashboard-admin

  namespace: kube-system

---

kind: ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

  name: dashboard-admin

subjects:

  - kind: ServiceAccount

    name: dashboard-admin

    namespace: kube-system

roleRef:

  kind: ClusterRole

  name: cluster-admin

  apiGroup: rbac.authorization.k8s.io

在命令行中进入到k8s-admin.yaml文件所在目录,执行下面命令添加管理员角色

bethxfchen:kubernetes cxf$ kubectl create -f k8s-admin.yaml

serviceaccount/dashboard-admin created

Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding

clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created

bethxfchen:kubernetes cxf$ kubectl get secret -n kube-system

NAME                                             TYPE                                  DATA   AGE

attachdetach-controller-token-h7pj6              kubernetes.io/service-account-token   3      25m

bootstrap-signer-token-r5ztx                     kubernetes.io/service-account-token   3      25m

bootstrap-token-abcdef                           bootstrap.kubernetes.io/token         6      25m

certificate-controller-token-6fhwx               kubernetes.io/service-account-token   3      25m

clusterrole-aggregation-controller-token-l5sgk   kubernetes.io/service-account-token   3      25m

coredns-token-2zz6b                              kubernetes.io/service-account-token   3      25m

cronjob-controller-token-ltmps                   kubernetes.io/service-account-token   3      25m

daemon-set-controller-token-ntknk                kubernetes.io/service-account-token   3      25m

dashboard-admin-token-gmr67                      kubernetes.io/service-account-token   3      10s

default-token-v4z7x                              kubernetes.io/service-account-token   3      25m

deployment-controller-token-rcnpd                kubernetes.io/service-account-token   3      25m

disruption-controller-token-7fkxz                kubernetes.io/service-account-token   3      25m

endpoint-controller-token-lsrkh                  kubernetes.io/service-account-token   3      25m

endpointslice-controller-token-n9st8             kubernetes.io/service-account-token   3      25m

endpointslicemirroring-controller-token-gcl5h    kubernetes.io/service-account-token   3      25m

expand-controller-token-jvfp8                    kubernetes.io/service-account-token   3      25m

generic-garbage-collector-token-c4795            kubernetes.io/service-account-token   3      25m

horizontal-pod-autoscaler-token-6pwsd            kubernetes.io/service-account-token   3      25m

job-controller-token-qkfp5                       kubernetes.io/service-account-token   3      25m

kube-proxy-token-l66vq                           kubernetes.io/service-account-token   3      25m

namespace-controller-token-7mhw7                 kubernetes.io/service-account-token   3      25m

node-controller-token-ckgvw                      kubernetes.io/service-account-token   3      25m

persistent-volume-binder-token-qtg47             kubernetes.io/service-account-token   3      25m

pod-garbage-collector-token-8fr7l                kubernetes.io/service-account-token   3      25m

pv-protection-controller-token-fcgg2             kubernetes.io/service-account-token   3      25m

pvc-protection-controller-token-fvrh7            kubernetes.io/service-account-token   3      25m

replicaset-controller-token-d8drp                kubernetes.io/service-account-token   3      25m

replication-controller-token-kfssb               kubernetes.io/service-account-token   3      25m

resourcequota-controller-token-4nrzh             kubernetes.io/service-account-token   3      25m

service-account-controller-token-qvl5p           kubernetes.io/service-account-token   3      25m

service-controller-token-bc645                   kubernetes.io/service-account-token   3      25m

statefulset-controller-token-tcmzj               kubernetes.io/service-account-token   3      25m

storage-provisioner-token-mvzcs                  kubernetes.io/service-account-token   3      24m

token-cleaner-token-hc27r                        kubernetes.io/service-account-token   3      25m

ttl-controller-token-nzwlc                       kubernetes.io/service-account-token   3      25m

kit-controller-token-vzjht                    kubernetes.io/service-account-token   3      24m

找到 dashboard-admin-token 前缀的一行,执行 kubectl describe secret dashboard-admin-token-gmr67 -n kube-system 如下:

bethxfchen:kubernetes cxf$ kubectl describe secret dashboard-admin-token-gmr67 -n kube-system

Name:         dashboard-admin-token-gmr67

Namespace:    kube-system

Labels:      

Annotations:  kubernetes.io/service-account.name: dashboard-admin

              kubernetes.io/service-account.uid: 955e6cb5-a91d-4ad3-820a-3ad0adb47d14

Type:  kubernetes.io/service-account-token

Data

====

ca.crt:     1066 bytes

namespace:  11 bytes

token:      eyJhbGciOiJSUzI1NiIsImtpZCI6ImJOcmNhWVFlU3RPTHlFMkNuZHpGaFpfb25FdS10SENzdVpmTXplUEFMTm8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlc

(此处省略完整 token 后面部分)

在 Kubernetes Dashboard 中输入 token,即可登录:

DevOps记录_第20张图片

DevOps记录_第21张图片

Dashboard 对应命令行:

DevOps记录_第22张图片

DevOps记录_第23张图片

DevOps记录_第24张图片

当然也可以考虑minikube快速搭建,minikube 是 K8S 官方为了开发者能在个人电脑上运行 K8S 而提供的一套工具。实现上是通过 Go 语言编写,通过调用虚拟化管理程序,创建出一个运行在虚拟机内的单节点集群。对于 K8S 集群的基本功能而言,节点数并没有什么限制。只有一个节点同样可以创建集群。

Ansible 

推荐 Ansible is Simple IT Automation
Ansible中文权威指南- 国内最专业的Ansible中文官方学习手册

Ansible 特性:

DevOps记录_第25张图片

配置自动化,应用部署

  • CentOS (Yum) 安装Ansible:

(1)新增 epel-release 第三方套件来源。
  sudo yum install -y epel-release

(2)安装 Ansible。
  sudo yum install -y ansible

ansible --version

[root@localhost bin]# cd /etc/ansible/

[root@localhost ansible]# ls

ansible.cfg       hosts        roles

  • Ansible 配置 

[root@localhost ansible]# vim ansible.cfg

  • 多主机之间可实现免密登录

ssh-keygen

ssh-copy-id

  • Host Inventory 主机清单,直接ip地址或主机名或主机分组

/etc/ansible/hosts

[root@localhost ansible]# vim hosts

  • HelloWorld

# Ansible 命令格式:ansible ip/hostname -m 模块名

[root@localhost ansible]# ansible localhost -m command -a 'echo Hello World.'

# 输出结果

localhost | CHANGED | rc=0 >>

Hello World.

  • Ansible ping模块实现测试主机互通性

# Ansible 命令格式:ansible ip/hostname -m 模块名

[root@localhost ~]# ansible localhost -m ping

# 输出结果

localhost | SUCCESS => {

    "changed": false,

    "ping": "pong"

}

  • Playbook

Playbook 采用 YAML 语言编写,Playbook核心元素有 hosts,tasks,variables变量,templates,handlers,tags,条件判断when,字典with_items等。

ansible-playbook YYYY.yml 

  • Ansible roles

roles就相当于多个Playbook的集合,完成复杂的任务。

Ansible Galaxy

(ansible-galaxy install XXXX;  tree .ansible/roles/)

  • ansible-vault 加密/解密

ansible-vault encrypt data.txt会要求输入一个新的Vault密码。

cat data.txt

DevOps记录_第26张图片

view时需要输入设置的Vault密码(不是原始密码),才可以查看原始密码。

ansible-vault decrypt data.txt输入Vault密码,即可解密。再cat data.txt就是原始密码。

ansible-vault rekey data.txt可重置Vault密码。

DevOps记录_第27张图片

local的是加密后的数据:

DevOps记录_第28张图片

远程传送到的是原始数据:

DevOps记录_第29张图片

Ansible Vault实践:

DevOps记录_第30张图片

或者ansible-playbook --vault-id=pass.txt vault.yml

Ansible Tower

Ansible Web界面,一种是直接在web界面操作创建inventory等,企业中一般不会这么做,而是采用另一种,在github上创建inventory,variables,roles,playbook目录等,然后在Ansible Tower指定SCM URL。

下面是第一种:

create an inventory

DevOps记录_第31张图片

add host

DevOps记录_第32张图片

create a project

DevOps记录_第33张图片

add a credential

DevOps记录_第34张图片

DevOps记录_第35张图片

create a job template

DevOps记录_第36张图片

run a job template:

DevOps记录_第37张图片

DevOps记录_第38张图片

Terraform

公司的谷歌云项目都是由Ansible+Terraform自动创建资源,然后相关信息会放在Github里。

如果需要更改Infra info,会push到Github上,然后 Terraform会自动扫描GitHub上的更改,系统自动 terraform apply 实现对资源的创建和更新。

你可能感兴趣的:(其他,docker)