Fork me on GitHub

一起学 Docker(三)-- 镜像的常用操作

1. 获取镜像:

命令:

docker pull < 域名 >/<namespace>/<repo>:<tag>

说明:

镜像是 Docker 运行容器的前提。

用户可以使用 docker pull 命令从网络上下载镜像。对于镜像来说,如果不显式地指定 tag, 则默认会选择 latest 标签,即下载仓库中最新版本的镜像。

默认是从 docker 官方下载的。只有 docker 官方的可以不需要增加命名空间直接进行下载。

2. 查看镜像列表

命令:

docker images

说明:

使用 docker images 命令可以列出本地主机上已有的镜像。

信息含义:来自于哪个仓库、镜像的标签信息、镜像的 ID 号(唯一)、创建时间、镜像大小。

3. 查看镜像信息

命令:

docker inspect <image_id>

说明:

docker inspect 命令返回的是一个 JSON 的格式消息,如果我们只要其中的一项内容时,可以通过 -f 参数来指定。Image_id 通常可以使用该镜像 ID 的前若干个字符组成的可区分字符串来替代完成的 ID。

查看镜像的某一个详细信息

4. 查找镜像

命令:

docker search <image_name>

说明:

使用 docker search 命令可以搜索远端仓库中共享的镜像,默认搜索 Docker hub 官方仓库中的镜像。

5. 删除镜像

命令:

docker rmi <image>:<tag>

说明:

使用 docker rmi 命令可以删除镜像,其中 image 可以为标签或 ID。

注意:

当同一个镜像拥有多个标签,docker rmi 只是删除该镜像多个标签中的指定标签而已,而不影响镜像文件。

当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。

如果一个镜像就有一个 tag 的话,删除 tag 就删除了镜像的本身。

一个镜像做一个 tag

执行删除 tag 操作

删除镜像操作

重新下载镜像,方便下一步关于镜像和容器的关系演示

如果镜像里面有容器正在运行,删除镜像的话,会提示 error,系统默认是不允许删除的,如果强制删除需要加入 -f 操作,但是 docker 是不建议这么操作的,因为你删除了镜像其实容器并未删除,直接导致容器找不到镜像,这样会比较混乱。

运行一个镜像里面的容器

查看运行中的容器

删除镜像,报错误 error,有一个容器正在这个镜像内运行

强制删除

已经找不到镜像,删除镜像未删除容器的后果

6. 创建镜像

命令:

docker commit <options> <container_id><repository:tag>

参数说明:

-a , --author : 作者信息

-m , --meassage : 提交消息

-p , --pause=true : 提交时暂停容器运行

说明:

基于已有的镜像的容器的创建。再次下载 ubuntu,以 ubuntu 为例子创建

运行 ubuntu,-ti 把容器内标准绑定到终端并运行 bash,这样开跟传统的 linux 操作系统没什么两样,现在我们直接在容器内运行。这个内部系统都是极简的只保留我们的一些系统的运行参数,里面很多 vi 命令可能都是没有的。

退出容器 exit

容器创建成镜像的方法:

通过某个容器 d1d6706627f1 创建对应的镜像,有点类似 git

发现通过 docker images 里面多了一个镜像

liming/test 的仓库

7. 迁出镜像

命令:

docker save -o <image>.tar<image>:<tag>

参数说明:

-o: 设置存储压缩后的文件名称

说明:

可以使用 docker save 命令来迁出镜像,其中 image 可以为标签或 ID。

8. 载入镜像

命令:

docker load --input <image>.tar 或 docker load < <image>.tar

说明:

使用 docker load 命令可以载入镜像,其中 image 可以为标签或 ID。这将导入镜像及相关的元数据信息(包括标签等),可以使用 docker images 命令进行查看。我们先删除原有的 liming/test 镜像,执行查看镜像,然后在导入镜像

为了确定导入的镜像是否是原来删除的那个镜像,我们进入镜像,查看下 text.txt

是我们输入的 docker 这个内容

可能这个镜像的名字不符合 docker 的要求因为都是, 重新命名一下

9. 上传镜像

命令:

