欢迎各位兄弟 发布技术文章
这里的技术是共享的
了解一下 Docker 的镜像与容器。
封面摄影:Ole Henrik Skjelstad
来自 https://ninghao.net/course/3764
准备
1)下载 Docker Toolbox
https://www.docker.com/products/overview#/docker_toolbox
https://docs.docker.com/desktop/install/mac-install/ 有桌面功能
Docker 本身需要在 Linux 核心的系统上运行,所以如果我们想在平时用的 MAC 还有 Windows 上使用 Docker ,需要安装一些软件 .. Docker Toolbox 就是一个软件包 ..
在这里你可以选择要使用的版本,然后把它下载下来 ... 再去安装一下它 .. 安装完成以后,这个 Toolbox 给我们提供了两个开始用 Docker 的工具 .. 一个是 Docker Quickstart Terminal ..
它是一个命令行工具 .. 还有一个是 Kitematic .. 它提供了一个图形界面 ... 我们先用一下这个命令行工具 ... 默认它会打开系统自带的终端工具 .. 第一次打开它的时候,它会给我们创建一台默认的 Docker 机器 ..
这样我们就可以去使用 Docker 了 ...
来自 https://ninghao.net/video/3766
来自 https://ninghao.net/course/3764#info
下载镜像
2)搜索镜像
https://hub.docker.com/explore
image 可以翻译成镜像 ... 在 Docker Hub 这个网站上你可以找到一些别人做好的镜像,比如一些基本的镜像 ,像 centos,ubuntu 等等 .. 还有一些镜像里面已经安装好了特定的软件,比如 nodejs ,或者 wordpress ..
使用 docker 命令可以把这些镜像下载到本地电脑上 .. 不确定要使用的 image 的名字可以先去搜索一下,比如我要找一下 centos 相关的镜像 ..
# docker search centos
这里会给我们返回搜索的结果 .. Name 这栏就是镜像的名字 .. 有些镜像的名字会有两个部分,斜线前面的东西是创建这个镜像的人或者团队 .. 后面的东西是这个 image 的名字 .. 这个名字一般可以描述它到底能做什么 ..
Description 这栏里面有一个具体的描述 .. Stars 是被喜欢的次数 .. 这个星星数越多说明它越受欢迎 .. Official 表示这个 Image 是否是官方提供的 .. Docker 团队提供了一些官方正式的 Image .. ok 表示这是一个官方提供的 image ..
官方提供的 image 的名字里面一般没有前缀 ..
来自 https://ninghao.net/video/3768
3)下载镜像
查看在本地上已有的 image 可以执行一下
# docker images
.. 这里只有一些栏目的名字,因为在我的主机上还没有可以使用的 image .. 找到想要使用的 image 以后,再用 docker pull 去把它下载下来 .. 后面加上 image 的名字 .. 比如我要下载一下 centos .. 它是 docker 官方提供的一个 image ...
# docker pull centos
这样 docker 命令行会自动到指定的 registry 上面把它下载到本地 ... 在国内,使用 docker 官方提供的 registry 可能下载的速度有些慢 ..
我们可以使用国内的一些镜像服务,比如 aliyun 提供的服务 ... 这样会快很多 ..
完成以后再执行一下
# docker images
这里会出现一个可以使用的 image 了 ..
来自 https://ninghao.net/video/3769
4)使用阿里云镜像加速
如果您觉得从 Docker hub 上面下载镜像速度比较慢,我们可以使用阿里云提供的服务 .. 它会加速国内的镜像下载或者上传的速度 ..
使用你的阿里云帐号登录一下 ..
https://promotion.aliyun.com/ntms/act/kubernetes.html
再打开这个开发者平台的管理界面 ..
https://cr.console.aliyun.com/cn-hangzhou/instances
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
找到这个 加速器 .. 这里提供了几种系统的操作手册 ..
我用的是 Mac .. 打开这个标签 .. 复制一下这个创建 Docker Machine 的命令 ... 回到 Docker 的终端 .. 安装了 Docker Toolbox 以后,它会给我们创建一台默认的机器 .. 我们可以先把它删除掉 .. 先查看一下 ..
# docker-machine ls
# docker-machine rm default
# docker-machine create --engine-registry-mirror=https://7ftmozw9.mirror.aliyuncs.com -d virtualbox default
# docker-machine env default
# eval "$(docker-machine env default)"
# docker info
docker-machine ls .. 这里有一台名字是 default 的机器 .. 删掉它可以使用 docker-machine rm .. 加上要删除掉的机器的名字 .. 这里就是 default ..
然后执行一下刚才我们复制的创建 docker machine 的命令 ..
再去执行一下操作手册里的,另外几条配置的命令 ...
现在我们下载镜像的时候,就会从阿里云那里下载了 .. 查看一下 ..
# docker images .. 还没有镜像 .. 再用 docker pull ,下载一个 centos ..
# docker pull centos
你会发现,下载的速度会非常的快 ...
完成以后,我们的主机上就会有一个名字是 centos 的镜像了 ...
来自 https://ninghao.net/video/3770
容器
5)创建容器
有了 image 以后,我们可以基于它去运行一些 container ,也就是容器。 运行容器用的是 docker run 这个命令 .. 后面指定一下要使用的 image ... 比如 centos ,它是我们之前已经下载下来的一个 image .. 如果本地上没有这个 image 的话,docker 会自动给我们去下载它 ...
我们可以在这个容器里面执行一下 echo 命令 ... 输出 hello 这个词儿 ...
# docker run centos /bin/echo 'hello'
执行一下 ... docker 会基于 centos 这个 image 创建一个容器, 在这个容器里面执行一下 echo 这个命令,然后输出指定的文字 ... 完成以后这个容器也就会停止运行了 ...
查看正在运行的容器,用一下
# docker ps
返回的是一些栏目的名字,因为刚才我们运行的那个容器,执行完任务以后它自己就停止了 ..
# docker ps --all
查看所有的容器,可以在 docker ps 后面加上一个 --all 参数 ... 上面有 Container ID ,容器的 id ,我们可以使用它来表示这个容器 .. 比如你可以用它去启动,停止,或者删除容器
Image 是这个容器用的镜像 .. Command 是在容器里执行的命令 .. Created 是它创建的时间 .. Status 表示状态 .. Ports 是端口 .. Names 是容器的名字,因为屏幕不够用,所以被挤到第二排了 .. Docker 会自动给容器分配一个名字 .. 我们也可以手工的在运行容器的时候给它起个名字 .. 使用这个名字也可以表示这个容器 ..
我这里自动分配给这个容器的名字就是这个 sleepy_bell ..
来自 https://ninghao.net/video/3772
6)管理容器
基于一个 image ,我们可以创建多个容器 .. 这里我们再用一下 centos 这个 image ... 这次在容器里执行一下 ls 这个命令 ..
# docker run centos ls
输出的就是容器里的目录和文件的列表 ..
再查看一下所有可用的容器 .. docker ps -a .. -a 是 --all 的一个简写形式 ..
# docker ps --all ( docker ps -a )
现在这有会有两个容器,它们都是基于 centos 这个 image 创建的 ..
使用它的 id 或者名字可以再处理一下这个容器 .. 比如我要删除一个容器 .. 可以使用 docker rm 这个命令 .. 后面加上容器的 id 或者名字(hello) ..
# docker rm 324acc052fc0 # 324acc052fc0 是容器的id
再查看一下所有的容器 ..
# docker ps -a
这里就只剩下一个容器了 ..
在创建容器的时候我们可以手工的去给它指定一个名字 .. 这样以后用到它的时候会更方便一些 ..
docker run .. 后面加上一个 --name 选项 .. 后面指定一下要创建的容器的名字 .. 我们叫它 greeting .. 然后是要使用的 image 的名字 .. 用一下 centos .. 要执行的时候就是使用 echo .. 输出一下 hello ..
# docker run ---name greeting centos /bin/echo 'hello'
然后再查看一下所有的容器 ... 这次我们加上一个 --latest 选项 .. 它可以显示最近创建的容器 ..
# docker ps --all --latest
这里显示的就是刚才我们创建的一个名字是 greeting 的容器 ... 查看容器的日志,用的是 docker logs .. 后面加上容器的 id 或者名字 ..
# docker logs greeting # greeting 是名字,也可以为容器的id
停止容器用的是 docker stop .. 再加上想要停止的容器的名字
# docker stop greeting
重新启动,用的是
# docker restart greeting
运行容器可以使用
# docker start greeting
再查看一下容器的日志 .. 这里会出现好几个 hello .. 因为刚才我们又运行了两回这个容器 ...
来自 https://ninghao.net/video/3773
7)带互动的容器
现在我想创建一个带互动的容器,也就是我可以登录到容器里面,去执行一些命令 ... docker run 这里需要再用几个选项 .. 一个是 --interactive ,表示我要使用一个可以互动的容器,它的简写形式可以用一个 -i .. 再加上一个 --tty 给容器附加一个终端,它的简写形式是 -t ..
这个容器用的 image 是 centos .. 终端的位置是 /bin/bash ..
# docker run --interactive --tty centos /bin/bash ( --interactive 可以简写为 -i ,,,--tty 可以简写为 -t )
你会看到,现在我们就会进入到这个容器里面了 .. 这个容器的主机名会是容器的 id .. 在这里你可以去安装或者配置一些应用 .. 查看一下当前所在的位置 ..
# pwd
显示是在根目录的下面 .. 再看一下目录还有文件 .. 执行一下
# ls
返回的都是这个容器里面的东西 ..
退出来,可以执行一下
# exit
来自 https://ninghao.net/video/3774
8)在后台运行的容器
容器我们可以让它作为一个 daemon 去运行,也就让它在后台去运行 .. 在创建容器的时候,可以加上一个 --detach 选项 ... docker run --detach .. 它的简写形式是一个 -d .. 用的 image 是 centos ..
要执行的命令可以去 ping 一下 ninghao.net ..
docker run --detach centos ping ninghao.net #( 以 daemon 的方式去运行 ) (--detach 可以简写为 -d )
这里并没有给我们输出结果... 而是提供了一个容器的 id 号 .. 查看一下当前正在运行的容器 ..
# docker ps #这里会显示刚才我们创建的这个容器
这里会显示刚才我们创建的这个容器 .. 它会在后台一直运行 ... 复制一下这个容器的 id 号 .. 在这个新的窗口,我们再用一下 docker logs .. 用一个 --follow 选项 .. 查看一下这个容器的日志 ..
# docker logs --follow 59710b7cd935 # 是容器的id号,,,,,follow是跟随的意思
你会看到,它会一直在后台运行 ..
再回过来 .. 停止这个容器 .. 可以使用
# docker stop 59710b7cd935 #停止这个容器
然后加上容器的 id 或者名字 ... 再看一下它的日志 .. 容器停止运行以后,日志也就会停止显示了
此时
# docker logs --follow 59710b7cd935 #这个命令就停止显示了
来自 https://ninghao.net/video/3775
创建镜像
9)创建镜像
我们可以手工去创建 image ,也可以使用 Dockerfile 去创建。先看一下手工创建 image 的方法 ... 先去创建一个带交互的容器 ..
# docker run -i -t centos bash .. #进入交互式
进入到容器以后,我们可以安装一下 nodejs .. 先去添加一个 nodejs 的安装源 ..
# curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -
然后再用 yum 去安装一下 nodejs ..
# yum install nodejs -y
完成以后这个容器就可以使用 node 了 .. 我们可以试一下
# node -e "console.log('hello')" # 输出一个 hello ..
我们可以基于这个容器去创建一个 image ,其实就是去提交一下对容器的修改就行了 .. 先复制一下这个容器的主机名 .. 它就是这个容器的 id 号 .. 然后输入
#exit # 退出
提交修改可以使用 docker commit .. 加上一个 -m 选项指定一下提交的日志 .. 再用一个 -a .. 指定一下作者author ... 然后是容器的名字或者 id 号 .. 接着是 image 的名字 .. 先是你的用户名 .. 我这里就是 ninghao 斜线的右边儿是这个 image 的名字 .. nodejs-demo .. 再用一个冒号 .. 设置一下这个 image 的 tag .. latest(表示最新的)
# docker commit -m '安装 nodejs' -a 'wanghao' 59710b7cd935 ninghao/nodejs-demo:latest
查看一下主机上所有的 images ...
# docker images ..
在这里你会看到刚才我们手工制作的这个 ninghao/nodejs-demo ..
下面我们再基于这个 image 去创建一个容器 .. 使用一下它里面的 node 去执行一小行代码 ... 这里会显示一个 hello ...
# docker run ninghao/nodejs-demo node -e "console.log('hello')"
后面我们会介绍一种更好的创建 image 的方法 .. 先把刚才手工创建的 image 删除掉 .. 这里我们需要先要删除掉跟它有关系的容器 .. 先查看一下
# docker ps -a
再用 docker rm 删除掉这个容器 ..
# docker rm 59710b7cd935
删除主机上的 image ,用的是 docker rmi 命令 .. 加上要删除的 image 的名字 ..
# docker rmi ninghao/nodejs-demo
再查看一下主机上所有的 image ...
# docker images
刚才我们创建的 image 已经不存在了 ..
来自 https://ninghao.net/video/3777
10)用 Dockerfile 创建镜像
在一个文本文件里面描述一下一个 image 的构建过程,然后使用 docker build 可以根据文件上的描述给我们去创建一个 image .. 这个文本文件就是 Dockerfile ... 这种创建 image 的方法更灵活一些 ..
进入到桌面上 .. cd ~/desktop .. 先去创建一个目录 .. 名字可以是 nodejs-demo .. 进入到这个目录的下面 .. 再用编辑器打开这个目录 ..
# cd ~/desktop
# mkdir nodejs-demo
# cd nodejs-demo
# atom .
在它下面创建一个文件 .. 名字是 Dockerfile .. 在这个文件里我们要添加一些指令 .. 这些指令可以决定怎么样去创建这个 image ..
先用一个 FROM .. 指令的名字都是大写的 .. 用它指定一下基于哪个 image 去创建我们自己的 image .. 这里我用一下 centos
另起一行,再用一个 MAINTAINER .. image 的作者是谁 .. 输入我的名字还有邮箱 .. wanghao
要执行的命令可以使用 RUN 这个指令 .. 这里我要创建一个 nodejs 的 image .. 先添加一个安装源 .. 再用一个 RUN .. 使用 yum 再去安装一下 nodejs ..
这就是一个最基本的 Dockerfile ... 下面我们根据这个 Dockerfile 去制作一个 image ...
FROM centos
MAINTAINER wanghao <wanghao@ninghao.net>
RUN curl --silent --location https:// rpm. nodesource. com/setup_6.x | bash -
RUN yum install nodejs -y
回到命令行 .. 这里用的命令是 docker build .. 后面加上一个 --tag .. 给这个 image 起个名字 .. 先是用户名 .. 我这里就是 ninghao .. 斜线的右边是这个 image 的名字 .. nodejs-demo .. 在冒号的右边 .. 再给它打上个标签 ... 然后是 Dockerfile 的位置 .. 我这里它就在当前目录的下面 .. 所以可以使用一个 . 来表示 ..
# docker build --tag ninghao/nodejs-demo:latest . #这里最后的点表示是当前目录
执行一下 .. 这样 Docker 会根据 Dockerfile 里的描述去给我们创建一个 image .. 创建成功以后,会有个 Successfully built 的提示 ..
完成以后查看一下所有的 images ..
# docker images
这个 ninghao/nodejs-demo 就是刚才我们用 Dockerfile 创建的 ..
来自 https://ninghao.net/video/3778
11)把镜像推送到 Docker Hub
Docker Hub 是一个保存镜像的地方 .. 我们可以在上面下载别人做好的 image ,也可以把我们自己做好的 image 传到上面去保存 .. 申请一下 Docker Hub 帐号 .. 然后再登录一下 ..
回到命令行 .. 我们可以把之前自己创建的这个 image 推送到 Docker Hub 上面 .. 先登录一下 ...
# docker login
输入我们在 Docker Hub 上申请的用户名 .. 再输入对应的密码 ..
提示登录成功以后,我们就可以使用 docker push 这个命令,去上传 image 了 .. 后面加上要上传的 image 的名字 .. 我这里就是 ninghao/nodejs-demo ..
Docker 只会把有变化的那部分东西上传到 Docker Hub 上面 ..
# docker push ninghao/nodejs-demo
完成以后回来再刷新一下 .. 在我的个人帐号下面,会出现刚才 push 上来的这个镜像 ..
来自 https://ninghao.net/video/3779
12)把镜像推送到阿里云
阿里云也有个 Docker 镜像服务,我们可以把自己的镜像放到阿里云的这个服务上存储 ..
# docker login --username=ninghao8080 registry.aliyuncs.com
# docker images
# docker tag 2088428f71d7 registry.aliyuncs.com/ninghao/nodejs-demo
# docker push egistry.aliyuncs.com/ninghao/nodejs-demo
登录以后可以先设置一下镜像仓库的命名空间 ..
这个命名空间就是你的镜像名字的前缀 ... 再设置一个密码 ... 我们一会儿会用到这个密码登录一下 .. 这样才能上传或者下载在阿里云上的镜像 ..
完成以后再去创建一个镜像仓库 .. 它的名字的前面就是刚才我们设置的命名空间 .. 再输入个名字 .. 比如 ndoejs-demo .. 在下面输入一小段摘要 .. 介绍一下这个镜像 ..
然后你可以指定这个仓库的类型,可以是公开的,也可以是私有的 .. 下面可以再设置一下代码的来源 .. 这里我们先选择 本地仓库 .. 再去创建这个镜像仓库 ..
点一下这个仓库后面的 管理 .. 在这里会有一些使用说明 .. 复制一下这个登录用的命令 .. 回到终端 .. 执行一下它 .. 输入登录的密码 .. 成功以后会出现一个 Login Succeeded ..
下面我们可以把自己之前创建的镜像推送到我们在阿里云上创建的这个镜像仓库里面 .. 先查看一下主机上的镜像 .. 复制一下这个镜像的 id 号 ..
然后再设置一下镜像的仓库 .. docker tag .. 加上这个镜像的 id .. 后面是仓库的名字 .. 复制一下 .. 再执行一下 ..
最后我们再用 docker push 把它上传到阿里云的镜像仓库里面 .. 在国内上传到阿里云的速度会非常快 .. 完成以后 .. 在这个仓库的 镜像版本 这里你会看到刚才推送上来的镜像 ..
因为刚才我们的仓库是一个公开的镜像仓库,也就是所有人都可以在阿里云的镜像网站搜索到这个镜像 ...
来自 https://ninghao.net/video/3780#info