Docker相关

Docker的学习总结一:Docker简介、安装和常用命令

2019-03-05  本文已影响0人  奔向算法的喵

本小节总结以下的几点

一、容器技术和Docker的简介

虚拟机与容器的对比总结如下所示:

1 2 3
运行性能 几乎无额外性能损失 操作系统额外的CPU、内存消耗
移植性 轻便、灵活、适应于LInux 笨重,与虚拟化技术耦合度高
硬件亲和性 面向软件开发者 面向硬件运维者

二、Docker的安装

2.1、docker的基本组成和架构

安装之前,我们来先看看docker的三大核心部分,如下:


Docker的三大核心

Docker的基本组成是由镜像(image)、容器(container)和仓库(repository)组成。

然后我们在看看docker的架构图,如下:

容器架构图

在这里,Client就是我们的docker的客户端,然后Host就是我们的系统,可以看出我们的系统里面有多个镜像,镜像的实例就是我们的容器。我们的host可以从远端的仓库拉镜像下来。

2.2、Docker的安装
Docker的安装来说就显得挺简单了。跟着官网来就行了,这里给大家几个链接去安装就行了

三、Docker的常用命令

下面的思维导图简要的总结了一下我们常用的docker命令:


Docker常用命令思维导图
3.1、帮助命令

帮助命令主要有三个:docker version、docker info、docker --help
要是有些命令记不住了,可以直接docker --help一下,看看各个命令的意义。这里就不记这三个命令的使用了。

3.2、镜像命令

(1)docker images