docker push < 域名 >/<namespace>/<repo>:<tag>

说明:

可以使用 docker push 命令上传镜像到仓库,默认上传到 DockerHub 官方仓库(需要登录)。

开始提示我权限不足,因为我没有登录。

登录之后提示

登录后删除还是权限不足

因为我们 ubuntu/test 这个名字跟官网的 yhaing 名字不一致我修改下在试试

开始上传了

去官网看看是否上传成功

Docker 命令帮助

docker help

docker command

$ sudo docker   # docker 命令帮助

Commands:
attach   Attach to a running container 
         # 当前 shell 下 attach 连接指定运行镜像
build    Build an image from a Dockerfile  
         # 通过 Dockerfile 定制镜像
commit   Create a new image from a container's changes                
         #提交当前容器为新的镜像
cp       Copy files/folders from the containers filesystem to the host path 
         # 从容器中拷贝指定文件或者目录到宿主机中
create   Create a new container
         # 创建一个新的容器,同 run,但不启动容器
diff     Inspect changes on a container's filesystem     
         # 查看 docker 容器变化
events   Get real time events from the server  
         # 从 docker 服务获取容器实时事件
exec     Run a command in an existing container
         # 在已存在的容器上运行命令
export   Stream the contents of a container as a tar archive   
         # 导出容器的内容流作为一个 tar 归档文件[对应 import]
history  Show the history of an image  
         # 展示一个镜像形成历史
images   List images   
         # 列出系统当前镜像
import   Create a new filesystem image from the contents of a tarball  
         # 从 tar 包中的内容创建一个新的文件系统映像[对应 export]
info     Display system-wide information   
         # 显示系统相关信息
inspect  Return low-level information on a container   
         # 查看容器详细信息
kill     Kill a running container  
         # kill 指定 docker 容器
load     Load an image from a tar archive  
         # 从一个 tar 包中加载一个镜像[对应 save]
login    Register or Login to the docker registry server   
         # 注册或者登陆一个 docker 源服务器
logout   Log out from a Docker registry server
         # 从当前 Docker registry 退出
logs     Fetch the logs of a container 
         # 输出当前容器日志信息
port     Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
         # 查看映射端口对应的容器内部源端口
pause    Pause all processes within a container
         # 暂停容器
ps       List   containers   
         # 列出容器列表
pull     Pull an image or a repository from the docker registry server
         # 从 docker 镜像源服务器拉取指定镜像或者库镜像
push     Push an image or a repository to the docker registry server
         # 推送指定镜像或者库镜像至 docker 源服务器
restart  Restart a running container   
         # 重启运行的容器
rm       Remove one or more containers 
         # 移除一个或者多个容器
rmi      Remove one or more images 
         # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run      Run a command in a new container
         # 创建一个新的容器并运行一个命令
save     Save an image to a tar archive
         # 保存一个镜像为一个 tar 包[对应 load]
search   Search for an image on the Docker Hub 
         # 在 docker hub 中搜索镜像
start    Start a stopped containers
         # 启动容器
stop     Stop a running containers 
         # 停止容器
tag      Tag an image into a repository
         # 给源中镜像打标签
top      Lookup the running processes of a container   
         # 查看容器中运行的进程信息
unpause  Unpause a paused container
         # 取消暂停容器
version  Show the docker version information   
         # 查看 docker 版本号
wait     Block until a container stops, then print its exit code   
         # 截取容器停止时的退出状态值
Run 'docker COMMAND --help' for more information on a command.

docker option

