Docker基础(1)—— Docker基本概念
Docker基础(2)—— Docker安装及基础操作
二、环境配置
1、下载安装
macOS安装Docker还是比较简单的。下载 Stable 或 Edge 版本的 Docker for Mac,安装。
也可以使用Homebrew安装:$ brew cask install docker 。
Windows用户可以参考教程。
2、运行
点击Docker图标运行之后右上角菜单栏会出现一个鲸鱼图标,这个图标表明了Docker的运行状态。
第一次点击图标,可能会看到这个安装成功的界面,点击 "Got it!" 可以关闭这个窗口。
以后每次点击鲸鱼图标会弹出操作菜单。
启动终端,通过命令可以检查安装后的 Docker 版本。
下面尝试运行一个Nginx服务器:
3、镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,建议安装 Docker 之后配置国内镜像加速。
三、Docker架构
DOCKER_HOST:我们进行操作的宿主机
Docker daemon:守护进程(核心程序),做各种Docker操作
Client:客户端,将命令交给daemon,由daemon来做实际的操作
Registry:仓库,所有Docker玩家共享Docker镜像的服务 (Docker Registry提供一个集中的存储、分发镜像的服务)
四、实战之镜像操作
1、拉取镜像
1.1 可以去Docker hub查找自己想要的镜像
也可以使用 > docker search nginx 指令。
1.2 指令:> docker pull nginx
执行Docker run 时若在本地找不到镜像,则会去仓库拉取,存于本地。
2、列出镜像
2.1查看已有镜像:> docker images 等同于 > docker image ls
ls只显示顶层镜像,加上-a可显示中间层镜像,这样会看到很多无标签的镜像。这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。(这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。实际上,这些镜像也没必要删除,因为相同的层只会存一遍,而这些镜像是别的镜像的依赖,因此并不会因为它们被列出来而多存了一份。当删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。)
若想列出部分镜像可在ls后加镜像仓库名 如:> docker image ls ubuntu
3、删除本地镜像 > docker image rm
4、构建镜像
4.1 使用Dockerfile定制镜像
在一个空白目录中,建立一个文本文件,并命名为 Dockerfile。内容为:
这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM 和 RUN 。
FROM指令指定基础镜像,RUN指令用来执行命令(RUN指令会在一个容器中进行操作)。还有很多其他的Dockerfile指令(如:COPY、ADD、CMD、ENTRYPOINT、ENV、ARG、WORKDIR、EXPOSE 等)可自行学习。
4.2 构建镜像 > docker build -t nginx:v4 .
“.”表示当前目录,用于指定上下文路径
。
当我们进行镜像构建的时候,并非所有定制都会通过 RUN
指令完成,经常会需要将一些本地文件复制进镜像,比如通过 COPY
指令、ADD
指令等。而 docker build
命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢?
这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径,docker build
命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。(若路径下有些文件不需要上传给Docker引擎,可以将其放在.dockerignore中)
构建成功,测试一下:
5、上传镜像 > docker push
5.1 上传前要先登陆Docker Hub
指令 > docker login ,输入用户名和密码。
5.2 更改仓库名
指令 > docker tag nginx:v4 huangbaoling/nginx ,我这里没写标签则默认是latest,我们也可以 > docker tag nginx:v4 huangbaoling/nginx:4
(对已有Docker镜像做tag,注意新tag需要附带注册用户名huangbaoling。如果是在内网仓库操作则附带服务器地址 docker.sunseaiot.cn)
当没有做tag直接push时,默认的路径是library,是官方镜像段路径。前面提到的两段式路径是多用户环境下,推送镜像段规范是:> docker push 注册用户名/镜像名
上传成功。
五、实战之容器操作
1、新建并启动容器
1.1 查看已有镜像:> docker images
1.2 启动容器指令:> docker run -d -p 8088:80 nginx
-d:后台运行容器并打印容器
-i:保证输入有效
-t:分配个伪终端
-p:开放容器端口给主机 (-p 本机端口:镜像端口),Docker Hub上可查看到镜像端口和镜像使用到一些信息
其他参数用法可参考 >docker run -help
2、进入容器
2.1 ps指令查看进程信息
容器外:> docker ps 列出所有运行的容器
容器内:> ps -ef
查看容器信息指令 > docker container ls 和 > docker ps 是一样的效果
2.2 进入容器内部 > docker exec -it ____ bash
(____中填写容器ID、容器名,ID可以只填部分数据,只要能与其他容器区分)
2.3 退出容器 exit
注意退出容器并不是终止容器,容器仍然在运行。
(这针对的是2.2的情况,若执行的docker run -it ubuntu,因为没有后台运行-d,所以在伪终端执行exit后容器也就结束了。)
3、 终止容器 > docker container stop ____
(____中可填写容器ID、容器名,可以只填部分数据,只要能与其他容器区分)
在容器中写入的内容会存放在容器存储层,若只是将容器stop,存储层中的内容不会消失,下次restart还在,若是将容器remove,容器存储层会随着容器一起消失,所以若想保存内容,应当挂载到外部宿主。
4、 删除容器
4.1 单个删除 > docker container rm _____
(____中可填写容器ID、容器名,可以只填部分数据,只要能与其他容器区分)
4.2 清除所有出于终止状态的容器 > docker container prune
六、总结
容器技术有很多种,Docker只是其中一种,只是它的流行度比较高。注意区分容器技术和虚拟化技术的区别(容器和虚拟机之间的主要区别在于虚拟化层的位置和操作系统资源的使用方式)。
前面我们分析了容器的轻量的原因,但因此也会给容器带来局限性:一,由于所有容器都是与宿主机共用内核的,容器与容器之间的隔离性就会差很多;二,容器里面是不存放数据的,容器里面的数据会随着容器的生命周期而消失,如果想要持久化的存储,必须要依靠外部的存储设备。(所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。)