动手学Docker-第二弹-基本操作


完整项目请查看Github:链接
或通过gitbook在线查看: 链接

Docker三大基本概念

镜像Image

Image文件可以看作是我们要使用的运行环境的一个模版。任何两台电脑都安装了Docker的话,只要你们使用的image相同,那么加载出来的container就是相同的。Docker的Image是分层的,通过改变某层就可以形成一个新的镜像每个镜像可能会有很多个版本的tag。

在这里插入图片描述

容器Container

Docker通过Image加载出来的就是容器,其实质是一个进程,所以它可以拥有自己独立的文件系统,网络等等。我们可以将我们的整体开发环境打包成镜像,在服务器上将此镜像加载为容器,对外界提供服务,就像刚才的那个wordpess案例一样。

仓库Repository

Docker Registry

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个 仓库Repository);每个仓库可以包含多个 标签Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,16.04, 18.04。我们可以通过 ubuntu:16.04,或者 ubuntu:18.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest

仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。

Docker Registry 公开服务

Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 CoreOSQuay.io,CoreOS 相关的镜像存储在这里;Google 的 Google Container RegistryKubernetes 的镜像使用的就是这个服务。

由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见的有 阿里云加速器DaoCloud 加速器 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 安装 Docker 一节中有详细的配置方法。

国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 网易云镜像服务DaoCloud 镜像市场阿里云镜像库 等。

私有 Docker Registry

除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。在 私有仓库 一节中,会有进一步的搭建私有 Registry 服务的讲解。

开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 Docker Trusted Registry 中,提供了这些高级功能。

除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,HarborSonatype Nexus


在这里插入图片描述

关于以上概念更多内容请看:基本概念

镜像与容器操作

若使用Linux操作Docker时,发现Docker没有启动们可以使用命令

sudo service docker start

来启动Docker服务。

查看本地已经存在的image

docker image ls
#或者docker images

因为Docker的架构与虚拟机不同,所以Docker可以在不同的Image之间共享层,这样可以尽可能的少占用存储空间。

如何获取image

  • 通过docker pull从远程仓库拉取镜像
  • 通过Dockerfile构建镜像

1.使用docker pull方式例如我们想获取redis的镜像,我们可以通过命令

docker pull redis

我们在拉取镜像时也可以指定版本号,否则默认是拉取最新的latest镜像。

docker pull redis:alpine3.11

通过docker images再显示拉取下来的镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u86g7gkd-1584957348579)(./images/docker_pull.png)]

2.使用Dockerfile方式

我们这里使用c语言编写一个hello world程序,之后将该程序打包到Docker image中。

首先创建单独的文件夹存放与Dockerfile相关的文件,创建hello.c文件,并将其编译为可执行文件hello

#include<stdio.h>

int main(){
    printf("Hello World\n");
}

使用命令进行编译。在centos上通过命令安装编译环境:

sudo yum install gcc
sudo yum install glibc-static

将文件编译为可执行文件

gcc -static ello.c -o hello

创建并编辑Dockerfile内容(此处的文件并不规范,仅作为快速上手使用)

FROM scratch
ADD hello /
CMD ["/hello"]

现在我们来看一下目录下的所有文件

在这里插入图片描述

根据此Dockerfile创建镜像

docker build -t su/hello-world .

其中-t之后代表我们要生成镜像的标记,最后有一个.不要忘记,代表当前文件夹下。

我们再使用docker images便可以查看到我们刚才创建的image。

在这里插入图片描述

关于更多Dockerfile语法规则请查看:Dockerfile 指令详解

删除image

使用如下命令删除redis拉取的redis镜像,命令中的redis也可以修改为redis对应的Image ID。

docker image rm redis
#或者docker rmi redis

发布image

为了将我们自己创建的image发布,我们需要在Docker Hub上注册账号,并且在生成镜像时,-t后面要接Docker Hub用户名/镜像名称。我们已经生成了一个新的hello world镜像。

在这里插入图片描述

首先通过docker login命令登陆。

在这里插入图片描述

推送自己的镜像到Docker Hub上

docker push superssssss/hello-world:latest

注意你在使用过程中需要将superssssss修改为自己的账户名,:后面接的是镜像版本。

在这里插入图片描述

我们就可以在Docker Hub上查看到刚才push上去的镜像了。
关于Docker Hub与Github连接并自动构建镜像,请查看完整版:Github

在这里插入图片描述

生成container并进入container

我们先加载一下刚才我们自己创建的image,通过一下命令运行

docker run su/hello-world

我们可以看到输出结果

在这里插入图片描述

刚才使用docker run命令就是将我们创建的hello-world镜像加载成容器运行。

我们通过此命令可以查看到container的运行情况

docker container ls -a
#或者docker	ps -a

因为通过此方式创建的容器运行完会直接退出,所以需要加上-a参数。

在这里插入图片描述


我们在来看一个centos的案例。

docker run -d centos /bin/bash

我们本地虽然没有centos的镜像,但是如果我们直接run的话,docker会自动从网上将centos的镜像拉取下来,并加载成容器,其中的-d参数会使当前的容器转为后台执行,我们可以使用命令来查看一下容器状态。

在这里插入图片描述

STATUS一栏可以查看容器的状态,现在centos这个镜像是UP状态。然后再通过docker exec命令进入容器

docker exec -it b6a /bin/bash

其中-it参数可以使终端以交互式的运行,并执行/bin/bash命令,b6a就可以代表这个centos容器对应的CONTAINER ID。

在这里插入图片描述

进入容器之后我们就可以配置我们需要的环境或者安装需要的服务。

在终端中输入exit退出容器。

停止和重启container

对于现在运行的container我们可以使其停止运行或者将已经停止的container重新启动

docker container stop b6a
docker container start b6a

删除container

对于我们已经不再需要的容器,我们可以将其删除。

docker container rm b6a
#或者docker rm b6a

在这里插入图片描述

flask案例实战

本案例我们使用python的flask框架搭建一个简易的可访问的网站。

首先编写python程序,文件名为app.py

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return "hello docker\n"
if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000)

之后编写Dockerfile文件

FROM python:2.7
LABEL maintainer="123<123@gmail.com>"
RUN pip install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 5000
CMD ["python", "app.py"]

这个Dockerfile包含更多的内容,我们这个Dockerfile是以python:2.7为基础镜像,其中maintainer为此Dockerfile文件的维护人员,方便其他使用者联系。接下来的RUN命令安装了flask框架,COPY命令将文件夹下的app.py拷贝到镜像文件下的/app/目录下,并通过WORKDIR命令将当前的工作目录设置为/app,并将镜像的5000端口EXPOSE开放出去提供访问,最后的CMD命令执行这个app.py文件。我们来看一下现在文件夹下存在哪些内容

在这里插入图片描述
然后构建一下镜像,需要一段时间。

docker build -t superssssss/flask-hello .

接下来我们将镜像加载为容器运行

docker run -d -p 5000:5000 superssssss/flask-hello

-p参数将容器的5000端口映射到电脑的5000端口,这样通过电脑的ip地址:5000就可以访问这个容器提供的服务了。

在这里插入图片描述

Docker练习场

学习完以上内容,大家可以参加一下阿里天池的Docker练习场比赛,更进一步熟悉Docker操作。

我的提交在:tianchi_submit


欢迎大家关注我们的公众号:知识沉淀部落。
知识沉淀部落

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页