Usage of docker:
  --api-enable-cors=false    Enable CORS headers in the remote API  
                             # 远程 API 中开启 CORS 头
  -b, --bridge=""            Attach containers to a pre-existing network bridge use 'none' to disable container networking
                             # 桥接网络
  --bip=""                   Use this CIDR notation address for the network bridge's IP, not compatible with -b
                             # 和 -b 选项不兼容,具体没有测试过
  -d, --daemon=false         Enable daemon mode 
                             # daemon 模式
  -D, --debug=false          Enable debug mode  
                             # debug 模式
  --dns=[]                   Force docker to use specific DNS servers   
                             # 强制 docker 使用指定 dns 服务器
  --dns-search=[]            Force Docker to use specific DNS search domains
                             # 强制 docker 使用指定 dns 搜索域
  -e, --exec-driver="native" Force the docker runtime to use a specific exec driver 
                             # 强制 docker 运行时使用指定执行驱动器
  --fixed-cidr=""            IPv4 subnet for fixed IPs (ex: 10.20.0.0/16)
   this subnet must be nested in the bridge subnet (which is defined by -b or --bip)
  -G, --group="docker"       Group to assign the unix socket specified by -H when running in daemon mode
   use '' (the empty string) to disable setting of a group
                             #指定容器运行的用户组
  -g, --graph="/var/lib/docker"  Path to use as the root of the docker runtime  
                             # 容器运行的根目录路径
  -H, --host=[]              The socket(s) to bind to in daemon mode specified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.
                             # daemon 模式下 docker 指定绑定方式[tcp or 本地 socket]
  --icc=true                 Enable inter-container communication   
                             # 跨容器通信
  --insecure-registry=[]     Enable insecure communication with specified registries (no certificate verification for HTTPS and enable HTTP fallback) (e.g., localhost:5000 or 10.20.0.0/16)
  --ip="0.0.0.0"             Default IP address to use when binding container ports 
                             # 指定监听地址,默认所有 ip
  --ip-forward=true          Enable net.ipv4.ip_forward 
                             # 开启转发
  --ip-masq=true             Enable IP masquerading for bridge's IP range
  --iptables=true            Enable Docker's addition of iptables rules 
                             # 添加对应 iptables 规则
  --mtu=0                    Set the containers network MTU 
                             # 设置网络 mtu
   if no value is provided: default to the default route MTU or 1500 if no default route is available
  -p, --pidfile="/var/run/docker.pid"   Path to use for daemon PID file
                             # 指定 pid 文件位置
  --registry-mirror=[]       Specify a preferred Docker registry mirror  
  -s, --storage-driver=""    Force the docker runtime to use a specific storage driver  
                             # 强制 docker 运行时使用指定存储驱动
  --selinux-enabled=false    Enable selinux support 
                             # 开启 selinux 支持
  --storage-opt=[]           Set storage driver options 
                             # 设置存储驱动选项
  --tls=false                Use TLS; implied by tls-verify flags   
                             # 开启 tls
  --tlscacert="/root/.docker/ca.pem"  Trust only remotes providing a certificate signed by the CA given here
  --tlscert="/root/.docker/cert.pem"  Path to TLS certificate file   
                              # tls 证书文件位置
  --tlskey="/root/.docker/key.pem"   Path to TLS key file  
                              # tls key 文件位置
  --tlsverify=false           Use TLS and verify the remote (daemon: verify client, client: verify daemon) 
                              # 使用 tls 并确认远程控制主机
  -v, --version=false         Print version information and quit
                              # 输出 docker 版本信息  
$ sudo docker search --help

Usage: docker search TERM

Search the Docker Hub for images # 从 Docker Hub 搜索镜像 --automated=false Only show automated builds
  --no-trunc=false Don't truncate output
  -s, --stars=0 Only displays with at least xxx stars

示例:

$ sudo docker search -s 100 ubuntu # 查找 star 数至少为 100 的镜像,找出只有官方镜像 start 数超过 100,默认不加 s 选项找出所有相关 ubuntu 镜像 NAME  DESCRIPTION  STARS OFFICIAL   AUTOMATED
ubuntuOfficial Ubuntu base image 425 [OK] 

docker info

$ sudo docker info 
Containers: 1 # 容器个数 Images: 22 # 镜像个数 Storage Driver: devicemapper # 存储驱动 Pool Name: docker-8:17-3221225728-pool
 Pool Blocksize: 65.54 kB
 Data file: /data/docker/devicemapper/devicemapper/data
 Metadata file: /data/docker/devicemapper/devicemapper/metadata
 Data Space Used: 1.83 GB
 Data Space Total: 107.4 GB
 Metadata Space Used: 2.191 MB
 Metadata Space Total: 2.147 GB
 Library Version: 1.02.84-RHEL7 (2014-03-26) Execution Driver: native-0.2 # 存储驱动 Kernel Version: 3.10.0-123.el7.x86_64
