Docker使用

Docker成功安装后,继续来学习Docker基本命令的使用。安装方法参见上一篇文章Docker入门

镜像加速器

当运行容器时,使用的镜像如果在本地中不存在,Docker 就会自动从 Docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。可以使用阿里云的镜像加速器。

前往https://cr.console.aliyun.com/注册/登录阿里云,左侧列表里就有镜像加速器地址。

操作方法:

1
2
3
4
5
6
7
8
9
10
//Ubuntu
//修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2
3
4
5
6
7
8
9
10
11
12
//Windows
//针对安装了Docker Toolbox的用户,您可以参考以下配置步骤:
创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。
docker-machine create --engine-registry-mirror=https://xxxxxxx.mirror.aliyuncs.com -d virtualbox default
//查看机器的环境配置,并配置到本地,并通过Docker客户端访问Docker服务。
docker-machine env default
eval "$(docker-machine env default)"
docker info

//针对安装了Docker for Windows的用户,您可以参考以下配置步骤:
在系统右下角托盘图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Docker Daemon。将加速器地址添加到Registry mirrors窗口内。
//编辑完成后点击 Apply 保存按钮,等待Docker重启并应用配置的镜像加速器。

镜像

列出镜像

1
docker images [OPTIONS] [REPOSITORY[:TAG]]

options:

  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
  • –digests :显示镜像的摘要信息;
  • -f :显示满足条件的镜像;
  • –format :指定返回值的模板文件;
  • –no-trunc :显示完整的镜像信息;
  • -q :只显示镜像ID。

查找镜像

1
docker search [OPTIONS] TERM

options:

  • –automated :只列出 automated build类型的镜像;
  • –no-trunc :显示完整的镜像描述;
  • -s :列出收藏数不小于指定值的镜像

列出镜像所有tag

找到一个很好的python脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env python3
import argparse
import json
import requests

def get_token(auth_url, image_name):
payload = {
'service': 'registry.docker.io',
'scope': 'repository:library/{image}:pull'.format(image=image_name)
}
r = requests.get(auth_url + '/token', params=payload)
if not r.status_code == 200:
print("Error status {}".format(r.status_code))
raise Exception("Could not get auth token")

j = r.json()
return j['token']

def fetch_versions(index_url, token, image_name):
h = {'Authorization': "Bearer {}".format(token)}
r = requests.get('{}/v2/library/{}/tags/list'.format(index_url, image_name),
headers=h)
return r.json()

if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument('name', help='Name of image to list versions of')
p.add_argument('-t', '--token',
help='Auth token to use (automatically fetched if not specified)')
p.add_argument('-i', '--index-url', default='https://index.docker.io')
p.add_argument('-a', '--auth-url', default='https://auth.docker.io')
args = p.parse_args()
token = args.token or get_token(auth_url=args.auth_url, image_name=args.name)
versions = fetch_versions(args.index_url, token, args.name)
print(json.dumps(versions, indent=2))

拖取/更新镜像

1
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

options:

  • -a :拉取所有 tagged 镜像
  • –disable-content-trust :忽略镜像的校验,默认开启

从容器创建一个新的镜像

1
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

options:

  • -m:提交的描述信息
  • -a:指定镜像作者
  • -p:在提交期间暂停容器
  • -c :使用Dockerfile指令来创建镜像;

例:

1
docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1

设置镜像标签

1
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

将镜像ubuntu:15.10标记为 ubuntu111:v3 镜像:

1
docker tag ubuntu:15.10 ubuntu111:v3

保存镜像为tar

1
docker save [OPTIONS] IMAGE [IMAGE...]

options:

  • -o:输出到文件

将镜像ubuntu:v3 生成my_ubuntu_v3.tar文档:

1
docker save -o my_ubuntu_v3.tar ubuntu:v3

载入容器包为镜像

1
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

options:

  • -c :应用docker指令创建镜像
  • -m :提交时的说明文字

从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为ubuntu:v4:

1
docker import  my_ubuntu_v3.tar ubuntu:v4

载入镜像包为镜像

1
docker load [OPTIONS]

