微信搜索superit|邀请体验:大数据, 数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

Docker总结(配合阿里云容器镜像服务)

aliyun aide_941 24℃

Docker总结(配合阿里云容器镜像服务)

Docker是个很好的工具,刚开始用觉得还没虚拟环境好用,随着深入了解,越发觉得Docker好用,今天就来总结一下使用心得。

一、Docker基础

1、背景知识

1)docker是什么?

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

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

注册服务器(repository),仓库(registry),镜像(image),容器(container)之间的关系:注册服务器主要是用来存放仓库的服务器,在一个服务器上有多个仓库,而仓库又可以分为公共仓库和私有仓库,一个仓库里面有可以有多个镜像,而容器则是镜像的一个实例

 

下图是docker组件:

wKiom1fkFJOgOSgNAAD3ZVxFxAk716.png

Docker之所以火的很快,原因之一就是它的仓库。仓库类似于github,很多现成的镜像供各位下载,直接用docker pull redis-server(这个名字是瞎起的)就可以拉下来一个redis服务器的镜像,放到自己的docker里就能用了,不用自己解决依赖、安装redis。好多开源工具都有docker镜像,这就使得用户只需要下载使用就行,完全省去了处理软件依赖、缺少库文件、安装部署等环节。

2) docker用途,目前有三大类

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

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

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

2、docker安装:

1)Windows安装,推荐使用win10,参考我的另一篇博客—windows10安装docker以及挂在在pycharm

2)Mac安装,参考博客—Mac平台上Docker安装与使用

3)  Centos安装

在centos下,如果有epel源直接yum install docker-io就完成安装了。

wKioL1fkFLayj1M9AAAm5fcHiXw718.png

/etc/init.d/docker start启动docker。

4)Ubuntu安装

sudo apt-get remove debian-keyringdebian-archive-keyring

sudo apt-get clean

sudo apt-get update && sudo apt-get-y install debian-keyring debian-archive-keyring

wget -qO- https://get.Docker.com/ | sh

注:如果ubuntu启用了ufw,要配置使其能转发请求,并允许2375端口访问外网。

3、docker命令

 

在知道docker命令之前,有必要弄清楚镜像和容器的差别,简单来说,镜像是静止的,容器是动态的,镜像运行起来就是容器,下边是我认为比较好的一篇博客—docker容器和镜像区别

 

以下命令最好使用管理员权限运行,避免出错。

 

1、镜像

1)获取镜像:docker pull  images-name

2)查看所有镜像:docker images

3)删除镜像:docker rmi image-id

4)保存镜像:docker commit -m=”description about images” –author=”author” {container_id}  {repository/images_name:tag}

5)推送镜像到代码仓库(可以后面的阅读完在看这个),以阿里云docker平台为例:

  1. ① docker login –username=your_username registry.cn-beijing.aliyuncs.com
  2. ② docker tag [ImageId] registry.cn-beijing.aliyuncs.com/[命名空间]/[仓库名称]:[镜像版本号]
  3. ③ docker push registry.cn-beijing.aliyuncs.com/[命名空间]/[仓库名称]:[镜像版本号]

6)使用Dockerfile创建新的镜像(注意:末尾有一个点,表示当前路径):docker build -t “repository/images_name:tag” .

 

2、容器

wKioL1fkFRPyV9cRAAGgdghVzUg932.png

docker start 容器id
docker stop 容器id
docker exec -it 容器id /bin/bash  # 进入容器
docker cp 宿主机绝对路径  容器id:路径   # 宿主机和docker容器之间复制文件

# 关于删除容器:

方法一:

#显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID,

sudo docker ps -a|grep Exited|awk ‘{print $1}’

#查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器

sudo docker rm `docker ps -a|grep Exited|awk ‘{print $1}’`

方法二:

#删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)

sudo docker rm $(sudo docker ps -a -q)

方法三:

#根据容器的状态,删除Exited状态的容器

sudo docker rm $(sudo docker ps -qf status=exited)

方法四:

#Docker 1.13版本以后,可以使用 docker containers prune 命令,删除孤立的容器。

sudo docker container prune  (推荐)

 

wKioL1fkFTGDEMeJAAGYWDVx2bM180.png

指定映射最常用的是第一种,直接指定宿主端口:容器端口;

第二种,假如宿主有多个ip的话,让容器的端口绑定到宿主的固定一个ip的端口上;

第三种,只绑定宿主ip,端口随机取;

