文章详情页 您现在的位置是:网站首页>文章详情
Docker的简单用法
Jeyrce.Lu
发表于:2019年11月15日 18:41
分类:【服务器】
2225次阅读
我们目前有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
上一篇:我在杭州叙事老楼梯篇
下一篇:消息队列基础篇(上)
猜你喜欢
文章评论区
作者名片
![图片丢失](/media/header/avator.png)
- 作者昵称:Jeyrce.Lu
- 原创文章:61篇
- 转载文章:3篇
- 加入本站:1972天
作者其他文章
站长推荐
友情链接
站点信息
- 运行天数:1973天
- 累计访问:164169人次
- 今日访问:0人次
- 原创文章:69篇
- 转载文章:4篇
- 微信公众号:第一时间获取更新信息
![](/static/image/wxgzh.jpg)