Docker -- 系统整洁之道 -- 1

在上文Docker – 系统整洁之道 – 0中已经对Docker是什么,安装Docker以及怎么运行一个简单的容器有了初步了解,这篇文章介绍Docker的一些命令和Docker镜像的使用及操作。

一些Docker命令



Docker的命令按照使用一个容器的顺序进行。

docker info 查看Docker的信息

~  docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 8
Server Version: 1.12.1
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
...

能查看到docker信息,说明docker是安装好的。

docker run 运行一个容器

~  docker run -it ubuntu
root@8eac2e6cf194:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@8eac2e6cf194:/#

由于在上文中已经运行过一次该条命令,所以ubuntu的镜像已经下载到了本地,此次运行就可以使用该镜像产生一个容器,在容器启动后,上过-it获取到命令行,运行命令ls

使用–name标志可以给容器定义一个名字,如
docker run –name this_is_first_ubunt_container -it ubuntu
就会创建一个名字叫做this_is_first_ubunt_container的ubuntu的容器。名字只能使用大小写字母,数字,下划线,原点和横线,即[a-zA-Z0-9_.-]。

关于docker run的帮助可以使用docker run --help获取。

docker ps 列出所有的容器

~  docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8eac2e6cf194        ubuntu              "/bin/bash"         5 minutes ago       Up 5 minutes                            modest_davinci

使用docker ps命令可以看到当前正在运行的容器有哪些,并给出了一些相应的属性。给命令增加参数-a就可以获取当前所有的容器,包括已经停止的,如下。

~  docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
4d0cc9a960f1        hello-world         "/hello"            About a minute ago   Exited (0) About a minute ago                       small_roentgen
8eac2e6cf194        ubuntu              "/bin/bash"         4 minutes ago        Up 4 minutes                                        modest_davinci

docker ps -n x,显示最后x个容器,不管容器正在运行还是停止。

docker start 重新启动已经停止的容器

docker start
docker start this_is_first_ubunt_container

docker attatch 附着容器

docker attach this_is_first_ubunt_container

docker stop 停止一个容器

~  docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
4d0cc9a960f1        hello-world         "/hello"            4 minutes ago       Exited (0) 4 minutes ago                       small_roentgen
8eac2e6cf194        ubuntu              "/bin/bash"         8 minutes ago       Up 8 minutes                                   modest_davinci
~  docker stop 8eac2e6cf194
8eac2e6cf194
~  docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
4d0cc9a960f1        hello-world         "/hello"            4 minutes ago       Exited (0) 4 minutes ago                       small_roentgen
8eac2e6cf194        ubuntu              "/bin/bash"         8 minutes ago       Exited (0) 5 seconds ago                       modest_davinci

前几个命令整体练习

创建一个有名字的container,停止它,启动它。

~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
03248ab5d03b        tomcat:latest       "catalina.sh run"   2 days ago          Exited (0) 2 days ago                       tomcat
4d0cc9a960f1        hello-world         "/hello"            4 days ago          Exited (0) 4 days ago
~ docker run --name this_is_first_ubunt_container -it ubuntu
root@894b1f0fa739:/# whoami
root
root@894b1f0fa739:/# exit
exit
~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
894b1f0fa739        ubuntu              "/bin/bash"         21 seconds ago      Exited (0) 14 seconds ago                       this_is_first_ubunt_container
03248ab5d03b        tomcat:latest       "catalina.sh run"   2 days ago          Exited (0) 2 days ago                           tomcat
4d0cc9a960f1        hello-world         "/hello"            4 days ago          Exited (0) 4 days ago                           small_roentgen
~ docker start 894b1f0fa739
894b1f0fa739
~ docker attach 894b1f0fa739
root@894b1f0fa739:/# whoami
root
root@894b1f0fa739:/# exit
exit
~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                     PORTS               NAMES
894b1f0fa739        ubuntu              "/bin/bash"         About a minute ago   Exited (0) 8 seconds ago                       this_is_first_ubunt_container
03248ab5d03b        tomcat:latest       "catalina.sh run"   2 days ago           Exited (0) 2 days ago                          tomcat
4d0cc9a960f1        hello-world         "/hello"            4 days ago           Exited (0) 4 days ago                          small_roentgen
~ docker start this_is_first_ubunt_container
this_is_first_ubunt_container
~ docker attach this_is_first_ubunt_container
root@894b1f0fa739:/# whoami
root
root@894b1f0fa739:/# exit
exit

