docker常用操作解析(详细版)

容器是 Docker 又一核心概念。

简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

启动容器

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态( stopped )的容器重新启动。

因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。

新建并启动

首先来了解一下当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

1.检查本地是否存在指定的镜像,不存在就从公有仓库下载
2.利用镜像创建并启动一个容器
3.分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
4.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
5.从地址池配置一个 ip 地址给容器
6.执行用户指定的应用程序
7.执行完毕后容器被终止

新建并启动容器所需要的命令主要为

docker run

比较下面的命令理解参数的使用及效果:

 $ docker run ubuntu:14.04 /bin/echo 'Hello world'

Hello world

二:

$ docker run -t -i ubuntu:14.04 /bin/bash

root@af8bae53bdd3:/#

一跟在本地直接执行 /bin/echo ‘hello world’ 几乎感觉不出任何区别。

二加入对应的参数之后,进入到了交互模式,用户可以通过所创建的终端来输入命令,例如

root@af8bae53bdd3:/# pwd

/

root@af8bae53bdd3:/# ls

bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i则让容器的标准输入保持打开。

当我们需要进行后台运行的是后可以加入 -d参数

$ docker run -d ubuntu:17.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用docker logs 查看)。

注: 容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关。

使用 -d 参数启动后会返回一个唯一的 id,也可以通过 docker container ls 命令来查看容器信息。

$ docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

77b2dc01fe0f ubuntu:17.10 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright

要获取容器的输出信息,可以通过 docker container logs 命令。

$ docker container logs [container ID or NAMES]

hello world

hello world

hello world

. . .

启动已终止容器

可以利用 docker container start 命令,直接将一个已经终止的容器启动运行。

容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 ps 或 top 来查看进程信息。

容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。

终止容器

可以使用 docker container stop 来终止一个运行中的容器。

此外,当 Docker 容器中指定的应用终结时,容器也自动终止。

当用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器立刻终止。

终止状态的容器可以用 docker container ls -a 命令看到。例如

docker container ls -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

ba267838cc1b ubuntu:14.04 "/bin/bash" 30 minutes ago Exited (0) About a minute ago trusting_newton

98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited (0) 34 minutes ago backstabbing_pike

处于终止状态的容器,可以通过 docker container start 命令来重新启动。

此外, docker container restart 命令会将一个运行态的容器终止,然后再重新启动它。

进入容器

某些时候需要进入容器进行操作,包括使用 docker attach 命令或 docker exec 命令,推荐大家使用 docker exec 命令,原因会在下面说明。

attach 命令

docker attach 是 Docker 自带的命令。下面示例如何使用该命令。

$ docker run -dit ubuntu

243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550

$ docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

243c32535da7 ubuntu:latest “/bin/bash” 18 seconds ago Up 17seconds nostalgic_hypatia

$ docker attach 243c

root@243c32535da7:/#

注意: 如果从这个 stdin 中 exit,会导致容器的停止。

exec 命令

-i -t 参数

docker exec 后边可以跟多个参数,这里主要说明 -i -t 参数。

只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。

当 -i -t 参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。

$ docker run -dit ubuntu

69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6

$ docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

69d137adef7a ubuntu:latest "/bin/bash" 18 seconds ago Up 17seconds zealous_swirles

$ docker exec -i 69d1 bash

ls
bin
boot
dev
...

$ docker exec -it 69d1 bash

root@69d137adef7a:/#

如果从这个 stdin 中 exit,不会导致容器的停止。这就是为什么推荐大家使用 docker
exec 的原因。

更多参数说明可使用 docker exec --help 查看

导出和导入容器

导出容器

如果要导出本地某个容器,可以使用 docker export 命令。

$ docker container ls -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited(0) 21 hours ago test

$ docker export 7691a814370e > ubuntu.tar

这样将导出容器快照到本地文件。

导入容器快照

可以使用 docker import 从容器快照文件中再导入为镜像,例如

$ cat ubuntu.tar | docker import - test/ubuntu:v1.0

$ docker image ls

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3MB

此外,也可以通过指定 URL 或者某个目录来导入,例如

$ docker import http://example.com/exampleimage.tgz example/imagerepo

注:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

删除容器

可以使用 docker container rm 来删除一个处于终止状态的容器。例如

$ docker container rm trusting_newton
trusting_newton

