文章详情页 您现在的位置是:网站首页>文章详情

Docker的简单用法

图片丢失 Jeyrce.Lu 发表于:2019年11月15日 18:41 分类:【服务器 2109次阅读

        我们目前有redfish_exporter、snmp_exporter、ssh_exporter、oracle_exporter、qfalme_exporter共5个exporter, 全部采用golang开发,而我们打包这些exporter可以在自己本地配置好golang环境,采用go build 编译成可执行文件,也可通过我们的docker环境进行打包,因此此处记录一下打包方法

一、docker 部署和使用

1.1docker 概述

        软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?

        用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。

        如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:"它在我的机器可以跑了"(It works on my machine),言下之意就是,其他机器很可能跑不了。

        环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

        Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

        Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

        总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker 的主要用途,目前有三大类。

(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

1.2docker 环境部署

1.2.1准备操作系统

zstack平台准备一台虚拟机,此处有两个要点

(1) 虚拟机的配置可以高一些,以便安装更快,也便于之后部署更多的服务

(2) 系统镜像不要选择7.5, 会有一堆依赖装不下来;我选择的是7.4, 其他版本没有实践过。


1.2.2配置、更新yum源和依赖

默认yum源是找不到docker的,选择官方的yum源则需要翻墙,因此此处采用阿里云的yum源

(1) 更新yum

yum -y update --skip-broken

(2) 添加yum源(如果yum-config-manager命令找不见,则使用yum install yum-utils下载)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(3) 下载依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2

(4) 安装docker相关的包

yum install -y docker-ce docker-ce-cli containerd.io

之后应该就很快装好了

1.3docker 常用操作

1.3.1启动和设置开机自启

以上步骤没有问题,就可以通过开启docker进行使用了,过程中如果缺少依赖包,则先安装依赖包即可

systemctl start docker
systemctl enable docker
docker version 或 docker info # 查看docker版本信息
docker help # 查看docker 命令

1.3.2 image

1.3.2.1 镜像文件

Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。

docker image -h # 查看image 相关的命令
docker images 或 docker image ls # 查看的当前镜像列表
docker build # 根据docker file 制作image

image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。

1.3.2.2 镜像仓库

为了方便共享,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 [Docker Hub](https://hub.docker.com/) 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。dockerhub和github特别像,只不过git托管的是代码,而dockerhub托管image,可以去注册一个dockerhub的账号,就能够像使用git一样使用它。

由于官方docker镜像源经常超时,将/etc/docker/daemon.json 添加以下内容(文件不存在则自建):

# 更换为国内镜像源, 之后重新启动docker
{
    "registry-mirrors": [
        "https://dockerhub.azk8s.cn",
        "https://reg-mirror.qiniu.com",
        "https://registry.docker-cn.com"
    ]
}

1.3.3container

如果说 image 是一个模板, 那么container 就是根据image 模板创建出来的实例

docker container run <name> # 创建容器并启动:会在本地找image文件,找不见会在镜像仓库去找
docker container start <id> # 启动已经存在的,停止的容器
docker container ls # 查看正在运行的容器, -a 可查看所有的
docker container rm # 删除容器,容器停止后依然存在

例如:

docker image pull nginx
docker run -d -p 80:80 nginx # 之后打开本机:80端口即可查看nginx启动成功的页面

1.4 docker 深入使用

1.4.1 DockerFile 

学会使用 image 文件以后,接下来的问题就是,如何可以生成 image 文件?如果你要推广自己的软件,势必要自己制作 image 文件。

这就需要用到 Dockerfile 文件。它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。

# 继承xxx镜像, 冒号表示标签, 后面的内容通常是版本号或 latest
FROM xxx:1.4

# 要打包的文件: 当前目录下所有文件(除.dockerignore文件中排除的)拷贝到image的/app目录下
COPY . /app

# 之后的工作路径
WORKDIR /app

# 构建image阶段执行的命令, 结果都会打包进image
RUN ["pip install xxx", "cccc"]

# 将容器的8000端口暴露,允许外部连接
EXPOSE 8000

# 容器启动后执行的命令, 通常用于启动服务, 如果docker container run 添加了附带命令则会覆盖此处
CMD ["/bin/bash xxx.sh", "xxx"]

1.4.2 使用docker 部署服务

以启动一个nginx服务并自定义配置为例

1.使用docker 下载nginx 镜像 

docker pull nginx

这样就简单的把nginx启动了,但是我们想要改变配置文件nginx.conf ,进入容器,命令:

docker exec -it nginx bash

nginx.conf配置文件在 /etc/nginx/ 下面,但是你使用vim nginx.conf 或者vi nginx.conf会发现vi或者vim命令没有用,解决办法:apt-get update 完成之后 apt-get install vim 此时你就可以自己定制nginx.con文件了,改好配置文件之后重启容器,步骤,先把容器停了

docker stop nginx 然后重启 docker start nginx

2. 这样不是很方便,还有第二种方式,挂载配置文件。

就是把装有docker宿主机上面的nginx.conf配置文件映射到启动的nginx容器里面,这需要你首先准备好nginx.con配置文件,如果你应经准备好了,下一步是启动nginx

命令:

docker run --name nginx -p 80:80 -v /home/docker-nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/docker-nginx/log:/var/log/nginx -v /home/docker-nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -d nginx

解释下上面的命令:

--name 给你启动的容器起个名字,以后可以使用这个名字启动或者停止容器

-p 映射端口,将docker宿主机的80端口和容器的80端口进行绑定

-v 挂载文件用的,第一个-v 表示将你本地的nginx.conf覆盖你要起启动的容器的nginx.conf文件,第二个表示将日志文件进行挂载,就是把nginx服务器的日志写到你docker宿主机的/home/docker-nginx/log/下面

第三个-v 表示的和第一个-v意思一样的。

-d 表示启动的是哪个镜像

之后打开浏览器访问: http://192.168.1.48 就可以看到自定义配置后的nginx服务


二、构建我们二方库pypi源

目前我们有一个自己的pypi源  http://192.168.1.80:8080,里面封装了我们项目中一些公共模块,下面实操一下搭建过程

2.1 构建docker 环境

操作在 192.168.1.48 进行, 目前已经开好pypi服务

# 拉取镜像: 官方源或国内代理版官方源都有
docker image pull codekoala/pypi
# 将80环境中的文件目录直接拉过来,也可自己创建, 这个目录就是用来存放二方包的
scp -r root@192.168.1.80:/srv/pypi /srv/
# 开启镜像服务
docker run -itd -e PYPI_EXTRA="--disable-fallback" -v /srv/pypi:/srv/pypi:rw -p 8080:80 --name pypi codekoala/pypi
# 查看服务状态
docker container ls

之后就可以使用浏览器打开 http://192.168.1.48:8080/packages/ 就能看到所有的包了,在我们项目中 .env 和Pipfile 修改pypi源, 尝试pipenv下载即可看到效果

补充开启容器时可以携带的参数:

PYPI_ROOT:容器中将存储软件包的路径。默认为/srv/pypi。
PYPI_PORT:绑定到接收请求的端口。默认为80。所以我们用 -p 8080:80 将容器的80端口映射到宿主机的8080端口, 宿主机80端口已经被nginx映射了
PYPI_PASSWD_FILE:认证文件的路径,用来向pypi中添加包。默认为 /srv/pypi/.htpasswd。
PYPI_OVERWRITE:允许覆盖现有软件包。默认为 false。
PYPI_AUTHENTICATE:要验证的(不区分大小写)操作的列表。默认为update。
PYPI_EXTRA:的任何其他参数pypi-server。

2.2 上传二方包到pypi仓库中 

如上,我们实际上可以直接将xxx.tar.gz包拖入宿主机的 /srv/pypi中,但是这种方法并不好,需要root帐密登录(假如别人登上去把你别的服务停了怎么办),因此我们使用另一种推荐的办法。

(1) 在宿主机安装htpasswd 命令,用于文件auth验证

yum -y install httpd-tools # 之后能够找见htpasswd 命令

(2) 在宿主机pypi目录下创建用户和密码

# 在/srv/pypi/.htpasswd文件写入用户admin, 如果文件已经存在则去掉-c参数
htpasswd -cs /srv/pypi/.htpasswd admin

(3) 在本地家目录(自己开发用的电脑)编写 ~/.pypirc, 注意是**家目录**, 不要放到项目下

[distutils]
index-servers =
    pypi
    internal    # 注意此处和下面的[internal要对应]

[pypi]
username:pypiusername
password:pypipassword

[internal]    // 此处要和上面的对应,且使用时 python setup.py sdist upload <位置> 这里的位置和此处也对应
repository: http://192.168.1.48:8080
username:yourusername
password:yourpassword

(4) 在本机**项目下**编写setup.py

from setuptools import setup, find_packages

version = '0.1.2.dev7'
requirements = [
    "pyyaml",
    "grpcio",
    "qflame",
    "qdata-utils"
]

setup(
    author="Jeeyshe",
    author_email='jeeyshe@gmail.com',
    classifiers=[
        'Programming Language :: Python :: 2.7',
    ],
    description="qflame qpi wrapper",
    install_requires=requirements,
    include_package_data=True,
    name='qdata_monitor',
    packages=find_packages(include=['qdata_monitor']),    # 此处表示将项目下 qdata_monitor 文件夹整个打包
    version=version
)

(5) 执行命令将文件上传到pypi库

# 注意此处upload 后面的 internal 参数标定的是pypi 库, 是可以配置多个的
python setup.py sdist upload internal

能够看到 `Server response (200): OK` 输出信息则上传成功, 此时到 宿主机 `/srv/pypi` 下面就能够看到 `qdata_monitor.0.1.2.dev7.tar.gz` 文件了

补充: 如果/srv/pypi 下面已经存在相同 name 和 version 的文件也是会失败的。

2.3 将三方包纳入到我们的pypi仓库

有一些三方包不维护了,甚至说从官方的pypi源中移除了,那么我们就可以将三方包放到自己的pypi仓库中。

# 在宿主机中运行 pip 下载命令,将原包(.tar.gz)放入 /srv/pypi
pipdownload <pkg_name> -d /srv/pypi 
# 批量下载包到宿主机
pip download -r requirements.txt -d /srv/pypi

然后下载三方包时指定pip源为我们的pypi仓库即可

pip install xxx -i http://192.168.1.48:8080


版权声明 本文属于本站  原创作品,文章版权归本站及作者所有,请尊重作者的创作成果,转载、引用自觉附上本文永久地址: http://blog.lujianxin.com/x/art/hwgrdevq8okq

文章评论区

作者名片

图片丢失
  • 作者昵称:Jeyrce.Lu
  • 原创文章:61篇
  • 转载文章:3篇
  • 加入本站:1809天

站点信息

  • 运行天数:1810天
  • 累计访问:164169人次
  • 今日访问:0人次
  • 原创文章:69篇
  • 转载文章:4篇
  • 微信公众号:第一时间获取更新信息