欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > 【Docker】容器简介和构建镜像

【Docker】容器简介和构建镜像

2024/11/30 6:53:47 来源:https://blog.csdn.net/cherry__yu/article/details/142052939  浏览:    关键词:【Docker】容器简介和构建镜像

文章目录

      • Docker简介
        • Docker和虚拟机区别
        • Docker优点
        • 镜像、容器和仓库
      • RUN
        • 仓库
      • 构建我的镜像
        • 构建Dockerfile文件
        • build
        • 将镜像推送到远程仓库
      • 命令附录

Docker简介

Docker和虚拟机区别

Docker守护进程可以直接和主操作系统进行通信,为各个Docker容器分配资源,而虚拟机有各自的从操作系统。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。

Docker有着小巧、迁移部署快速、运行高效等特点,但隔离性比服务器虚拟化差:Docker上运行不同的应用实例,相互隔离,但用同一个主机操作系统内核。因为共享操作系统内核,因此相关信息会共享。
服务器虚拟化就是在物理主机及虚拟化层上,建立了多个独立的虚拟机,其拥有完全隔离的空间,每个虚拟机当前虚拟机的操作系统内核,无法管理其它仓库。不存在信息共享的情况。

在这里插入图片描述

Docker优点

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。所以它可以使开发、测试、生产环境一致,我们只需要维护一个docker镜像即可。
Docker的体量小,启动速度秒级,性能接近物理机,易于跨平台。

镜像、容器和仓库

Docker 由镜像(Image)、容器(Container)、仓库(Repository) 三部分组成。

Docker 的镜像是一个只读的模板,可以简单的类比为电脑装系统用的系统盘,包括操作系统,以及必要的软件。例如,一个镜像可以包含一个完整的 centos 操作系统环境,并安装了 Nginx 和 Tomcat 服务器。
镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。我们可以使用 docker images 来查看本地镜像列表。
注意一个镜像不能超过 127 层。

Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。我们可以使用 docker ps -a 查看本地运行过的容器。

Docker 的仓库用于存放镜像。这一点,和 Git 非常类似。我们可以从中心仓库下载镜像,也可以从自建仓库下载。同时,我们可以把制作好的镜像 commit 到本地,然后 push 到远程仓库。仓库分为公开仓库和私有仓库,最大的公开仓库是官方仓库 Dock Hub,国内的公开仓库也有很多选择,例如阿里云等。

RUN

docker run
Docker 通过 run 命令来启动一个新容器。Docker 首先在本机中寻找该镜像,如果没有安装,Docker 在 Docker Hub 上查找该镜像并下载安装到本机,最后 Docker 创建一个新的容器并启动该程序。
当第二次执行 docker run 时,因为 Docker 在本机中已经安装该镜像,所以 Docker 会直接创建一个新的容器并启动该程序。

docker run 每次使用都会创建一个新的容器,我们以后再次启动这个容器时,只需要使用命令 docker start 即可。这里, docker start 的作用在用重新启动已存在的镜像,而docker run 包含将镜像放入容器中 docker create ,然后将容器启动 docker start。
docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。
Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。
docker run = (docker pull) + docker create + docker start

通过 exit 命令关闭 Docker 容器。当然,如果我们运行的是后台的守护进程,我们也可以通过 docker stop web 来停止。
docker start 重启
docker attach 命令切换到运行交互式容器

cherie@iZbp1a6z4wmydw6sukxhkbZ:~$ sudo docker run -p 80 --name web -i -t centos /bin/bash[root@6af5d358eb2b /]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm[root@6af5d358eb2b /]# yum install -y nginxcherie@iZbp1a6z4wmydw6sukxhkbZ:~$ sudo docker stop web
[sudo] password for cherie: 
web
cherie@iZbp1a6z4wmydw6sukxhkbZ:~$ sudo docker start web
web
cherie@iZbp1a6z4wmydw6sukxhkbZ:~$ sudo docker attach web
[root@6af5d358eb2b /]# exit
exit
仓库

Docker 的仓库用于存放镜像。我们可以从中心仓库下载镜像,也可以从自建仓库下载。同时,我们可以把制作好的镜像从本地推送到远程仓库。

当我们创建一个新的容器时,Docker 会构建出一个镜像栈,存在很多镜像层,每个镜像层都是只读的,栈的最顶层有一个读写层,如图所示。
在这里插入图片描述