☁  ~  docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE`

由于我的电脑上面没有任何的镜像的存在,所以就是空的。下面我们拉一个hello-world下来看看:

☁  ~  docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

拉取完了hello-world之后,我们再采用docker images看看

☁  ~  docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        2 months ago        1.84kB

这里的标签说明:
REPOSITORY :镜像的仓库源
TAG:镜像的标签,latest表示是最新的版本。
IMAGE ID :镜像的ID
CREATED:镜像的创建时间
SIZE:镜像的大小
同一个仓库源可以有很多个TAG,代表它有很多个不同的版本。采用REPOSITORY: TAG的形式来定义不同的镜像。如果看不到镜像名后面的标签,那么就是默认为镜像名:latest
前面的思维导图里面已经看到了-a、-q、--no-trunc的作用:

☁  ~  docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        2 months ago        1.84kB
☁  ~  docker images -q
fce289e99eb9
☁  ~  docker images -aq
fce289e99eb9
☁  ~  docker images --no-trunc
REPOSITORY          TAG                 IMAGE ID                                                                  CREATED             SIZE
hello-world         latest              sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e   2 months ago        1.84kB

这里我们可以结合a和q,拿到所有镜像的id,然后实现一个删除的操作。

(2)docker search
docker search 镜像名 ---> 可以去docker hub上面寻找镜像,我们可以看到搜索centos的话,就有很多的镜像了,有描述、点赞数、是不是官方的。

☁  ~  docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5227                [OK]
ansible/centos7-ansible            Ansible on Centos7                              120                                     [OK]
jdeathe/centos-ssh                 CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86…   107                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session…   81                                      [OK]
imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              50                                      [OK]
centos/mysql-57-centos7            MySQL 5.7 SQL database server                   47
tutum/centos                       Simple CentOS docker image with SSH access      43
gluster/gluster-centos             Official GlusterFS Image [ CentOS-7 +  Glust…   40                                      [OK]
openshift/base-centos7             A Centos7 derived base image for Source-To-I…   39
centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relational …   37
centos/python-35-centos7           Platform for building and running Python 3.5…   33
kinogmt/centos-ssh                 CentOS with SSH                                 26                                      [OK]
centos/httpd-24-centos7            Platform for running Apache httpd 2.4 or bui…   21
openshift/jenkins-2-centos7        A Centos7 based Jenkins v2.x image for use w…   20
centos/php-56-centos7              Platform for building and running PHP 5.6 ap…   19
pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag names…   10
openshift/wildfly-101-centos7      A Centos7 based WildFly v10.1 image for use …   6
openshift/jenkins-1-centos7        DEPRECATED: A Centos7 based Jenkins v1.x ima…   4
darksheer/centos                   Base Centos Image -- Updated hourly             3                                       [OK]
pivotaldata/centos-mingw           Using the mingw toolchain to cross-compile t…   2
pivotaldata/centos                 Base centos, freshened up a little with a Do…   2
pivotaldata/centos-gcc-toolchain   CentOS with a toolchain, but unaffiliated wi…   1
blacklabelops/centos               CentOS Base Image! Built and Updates Daily!     1                                       [OK]
openshift/wildfly-81-centos7       A Centos7 based WildFly v8.1 image for use w…   1
smartentry/centos                  centos with smartentry                          0                                       [OK]

有的时候,docker search的个数太多,所以我们可以选择过滤一下,也就是思维导图里面的加上-s来列出收藏数不小于指定值的镜像

☁  ~  docker search -s 100 centos
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                    The official build of CentOS.                   5227                [OK]
ansible/centos7-ansible   Ansible on Centos7                              120                                     [OK]
jdeathe/centos-ssh        CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86…   107                                     [OK]

(3)docker pull
docker pull centos等价于docker pull centos:latest,默认拉取的就是centos最新版本的镜像。

☁  ~  docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a02a4930cb5d: Pull complete
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:latest

(4)docker rmi
因为是删除镜像,所以是接rmi。这里需要注意的是要是镜像的一个容器正在使用中的话,采用docker rmi 镜像名来删除的话,是行不通的。需要采用docker rmi -f 镜像名的方式来强制删除这个镜像。

### 这个之前运行了docker run hello-world这个命令
☁  ~  docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container b2b8498f9086 is using its referenced image fce289e99eb9

在上面的命令基础上面加上f之后,就顺利删除掉了

☁  ~  docker rmi -f hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e

删除之后就不见hell-world镜像了。

☁  ~  docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              latest              dd6ff929584a        12 hours ago        463MB
centos              latest              1e1148e4cc2c        3 months ago        202MB

然后我们来删除全部的images,:docker rmi -f $(docker images -aq),这里就利用到了我们前面的aq命令了。

☁  ~  docker rmi -f $(docker images -aq)

3.3、容器命令
Docker利用容器独立运行一个多着多个应用,容器就是镜像创建的一个实例了。它可以被启动、开始、停止和删除。而且每一个容器都是相互隔离开来的,保证安全你的平台。

(1)新建并启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
参数options:
--name="容器新名字": 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
      ip:hostPort:containerPort
      ip::containerPort
      hostPort:containerPort
      containerPort

使用镜像centos:latest以交互模式启动一个容器。这样操作就进入了容器centos了,然后我们可以看见我们处在了当前的根目录下面。

☁  ~  docker run -it centos
[root@a5874f60f4a8 /]# pwd
/
[root@a5874f60f4a8 /]#

然后我们可以看看docker容器里面的状态,

[root@35cd9cdd095b /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:43 pts/0    00:00:00 /bin/bash
root        16     1  0 08:43 pts/0    00:00:00 ps -ef

(2) docker ps [options]
列出我们当前正在运行的容器的命令。

-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
--no-trunc :不截断输出。

直接用docker ps就能看到当前正在运行的容器

☁  ~  docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a5874f60f4a8        centos              "/bin/bash"         3 minutes ago       Up 3 minutes                            dreamy_goldberg
☁  ~  docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
35cd9cdd095b        centos              "/bin/bash"         3 minutes ago       Up 3 minutes                                    clever_mclean
30d1fa5ccf3a        hello-world         "/hello"            17 minutes ago      Exited (0) 17 minutes ago                       inspiring_chandrasekhar
☁  ~  docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
35cd9cdd095b        centos              "/bin/bash"         3 minutes ago       Up 3 minutes                            clever_mclean
☁  ~  docker ps -q
35cd9cdd095b
☁  ~  docker ps --no-trunc
CONTAINER ID                                                       IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
35cd9cdd095bc42175c3b9977e95810d8a9edbfd4e4954cd56d05122ab5b610a   centos              "/bin/bash"         4 minutes ago       Up 4 minutes                            clever_mclean

(3)容器退出的两种方式
1、exit:容器停止并退出,这样去docker ps查看的时候,就没有当前运行的容器信息。
2、ctrl+P+Q:就是保持容器不停止,但是我们也退出了。
(4)容器的启动、重启、停止、强制停止以及删除容器
启动: docker start 容器ID或者容器名

  ~  docker start 35cd9cdd095b
35cd9cdd095b
☁  ~  docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
35cd9cdd095b        centos              "/bin/bash"         15 minutes ago      Up 10 seconds                           clever_mclean

停止:docker stop 容器ID或者容器名

☁  ~  docker stop 35cd9cdd095b
35cd9cdd095b
 ☁  ~   docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

注意一下这里stop是温柔的停止,然后kill是暴力的停止。
我们已经有很多个容器了,那么我们也可以对容器进行一个删除的操作
删除容器:docker rm 容器ID或者容器名。
一次性删除多个容器:docker rm -f $(docker ps -aq)或者 docker ps -aq | xargs docker rm

☁  ~  docker rm -f $(docker ps -aq)
35cd9cdd095b
30d1fa5ccf3a

(5)重要的一些命令

☁  ~  docker run -d centos
abab374ce58fd473044ad0bbca4a39d21cea323fd32cd2844364a6a09b72812b
☁  ~  docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

在这里,我们看到了我们采用了启动守护式容器的方式进行运行了之后,但是docker ps并没有发现运行了。为什么会这样呢?
因为Docker容器后台运行,就必须有一个前台进程.容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start。但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,

docker run -d centos /bin/sh -c 'while true;do echo hello bear;sleep 2;done'
☁  ~  docker run -d centos /bin/sh -c 'while true;do echo hello bear;sleep 2;done'

0bdad01a4f53f860615932d1ecf57672f4ed4a5e6f9ef569b6adb4b476f719fa
☁  ~  docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
0bdad01a4f53        centos              "/bin/sh -c 'while t…"   11 seconds ago      Up 10 seconds                           hardcore_jennings

docker logs + 容器id ---->查看日志

☁  ~  docker logs 0bdad01a4f53
hello bear
hello bear
hello bear
hello bear
hello bear
hello bear
hello bear
hello bear
hello bear

docker logs -t + 容器id ---->查看日志,加上了时间戳

☁  ~  docker logs -t 0bdad01a4f53
2019-03-06T01:50:28.701813500Z hello bear
2019-03-06T01:50:30.711125000Z hello bear
2019-03-06T01:50:32.715700300Z hello bear
2019-03-06T01:50:34.716762300Z hello bear
2019-03-06T01:50:36.720626500Z hello bear
2019-03-06T01:50:38.723566900Z hello bear
2019-03-06T01:50:40.691119800Z hello bear
2019-03-06T01:50:42.693349700Z hello bear
2019-03-06T01:50:44.695585100Z hello bear
2019-03-06T01:50:46.698940300Z hello bear
2019-03-06T01:50:48.701926000Z hello bear

-t -f 就是不停的追加,因为是每两秒钟打印一下。因为太多了,看着有点蛋疼,所以我们就需要看后面的三行了,这里就用到了--tail+我们要看的行数了

☁  ~  docker logs -t -f --tail 3 0bdad01a4f53
2019-03-06T01:53:38.848574200Z hello bear
2019-03-06T01:53:40.855578300Z hello bear
2019-03-06T01:53:42.857704300Z hello bear
2019-03-06T01:53:44.861998600Z hello bear
2019-03-06T01:53:46.866374400Z hello bear
2019-03-06T01:53:48.871097600Z hello bear
2019-03-06T01:53:50.875416000Z hello bear
2019-03-06T01:53:52.877975100Z hello bear

感觉这个和linux里面的命令差不多

☁  ~  docker top b9d40b1f1c37
PID                 USER                TIME                COMMAND
3160                root                0:00                /bin/sh -c while true;do echo hello bear;sleep 2;done
3328                root                0:00                sleep 2
  ~  docker run -it centos
[root@583aeaf26957 /]# %                                                                                                                                                          ☁  ~  docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
583aeaf26957        centos              "/bin/bash"         22 seconds ago      Up 21 seconds                           heuristic_banzai

进入到容器中:docker attach 容器ID

☁  ~  docker attach 583aeaf26957
[root@583aeaf26957 /]#

Exec是另外一种方式了。意思就是进入到容器,然后执行后面的一个命令,这个好处就是不用交互式的进去。

☁  ~  docker exec -t 583aeaf26957 ls -l /tmp
total 4
-rwx------ 1 root root 836 Mar  5 17:36 ks-script-eC059Y
-rw------- 1 root root   0 Mar  5 17:34 yum.log

总结,这一部分就简单的介绍了一下Docker、Docker的安装和Docker的常用命令,喜欢的小伙伴,就点个赞哈。

持续更新中...

参考资料:
1、https://www.docker.com/
2、https://www.bilibili.com/video/av17854410?from=search&seid=2496603295204351706

上一篇 下一篇

猜你喜欢

热点阅读