Ubuntu 16.04上Docker使用手记

一、Docker Hub的使用

Docker Hub是Docker官方维护的仓库,里面已经包含了很多的镜像,一般我们的需求直接在官方仓库搜索就可以得到解决。在官方的公共仓库中我们无需登录就可以进行镜像的搜索和下载。

docker search命令进行搜索

docker pull命令进行下载

搜索镜像命令详细用法: docker search [OPTIONS] TERM

[email protected]:~# sudo docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
af49a5ceb2a5: Pull complete
8f9757b472e7: Pull complete
e931b117db38: Pull complete
47b5e16c0811: Pull complete
9332eaf1a55b: Pull complete
Digest: sha256:3b64c309deae7ab0f7dbdd42b6b326261ccd6261da5d88396439353162703fb5
Status: Downloaded newer image for ubuntu:latest

完成后,即可随时使用该镜像了,例如创建一个容器,让其中运行 bash 应用。

$ sudo docker run -t -i ubuntu /bin/bash
[email protected]:/#

docker images 列出镜像

$ sudo docker images
REPOSITORY       TAG      IMAGE ID      CREATED      VIRTUAL SIZE
ubuntu           latest   99ec81b80c55  4 weeks ago  266 MB

在列出信息中,可以看到几个字段信息

  • 来自于哪个仓库,比如 ubuntu
  • 镜像的标记,比如 14.04
  • 它的 ID 号(唯一)
  • 创建时间
  • 镜像大小

其中镜像的 ID 唯一标识了镜像,注意到 ubuntu:14.04 和 ubuntu:trusty 具有相同的镜像 ID,说明它们实际上是同一镜像。

TAG 信息用来标记来自同一个仓库的不同镜像。例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本,例如 10.0412.0412.1013.0414.04 等。例如下面的命令指定使用镜像 ubuntu:14.04 来启动一个容器。

$ sudo docker run -t -i ubuntu /bin/bash

如果不指定具体的标记,则默认使用 latest 标记信息。

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              4ca3a192ff2a        2 weeks ago         128.2 MB

docker commit 命令来提交更新后的副本。

$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。

使用 docker images 来查看新创建的镜像。

$ sudo docker images
REPOSITORY          TAG     IMAGE ID       CREATED       VIRTUAL SIZE
ubuntu              latest   99ec81b80c55  4 weeks ago   266 MB
ouruser/sinatra     v2      3c59e02ddd1a   10 hours ago  446.7 MB

之后,可以使用新的镜像来启动容器

$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
[email protected]:/#

docker save 和docker load  导入导出镜像

如果要导出镜像到本地文件,可以使用 docker save 命令。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              c4ff7513909d        5 weeks ago         225.4 MB
...
$sudo docker save -o ubuntu.tar ubuntu

可以使用 docker load 从导出的本地文件中再导入到本地镜像库,例如

$ sudo docker load --input ubuntu.tar

$ sudo docker load < ubuntu.tar

这将导入镜像以及其相关的元数据信息(包括标签等)。

docker rmi 移除镜像

$ sudo docker rmi ouruser/sinatra:v2
Untagged: ouruser/sinatra:v2
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0

*注意:在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器。

5.Docker命令之容器(container)篇

docker run 启动容器

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

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

新建并启动

所需要的命令主要为 docker run

例如,下面的命令输出一个 “Hello World”,之后终止容器。

$ sudo docker run ubuntu /bin/echo ‘Hello world‘
Hello world

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

下面的命令则启动一个 bash 终端,允许用户进行交互。

$ sudo docker run -t -i ubuntu /bin/bash
[email protected]:/#

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

在交互模式下,用户可以通过所创建的终端来输入命令,例如

[email protected]:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 -d 参数来实现。

例如下面的命令会在后台运行容器。

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

容器启动后会返回一个唯一的 id,也可以通过 docker ps 命令来查看容器信息。

$ sudo docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
1e5535038e28  ubuntu        /bin/sh -c ‘while tr  2 minutes ago  Up 1 minute        insane_babbage

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

$ sudo docker logs insane_babbage
hello world
hello world
hello world
. . .

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

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

启动已终止容器

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

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

[email protected]:/# ps
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
   11 ?        00:00:00 ps

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

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

此外,当Docker容器中指定的应用终结时,容器也自动终止。 例如对于上一章节中只启动了一个终端的容器,用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器立刻终止。

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

sudo docker ps -a
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS                          PORTSNAMES
ba267838cc1b        ubuntu                   "/bin/bash"            30 minutes ago      Exited (0) About a minute ago   trusting_newton
1e5535038e28        ubuntu                    /bin/sh -c ‘while tr  2 minutes ago       Up 1 minute                     insane_babbage

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

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

在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach 命令或 nsenter 工具等。

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

$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia
$sudo docker attach nostalgic_hypatia
[email protected]:/#

上文已给出实例。

docker import 和docker export  导入、导出容器

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

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
7691a814370e        ubuntu:14.04        "/bin/bash"         36 hours ago        Exited (0) 21 hours ago                       test
$ sudo docker export 7691a814370e > ubuntu.tar

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

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

