Docker踩坑笔记[一]:开始使用Docker(基于CentOS7)

本文记录了近两天开始学习docker基本操作的一些心得,进行小小的总结。
至于什么是docker,为什么使用docker,这里就不再赘述;
参考:
桀骜不驯的喵:《docker命令详解》
广州千锋:Docker-容器化引擎

文章目录

  • 安装docker
  • 启动并检查docker
  • 镜像操作(以测试CentOS为例)
    • 下载镜像(pull)
    • 查看镜像(images/imge ls)
    • 启动一个CentOS容器(run)
    • 再次进入myCentOS(exec)
    • 删除容器(rm)
    • 删除镜像(rmi)
    • 定制镜像(Dockerfile)
      • 指定基础镜像(FROM)
      • 执行命令(RUN)
      • 构建镜像(build)
      • 镜像构建上下文(Context)
      • 其他构建方式
  • 后记

安装docker

##首先,卸载直接用yum install的docker(原因:yum库里的docker版本过低)
yum remove docker
yum remove docker-*
##更新yum,这个操作不是必须的,但是更新升级内核,更有利于docker对系统资源的利用
yum update
##安装相关依赖
yum install -y yum-utils \
device-mapper-persistent-data \
lm2
##设置安装正式版docker-edge
yum-config-manager --enable docker-ec-edge
##添加阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
##安装docker
yum install docker-ce

启动并检查docker

##启动docker服务
systemctl start docker
##查看docker版本
docker version
##查看docker详细信息
docker info

镜像操作(以测试CentOS为例)

下载镜像(pull)

因为国内网速问题,会导致在从docker hub拉取镜像时,速度过慢,甚至出现失败现象,这里我们可以使用镜像加速;
docker中国镜像加速
想要选取指定版本,可以参考docker hub的标签TAG

##使用镜像加速(docker中国)
##拉取centos官方镜像,不指定版本号,默认为latest版本
##docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
##Docker Registry 地址,默认为Docker Hub
##仓库名为两段式名称,即<用户名>/<软件名>。对于Docker Hub,默认为library,即官方镜像
docker pull registry.docker-cn.com/library/centos

查看镜像(images/imge ls)

docker images
##也可以使用docker image ls
##REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
##registry.docker-cn.com/library/centos   latest              75835a67d134        8 weeks ago         200MB

启动一个CentOS容器(run)

##docker run <选项><镜像名称或者id><命令><参数>
## --name 自定义容器名称
## -t 分配一个伪终端
## -i 交互式操作
docker run -it --name myCentOS IMAGE ID /bin/bash
##此时进入到docker内的centOS
##可以看到用户名已经有改变
##[root@localhost /]# docker run -it --name myCentOS IMAGE ID /bin/bash
##[root@e09b83c89159 /]# 
##查看docker内的centOS版本信息
cat /etc/redhat-release
##[root@e09b83c89159 /]# cat /etc/redhat-release
##CentOS Linux release 7.5.1804 (Core)
##启动成功
##如果想退出docker内的CentOS交互式操作,输入
exit
##注意,此时容器仍然存在,可以使用docker ps命令查看
## -a 表示查看所有容器,包括运行和未运行状态
docker ps -a

再次进入myCentOS(exec)

##查看容器信息
docker ps -a
##CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
##e09b83c89159        75835               "/bin/bash"         5 minutes ago       Exited (0) 13 seconds ago                       myCentOS
##此时发现容器STATUS为已经停止,首先启动容器
docker start <CONTAINER ID>
##然后进入Centos
##exec用于从外部运行容器内部的命令
docker exec -it <CONTAINER ID> /bin/bash
##此时再次进入到了myCentOS

删除容器(rm)

##删除容器之前,请确保容器已经关闭
##查看当前正在运行的容器
docker ps
##CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
##e09b83c89159        75835               "/bin/bash"         16 minutes ago      Up 6 minutes                            myCentOS
##此时发现容器STATUS为正在运行,首先停止容器
docker stop <CONTAINER ID或者NAMES>
##容器已停止,删除容器
##rm 删除容器命令
##-f 强制停止容器后删除,使用SIGKILL信号
docker rm <CONTAINER ID或者NAMES>
##删除所有容器
docker rm $(docker ps -aq)

删除镜像(rmi)

##删除镜像前,请确保由此镜像创建的容器已经正确删除
##查看镜像
docker images
##删除镜像
##docker rmi <注册名称>/<镜像名称,id>:<标签>
##不指定标签,则默认删除latest标签
##-f 强制删除镜像
docker rmi <IMAGE ID>
##删除所有镜像
docker rm $(docker images -aq)

定制镜像(Dockerfile)

Dockerfile 是一个文本文件,其包含了一条条的指令(Instruction),每一条指令构建一层。

Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。

指定基础镜像(FROM)

所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。而FROM就是指定基础镜像,因此一个DockerfileFROM 是必备的指令,并且必须是第一条指令

执行命令(RUN)

用于执行命令行命令,格式有两种

  • shell格式:RUN <命令>

  • exec格式:RUN [“可执行文件”, “参数1”, “参数2”],这更像是函数调用中的格式。

构建镜像(build)

docker build <选项>

Dockerfile 路径可以使是本地路径,也可以是URL路径。若设置为 - ,则从标准输入获取Dockerfile的内容

--force-rm=false 创建镜像失败时,删除临时容器

--no-cache=false 不使用之前构建中创建的缓存。

-q、--quiet=false 不显示Dockerfile的RUN运行的输出结果

--rm=true 创建镜像成功时,删除临时容器

-t、--tag="" 设置注册名称、镜像名称、标签。格式为 <注册名称>/<镜像名称>:<标签>(标签默认为latest)

##cd到Dockerfile文件所在目录下,执行
docker build -t <REPOSITORY>:TAG .

其中REPOSITORY,为自定义镜像REPOSITORY,TAG为自定义标签(版本)

后面还有一个 .表示当前目录, 而Dockerfile就在当前目录,这个目录称为构建上下文

镜像构建上下文(Context)

首先我们要理解docker build的工作原理。Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 Docker Remote API,而如docker命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种docker功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举。

当我们进行镜像构建的时候,并非所有定制都会通过RUN指令完成,经常会需要将一些本地文件复制进镜像,比如通过COPY指令、ADD 指令等。而docker build命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢?

这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径,docker build命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。

一般来说,应该将Dockerfile放置在一个空目录下,或者项目的根目录下。如果该目录没有需要上传的文件,则需要将需要的文件复制过来;如果有些文件不需要在构建的时候上传Docker引擎,那么可以用类似.gitignore文件的语法写一个.dockerignore,忽略不需要的文件。

一般习惯,会使用Dockerfile作为文件名,并放置在基于构建的上下文目录中;

其实Dockerfile的文件名不是必须要为Dockerfile,也不是必须要位于上下文目录中,可以用-f指定某个文件作为Dockerfile;

其他构建方式

  • 使用Git repo构建
  • 用给定的tar压缩包构建
  • 标准输入中读取Dockerfile构建
  • 标准输入中读取上下文压缩包进行构建

后记

至此,学习docker的旅途才算刚刚迈出了第一步,积跬步,至千里。只有坚持,才能走得稳,行的远;下一篇将介绍更多关于Dockerfile的使用的详细内容,欢迎关注!
转载请注明出处:https://blog.csdn.net/zouguo1211/article/details/84859827

你可能感兴趣的:(Linux,Docker)