docker的基本使用命令
[ ]表示可选
容器
查看正在运行的容器
docker ps
查询最后一次创建的容器docker ps -l
列出所有的容器 IDdocker ps -aq
在后台运行一个python的web应用
docker run -d -P [hostport]:[containerport] 镜像名 python 要运行的文件名如app.py
参数说明:
-d:让容器在后台运行。
-P:将容器内部使用的网络端口映射到我们使用的主机上
运行交互式容器
docker run -i -t 镜像名 /bin/bash
各个参数解析:
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
重新以交互模式进入存在的容器
`docker attach 容器id`
- 查看容器的端口映射
docker port 容器id
ordocker port 容器名
- 查看web应用程序日志
docker logs 容器ID或者名字
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。 - 停止容器
docker stop 容器名
停止所有的容器
docker stop $(docker ps -aq)
- 启动已经停止的web应用容器
docker start 容器id
重启没有停止的web应用容器
docker restart 容器id
- 移除容器(移除容器时容器必须是停止状态)
docker rm 容器名
删除所有的容器
docker rm $(docker ps -aq)
删除所有停止的容器
docker container prune -f
- 退出容器
ctrl+d
- 如果要正常退出不关闭容器,请按Ctrl+P+Q进行退出容器
镜像
- 载入镜像
docker pull 镜像名[:标签]
标签可选,没有标签默认latest
查看镜像
docker images
使用镜像
run 镜像名
删除镜像
docker rmi 镜像名或id
删除所有的镜像docker rmi $(docker images -q)
删除所有不使用的镜像docker image prune --force --all
查找镜像
docker search 镜像名
创建镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1.从已经创建的容器中更新镜像,并且提交这个镜像
2.使用 Dockerfile 指令来创建一个新的镜像
从已经创建的容器中更新镜像
更新镜像包
新镜像之前,我们需要使用镜像来创建一个容器。
runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@e218edb10161:/# 在运行的容器内使用 apt-get update
命令进行更新和安装想要安装的包
在完成操作之后,输入 exit
命令来退出这个容器。
此时ID为e218edb10161的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit
来提交容器副本。
runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
各个参数说明:
-m: 提交的描述信息
-a: 指定镜像作者
e218edb10161:容器ID
runoob/ubuntu:v2: 指定要创建的目标镜像名
我们可以使用 docker images
命令来查看我们的新镜像 runoob/ubuntu:v2:
导入和导出镜像包
export和import
exportdocker export 容器名 > 导出路径,一般以.tar结尾
举例:
我们使用容器 furious_bell,现在要将这个容器保存为一个文件 myunbuntu-export-1204.tardocker export furious_bell > /home/myubuntu-export-1204.tar
importdocker import - 要导入的包路径或url
举例:docker import - /home/myubuntu-export-1204.tar
通过指定 URL 或者某个目录来导入sudo docker import http://example.com/exampleimage.tgz example/imagerepo
save和load
savedocker save 9610cfc68e8d > /home/myubuntu-save-1204.tar
有点慢,稍微等待一下,没有任何warn信息就表示保存OK。9610cfc68e8d 是镜像ID
load
现在就可以在任何装 docker 的地方加载刚保存的镜像了docker load < /home/myubuntu-save-1204.tar
导出 export 与 保存 save 的区别
export导出的镜像文件大小 小于 save保存的镜像
export 导出(import导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史,所以无法进行回滚操作(
docker tag <LAYER ID> <IMAGE NAME>
);而save保存(load加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。(查看方式:docker images --tree
) 确切的说,export其实是容器的保存,只把镜像当前的状态保存下来,没有历史版本等信息,所以文件比较小
注:导入加载进来觉得不合适可以使用 docker rm 容器ID 、 docker rmi 镜像ID 来删掉和移除所有的容器和镜像(大扫除):docker kill $(docker ps -q)
; docker rm $(docker ps -a -q)
; `docker rmi $(docker images -q -a)``
使用 Dockerfile 来创建一个新的镜像
创建 Dockerfile文件
vim dockerfile
进入 dockerfile文件进行编辑
Docker语法:
FROM 基础镜像base image
MAINTAINER 维护者
RUN 执行命令
ADD 添加文件
COPY 拷贝文件
CMD 执行命令
EXPOSE 执行命令
WORKDIR 指定路径
ENV 设定环境变量
USER 指定路径
VOLUME 逻辑卷挂载点mount point
注意事项
- 使用apt-get install 要在最后加 –assume-yes ,否则会abort
- 使用yum还是apt取决于base image环境,不是取决于自己服务器的环境
- 每次使用RUN指令都是新增一层镜像,所以最好用&& 连接多个RUN
- 换行是\
- 为了让镜像包不臃肿最后要删除。。。什么什么的
使用dockerfile
docker build -t 镜像名 dockfile所在目录,当前目录可用.
其他
拷贝
从容器拷贝文件到宿主机
拷贝方式为:
docker cp 容器名:容器中要拷贝的文件名及其路径 要拷贝到宿主机里面对应的路径
例如,将容器:mycontainer中路径:/opt/testnew/下的文件:file.txt
拷贝到宿主机:
/opt/test/
路径下,在宿主机中执行命令如下:
docker cp mycontainer:/opt/testnew/file.txt /opt/test
从宿主机拷贝文件到容器拷贝方式为:
docker cp 宿主机中要拷贝的文件名及其路径 容器名:要拷贝到容器里面对应的路径
例如,将宿主机中路径:
/opt/test/ 下的文件 file.txt
拷贝到容器:mycontainer 的:/opt/testnew/
路径下,同样还是在宿主机中执行命令如下:
docker cp /opt/test/file.txt mycontainer:/opt/testnew
不管容器有没有启动,拷贝命令都会生效
映射
DOCKER 给运行中的容器添加映射端口
方法1
- 获得容器IP
将container_name 换成实际环境中的容器名
docker inspectcontainer_name
| grep IPAddress - iptable转发端口
将容器的8000端口映射到docker主机的8001端口iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:80
方法2
- 提交一个运行中的容器为镜像
docker commit containerid foo/live
- 运行镜像并添加端口
docker run -d -p 8000:80 foo/live /bin/bash
方法3(已确认)
- 停止容器
- 停止docker服务(systemctl stop docker)
- 修改这个容器的hostconfig.json文件中的端口(原帖有人提到,如果config.v2.json里面也记录了端口,也要修改)
cd /var/lib/docker/3b6ef264a040* #这里是CONTAINER ID vi hostconfig.json 如果之前没有端口映射, 应该有这样的一段: "PortBindings":{} 增加一个映射, 这样写: "PortBindings":{"3306/tcp":[{"HostIp":"","HostPort":"3307"}]} 前一个数字是容器端口, 后一个是宿主机端口. 而修改现有端口映射更简单, 把端口号改掉就行.
- 启动docker服务(systemctl start docker)
- 启动容器