第四种,它的意思是一条docker run命令可以同时用多次”-p”参数,指定多个端口映射关系,比如,docker run –d –p 99:80 –p 33:443 –name mynginx33 nginx

wKiom1fkFeTjUbJnAAAqMyKJ1JI651.png

启动容器时用-P(大写)参数,表示让容器随机对应一个宿主机的端口,如上,容器的80端口对应宿主的32768端口,容器的443对应宿主的32769端口。

比如我的宿主ip是192.168.0.55,这时候在宿主机的浏览器输入192.168.0.55:32768就可以访问到docker容器里的nginx应用了。

端口随机映射的好处是:端口不会冲突。难点是,生产中还得用脚本或者其他方式获取到这个随机的端口,由于它是变化的,所以脚本必须得适应这种变化性。

wKioL1fkFfiCF4ElAAAxf7B-tVM477.png

用小p来手动指定端口映射,如上所示,将容器的80端口映射到宿主的91端口上,而443没有指定映射关系,所以443不可访问。

 

二、制作自己的Docker镜像

自己制作的docker我都推送到了阿里云docker管理平台了,而不是推送到docker官方的管理平台。下面首先介绍一下使用阿里云docker管理平台创建自己的仓库。

1、阿里云docker管理平台创建仓库

1)进入阿里云镜像服务控制台,新建镜像仓库,如图

2)新建仓库弹窗,一步一步按提示填,注意,设置代码源可以使用github,阿里云code等等,这里我使用的是阿里云code,后面可以使用项目里面的Dockerfile自动生成镜像,具体步骤下面会详细介绍

3)新建完之后,会有镜像仓库列表,显示镜像仓库信息

4)点击管理,基本信息,会有各个命令提示:

登录阿里云docker registry:

  $ sudo docker login --username=  registry.cn-beijing.aliyuncs.com

登录registry的用户名是您的阿里云账号全名,密码是您开通服务时设置的密码。

你可以在镜像管理首页点击右上角按钮修改docker login密码。

从registry中拉取镜像:

  $ sudo docker pull registry.cn-beijing.aliyuncs.com/spencer_docker/django2:[镜像版本号]

将镜像推送到registry:

  1. $ sudo docker login –username= registry.cn-beijing.aliyuncs.com
  2. $ sudo docker tag [ImageId] registry.cn-beijing.aliyuncs.com/spencer_docker/django2:[镜像版本号]
  3. $ sudo docker push registry.cn-beijing.aliyuncs.com/spencer_docker/django2:[镜像版本号]

其中[ImageId],[镜像版本号]请你根据自己的镜像信息进行填写。

 

2、手动构建Docker镜像

这种方法就是根据docker镜像为基础镜像来创建容器,然后运行容器,在容器中安装自己需要的包,然后再提交(commit)一下,推送(push)到自己的镜像仓库就ok了。

下面以一个Ubuntu:16.04为例,更改为自己的python3.6+django2.0镜像,由于三个版本(v1,v2,v3)都是使用的原始的Ubuntu:16.04,所以三种生成进行镜像方法介绍完之后再以一个版本为例介绍docker环境配置。

1)拉取Ubuntu:16.04官方镜像:

2)进入镜像,变为容器,随便安装一些包

3)退出容器,exit,提交镜像(命令可以看本博客命令部分的镜像命令)

如图,上图提交命令解释:

① -m是对提交的描述,author是作者(选填),后面的c28e5976a6ab是修改容器的id,后面的是新镜像名字和标签(tag)。

② 成功之后,会生成新的镜像id

③ 输入docker images 查看镜像,会发现新的名为spencer/django,标签为v1的镜像已经存在。

4)推送到阿里云docker管理平台,命令参考上面将镜像推送到阿里云registry

 

 

 

5)打开阿里云镜像服务控制台,进入镜像仓库列表–>管理–>镜像版本,如下图,版本,镜像id,和本地推送上来的版本,镜像id一样

6)删除本地images,拉取阿里云docker镜像管理台镜像,如下图

3、利用Dockerfile构建Docker镜像

由Dockerfile自动构建镜像,其实就是把手动构建的命令逐行写入一个“脚本”里,只不过这个脚本有自己的语法,如下图

wKioL1fkFjbCb5-DAAMG1r9ceFY874.png

1)现在在本地创建一个Dockerfile文件,如图,touch Dickerfile

2)使用Dockerfile生成镜像,注意:

