前言
什么是Docker?
Docker就是一个容器,但是这个容器里什么都没有,所以我们根据需求不同就要不同的环境,这些环境就是镜像
,我们可以用一个镜像生成多个容器
,每个容器都有它的ID
或NAME
。
所以对于Docker的操作命令就可以分为三类:Docker命令
镜像命令
和 容器命令
Docker信息
查看docker版本
1 | docker version |
显示docker系统的信息
1 | docker info |
批量删除
删除容器
删除所有容器
1 | docker rm `docker ps -a -q` |
删除镜像
删除所有的镜像
1 | docker rmi `docker images -q` |
强制删除
1 | docker rmi --force `docker images -q` |
删除所有没有tag的镜像
1 | docker rmi `docker images|grep none|awk '{print $3 }'|xargs` |
镜像命令
下载镜像的地址阿里云镜像地址
检索镜像
1 | docker search image_name |
下载镜像
1 | docker pull image_name |
列出镜像列表
1 | docker images |
删除一个或者多个镜像
1 | docker rmi image_name |
显示一个镜像的历史
1 | docker history image_name |
保存和加载镜像(save、load)
当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。
1 | # 保存镜像到一个tar包 |
添加镜像的名字和tag
1 | docker tag imageid name:tag |
容器命令
启动容器
1 | # 在容器中运行"echo"命令,输出"hello word" |
举例
1 | docker run -i -t -v /root/software/:/mnt/software/ 25c5298b1a36 /bin/bash |
这条命令比较长,我们稍微分解一下,其实包含以下三个部分:
1 | docker run <相关参数> <镜像 ID> <初始命令> |
其中,相关参数包括:
- -i:表示以“交互模式”运行容器
- -t:表示容器启动后会进入其命令行
- -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>.
假设我们的所有安装程序都放在了宿主机的/root/software/目录下,现在需要将其挂载到容器的/mnt/software/目录下。
- -d:表示以
守护模式
执行/bin/bash
脚本,此时 Tomcat 控制台不会出现在输出终端上。- -p:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 58080 端口,这样就向外界暴露了 58080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。
- –name:表示容器名称,用一个有意义的名称命名即可。
需要说明的是,不一定要使用“镜像 ID”,也可以使用“仓库名:标签名”,例如:docker.cn/docker/centos:centos6。使用在Docker run的时候使用`--restart`参数来设置。 `no-container`:不重启. `on-failure-container`:退出状态非0时重启. `always`:始终重启.
查看容器
1 | # 列出当前所有正在运行的container |
容器保存为镜像(commit)
1 | docker commit ID new_image_name |
如:
1 | docker commit 57c312bbaad1 psvmc/javaweb:0.1 |
该容器的 ID 是57c312bbaad1
,所创建的镜像名是psvmc/javaweb:0.1
,随后可使用镜像来启动 Java Web 容器。
导入导出
1 | #可以使用 docker export 命令,导出容器快照到本地文件。 |
对容器的操作(rm、stop、start、kill、logs、diff、top、cp、restart、attach)
1 | # 删除所有容器 |
导出日志
1 | docker logs mydocker>mydocker.log |
查看容器IP
查询单个容器 IP 地址:
使用下面命令可以查看容器详细信息,里面包含 IP 地址信息:
1 | docker inspect <container id> |
或者使用下面命令直接输出 IP 地址信息:
1 | docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container id> |
或者:
1 | docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container id> |
查询全部容器 IP 地址:
任选其一即可:
1 | docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq) |
或者:
1 | docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) |
其中
-f
是 --format
的简写
查看容器内网络
在docker中,为了尽可能缩减镜像大小,常常不会包含一些常用的工具,类似ping,curl,tcpdump
很多时候我们需要知道容器内部解析的域名ip信息,如果没有这些工具,本来很简单的事就变得很麻烦,通过以下步骤就可以通过nsenter
解决以上问题
如果我们想利用主机上的工具,能够实现这种需求的工具就是我们今天要介绍的nsenter
工具安装
1 | yum install util-linux -y |
参数
1 | nsenter [options] [program [arguments]] |
获取容器pid
1 | docker inspect taier_taier_1 -f '{{.State.Pid}}' |
结果为
15728
执行nsenter
命令
1 | nsenter -n -t 15728 |
注意
这个命令没有任何输出,通过ifconfig命令查看当前ip可以确定我们已经进入了容器的网络空间
这时候主机上的命令都可以使用
1 | ping 192.168.7.101 |
如果想退出当前网络空间,返回系统网络空间,输入exit
就行
1 | exit |
如果内部无法访问外部网络
安装brctl
1 | yum install -y bridge-utils |
重建docker0
网桥
1 | sudo service docker stop |
实际操作
下载Tomcat8
镜像(操作方式见自定义Dockerfile构建镜像)
1 | docker pull registry.cn-hangzhou.aliyuncs.com/psvmc/oraclejdk-tomcat8 |
查看镜像ID
1 | docker images |
运行镜像
1 | docker run -d -p 8081:8080 --name tomcat01 -v /data/wwwroot/tomcat01/:/opt/tomcat8/webapps/ -v /data/wwwroot/tomcat01_log/:/opt/tomcat8/logs/ --restart=always 71dc929e155c |
查看容器运行状态
1 | docker ps -a |
查看tomcat
启动日志
1 | docker logs tomcat01 |
我们运行了tomcat
那么怎样进入tomcat
运行的环境呢
1 | // docker exec意思是:在`tomcat01`下面运行一个命令,在这里,运行的是/bin/bash |
接下来 我们退出tomcat
的运行环境(Ctrl+P+Q
)
把文件拷贝到容器中
1 | docker cp /root/test.war tomcat01:/usr/local/tomcat/webapps/test.war |
重启容器
1 | docker restart tomcat01 |
常见问题
1) 怎样在一运行的容器中添加端口映射?
不能直接添加端口映射。只能先保存(commit)为镜像 再重新运行(run)
- import/export 与 save/load 的区别?
import应用于容器 save应用于镜像
自动启动容器内服务
Docker 容器运行后 自动启动服务
docker中的容器运行后 里面的服务就算设置了开机启动也不会启动。
解决方式是建一个文件/home/auto_service.sh
1 |
|
第一行不能少 来标示文件的类型 最后一行也不能少 否则会在服务启动后自动退出容器
运行命令
1 | docker run -i -t --name javaweb -p 80:80 -p 8080:8080 fec9183579a7 /home/auto_service.sh |
4) 无法ping
容器的IP地址 无法用容器的ip ssh登录
I cannot ping my containers。
Unfortunately, due to limitations in macOS, we’re unable to route traffic to containers, and from containers back to the host.
这是官网给的解释 由于macOS的限制
。
所以在mac上只能把内部的22端口映射到外部 直接通过映射出来的端口访问
镜像无法删除
1 | docker images |
假如
进入文件目录
1 | cd /var/lib/docker/image/overlay2/imagedb/content/sha256 |
找到如下的文件(前12位和前面的IMAGE ID
一致 )
f6d0b4767a6c466c178bf718f99bea0d3742b26679081e52dbf8e0c7c4c42d74
直接删除即可
1 | rm -rf f6d0b4767a6c466c178bf718f99bea0d3742b26679081e52dbf8e0c7c4c42d74 |
这时再查看镜像就没有了