输入 docker 可以查看Docker的命令用法,输入 docker COMMAND help 查看指定命令的详细用法
## 1、镜像操作
| 操作 | 命令 | 说明 |
| --- | --- | --- |
| 查找 | docker search 关键字 | 可以在Docker Hub网站查看镜像的详细信息,如镜像的tag标签 |
| 抽取 | docker pull 镜像名:tag | :tag表示软件的版本,如果不指定默认是latest |
| 列表 | docker images | 查看所有本地镜像 |
| 获取元信息 | docker inspect 镜像id | 获取镜像的元信息,详细信息 |
| 删除 | docker rmi f 镜像id或镜像名:tag | 删除指定的本地镜像,f表示强制删除 |
## 2、容器操作
| 操作 | 命令 | 说明 |
| --- | --- | --- |
| 运行 | docker run name 容器名 i t p 主机端口:容器端口 d v 主机目录:容器目录:ro 镜 像id或镜像名称:tag | name 指定容器名,名称自定义,如果不指定会自动命名; i 以交互模式运 行,即以交互模式运行容器;t 分配一个伪终端,即命令行,通常组合使用it ;p 指定端口映射,将主机端口映射到容器内的端口;d 表示后台运行,即守 护式运行容器;v 指定挂载主机目录到容器目录(主机目录中的内容发生变化会自动同步到容器目录),默认在容器中为rw读写模式,ro表示 只读 |
| 列表 | docker ps a q | 查看正在运行的容器,a表示显示所有容器,q表示只显示容器id |
| 启动 | docker start 容器id或容器名称 | 启动容器 |
| 停止 | docker stop 容器id或容器名称 | 停止正在运行的容器 |
| 删除 | docker rm -f 容器id或容器名称 | 删除容器,-f表示强制删除 |
| 日志 | docker logs 容器id或容器名称 | 获取容器的日志 |
| 在容器中执行 | docker exec -it 容器id或容器名称 /bin/bash | 进入正在运行的容器中并开启一个交互模式的终端,可以在容器中执行操作 |
| 拷贝文件 | docker cp 主机中的文件路径容器id或容器名称:容器路径;docker cp 容器id或容器名称:容器中的文件路径主机路径 | 将文件中的文件拷贝到容器中;将容器中的文件拷贝到主机中 |
| 获取元信息 | docker inspect 容器id | 获取容器的元信息 |
#### 以CentOS为例:
```
docker search centos
docker pull centos
docker run --name mycentos -it centos:latest # 根据centos:latest镜像运行容器,并以交互模式 进入容器中
# 实际上是在Docker容器中运行一个精简版的CentOS系统
exit # 退出并关闭容器
docker ps -a
docker start mycentos
docker stop mycentos
docker rm mycentos
docker rm -f $(docker ps -aq) # 强制删除所有容器
```
注:Docker容器内实际上是运行着一个精简版的Linux系统
#### 以tomcat为例:
```
# 示例1:基本用法
docker search tomcat
docker pull tomcat
docker run --name mytomcat -p 8888:8080 -d tomcat
# 测试:http://宿主机地址:8888
docker stop mytomcat
docker ps -a
docker start mytomcat
# 示例2:拷贝文件和挂载目录
docker run -p 8080:8080 -d tomcat
docker exec -it 70cba924861c /bin/bash
cd /usr/local/tomcat/webapps/ROOT
exit
echo welcome to tomcat > index.jsp
docker cp index.jsp 70cba924861c:/usr/local/tomcat/webapps/ROOT # 将宿主机中的文件拷贝到容器中指定的目录中
# 部署web项目,将war文件放到容器中
docker cp spring-web.war 70cba924861c:/usr/local/tomcat/webapps
# 问题:如果项目更改了需要重新拷贝war文件,太麻烦,可以直接挂载目录(也称为数据卷Volume)
docker run \
-p 8080:8080 \
-v /my/tomcat/webapps/springweb.war:/usr/local/tomcat/webapps/springweb.war \
-v /my/tomcat/data:/usr/local/tomcat/dataVolume:ro \
-d tomcat
# 可以挂载指定的文件也可以挂载目录
# 示例3:启动多个容器,一个镜像可以启动多个容器,每个容器互相隔离、独立 ,所以容器的端口是可以重复的
docker run -p 8081:8080 -d tomcat
docker run -p 8082:8080 -d tomcat
docker run -p 8083:8080 -d tomcat
```
## 3、 镜像的分层结构
tomcat镜像为什么这么大?
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境的软件,包含运行某个软件所需要的所有内容。
基于UnionFS联合文件系统,采用分层结构,一层一层的堆叠起来,像一个同心圆,但从外面来说,只能看到最外层的文件系统(镜像层)
![](https://img.kancloud.cn/ea/02/ea021d300bf089dcc3984ca5c57d907d_342x186.png)
分层结构:共享资源、便于复用(许多镜像都是从相同的Base基础镜像构建而来的,基础镜像只需要保存一份)
镜像都是只读的,而由镜像生成的容器是可修改的
## 4、创建镜像
有时从Docker镜像仓库中下载的镜像不能满足我们的要求,此时可以基于这个镜像(基础镜像)封装一个自己的镜像。
两种方式:
* 更新镜像:使用docker commit命令
* 构建镜像:使用docker build命令,需要创建Dockerfile文件
### 4.1、更新镜像
先使用基础镜像创建一个容器,然后对容器进行修改,最后使用commit命令提交为一个新的镜像
步骤:
a、根据基础镜像,创建容器
docker run --name mytomcat -p 8080:8080 -d tomcat
b、修改容器
```
docker exec -it bcd08edac78d /bin/bash
cd webapps/ROOT
rm -f index.jsp
echo welcome to tomcat > index.html
exit
```
c、提交为新镜像,语法: docker commit m="描述消息" a="作者" 容器id或容器名 镜像名:tag
```
docker commit -m="修改默认索引页" -a="AAA" bcd08edac78d itany/tomcat:v1
```
d、使用新镜像运行容器
```
docker run --name tomcat_v1 -p:8080:8080 -d itany/tomcat:v1
```
### 4.2、 构建镜像
根据Dockerfile文件来自动构建镜像
Dockerfile是一个包含创建镜像所有命令的文本文件,使用docker build命令可以根据Dockerfile的内容创建镜像
步骤:
a、创建一个Dockerfile文件 vi Dockerfile
```
# 指定基础镜像
FROM tomcat
# 指定作者
MAINTAINER yuanke@163.com
# 执行命令
RUN rm -f /usr/local/tomcat/webapps/ROOT/index.jsp
RUN echo "welcome to tomcat!" > /usr/local/tomcat/webapps/ROOT/index.html
```
b、构建新镜像,语法: docker build f Dockerfile文件的路径 t 镜像名:tag 命令执行的上下文
```
docker build -f Dockerfile -t itany/tomcat:v2 .
```
c、使用新镜像运行容器
```
docker run -p 9999:8080 -d itany/tomcat:v
```