守护式容器

上面创建的ubuntu是交互式运行的容器(interactive container),也可以创建一个长期运行的容器–守护式容器(daemonized container)。

~ docker run --name daemon_ubuntu -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
e56ae29adaf1d27cf49e05bccda5a7214be458fecc2afb0ff7721f16af8e044c
~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
e56ae29adaf1        ubuntu              "/bin/sh -c 'while tr"   About a minute ago   Up About a minute                       daemon_ubuntu

docker logs 容器日志

~ docker logs daemon_ubuntu
hello world
hello world
hello world
hello world
...

~ docker logs --tail 0 -f daemon_ubuntu
hello world
hello world
hello world
hello world
hello world

docker top 容器进程

~ docker top daemon_ubuntu
PID                 USER                TIME                COMMAND
2792                root                0:00                /bin/sh -c while true;do echo hello world;sleep 1;done
3264                root                0:00                sleep 1

容器内运行进程

~ docker exec -d daemon_ubuntu touch /etc/new_config_file
~ docker exec -it daemon_ubuntu /bin/sh
# ls -l /etc | grep new
-rw-r--r-- 1 root root       0 Oct 13 02:21 new_config_file

docker inspect 容器详细信息

~  docker inspect daemon_ubuntu
# 获取容器运行状态
~  docker inspect --format='{{.State.Running}}' daemon_ubuntu
# 查看容器IP地址
~ docker inspect --format='{{.NetworkSettings.IPAddress}}' daemon_ubuntu

自动重启容器

docker run –restart=always –name daemon_ubuntu -d ubuntu /bin/sh -c “while true;do echo hello world;sleep 1;done”

–restart=always 无论容器的退出代码为何,都自动重启。
–restart=on-failure 当容器退出代码不为0时,自动重启。
–restart=on-failure:5 重启5次。

docker rm 删除容器

运行中的Docker容器是无法删除的。

# 删除所有容器
docker rm `docker ps -a -q`

Docker 镜像

docker images

Linux /var/lib/docker
Mac $HOME/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2

docker pull ubuntu:16.10 获取ubuntu仓库中tag为16.10的镜像。

docker pull -a ubuntu 获取ubuntu仓库中所有镜像。

docker images ubuntu 列出本地所有ubuntu仓库的镜像。

docker run 的时候如果没有指定镜像的版本,则拉取最新版本进行创建。

Docker Hub 中仓库分为两种,一种是用户仓库(user repository),这种是用户创建使用的的,命名方式为username/repositoryname,意义为用户名/仓库名;一种是顶层仓库(top-repository),由docker内部人员管理。

docker search 查找Docker Hub上公用可用镜像。

获取镜像时,格式其实可以看做 用户/仓库:标签。 由于很多仓库为官网所有,所有很多都变成了 仓库:标签,如上面写的 ubuntu:16.10,ubutnu仓库的tag为16.10的镜像。

构建镜像

docker commit
docker build 和 Dockerfile文件

一般来说,我们不是真正「创建」了一个镜像,而是基于一个已有的镜像,构建了一个新的镜像。

参考链接


  1. Docker 从入门到实践
  2. 第一本Docker书
  3. 一个比较详细的命令用法
时间: 2024-08-26 04:35:08

Docker -- 系统整洁之道 -- 1的相关文章

Docker -- 系统整洁之道 -- 0

在我的小 rmbp 256G的硬盘里,实在是装不下100多个G的虚拟机了,所以想把一些东西迁移到这两年很火的Docker下,Docker以前也有过一两次,只是按着别人给的用法用的,具体的一些细节并没有深入,和git一样,这么牛掰的东西怎么能不好好学一些呢? Docker和虚拟机的区别 Docker是一种容器,虚拟机是一种管理程序虚拟机化(hypervisor virtualization,HV).管理程序虚拟化通过中间层将一台或者多台独立的机器虚拟运行在物理硬件之上,而容器(比如Docker)则

代码整洁之道

现在的软件系统开发难度主要在于其复杂度和规模,客户需求也不再像Winston Royce瀑布模型期望那样在系统编码前完成所有的设计满足用户软件需求.在这个信息爆炸技术日新月异的时代,需求总是在不停的变化,随之在2001年业界17位大牛聚集在美国犹他州的滑雪胜地雪鸟(Snowbird)雪场,提出了"Agile"(敏捷)软件开发价值观,并在他们的努力推动下,开始在业界流行起来.在<代码整洁之道>(Clean Code),提出一种软件质量,可持续开发不仅在于项目架构设计,还与代码

