Docker
常用命令
- 查找镜像:docker search 镜像名
- 拉取镜像:docker pull 镜像名
- 启动docker服务:sudo service docker start
- 查看docker状态:systemctl status docker
- 启动镜像:docker run 镜像名
- 进入运行的容器中:docker exec -it 容器名
- 查看当前正在运行的容器:docker ps
- 查看最后一次创建的容器:docker ps -l
- 列出所有容器ID:docker ps -aq
- 查看所有运行或者不运行容器:docker ps -a
- 补充:docker container ls -l/all
- 停止运行的容器:docker stop 容器id/name
- 重新启动已终止容器:docker start 容器id
- 重启运行中的容器:docker restart 容器id
- 删除docker中的容器:docker rm
- 删除docker中所有的容器:docker rm 'docker ps -a -q' -f
- 删除容器的同时移除数据卷:docker rm -v 容器id
- 查看有哪些镜像:docker images
- 删除docker中的镜像:docker rmi
- 删除docker中所有的镜像:docker rmi $(docker images -q)
- 先删除容器,再删除镜像
- 查看映射容器映射端口:docker port 容器id/name
- 查看容器内部的标准输出:docker logs 容器id/name
- 查看容器内部实时日志的标准输出:docker logs -f 容器id/name
- 查看容器内部运行的进程:docker top 容器名字
- 标记镜像:docker tag 镜像名 标记的新镜像名
- 重启docker: service docker restart
- 提交镜像:docker push 镜像名 或: docker push 镜像名:标签名 注:镜像名必须是docker账号/镜像名:标签名,如果没有标签名默认latest,也可以在提交时添加标签名
- 导出容器:docker export 容器id > 文件名 (导出容器快照到本地文件)
- 导入容器:docker import -快照文件名...
- 创建数据卷:docker volume create 数据卷名
- 查看所有的数据卷:docker volume ls
- 查看指定数据卷信息:docker volume inspect 数据卷名
- 查看容器的信息:docker inspect 容器名数据卷信息在其"Mounts"Key下面
- 删除数据卷:docker volume rm 数据卷名 (删除数据卷前需要将利用该数据卷的容器删除掉)
- 删除无主的数据卷:docker volume prune
Docker提交命令
docker commit -m "update" -a="root" a6e80297382e root/ubuntu:update
- -m:提交的描述信息
- -a:指定镜像作者
- a6e80297382e:容器ID
- root/ubuntu:指定要创建的目录镜像名
- :update:指定镜像标签名
Docker运行命令
docker run -i -t ubuntu:15.10 /bin/bash
- -t:在新容器内指定一个伪终端或终端。
- -i:允许你对容器内的标准输入 (STDIN) 进行交互。
docker run -d -P training/webapp python app.py
- -d:让容器在后台运行
- -P:将容器内部使用的网络端口映射到我们使用的主机上。
Docker运行命令详解
docker run -dit --privileged -p21:21 -p80:80 -p8080:8080 -p30000-30010:30000-30010 --name how2jtmall how2j/tmall:latest /usr/sbin/init
- docker run 表示运行一个镜像
- -dit 是 -d -i -t 的缩写。 -d ,表示 detach,即在后台运行。 -i 表示提供交互接口,这样才可以通过 docker 和 跑起来的操作系统交互。 -t 表示提供一个 tty (伪终端),与 -i 配合就可以通过 ssh 工具连接到 这个容器里面去了
- --privileged 启动容器的时候,把权限带进去。 这样才可以在容器里进行完整的操作
- -p21:21 第一个21,表示在CentOS 上开放21端口。 第二个21 表示在容器里开放21端口。 这样当访问CentOS 的21端口的时候,就会间接地访问到容器里了
- -p80:80 和 21一个道理
- -p8080:8080 和21 一个道理,在本例里,访问的地址是 http://192.168.84.128:8080/tmall/, 这个 192.168.84.128 是CentOS 的ip地址,8080是 CentOS 的端口,但是通过-p8080:8080 这么一映射,就访问到容器里的8080端口上的 tomcat了
- -p30000-30010 和21也是一个道理,这个是ftp用来传输数据的
- --name how2jtmall 给容器取了个名字,叫做 how2jtmall,方便后续管理
- how2j/tmall:latest how2j/tmall就是镜像的名称, latest是版本号,即最新版本
- /usr/sbin/init: 表示启动后运行的程序,即通过这个命令做初始化
创建容器过程
当利用docker run 来创建容器时,Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
自动构建:
- 在Docker Hub选择仓库,在Builds选项卡中选择Configure Automated Builds;
- 选取一个目标网站中的项目(需要含Dockerfile)和分支
- 指定Dockerfile的位置,并保存下来。
之后可以在Docker Hub的仓库页面的Timeline选项卡中查看每次构建的状态。
数据管理
数据卷
数据卷概念
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对 数据卷的修改会立马生效
- 对 数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
当我们运行一个容器时(如果不使用卷),做的任何文件修改都会别记录于容器存储层里。
启动数据卷
docker run -d -P --name web --mount source=my-vol,target=/webapp training/webapp python app.py
- -d:让容器在后台运行
- -P:将容器内部使用的网络端口映射到我们使用的主机上。
- --name:创建容器的名字
- source:指定数据卷名
- target:指定挂载在容器的哪个目录下
- training/webapp:镜像名
- python app.py:容器名
使用--mount标记将数据卷挂载到容器里。
创建一个名为web的容器,并加载一个数据卷到容器的/webapp目录
删除数据卷
- 数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用
docker rm -v
这个命令。 - 删除数据卷:docker volume rm 数据卷名 (删除数据卷前需要将利用该数据卷的容器删除掉)
- 删除无主的数据卷:docker volume prune
挂载主机目录
挂载主机目录为数据卷
docker run -d -P --name web --mount type=bind,source=/home/docker,target=/opt/webapp training/webapp python app.py
- -d:让容器在后台运行
- -P:将容器内部使用的网络端口映射到我们使用的主机上。
- --name:创建容器的名字
- source:指定本地的目录,必须是绝对路径,使用--mount时,如果本地目录不存在Docker会报错
- 使用-v时,如果本地目录不存在Docker会自动创建一个文件夹
- target:指定挂载在容器的哪个目录下
- training/webapp:镜像名
- python app.py:容器名
只读权限
Docker挂载主机目录的默认权限是:读写 ,可以增加readonly指定为:只读
docker run -d -P --name web --mount type=bind,source=/home/docker,target=/opt/webapp,readonly training/webapp python app.py
- -d:让容器在后台运行
- -P:将容器内部使用的网络端口映射到我们使用的主机上。
- --name:创建容器的名字
- source:指定本地的目录,必须是绝对路径,使用--mount时,如果本地目录不存在Docker会报错
- 使用-v时,如果本地目录不存在Docker会自动创建一个文件夹
- target:指定挂载在容器的哪个目录下
- readonly:设定挂载目录的权限是只读
- training/webapp:镜像名
- python app.py:容器名
挂在本地文件为数据卷
docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history training/webapp bash
- --rm:容器在退出时自动清理容器内部的文件系统
- -it:以交互模式运行,分配一个伪输入终端
- source:指定本地的目录,必须是绝对路径,使用--mount时,如果本地目录不存在Docker会报错
- 使用-v时,如果本地目录不存在Docker会自动创建一个文件夹
- target:指定挂载在容器的哪个目录下
- training/webapp:镜像名
- bash:容器名
运行history,可以查看记录在容器输入过的命令(宿主机的历史命令)
网络
使用网络
外部访问容器
docker run -d -P training/webapp python app.py
- -d:让容器在后台运行
- -P:将容器内部使用的网络端口映射到我们使用的主机上。
此时使用-P标记时Docker会随机映射一个49000~49900的端口到内部容器开放的网络端口
-P 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。
映射所有接口地址
使用 hostPort:containerPort
格式本地的 5000 端口映射到容器的 5000 端口,可以执行
$ docker run -d -p 5000:5000 training/webapp python app.py
此时默认会绑定本地所有接口上的所有地址。
映射到指定地址的指定端口
可以使用 ip:hostPort:containerPort
格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
$ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到指定地址的任意端口
使用 ip::containerPort
绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。
$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
还可以使用 udp
标记来指定 udp
端口
$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
配置DNS
配置全部容器的 DNS ,也可以在 /etc/docker/daemon.json
文件中增加以下内容来设置。
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过 /etc/resolv.conf
文件立刻得到更新,每次启动的容器 DNS 自动配置为 114.114.114.114
和 8.8.8.8
。