如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。

清理所有处于终止状态的容器

用 docker container ls -a 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。

$ docker container prune

登录

可以通过执行 docker login 命令交互式的输入用户名及密码来完成在命令行界面登录Docker Hub。

你可以通过 docker logout 退出登录。

拉取镜像

docker search

查找关键字,如docker search oracle查找关于oracle的镜像

最后的official用来标注是否为官方镜像,STARS表示受欢迎程度

docker search oracle
NAME                                  DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
oraclelinux                           Official Docker builds of Oracle Linux.         694                 [OK]          
jaspeen/oracle-11g                    Docker image for Oracle 11g database            167                                     [OK]
oracleinanutshell/oracle-xe-11g                                                       118                               
oracle/graalvm-ce                     GraalVM Community Edition Official Image        80                                      [OK]
docker pull 镜像名:tag标签 

默认为latest,如果没有对应的标签,则可能报如下错误:

docker pull oraclelinux
Using default tag: latest
Error response from daemon: manifest for oraclelinux:latest not found: manifest unknown: manifest unknown

我们可以这样通过加入对应tag进行下载,如:docker pull oraclelinux:7,具体的tag可以在docker hub上进行查看。

docker pull oraclelinux:7
7: Pulling from library/oraclelinux
Image docker.io/library/oraclelinux:7 uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
1eba0f765202: Pull complete                                                                                Digest: sha256:5fa581b74cb824d06ce938b73242fc16ebdbf6da037f7b180e121408d773eccf
Status: Downloaded newer image for oraclelinux:7
docker.io/library/oraclelinux:7

根据是否是官方提供,可将镜像资源分为两类。

一种是类似 oracle 这样的镜像,被称为基础镜像或根镜像。这些基础镜像由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。

还有一种类型,比如 jaspeen/oracle-11g 镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀。可以通过前缀 username/ 来指定使用某个用户提供的镜像,比如 jaspeen 用户。

另外,在查找的时候通过** --filter=stars=N **参数可以指定仅显示收藏数量为 N 以上的镜像。

推送镜像

用户也可以在登录后通过 docker push 命令来将自己的镜像推送到 Docker Hub。

以下命令中的 username 请替换为你的 Docker 账号用户名。

docker push username/ubuntu:17.10

自动创建

自动创建(Automated Builds)功能对于需要经常升级镜像内程序来说,十分方便。

有时候,用户创建了镜像,安装了某个软件,如果软件发布新版本则需要手动更新镜像。而自动创建允许用户通过 Docker Hub 指定跟踪一个目标网站(目前支持 GitHub 或 BitBucket)上的项目,一旦项目发生新的提交或者创建新的标签(tag),Docker Hub 会自动构建镜像并推送到 Docker Hub 中。

要配置自动创建,包括如下的步骤:

1.创建并登录 Docker Hub,以及目标网站;
2.在目标网站中连接帐户到 Docker Hub;
3.在 Docker Hub 中 配置一个自动创建;
4.选取一个目标网站中的项目(需要含 Dockerfile )和分支;
5.指定 Dockerfile 的位置,并提交创建。

之后,可以在 Docker Hub 的 自动创建页面 中跟踪每次创建的状态。

私有仓库

安装运行 docker-registry

可以通过获取官方 registry 镜像来运行。

$ docker run -d -p 5000:5000 --restart=always --name registry registry

默认情况下,仓库会被创建在容器的/var/lib/registry 目录下。你可以通过 -v 参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 /opt/data/registry 目录。

$ docker run -d \

    -p 5000:5000 \

    -v /opt/data/registry:/var/lib/registry \

    registry

在私有仓库上传、搜索、下载镜像

创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后推送它到仓库。例如私有仓库地址为 127.0.0.1:5000 。

格式为

docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

如:

docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest

再使用使用 docker push 上传标记的镜像。

docker push 127.0.0.1:5000/ubuntu:latest

用 curl 查看仓库中的镜像。

$ curl 127.0.0.1:5000/v2/_catalog
{"repositories":["ubuntu"]}

这里可以看到 {“repositories”:[“ubuntu”]} ,表明镜像已经被成功上传了。先删除已有镜像,再尝试从私有仓库中下载这个镜像。

注意事项

如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.199.100:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者查看下一节配置能够通过 HTTPS 访问的私有仓库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值