docker使用

Docker学习参考文档:https://yeasy.gitbook.io/docker_practice

一、 Docker基本操作

1.1 Docker安装

1.1.1 Ubuntu安装

  • 卸载旧版本
    Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,请卸载它们:

    $ sudo apt-get remove docker docker-engine docker.io
    
  • 使用APT安装

    由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。

    $ sudo apt-get update
    
    $ sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
  • 添加 Docker 的官方 GPG 密钥

    鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。

    $ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
    
    # 官方源
    # $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    

    然后,我们需要向 sources.list 中添加 Docker 软件源

    $ echo \
      "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    
    # 官方源
    # $ echo \
    #   "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
    #   $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

    [^]: 以上命令会添加稳定版本的 Docker APT 镜像源,如果需要测试版本的 Docker 请将 stable 改为 test。

  • 安装 Docker

    更新 apt 软件包缓存,并安装 docker-ce

    $ sudo apt-get update
    
    $ sudo apt-get install docker-ce docker-ce-cli containerd.io
    
  • 使用脚本自动安装

    在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:

    若你想安装测试版的 Docker, 请从 test.docker.com 获取脚本

    # $ curl -fsSL test.docker.com -o get-docker.sh
    $ curl -fsSL get.docker.com -o get-docker.sh
    $ sudo sh get-docker.sh --mirror Aliyun
    # $ sudo sh get-docker.sh --mirror AzureChinaCloud
    

    执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在系统中。

  • 启动 Docker

    $ sudo systemctl enable docker
    $ sudo systemctl start docker
    
  • 测试 Docker 是否安装正确

$ docker run --rm hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

1.1.2 CentOs安装

1.1.3 Debian安装

1.2 Docker中央仓库

1、Docker官方的中央仓库: 这个仓库镜像最全,但是下载速度比较慢

​ https://hub.docker.com

2、国内的镜像网站: 网易蜂巢、daoCloud

​ https://c.163.com/hub

​ http://hub.daocloud.io 推荐使用

3、在公司内部采用私服的方式拉取镜像, [添加配置]

# 需要在/etc/docker/daemon.json
{
  "registry-mirrors" : [
    "http://ovfftd6p.mirror.aliyuncs.com",
    "http://registry.docker-cn.com",
    "http://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries" : [
	"ip:port"
  ],
  "debug" : true,
  "experimental" : true
}
# 配置完成之后,重启两个服务
$ sudo systemctl enable docker
$ sudo systemctl start docker

1.3 Docker镜像

# 1 拉取镜像到本地
docker pull 镜像名称[:tag]
# 2 查看全部本地的镜像
docker images
docker images ls
# 3 删除镜像
docker rmi 镜像标识id
# 4 镜像的导入导出
# 将本地的镜像导出
docker save -o 导出的路径 镜像id

# 加载本地的镜像
docker load -i 镜像文件
# 修改镜像名称
docker tag 镜像id 新镜像名称:版本

1.4 Docker容器

# 1 运行容器
docker run 镜像的标识|镜像名称[:tag]

# 2 常用参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
# -d: 守护运行
# -p: 指定宿主机端口与容器的端口映射
# --name: 容器的名称
# 3 查看正在运行的容器
docker ps

# 4 查看使用过的容器
docker ps -a
# 5 停止容器
docker stop 容器id  # 停止指定的容器
docker stop $(docker ps -qa) # 停止所有容器
# 6 删除容器
docker rm 容器id  # 删除指定的容器
docker rm $(docker ps -qa) # 删除所有的容器
# 7 查看容器日志
docker logs -f 容器id
# -f:可以滚动查看日志的最后几行
# 8 进入到容器
docker exec -ti 容器id /bin/bash
docker exec -ti 容器id /bin/sh

二、Docker应用

2.1 准备自己项目工程文件

脚本文件, selenium + chromedriver 截屏

required:

​ python==3.6,

​ chromedriver==90.3 下载链接:http://npm.taobao.org/mirrors/chromedriver/

  • 文件结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bafOtUcP-1665974966422)(/home/hodor/桌面/企66666666666666.png)]

snap_images: 存放截图文件

chromedriver:chrome驱动

docker-compose.yml: 挲得分

# snap_script.py

from selenium import webdriver
import time
import os
import getopt
import sys


def usage():
    print("""Snap browser cmd entry line:

    Usage: python snap_driver_cli.py [-m|-s|-i|-o|-p|-t]

    Options:
      -m, Execute Mode: 'to_img', 'to_video'
      -i, Input Url
      -d, Output Dir
      -t, Output File Type
      -s, Output File Size List, e.g. "1080p|210x170"
      -n, Output File Name

    """)
    print("")