Operating System: CentOS Linux 7 (Core) 

docker pull && docker push

$ sudo docker pull --help # pull 拉取镜像 Usage: docker pull [OPTIONS] NAME[:TAG] Pull an image or a repository from the registry

  -a, --all-tags=false Download all tagged images in the repository $ sudo docker push # push 推送指定镜像 Usage: docker push NAME[:TAG] Push an image or a repository to the registry

示例:

$ sudo docker pull ubuntu # 下载官方 ubuntu docker 镜像,默认下载所有 ubuntu 官方库镜像 $ sudo docker pull ubuntu:14.04 # 下载指定版本 ubuntu 官方镜像 


$ sudo docker push 192.168.0.100:5000/ubuntu # 推送镜像库到私有源[可注册 docker 官方账户,推送到官方自有账户] $ sudo docker push 192.168.0.100:5000/ubuntu:14.04 # 推送指定镜像到私有源 

docker images

列出当前系统镜像

$ sudo docker images --help

Usage: docker images [OPTIONS] [NAME] List images

  -a, --all=false Show all images (by default filter out the intermediate image layers) # -a 显示当前系统的所有镜像,包括过渡层镜像,默认 docker images 显示最终镜像,不包括过渡层镜像 -f, --filter=[] Provide filter values (i.e. 'dangling=true') --no-trunc=false Don't truncate output
  -q, --quiet=false Only show numeric IDs

示例:

$ sudo docker images # 显示当前系统镜像,不包括过渡层镜像 $ sudo docker images -a # 显示当前系统所有镜像,包括过渡层镜像 $ sudo docker images ubuntu # 显示当前系统 docker ubuntu 库中的所有镜像 REPOSITORY TAG IMAGE IDCREATED VIRTUAL SIZE
ubuntu 12.04   ebe4be4dd427 4 weeks ago 210.6 MB
ubuntu 14.04   e54ca5efa2e9 4 weeks ago 276.5 MB
ubuntu 14.04-ssh   6334d3ac099a 7 weeks ago 383.2 MB

docker rmi

删除一个或者多个镜像

$ sudo docker rmi --help

Usage: docker rmi IMAGE [IMAGE...] Remove one or more images

  -f, --force=false Force removal of the image # 强制移除镜像不管是否有容器使用该镜像 --no-prune=false Do not delete untagged parents # 不要删除未标记的父镜像 

docker run

$ sudo docker run --help

常用选项说明

-d, --detach=false,   指定容器运行于前台还是后台,默认为 false
-i, --interactive=false, 打开 STDIN,用于控制台交互
-t, --tty=false,      分配 tty 设备,该可以支持终端登录,默认为 false
-u, --user="",        指定容器的用户
-a, --attach=[],      登录容器(必须是以 docker run -d 启动的容器)
-w, --workdir="",     指定容器的工作目录
-c, --cpu-shares=0,   设置容器 CPU 权重,在 CPU 共享场景使用
-e, --env=[],         指定环境变量,容器中可以使用该环境变量
-m, --memory="",      指定容器的内存上限
-P, --publish-all=false, 指定容器暴露的端口
-p, --publish=[],     指定容器暴露的端口
-h, --hostname="",    指定容器的主机名
-v, --volume=[],      给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[],    给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[],         添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[],        删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="",         运行容器后,在指定文件中写入容器 PID 值,一种典型的监控系统用法
--cpuset="",          设置容器可以使用哪些 CPU,此参数可以用来容器独占 CPU
--device=[],          添加主机设备给容器,相当于设备直通
--dns=[],             指定容器的 dns 服务器
--dns-search=[],      指定容器的 dns 搜索域名,写入到容器的 /etc/resolv.conf 文件
--entrypoint="",      覆盖 image 的入口点
--env-file=[],        指定环境变量文件,文件格式为每行一个环境变量
--expose=[],          指定容器暴露的端口,即修改镜像的暴露端口
--link=[],            指定容器间的关联,使用其他容器的 IP、env 等信息
--lxc-conf=[],        指定容器的配置文件,只有在指定 --exec-driver=lxc 时使用
--name="",            指定容器名字,后续可以通过名字进行容器管理,links 特性需要使用名字
--net="bridge",       容器网络设置:
      bridge 使用 docker daemon 指定的网桥
      host // 容器使用主机的网络
      container:NAME_or_ID >// 使用其他容器的网路,共享 IP 和 PORT 等网络资源
      none 容器使用自己的网络(类似 --net=bridge),但是不进行配置