$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
test/ubuntu         v1.0                9d37a6082e97        About a minute ago   171.3 MB

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

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

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

删除容器

docker rm 来删除一个处于终止状态的容器。 例如

$sudo docker rm  trusting_newton
trusting_newton

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

更多命令可在终端输入docker --help 查看。

时间: 2024-10-13 15:15:36

Ubuntu 16.04上Docker使用手记的相关文章

(译)综合指南:通过Ubuntu 16.04上从Source构建来安装支持GPU的Caffe2

(译)综合指南:通过Ubuntu 16.04上从Source构建来安装支持GPU的Caffe2 译者注: 原文来自:https://tech.amikelive.com/node-706/comprehensive-guide-installing-caffe2-with-gpu-support-by-building-from-source-on-ubuntu-16-04/?tdsourcetag=s_pctim_aiomsg, 不得不说该文作者知识比较丰富,研究比较深入,环境的配置讲解比较详

ubuntu 16.04利用docker搭建java+tomcat+nginx反向代理/动静分离

ubuntu 16.04利用docker搭建java+tomcat+nginx反向代理 新建两个docker容器 docker run -it --name Tomcat-mysql -v /mnt:/mnt -p 8866:80 -p 33006:3306 ubuntu /bin/bash docker run -itd --name webserver -p 8888:80 -v /mnt/:/mnt/ ubuntu /bin/bash [email protected]:~# docker

Ubuntu 16.04 安装 Docker

Ubuntu 16.04 安装 docker 是一件很麻烦的事情,但鉴于 docker 的各种优点,还是忍了.参考docker官网. 1.选择国内的云服务商,这里选择阿里云为例 curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh - 2.安装所需要的包 sudo apt-get install linux-image-extra-$(uname -r) linux-

在Ubuntu 16.04上用sytemd启动OpenVPN Client的正确方式

Ubuntu 16.04默认使用systemd管理服务的启动.停止.重新启动和状态查看等.由于之前用习惯了sysv的服务管理方式,用sytemd还很不习惯,有很多不甚了了地方.今天中午准备在Ubuntu 16.04上部署一套OpenVPN用于远程管理阿里云的十几台Linux主机,期间遇到了一个关于systemd的问题,在此记录一下,供需要者查看和了解. systemd所管理的服务通常位于:/lib/systemd/system/,如果细心的话会发现有些xxx.service中有带"@"

Ubuntu 16.04上安装SkyEye及测试

说明一下,在Ubuntu 16.04上安装SkyEye方法不是原创,是来自互联网,仅供学习参考. 1.检查支持软件包 gcc,make,vim(optional),ssh,subversionbinutils-dev (bfd)atk-dev (libatk1.0-dev)gtk+-2.0-dev (libgtk2.0-dev)pkg-configpango-dev (libpango1.0-dev)freetype2-dev (libfreetype6-dev)glib-dev (libgli

使用 Nginx 在 Ubuntu 16.04 上托管 ASP.NET Core

使用 Nginx 在 Ubuntu 16.04 上托管 ASP.NET Core 准备工作 服务器主机:腾讯云主机 Ubuntu 16.04 64位 客户端软件:putty.exe; WinSCP 5.13.2 在 Ubuntu 中安装 ASP.NET Core 微软在 .NET Core指南 提供了在不同操作系统中安装运行 ASP.NET Core 的帮助文档,请选择 linux-prerequisites 部分,并找到和自己服务器所安装操作系统相同的内容进行安装即可. 注册Microsoft

在Ubuntu 16.04上安装Joomla系统

Joomla !是一个流行的内容管理系统(CMS),它是仅次于Wordpress的第二大流行的CMS.到2017年,约有3.3%的网站使用Joomla !作为他们的CMS.本文介绍了如何在Ubuntu 16.04上一键安装Joomla ! 步骤1:安装Apache更新存储库列表.apt-get update安装Apache web服务器.apt-get install apache2使用 LAMP stack 一键安装包安装Joomla!,我们需要安装MySQL并将其链接到PHP.apt-get

在Ubuntu 16.04上安装Concrete5

介绍 Concrete5是用PHP编写的开源内容管理系统(CMS).它的设计是为了便于使用,并提供了一个允许用户直接从页面编辑内容的web界面.Concrete5可以安装在Ubuntu 16.04上实现一键安装. 先决条件 本教程假设您已经创建了一个新的Vultr云计算实例,运行Ubuntu 16.04,并有根访问权限. 步骤1:安装Apache.MySQL和PHP以及其他依赖项 Comcrete5在一键安装包上运行.您需要安装Apache.PHP.MySQL和许多其他必需的依赖项. apt-g

在Ubuntu 16.04上使用Apache安装phpBB

PhpBB是一个开源的公告板程序.本文将向您展示如何在Ubuntu 16.04上在Apache webserver上安装phpBB.它是使用phpBB 3.2.1编写的,但是这里提供的说明可能也适用于新版本的phpBB.先决条件本文假设您已经使用Ubuntu 16.04创建了一个Vultr云计算实例,并以root身份登录. 步骤1:安装Apache更新存储库列表.apt-get update安装Apache web服务器.apt-get install apache2步骤2:安装MySQLphp