来源: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)构建成功,查看镜像,拉取镜像到本地
点击镜像版本,如图,构建成功
本地拉取镜像,如图