《代码整洁之道》目录—导读

版权声明 代码整洁之道 Authorized translation from the English language edition, entitled Clean Code: A Handbook of Agile Software Craftsmanship, 9780132350884 by Robert C. Martin, published by Pearson Education, Inc, publishing as Prentice Hall, Copyright 2009

整洁之道 如何让代码更明确、简单、有力

中介交易 SEO诊断 淘宝客 云主机 技术大厅 这篇文章摘录自<代码整洁之道>第一章,这本书被看作是程序员必读的书籍之一.但好的书不只是交给你工具.技术,更多是思维过程,近乎禅学.至理,这本书符合这样的定义.本章技术元素最少,适合每一个领域的人阅读. 阅读本书有两种原因:第一,你是个程序员;第二,你想成为更好的程序员.很好.我们需要更好的程序员. 这是本有关编写好程序的书.它充斥着代码.我们要从各个方向来考察这些代码.从顶向下,从底往上,从里而外.读完后,就能知道许多关于代码的事了.而且,我们

读代码整洁之道

      现在的软件系统开发难度主要在于其复杂度和规模,客户需求也不再像Winston Royce瀑布模型期望那样在系统编码前完成所有的设计满足用户软件需求.在这个信息爆炸技术日新月异的时代,需求总是在不停的变化,随之在2001年业界17位大牛聚集在美国犹他州的滑雪胜地雪鸟(Snowbird)雪场,提出了"Agile"(敏捷)软件开发价值观,并在他们的努力推动下,开始在业界流行起来.在<代码整洁之道>(Clean Code),提出一种软件质量,可持续开发不仅在于项目架构设

《代码整洁之道》—第13章13.1节为什么要并发

第13章 并发编程代码整洁之道Brett L.Schuchert "对象是过程的抽象.线程是调度的抽象."--James O Coplien[1] 编写整洁的并发程序很难--非常难.编写在单线程中执行的代码简单得多.编写表面上看来不错.深入进去却支离破碎的多线程代码也简单.系统一旦遭受压力,这种代码就扛不住了. 本章将讨论并发编程的需求及其困难之处,并给出一些对付这些难点.编写整洁的并发代码的建议.最后,我们将讨论与测试并发代码有关的问题. 整洁的并发编程是个复杂话题,值得用一整本书来

《代码整洁之道》—第1章1.1节要有代码

第1章 整洁代码代码整洁之道 阅读本书有两种原因:第一,你是个程序员:第二,你想成为更好的程序员.很好.我们需要更好的程序员. 这是本有关编写好程序的书.它充斥着代码.我们要从各个方向来考察这些代码.从顶向下,从底往上,从里而外.读完后,就能知道许多关于代码的事了.而且,我们还能说出好代码和糟糕的代码之间的差异.我们将了解到如何写出好代码.我们也会知道,如何将糟糕的代码改成好代码. 1.1 要有代码有人也许会以为,关于代码的书有点儿落后于时代--代码不再是问题:我们应当关注模型和需求.确实,有人

Java 不可变类的整洁之道

本文讲的是Java 不可变类的整洁之道, 当一个普通类 (class) 的实例不能被修改时,我们便称之为「不可变类」(immutable class).这样的类在实例化时便需要提供其所有的值,而在之后的运行中便绝不可更改.比如大家可能都知道的 Java 中已有的一些不可变类型,String (string 的字符串联很没效率,对吧), BigInteger, 和 BigDecimal_. 设计一个不可变类有如下的好处: 更简明的设计.实现.和使用 更不容易出错 更安全,因此可以轻松分享 线程安全

《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——02-03项目生命周期五大阶段

02-03项目生命周期五大阶段 嵌入式系统开发之道--菜鸟成长日志与项目经理的私房菜 我们前面讲过项目的定义,特别谈到每件项目都是独一无二的,都有各自的目标.可应用的资源.必须面对的限制与风险等.但所谓的知识体系就是要设法异中求同,通过分析与比较足够数量且不同种类的案例,试图归纳出适用于所有项目的思想与方法. 这么做并不牵强,因为不同项目间确实具有共同的特性,可以使用相同的思想与方法论来执行,就如同我们的本行-嵌入式系统与电子产品开发,如果不能在不同的项目间秉持共通的概念,工程人员免不了要多走很