--privileged=false,   指定容器是否为特权容器,特权容器拥有所有的 capabilities
--restart="no",       指定容器停止后的重启策略:
    no:容器退出时不重启
    on-failure:容器故障退出(返回值非零)时重启
    always:容器退出时总是重启
--rm=false,           指定容器停止后自动删除容器(不支持以 docker run -d 启动的容器)
--sig-proxy=true,     设置由代理接受并处理信号,但是 SIGCHLD、SIGSTOP 和 SIGKILL 不能被代理

docker start|stop|kill… …

dockerstart|stop|kill|restart|pause|unpause|rm|commit|inspect|logs

docker start CONTAINER [CONTAINER...]

# 运行一个或多个停止的容器
docker stop CONTAINER [CONTAINER...]

# 停掉一个或多个运行的容器 -t 选项可指定超时时间
docker kill [OPTIONS] CONTAINER [CONTAINER...]

# 默认 kill 发送 SIGKILL 信号 -s 可以指定发送 kill 信号类型
docker restart [OPTIONS] CONTAINER [CONTAINER...]

# 重启一个或多个运行的容器 -t 选项可指定超时时间
docker pause CONTAINER

# 暂停一个容器,方便 commit
docker unpause CONTAINER

# 继续暂停的容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]

# 移除一个或多个容器 -f, --force=false Force removal of running container-l, --link=false Remove the specified link and not the underlying container-v, --volumes=false Remove the volumes associated with the container
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

# 提交指定容器为镜像 -a, --author="" Author (e.g., "John Hannibal Smith hannibal@a-team.com")-m, --message="" Commit message-p, --pause=true Pause container during commit

# 默认 commit 是暂停状态

docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]

# 查看容器或者镜像的详细信息
docker logs CONTAINER

# 输出指定容器日志信息 -f, --follow=false Follow log output

# 类似 tail -f
-t, --timestamps=false Show timestamps--tail="all" Output the specified number of lines at the end of logs (defaults to all logs)

参考文档:Docker Run Reference

docker exec –help

Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] Run a command in an existing container

  -d, --detach=false Detached mode: run command in the background
  -i, --interactive=false Keep STDIN open even if not attached
  -t, --tty=false Allocate a pseudo-TTY

为了简化调试,可以使用 docker exec 命令通过 Docker API 和 CLI 在运行的容器上运行程序。

$ docker exec -it ubuntu_bash bash

上例将在容器 ubuntu_bash 中创建一个新的 Bash 会话。

Tune container lifecycles withdocker create

我们可以通过 docker run 命令创建一个容器并运行其中的程序,因为有很多用户要求创建容器的时候不启动容器,所以 docker create 应运而生了。

$ docker create -t -i fedora bash
6d8af538ec541dd581ebc2a24153a28329acb5268abe5ef868c1f1a261221752

上例创建了一个可写的容器层 (并且打印出容器 ID),但是并不运行它,可以使用以下命令运行该容器:

$ docker start -a -i 6d8af538ec5
bash-4.2#

Security Options

通过–security-opt 选项,运行容器时用户可自定义 SELinux 和 AppArmor 卷标和配置。

$ docker run --security-opt label:type:svirt_apache -i -t centos \ bash

上例只允许容器监听在 Apache 端口,这个选项的好处是用户不需要运行 docker 的时候指定–privileged 选项,降低安全风险。

参考文档:Docker 1.3: signed images, process
injection, security options, Mac shared directories

赞赏是最好的支持与鼓励!
-------------本文结束感谢您的阅读-------------