class ChromeSnapImpl(object):
    def __init__(self, url, file_dir="./", file_type="png", file_name=str(int(time.time())), file_size=None):
        self.init_options()
        self.driver = webdriver.Chrome(executable_path="./chromedriver", options=self.options)
        self.gen_target_img_size(file_size)
        self.url = url
        self.target_file_name = file_name
        self.target_file_type = file_type
        self.target_file_dir = file_dir
        self.target_file_path = "%s%s.%s" % (self.target_file_dir, self.target_file_name, self.target_file_type)

    def init_options(self):
        options = webdriver.ChromeOptions()
        # options.add_argument("--headless")                  # 浏览器不提供可视化页面
        # options.add_argument('--no-sandbox')                # 解决DevToolsActivePort文件不存在的报错"
        # options.add_argument('--start-maximized')           # 最大化运行(全屏窗口),不设置,取元素会报错
        # options.add_argument('--no-startup-window')         # 启动时不建立窗口
        # options.add_argument(
        # '--allow-running-insecure-content')                 # 默认情况下,https 页面不允许从 http 链接引用 javascript/css/plug-ins。添加这一参数会放行这些内容。
        #
        options = webdriver.ChromeOptions()
        options.add_argument('--headless')
        options.add_argument('--dns-prefetch-disable')
        options.add_argument('--no-referrers')
        options.add_argument('--disable-gpu')
        options.add_argument('--disable-audio')
        options.add_argument('--no-sandbox')
        options.add_argument('--allow-running-insecure-content')
        options.add_argument('--ignore-certificate-errors')
        options.add_argument('--allow-insecure-localhost')
        options.add_argument('--disable-dev-shm-usage')
        options.add_experimental_option('excludeSwitches', ['enable-automation'])
        # return options
        self.options = options

    def gen_target_img_size(self, size_str):
        size_list = size_str.split("|")
        self.target_size_list = size_list

    def exec_snap(self):
        self.driver.get(self.url)
        width = self.driver.execute_script(
            "return Math.max(document.body.scrollWidth,"
            "document.body.offsetWidth, "
            "document.documentElement.clientWidth, "
            "document.documentElement.scrollWidth, "
            "document.documentElement.offsetWidth);"
        )
        height = self.driver.execute_script(
            "return Math.max(document.body.scrollHeight,"
            "document.body.offsetHeight, "
            "document.documentElement.clientHeight, "
            "document.documentElement.scrollHeight, "
            "document.documentElement.offsetHeight);"
        )
        print("sss", self.target_file_path)
        self.driver.set_window_size(width, height)
        self.driver.save_screenshot(self.target_file_path)
        print(self.driver.get_log("browser"))
        self.driver.close()
        self.clean_process()

    def clean_process(self):
        os.system("pkill chrome")
        os.system("kill $(ps aux | grep webdriver| awk '{print $1}')")


if __name__ == '__main__':
    try:
        opts, args = getopt.getopt(sys.argv[1:], "m:s:i:d:p:t:n:",
                                   ["mode=", "input_url=", "output_dir=", "output_type=", "output_size=", "output_name="])
        print("opts: %s" % opts)
        print("args: %s" % args)
    except:
        usage()
        exit()
    else:
        default_snap_path = "%s/snap_images/" %  os.path.dirname(os.path.realpath(__file__))
        print("default_snap_path: %s" %  os.path.dirname(__file__))
        if not os.path.exists(default_snap_path):
            os.makedirs(default_snap_path)

        mode = "to_img"
        input_url = "https://www.baidu.com"
        output_dir = default_snap_path
        output_type = "png"
        output_size = "1080p"
        output_name = "snap_" + str(int(time.time()))
        for opt, param in opts:
            if opt in ["-m", "mode"]:
                mode = param
            elif opt in ["-i", "input_url"]:
                input_url = param
            elif opt in ["-d", "output_dir"]:
                output_dir = param
            elif opt in ["-t", "output_type"]:
                output_type = param
            elif opt in ["-s", "output_size"]:
                output_size = param
            elif opt in ["-n", "output_name"]:
                output_name = param
        print("output_dir: %s" % output_dir)
        print("="*20)
        snap_impl = ChromeSnapImpl(url=input_url, file_dir=output_dir, file_type=output_type, file_name=output_name, file_size=output_size)
        snap_impl.exec_snap()


2.2 准备项目所需的指定的镜像文件