docker images可以查看本地的镜像

cherie@iZbp1a6z4wmydw6sukxhkbZ:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        3 months ago        237MB
hello-world         latest              fce289e99eb9        15 months ago       1.84k

TAG: 镜像标签,其中 lastest 表示最新版本。注意的是,一个镜像可以有多个标签,那么我们就可以通过标签来管理有用的版本和功能标签。

docker pull 拉取镜像
docker search 查找镜像
docker ps -a 查看容器

cherie@iZbp1a6z4wmydw6sukxhkbZ:~$ sudo docker search nginx
cherie@iZbp1a6z4wmydw6sukxhkbZ:~$ sudo docker pull nginx
cherie@iZbp1a6z4wmydw6sukxhkbZ:~$ sudo docker run -p 8080:80 -d --name nginx nginx
cherie@iZbp1a6z4wmydw6sukxhkbZ:~$ sudo docker ps -a

通过 -d 选项告诉 Docker 在后台运行容器的守护进程。并且,通过 8080:80 告诉 Docker 8080 端口是对外开放的端口,80 端口对外开放的端口映射到容器里的端口号。

除了Docker Hub,也可以切换到国内的其他替代注册服务器,比如阿里云,并拉取公开的镜像。

构建我的镜像

Docker 提供自定义镜像的能力,它可以让我们保存对基础镜像的修改,并再次使用。那么,我们就可以把操作系统、运行环境、脚本和程序打包在一起,并在宿主机上对外提供服务。

构建Dockerfile文件

Dockerfile 是一个由一堆命令+参数构成的脚本,使用 docker build 即可执行脚本构建镜像,自动的去做一些事,首先我们创建一个空的Dockerfile文件。

cherie@iZbp1a6z4wmydw6sukxhkbZ:~$ mkdir dockerfile_test
cherie@iZbp1a6z4wmydw6sukxhkbZ:~$ cd dockerfile_test
cherie@iZbp1a6z4wmydw6sukxhkbZ:~/dockerfile_test$ touch Dockerfile
cherie@iZbp1a6z4wmydw6sukxhkbZ:~/dockerfile_test$ nano Dockerfile

编写Dockerfile文件,格式为,开头必须 FROM BASE_IMAGE 指定基础镜像。然后,我们通过 MAINTAINER xxx “xxx@x.com” 指定该镜像的作者和邮箱。之后就可以执行一系列命令(下载安装等),Docker 在执行每个指令之后都会创建一个新的镜像层并且进行提交。

FROM centos:7 
MAINTAINER LiangGzone "lianggzone@163.com" 
RUN rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 
RUN yum install -y nginx 
EXPOSE 80
FROM rccoder/myworkspace:v1 
RUN mkdir a
build

我们使用 docker build 命令进行构建,指定 - t 告诉 Docker 镜像的名称和版本。注意的是,如果没有指定任何标签,Docker 将会自动为镜像设置一个 lastest 标签。最后还有一个 . 是为了让 Docker 到当前本地目录去寻找 Dockerfile 文件。

cherie@iZbp1a6z4wmydw6sukxhkbZ:~$ sudo docker build -t="cherie/nginx_demo:v1" cherie@iZbp1a6z4wmydw6sukxhkbZ:~/dockerfile_test$ sudo docker images
将镜像推送到远程仓库

首先要docker login
之后docker push NAME[:TAG]

sudo docker push cherie/nginx_demo:v1

命令附录

docker pull 从仓库获取镜像
例 docker pull registry.hub.docker.com/centos:centos6 ,即从注册服务器 registry.hub.docker.com 中的 centos 仓库来下载标记为 centos6 的镜像。
docker images 查看本地镜像列表
docker build 利用 Dockerfile 来创建镜像
例 docker build -t hainiu_httpd:1.0 .
docker push 上传镜像
docker run 运行容器(=docker create创造容器 + docker start启动容器)
docker exec 进入容器
docker stop 停止容器
docker rm 删除容器
docker ps 查看容器列表
docker rmi 删除镜像
docker save 保存镜像
docker export 导出容器(移除了元数据)

部分参考:
https://www.cnblogs.com/davidwang456/articles/9578409.html
https://juejin.im/post/5cacbfd7e51d456e8833390c
https://juejin.im/post/5ad3172c5188257ddb10109a#heading-10
https://www.runoob.com/docker/ubuntu-docker-install.html

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com