Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。
Docker的优点
总结一下,容器的最大好处就是为我们屏蔽了安装环境的因素
通过官方的脚本,使用阿里云镜像一键安装
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 可以跟随链接进行重定向whereis 命令用来查看应用的安装路径
whereis docker
/usr/bin/docker
/etc/docker
/usr/libexec
/usr/share/man/man1/docker.1.gz
运行实况
如果报错 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服务具体镜像可以在该网站上进行搜索 https://hub.docker.com/search
使用命令行方式搜索镜像 sudo docker search <镜像名关键词>
全匹配数据太多了,我们可以对搜索添加筛选以减少数据,比如筛选 starts 大于某值的
sudo docker search -s
这个是过去的方法,已经被 deprecated 了
现在推荐的方法是 sudo docker --filter=stars=
,也可以简写为 sudo docker -f stars=
例如,下载 ubuntu 镜像,可以使用 sudo docker pull ubuntu
sudo docker rmi <镜像ID>
删除所有镜像(就是删除所有搜索出的镜像ID)
sudo docker rmi `sudo docker ps -aq`
这里,如果启动的镜像之前没有被 pull 过,docker 会自动去拉取镜像,然后再启动容器。
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
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 在安装时,会自动在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
的方式挂载宿主机上的目录到容器中
数据卷比起绑定目录有如下优点
其实数据卷也是一个正常的容器,只是专门给其它容器挂载数据用的
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或容器名>
可以使用如下两种方法以特权模式启动容器
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 重启时,容器自动启动
由于 docker 命令需要 root管理员 权限,因此每次命令都要带 sudo 前缀,很麻烦,可以输入 sudo su
直接进入管理员模式