拉取一个ubuntu基础镜像

  • 拉取一个ubuntu基础镜像

    docker pull ubuntu
    
  • 运行容器

    docker run -d --name wzp_snap_worker 镜像id /bin/bash -c "while true;do echo hello;sleep 5;done"
    

    up , 所以容器在启动之后会被立即停止,因此认为加入一个循环执行的进程

    -c “while true;do echo hello;sleep 5;done”

  • 为容器创建所需环境,安装python

    #
    sudo apt-get update
    sudo apt-get install python==3.6
    
    
  • 将配置过的容器保存为自己的镜像

    docker commit 容器id 要保存的镜像名称:[tag]
    
  • 将生成的镜像导出一个tag包

    docker save -o 包名.tar 镜像名称[:tag]
    

2.3 数据卷Volumns

为了部署我们的项目工程, 需要使用到cp的命令将宿主机内的工程文件复制到容器内部

数据卷: 将宿主机的一个目录映射到容器的某一个目录中

可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会一起跟着改变

# 1 创建数据卷
docker volume create 数据卷名称
# 创建数据卷之后,默认会存放在一个目录下: /var/lib/docker/volumes/数据卷名称/_data
# 2 查看数据卷的详细信息
docker volume inspect 数据卷名称

# 查看全部数据卷
docker volume ls
# 3 删除数据卷
docker volume rm 数据卷名称

目前数据卷并没有与容器相关联

# 4 应用数据卷
## 当你映射数据卷的时候,如果数据卷不存在,Docker会自动帮你和创建, 会将容器内部自带的文件,存储在默认的路径当中
docker run -v 数据卷名称:容器内部的路径 镜像id

## 直接指定一个路径作为数据卷的存放位置
docker run -v 路径:容器内部的路径 镜像id

三、Docker自定义镜像

中央仓库上的镜像, 也是Docker的用户自己上传上去的

# 1 创建一个Dockerfile文件,并且指定自定义的镜像
# Dockerfile文件中常用的内容
from: 指定当前自定义镜像以来的环境
copy: 将相对路径下的内容复制到自定义的镜像中
workdir: 声明镜像的默认工作目录
cmd: 需要执行的命令(在workdir下执行的,cmd可以写多个,但是以最后一个为准)
  • 准备Dockerfile文件
from 依赖的镜像地址or链接 
copy 工程文件 镜像路径
workdir
cmd 
  • 制作镜像

    将准备好的Dockerfile文件和相应的文件拖拽到linux系统中, 通过Docker的命令制作镜像

docker build -t 镜像名称:[tag]
  • 查看刚制作的镜像
docker images

四、Docker-Compose

4.1 简介

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。其代码目前在 https://github.com/docker/compose 上开源。

Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

通过第一部分中的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

4.2 下载安装Docker-Compose

在 Linux 上的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。

例如,在 Linux 64 位系统上直接下载对应的二进制包。

  • 简洁安装
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# 国内用户可以使用以下方式加快下载
$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose
  • 详细安装
# 1 从github官网下载docker-compose, 根据需要下载指定的Docker-compose版本  这里下载最新版
https://github.com/docker/compose/releases/download/1.29.1/docker-compose-Linux-x86_64

# 2 在Linux终端下执行
sudo wget https://github.com/docker/compose/releases/download/1.29.1/docker-compose-Linux-x86_64 > /usr/local/bin
sudo mv docker-compose-Linux-x86_64 docker-compose

# 3 给docker-compose添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 4 添加到环境变量中
sudo vim /etc/profile

"""
在最后一行添加
export PATH=$PATH:/usr/local/bin
"""
# 重新加载环境变量
source /etc/profile

4.3 编写yml文件

version: "3"
services:
  snap_worker:
    restart: always
      image: chrome_snap_driver:wzp
      container_name: wzp_snap_worker
      volumes: 
        - /home/progress/docker_proj/docker_snap_image:/opt/typhoonae/snap_image
        - /home/progress/docker_proj/docker_snap_image/snap_script.py:/opt/typhoonae/snap_image/snap_script.py
        - /home/progress/docker_proj/docker_snap_image/chromedriver:/opt/typhoonae/snap_image/chromedriver

4.4 使用docker-compose命令管理容器

在使用docker-compose的命令时候,默认会在当前目录下检索.yml文件

# 1 基于docker-compose.yml启动管理的容器
docker-compose up -d

## 也可以指定yml文件
docker-compose -f 你的yml文件 up -d
# 2 关闭并删除容器
docker-compose down

# 指定yml文件
docker-compose -f docker-compose.yml down
# 3 开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart

# 指定yml文件
docker-compose -f docker-compose.yml start|stop|restart
# 4 查看由docker-compose管理的容器
docker-compose ps
# 5 查看日志
docker-compose logs -f

五 Docker DI CD

liu

fdasdfs




你可能感兴趣的:(docker,容器,运维)