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

一、Docker基础

1、背景知识

1)docker是什么?

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

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

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

下图是docker组件:

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就完成安装了。

/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命令之前,有必要弄清楚镜像和容器的差别,简单来说,镜像(Image)就是一堆只读层(read-only layer)的统一视角; 容器 = 镜像 + 读写层。

详细可参考我的另一篇文章---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平台为例:

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

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

2、容器

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  (推荐)

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

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

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

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

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

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

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

用小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:

  $ sudo docker login --username= registry.cn-beijing.aliyuncs.com$ sudo docker tag [ImageId] registry.cn-beijing.aliyuncs.com/spencer_docker/django2:[镜像版本号]$ 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自动构建镜像,其实就是把手动构建的命令逐行写入一个“脚本”里,只不过这个脚本有自己的语法,如下图

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

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

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

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

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

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

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

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

1)可以在阿里云code,github,等代码管理平台,创建项目,然后将自己的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

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

  1. centos7镜像加速_使用阿里云容器镜像服务托管私有Docker镜像

    一个只用markdown语法编写文章的90后野路子Web架构师,每天都分享一些有用的知识点,欢迎关注- 前言 概述 本文主要讲解如何托管自己的Docker镜像到阿里云容器镜像服务ACR上,以及如何使用 ...

  2. docker 修改阿里镜像源_使用阿里云容器镜像服务托管私有Docker镜像

    一个只用markdown语法编写文章的90后野路子Web架构师,每天都分享一些有用的知识点,欢迎关注- 前言 概述 本文主要讲解如何托管自己的Docker镜像到阿里云容器镜像服务ACR上,以及如何使用 ...

  3. Docker 4.2:Docker 公有镜像仓库 - 阿里云容器镜像服务

    4.2:阿里云容器镜像服务 阿里云的容器镜像服务地址为:https://cr.console.aliyun.com 阿里云存储 4.2.1:创建命名空间 阿里云提示: 推荐创建的命名空间用来对应一个公 ...

  4. 五、基于github+阿里云容器镜像服务进行docker部署

    将代码(jar包)托管在github上,使用阿里云容器镜像服务绑定github上的源代码,实现github上发生变更时,阿里云自动构建镜像,docker从阿里云拉取最新镜像并运行,关系如下: 本例主要 ...

  5. .Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续集成(CI)

    前面已经介绍过了 .Net Core 程序发布到 Docker 容器的内容.但是每次通过 SSH 链接到服务器敲命令,运行脚本也是挺麻烦的一件事.程序员是最懒的,能让电脑解决的问题绝不手动解决,如果当 ...

  6. 如何实现阿里云容器镜像服务反向访问代理?

    简介:本文会先介绍镜像推送/拉取过程的交互逻辑来梳理需要代理的所有服务,再通过搭建一个公网 HTTPS 反向代理来访问容器镜像服务来向您展示多场景代理访问模式原理. 真实业务场景可能很复杂,因安全.合 ...

  7. 实现阿里云容器镜像服务反向访问代理

    简介: 本文会先介绍镜像推送/拉取过程的交互逻辑来梳理需要代理的所有服务,再通过搭建一个公网 HTTPS 反向代理来访问容器镜像服务来向您展示多场景代理访问模式原理. 真实业务场景可能很复杂,因安全. ...

  8. 利用阿里云容器镜像服务下载gcr.io镜像

    背景 由于你懂的原因,国内是没有办法下载gcr.io镜像的,利用docker hub构建GitHub现在又要钱,所以这里利用阿里云容器镜像服务下载gcr.io镜像. 步骤 这里以gcr.io/tekt ...

  9. jib构建镜像(使用阿里云容器镜像服务拉取镜像)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zhangjingao/article/details/83542452 jib的基本使用(使用阿里云 ...

最新文章

  1. Java File类总结和FileUtils类
  2. 如何将APACHE许可证应用于您的工作
  3. Codeforces 919D Substring (拓扑图DP)
  4. Java中BigDecimal的一个除法异常
  5. Linux 进程管理与监控(supervisor and monit)
  6. 数组各元素出现的次数
  7. protobuf 数据解析的2种方法
  8. mysql 征途_MySQL数据库
  9. Centos7,配置防火墙,开启端口
  10. Android Learning:数据存储方案归纳与总结
  11. access insert语句怎么写_擦亮自己的眼睛去看SQLServer之简单Insert
  12. 30问提升技术人写作力-第1问作业
  13. treeset可以重复吗_java容器(五)HashSet与TreeSet
  14. 图像处理学习——色彩空间
  15. mysql创建软连接_18.4.2 建立MySQL的软链接
  16. arcgis属性表中的某一字段保留1位小数
  17. 2017暑假训练第一场的一些题目
  18. CSS基础入门,导入方式,选择器
  19. WIN10安装CH340驱动出现感叹号的解决办法总结
  20. genesis铜皮处理

热门文章

  1. Web安全之文件上传漏洞
  2. 工学硕士翻译计算机,赫瑞瓦特大学中英翻译与计算机辅助翻译工具理科硕士入学条件及实习就业...
  3. BaseAdapter notifyDataSetChanged()
  4. 阿里云服务器和腾讯云服务器哪个更好?多维度对比得出了结论
  5. Excel提取单元格中的数字
  6. 如何在 Android 上自定义来电通知?带有代码示例
  7. SQLServer 查询分析器里大小写转换快捷键
  8. Zotero6.0来了,内容丰富,适合初学者(插件安装,翻译器更新)
  9. CentOS 与 Ubuntu:哪个更适合做服务器
  10. 开环零极点对根轨迹的影响