options:

  • -i :从tar文件中读取而不是从STDIN
  • -q :静默模式

删除镜像

1
docker rmi [OPTIONS] IMAGE [IMAGE...]

options:

  • -f :强制删除
  • –no-prune :不移除该镜像的过程镜像,默认移除

容器

创建一个新的容器并运行一个命令

1
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

options:

  • -d:让容器在后台运行。
  • -P:将容器内部使用的网络端口映射到我们使用的主机上。
  • -i :允许你对容器内的标准输入 (STDIN) 进行交互。
  • -t :分配一个伪终端

创建一个带有交互伪终端的容器:

1
docker run -i -t ubuntu:15.10 /bin/bash

后台运行app.py并将容器5000端口映射到主机的5000端口:

1
docker run -d -p 5000:5000 training/webapp python app.py

后台运行php环境,映射宿主82到容器80,挂载目录并启动apache和bash

1
docker run -dt --name php -p:82:80 -v /Users/joe/www:/var/www --rm 6416 sh -c 'service apache2 start && /bin/bash'

返回但不退出容器

1
按住Ctrl+p+q

列出容器

1
docker ps [OPTIONS]

options:

  • -a :显示所有的容器,包括未运行的。
  • -f :根据条件过滤显示的内容。
  • –format :指定返回值的模板文件。
  • -l :显示最近创建的容器。
  • -n :列出最近创建的n个容器。
  • –no-trunc :不截断输出。
  • -q :静默模式,只显示容器编号。
  • -s :显示总的文件大小。

列出指定的容器的端口映射

1
docker port CONTAINER [PRIVATE_PORT[/PROTO]]

获取容器的日志

1
docker logs [OPTIONS] CONTAINER

options:

  • -f : 跟踪日志输出
  • –since :显示某个开始时间的所有日志
  • -t : 显示时间戳
  • –tail :仅列出最新N条容器日志

查看容器中运行的进程信息

1
docker top CONTAINER [ps OPTIONS]

支持 ps 命令参数

获取容器/镜像的元数据

1
docker inspect [OPTIONS] NAME|ID [NAME|ID...]

options:

  • -f :指定返回值的模板文件。
  • -s :显示总的文件大小。
  • –type :为指定类型返回JSON。

启动/停止/重启容器

1
docker start/stop/restart [OPTIONS] CONTAINER [CONTAINER...]

杀掉一个运行中的容器

1
docker kill [OPTIONS] CONTAINER [CONTAINER...]

options:

  • -s :向容器发送一个信号

删除一个或多少容器

1
docker rm [OPTIONS] CONTAINER [CONTAINER...]

options:

  • -f :通过SIGKILL信号强制删除一个运行中的容器
  • -l :移除容器间的网络连接,而非容器本身
  • -v :删除与容器关联的卷

暂停/恢复容器中所有进程

1
docker pause CONTAINER [CONTAINER...]

创建一个新的容器但不启动它

1
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

options同docker run

在运行的容器中执行命令

1
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

options:

  • -d :在后台运行
  • -i :允许你对容器内的标准输入 (STDIN) 进行交互。
  • -t :分配一个伪终端

容器 mynginx 中以交互模式执行容器内 /root/run.sh 脚本:

1
docker exec -it mynginx /bin/sh /root/run.sh

容器的文件系统导出为tar

1
docker export [OPTIONS] CONTAINER

options:

  • -o :写入文件而不是STDOUT

其他

显示系统信息

1
docker info [OPTIONS]

options:

  • -f :格式化输出

显示版本信息

1
docker version [OPTIONS]

options:

  • -f :格式化输出

load/import和save/export的区别

  • docker save保存的是镜像(image),docker export保存的是容器(container);
  • docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
  • docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
  • docker load只能载入镜像包,docker import可以载入镜像包和容器包,但载入镜像包无法运行容器。

可以将docker import理解为将外部文件复制进来形成只有一层文件系统的镜像,而docker commit则是将当前的改动提交为一层文件系统,然后叠加到原有镜像之上。

但愿我的博文能对您有所帮助~