Docker 学习笔记
什么是 Docker
关于 Docker 请详情查看《什么是 Docker》,这里详细介绍了 Docker 的前世今生,以及容器与传统虚拟机之间相比的不同和优势。
下面摘抄一段容器与传统虚拟机差异的描述:
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
Docker 中的概念
Docker 包括三个基本概念
镜像(Image):
理解为 Java 中的类;容器(Container):
理解为 Java 中的对象(实例);
内容摘抄:
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
仓库(Repository):
有 Docker Registry 分为公开和私有。
内容摘抄:
我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04。我们可以通过 ubuntu:14.04,或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。
理解了这三个概念,就理解了 Docker 的整个生命周期。
安装 Docker
树莓派
基本操作安装《树莓派卡片电脑安装 Docker CE》文章中操作,但在进行到这一段出现了问题,
sudo add-apt-repository "deb [arch=armhf] https://mirrors.ustc.edu.cn/docker-ce/linux/raspbian $(lsb_release -cs) stable"
错误信息:
Error: could not find a distribution template for Raspbian/stretch
最终通过编辑sudo vi /etc/apt/sources.list
解决,在文件中添加如下内容:
deb https://download.docker.com/linux/raspbian stretch stable
镜像加速器
在开始操作之前,这里啰嗦几句。由于各个方面的原因,从国内方法 Docker Hub 的速度着实让人捉急;这里我们先添加一下国内的镜像加速服务器信息,这样会使之后的操作快那么一丢丢( 其实也很有限 :-( )。
详情看这里:《镜像加速器》。
Docker 官方提供的中国 registry mirror https://registry.docker-cn.com
七牛云加速器 https://reg-mirror.qiniu.com/
$ sudo vi /etc/default/docker
在文件中加上这一行
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
修改完毕后保存,重新启动服务。
$ sudo service docker restart
操作
镜像(Image)
获取镜像
$ docker pull --help
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Pull an image or a repository from a registry
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
下面的命令是获取一个Ubuntu镜像,版本为16.04。
docker pull ubuntu:16.04
查看镜像
上面安装的镜像,在哪里能看到呢?通过如下命令。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 0d6bd8934d0f 4 weeks ago 91.1MB
在列表中可以看到所有顶级镜像信息,信息包括:仓库名、标签、镜像ID、镜像创建时间、镜像大小。
删除本地镜像
docker image rm <镜像ID>
容器(Container)
创建并启动
docker run nginx
这条命令似乎没有什么问题?的确,没有问题。可是做的是什么呢?docker run nginx ls
只使用一次的容器,之后再启动也是什么都不会发生。docker run -dit nginx
使用守护进程方式创建并运行容器,之后可以通过命令进入正在运行的容器。还是有个个问题,就是nginx运行起来以后,端口没有对外(宿主机)绑定。
选项说明:-d
容器启动后会进入后台;-t
让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i
让容器的标准输入保持打开。docker run -p 8080:80 -dit nginx
使用守护进程方式创建并运行容器,并将容器的80
端口绑定到宿主机的8080
端口上,这下就可以访问http://localhost
来访问了。
列表
如果上面4条命令都执行了,那已经创建了4个容易了,怎么查看呢?
docker container ls
只看到了两个容器,说好的4个呢?docker container ls -a
加个-a
选项,这下看到创建的所有容器了。
记好列表中CONTAINER ID
的后面有大用。
停止
docker container stop [CONTAINER ID]
容器ID用上了,启动时加了-d
的容器会在后台一直运行着,通过stop
命令停止正在运行的容器。
再启动
docker container start [CONTAINER ID]
容器ID又用上了,启动时加了-d
的容器停止后,通过start
命令再次启动容器。
删除
docker container rm [CONTAINER ID]
容器ID又双用上了,已经停止的容器以后也不想用了,使用rm
命令把它删掉。
进入容器
docker exec -it [CONTAINER ID] bash
容器ID又双叒用上了,正在后台运行的容器,通过exec
进入,之后就可以像使用原生系统命令行一样操作容器内容了。
只用-i
参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。
当-i
-t
参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。
导出/导入
docker export [CONTAINER ID] > imp_test.tar
容器ID又双叒叕用上了,将指定的容器导出容器快照到 tar 文件。cat imp_test.tar | docker import - test/nginx:v1.0
将指定的容器快照文件导入为镜像。
更新容器参数
将正在运行的容器设为自启动
docker update --restart=always <CONTAINER ID>
将正在运行的容器取消自启动
docker update --restart=no <CONTAINER ID>
restart 相关参数说明
--restart参数=
no
默认策略,在容器退出时不重启容器
on-failure
在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3
在容器非正常退出时重启容器,最多重启3次
always
在容器退出时总是重启容器
# 开机自启
unless-stopped
在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
# 一般推荐使用always参数
--restart=always
仓库(Repository)
参考
- 0
- 0
-
分享