① 如果是手动创建的话,不要创建txt文件,不然本地使用Dockerfile生成docker镜像的是,会报找不到的错误,

② 创建命令:docker build -t “repository/images_name:tag” .

新建镜像最好在Dockerfile当前路径下面创建,末尾可以用点表示,如果不是在当前路径,需要使用绝对路径

3)推送到阿里云docker管理平台,如下图

 

4、利用阿里云镜像平台的代码源Dockerfile构建docker镜像

可以将Dockerfile文件放在项目里面,然后利用阿里云镜像平台自动生成镜像功能,生成镜像,生成之后可以直接在本地拉取远程镜像。

1)可以在阿里云codegithub,等代码管理平台,创建项目,然后将自己的Dockerfile放大项目,推送到远程代码管理平台,然后绑定到阿里云镜像仓库,在创建镜像仓库的时候,设置代码源的选项,设置到Dockerfile文件路径下面就行,具体项目代码不再展示,如下图

2)进入镜像列表–>管理–>构建–>立即构建,注意:构建设置里面要设置对的Dockefile路径,不然会构建失败。

3)构建成功,查看镜像,拉取镜像到本地

点击镜像版本,如图,构建成功

本地拉取镜像,如图

注意:建议大家使用dockerfile创建镜像,因为启动镜像,在容器内安装包再commit ,每一次ocmmit都相当于多了一层,这样会导致镜像占用空间比较大而且臃肿,推荐使用dockerfile创建镜像,把多个安装包的步骤放在一个RUN里面,使用&&连接,这样安装多个包相当于在一层中,详细可参考《从入门到实践2》一书,讲解的很到位,下面是百度云盘的链接,有需要的朋友可以拿走。

https://pan.baidu.com/s/1QLsprDiB_fz_r06m_HcKfQ

5、docker环境配置python3.6+django2.0

其实docker镜像包都是可以通过Dockerfile一次性部署的,我在研究的时候分开了弄,走一遍流程,这样写到dockerfile中保证不会出错。接下来就是我研究过程,博友们不必看,就是简单的安装一些依赖包的过程

因为我构建的镜像是以ubuntu为基础,ubuntu原始安装命令是apt-get install

1)更新apt-get install

命令:apt-get update

2)安装Python3.6

说明一下:目前通过 apt-get install python3直接安装的是Python3.5版本,因为python3.6(apt-get install python3.6是无效的)是最新版本,所以只能先安装Python3.5然后升级到3.6。倘若Python3.6全部完善之后出来Python3.7,3.8,3.9等等,这样就可以直接通过apt-get install python3安装3.6了。

①安装Python3 ,安装成功之后,输入python3,会显示Python3.5的交互环境

命令:

apt-get install python3

②安装Python3.6的需求包

命令:

apt-get install software-properties-common

③添加Python3.6

命令:

add-apt-repository ppa:jonathonf/python-3.6

④更新apt-get

命令:

apt-get update

安装Python3.6,

命令:

apt-get install python3.6

⑥安装成功之后输入Python3依旧是Python3.5的交互环境,这样很不方便,接下来就是实现输入Python直接进入到Python3.6的交互环境,如下图:

第一步:which python3 —查看Python3.5安装在何处

第二步:更改软链接,输入Python默认启动Python3.5,命令:ln -s /usr/bin/python3.6 /usr/bin/python

第三步:更改默认启动为Python3.6,注意第三条命令最后的一个2,这个是排序,只要python3.6的排序比3.5的高就行,命令:

update-alternatives –install /usr/bin/python3 python3 /usr/bin/python3.6 2

3)安装pip

①安装pip3

命令:

apt-get install python3-pip

②更新pip3为pip,并升级

命令:

pip3 install --upgrade pip

4)升级python-dev

起初并不知道这个还需要升级,因为他原本的dev是Python3-dev,但是安装一些包的时候老是报如下错误:

Command "/usr/bin/python3 -u -c "import setuptools, tokenize;__file__='........

找了n久,才发现是这个原因,之前安装原本的dev是Python3-dev,要升级到Python3.6-dev,如下图

命令:

apt-get install python3.6-dev

5)批量安装依赖包

把需要安装的依赖放到一个名为requerments的文件中,然后使用命令 pip install -r requerments,批量安装依赖包

命令:

pip install -r requerments

https://www.jianshu.com/p/0231568ab335

 

转载请注明:SuperIT » Docker总结(配合阿里云容器镜像服务)

喜欢 (0)or分享 (0)