简介
Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。
Docker的优点
- Docker是一个轻量级的容器(比虚拟机更小更快)
- Docker使用沙箱机制,开发者可以打包他们的应用到这个可移植的容器中,然后发布到任意流行的Linux机器上,从而实现虚拟化
- Docker有免费开源的社区版(Community Edition)
总结一下,容器的最大好处就是为我们屏蔽了安装环境的因素
安装
通过官方的脚本,使用阿里云镜像一键安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以通过国内的 daocloud 一键安装
curl -sSL https://get.daocloud.io/docker | sh
说明
curl
是访问或下载网页的应用程序-f
表示不输出错误,且在第一次报错时就立即停止-sS
-s表示将 curl 设定在静默模式下工作。进度条和错误消息都不会被显示。在 -s 后面加上 -S 表示报错时显示具体的错误信息-L
如果直接使用 curl 打开某些被重定向后的链接,这种情况下我们就无法获取想要的网页内容了。使用 -L 可以跟随链接进行重定向
容器的使用
查看版本
- 查看详细版本信息:
sudo docker version
- 仅查看docker版本:
sudo docker --version
查看安装路径
whereis 命令用来查看应用的安装路径
whereis docker
/usr/bin/docker
/etc/docker
/usr/libexec
/usr/share/man/man1/docker.1.gz
运行实况
- ubuntu
- centos
启动守护进程
如果报错 Is the docker daemon running?
说明 docker 服务未启动,使用 sudo systemctl start docker
启动服务
说明
sudo systemctl enable docker
设置docker开机自启sudo systemctl disable docker
禁用docker开机自启sudo systemctl start docker
启动docker服务sudo systemctl restart docker
重启docker服务sudo systemctl daemon-reload
重启守护进程sudo systemctl stop docker
关闭docker服务
或sudo service docker start
启动docker服务sudo service docker restart
重启docker服务sudo service docker stop
关闭docker服务
搜索镜像
- 在 dockerHub 网页上进行查找
- 使用命令行进行搜索
具体镜像可以在该网站上进行搜索 https://hub.docker.com/search
使用命令行方式搜索镜像 sudo docker search <镜像名关键词>
全匹配数据太多了,我们可以对搜索添加筛选以减少数据,比如筛选 starts 大于某值的
sudo docker search -s <integer> <镜像关键词>
这个是过去的方法,已经被 deprecated 了
现在推荐的方法是 sudo docker --filter=stars=<integer> <镜像关键词>
,也可以简写为 sudo docker -f stars=<integer> <镜像关键词>
拉取镜像
例如,下载 ubuntu 镜像,可以使用 sudo docker pull ubuntu
查看已下载的镜像
sudo docker images
删除镜像
sudo docker rmi <镜像ID>
删除所有镜像(就是删除所有搜索出的镜像ID)
sudo docker rmi `sudo docker ps -aq`
用镜像创建并启动容器
这里,如果启动的镜像之前没有被 pull 过,docker 会自动去拉取镜像,然后再启动容器。
- 启动 ubuntu 容器,执行容器内的 bash 程序,进行交互
sudo docker run -it ubuntu /bin/bash
- 以后台方式启动容器,并给容器起个名字
sudo docker run -itd --name my-ubuntu ubuntu /bin/bash
常用参数
-i
表示交互式操作-t
表示终端-d
表示容器启动时,会进入后台-p
端口映射(主机端口 : 容器端口)ubuntu
是要启动的镜像名--name
可以指定容器名/bin/bash
放在镜像名后面的是命令,我们需要一个交互式 shell,因此这里用/bin/bash
最后,要退出容器,直接 exit 即可
停止容器
sudo docker stop <容器 ID>
重启容器
sudo docker start <容器ID>
或
sudo docker restart <容器ID>
这里的容器ID,不一定要输全,只要输入不重复的部分即可
查看容器
sudo docker ps -a
仅查看容器ID,用 -q
命令可以实现
sudo docker ps -a -q
sudo docker ps -aq
容器ID实际上是一个64位的随机数,但ps只显示其前12位(绝大部分情况是不会重复的)
此外 sudo docker container ls
命令也可以查看容器列表
删除容器
sudo docker rm <容器ID>
删除所有容器(就是删除所有搜索出的容器ID)
sudo docker rm `sudo docker ps -aq`
在容器中执行命令
在执行 docker run
命令由镜像生成容器后,我们可能还要对容器进行额外的操作,这时候就需要 exec 命令了
sudo docker exec <容器ID或名称> <待执行的命令>
但是上面这个方法只是一次性返回结果,如果我们想要持续操作,跟之前一样,还是加上 -it
sudo docker exec -it <容器ID> /bin/bash
docker的4种网络模式
docker 在安装时,会自动在host上创建3个网络,可以用 sudo docker network ls
命令查看
模式 | 参数 | 含义 |
---|---|---|
none | –net=none | 关闭网络功能,禁止容器联网 |
none | –net=host | 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 |
none | –net=bridge | 默认,此模式会为每一个容器分配和设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0虚拟网桥以及iptables nat配置表与宿主机通信 |
container | –net=container:<容器名或ID> | 容器不会创建自己的网卡,配置自己的IP等,而是和一个指定的容器共享IP、端口等 |
容器与主机间复制文件
sudo docker cp <主机目录> <容器ID:容器目录>
docker cp
命令支持双向复制,除了从本机复制到容器,也支持从容器中拷贝文件到本机上
将主机目录挂载到容器中
如果没有使用持久化卷,数据保存在容器内的文件系统,这意味着如果删除容器,数据也会丢失。
docker使用-v
的方式挂载宿主机上的目录到容器中
- 如果容器中没有该目录会自动创建
- 如果容器中的该目录包含文件,则会被宿主机覆盖
- 如果宿主机的目录为空,容器中的该目录也会被清空
数据卷volume
数据卷比起绑定目录有如下优点
- 更容易迁移和备份(window和linux都可以使用)
- 可以在多个容器之间共享数据卷,不受宿主机环境影响
- 可以使用docker cli命令管理卷
其实数据卷也是一个正常的容器,只是专门给其它容器挂载数据用的
创建数据卷
- 创建数据卷
sudo docker volume create <数据卷名>
- 查看数据卷信息
sudo docker volume inspect <数据卷名>
- 查看数据卷列表
sudo docker volume ls
- 删除数据卷
sudo docker volume
挂载数据卷
和挂载本地路径一样,挂载数据卷用的也是-v
参数 sudo docker run -it --name=<容器名> -v <数据卷名>:<挂载到容器的相应位置> <镜像名>
容器配置环境变量
run -e
命令可以在创建容器时配置环境变量,每个"-e"仅能配置一个参数,如果要配置多个则使用多个"-e"
- 单参数
sudo docker run -it -e "<变量名>=<变量值>" ubuntu
- 多参数
sudo docker run -it -e "<变量名1>=<变量值1>" "<变量名2>=<变量值2>" ubuntu
查看容器属性
查看容器的所有属性 sudo docker inspect <容器ID 或 容器名>
查看容器的某个属性,例如要查看上面这个容器的挂载目录
sudo docker inspect --format "{{.HostConfig.Binds}}" <容器ID或容器名>
特权模式 privileged
可以使用如下两种方法以特权模式启动容器
sudo docker run -it --privileged ubuntu bash
sudo docker run -it --privileged=true ubuntu bash
只有使用了该参数,容器才有真正意义上的root权限,否则容器内的root只是外部的一个普通用户权限。
以privileged启动的容器才能看到宿主上的外设,并且可以执行mount命令,甚至在容器中启动容器
容器自启动
docker container update --restart=always <容器ID>
用来设置当 docker 重启时,容器自动启动
避免每次输入sudo
由于 docker 命令需要 root管理员 权限,因此每次命令都要带 sudo 前缀,很麻烦,可以输入 sudo su
直接进入管理员模式