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

来源:https://blog.csdn.net/weixin_40475396/article/details/80423980

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命令之前,有必要弄清楚镜像和容器的差别,简单来说,镜像是静止的,容器是动态的,镜像运行起来就是容器,下边是我认为比较好的一篇博客---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)构建成功,查看镜像,拉取镜像到本地

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

本地拉取镜像,如图

 

你可能感兴趣的:(docker)