Docker 详解及安装

一、简介

Docker是基于Go语言实现的云开源项目。主要目标是 “Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(Web应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”

Linux容器技术 的出现就解决了这样一个问题,而Docker就是在它的基础上发展过来的。将应用运行在Docker容器上面,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机器上就可以一键部署好,大大简化了操作。一句话解释:Docker解决了运行环境和配置软件容器(软件容器:每一个容器也称为集装箱对应一个开发工具,多个容器对应多个开发软件),方便做持续集成并有助于整体发布的容器虚拟化技术。

为什么说Docker是秒级别启动的?我们简单了解一下,Docker使用的是一种虚拟化技术:Linux容器(Linux Containers,缩写为LXCLinux容器不是模拟一个完整的操作系统(Linux就是模拟一个完整的操作系统),而是对进程进行隔离。有了容器,就可以将软件运行所需要的所有资源进行打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都始终如一地运行。

【比较Docker与传统虚拟化方式的不同之处】:
 ● 传统虚拟化技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在此基础上运行所需的应用进程。
 ● 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器比传统虚拟机更为轻便。
 ● 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间的进程不会相互影响,能够区分计算资源。
在这里插入图片描述

二、Docker的基本组成

前提:目前,CentOS仅发行版本中的内核支持Docker
 ☛ Docker运行在CentOS7上,要求系统为64位、系统内核版本为3.10以上。
 ☛ Docker运行在CentOS-6.5或更高的版本的CentOS上,要求系统为64位、系统内核版本为2.6.32-431或者更高版本。
 ☛ 通过uname -r命令可以查看系统内核版本号,通过cat /etc/redhat-release 命令查看CentOS版本。

Docker 的架构图: Docker使用客户端-服务器C/S架构模式,使用远程API来管理和创建Docker容器。
【1】Docker 客户端(Client): Docker客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与Docker的守护进程通信。
【2】Docker 主机(Host): 一个物理或者虚拟的机器用于执行Docker守护进程和容器。

Docker 的基本组成:

【1】镜像(image):就是一个只读的模板。镜像可以用来创建 Docker容器,一个镜像可以创建多个容器。当运行容器时,使用的镜像如果在本地中不存在,docker就会自动从docker镜像仓库中下载,默认是从Docker Hub公共镜像源下载。

Docker面向对象
容器对象
镜像

镜像列表: 我们可以使用docker images来列出本地主机上的镜像

[root@zzx ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ccc6e87d482b        4 weeks ago         64.2MB
hello-world         latest              fce289e99eb9        13 months ago       1.84kB

 ■ REPOSITORY:表示镜像的仓库源
 ■ TAG:镜像的标签, 同一仓库源可以有多个TAG,代表这个仓库源的不同个版本
 ■ IMAGE ID:镜像ID
 ■ CREATED:镜像创建时间
 ■ SIZE:镜像大小

镜像查找: 使用docker search命令来搜索镜像

[root@zzx ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@zzx ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9132                [OK]
mariadb                           MariaDB is a community-developed fork of MyS…   3233                [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   676                                     [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   68
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   62
centurylink/mysql                 Image containing mysql. Optimized to be link…   61                                      [OK]
deitch/mysql-backup               REPLACED! Please use http://hub.docker.com/r…   41                                      [OK]
bitnami/mysql                     Bitnami MySQL Docker Image                      35                                      [OK]
tutum/mysql                       Base docker image to run a MySQL database se…   34
schickling/mysql-backup-s3        Backup MySQL to S3 (supports periodic backup…   29                                      [OK]
prom/mysqld-exporter                                                              26                                      [OK]
linuxserver/mysql                 A Mysql container, brought to you by LinuxSe…   24
centos/mysql-56-centos7           MySQL 5.6 SQL database server                   19
circleci/mysql                    MySQL is a widely used, open-source relation…   18
mysql/mysql-router                MySQL Router provides transparent routing be…   14
arey/mysql-client                 Run a MySQL client from a docker container      13                                      [OK]
databack/mysql-backup             Back up mysql databases to... anywhere!         10
openshift/mysql-55-centos7        DEPRECATED: A Centos7 based MySQL v5.5 image…   6
fradelg/mysql-cron-backup         MySQL/MariaDB database backup using cron tas…   5                                       [OK]
genschsa/mysql-employees          MySQL Employee Sample Database                  4                                       [OK]
devilbox/mysql                    Retagged MySQL, MariaDB and PerconaDB offici…   2
ansibleplaybookbundle/mysql-apb   An APB which deploys RHSCL MySQL                2                                       [OK]
jelastic/mysql                    An image of the MySQL database server mainta…   1
monasca/mysql-init                A minimal decoupled init container for mysql    0
widdpim/mysql-client              Dockerized MySQL Client (5.7) including Curl…   0                                       [OK]

 ■ NAME: 镜像仓库源的名称
 ■ DESCRIPTION: 镜像的描述
 ■ OFFICIAL: 是否docker官方发布
 ■ STARS: 类似Github里面的star,表示点赞、喜欢的意思
 ■ AUTOMATED: 自动构建

拉取镜像: 使用docker pull命令来拉取镜像

[root@zzx ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
619014d83c02: Pull complete
9ced578c3a5f: Pull complete
731f6e13d8ea: Pull complete
3c183de42679: Pull complete
6de69b5c2f3c: Pull complete
00f0a4086406: Pull complete
84d93aea836d: Pull complete
f18efbfd8d76: Pull complete
012b302865d1: Pull complete
fe16fd240f59: Pull complete
ca3e793e545e: Pull complete
51d0f2cb2610: Pull complete
Digest: sha256:6d0741319b6a2ae22c384a97f4bbee411b01e75f6284af0cce339fee83d7e314
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
[root@zzx ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              791b6e40940c        2 weeks ago         465MB
ubuntu              latest              ccc6e87d482b        4 weeks ago         64.2MB
hello-world         latest              fce289e99eb9        13 months ago       1.84kB

删除镜像: 使用docker rmdocker rmi命令来删除镜像。需要先删除container废除依赖,再删除镜像。

[root@zzx ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
1a51d2f023c9        ubuntu:latest       "/bin/sh -c 'while t…"   2 hours ago         Exited (137) 2 hours ago                       gifted_brown
414bf796cbe4        ubuntu:latest       "/bin/bash"              2 hours ago         Exited (0) 2 hours ago                         pedantic_galileo
512061ebfa4c        ubuntu:latest       "/bin/bash"              2 hours ago         Exited (0) 2 hours ago                         wizardly_brown
aa5e9ae5e5db        ubuntu:latest       "/bin/echo 'Hello wo…"   2 hours ago         Exited (0) 2 hours ago                         affectionate_knuth
c91b90b18884        hello-world         "/hello"                 3 hours ago         Exited (0) 3 hours ago                         admiring_pare
[root@zzx ~]# docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q )
[mysql:latest] sha256:791b6e40940cd550af522eb4ffe995226798204504fe495743445b900e417a51
[ubuntu:latest] sha256:ccc6e87d482b79dd1645affd958479139486e47191dfe7a997c862d89cd8b4c0
[hello-world:latest] sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e

[root@zzx ~]# docker rm c91b90b18884
c91b90b18884
[root@zzx ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
1a51d2f023c9        ubuntu:latest       "/bin/sh -c 'while t…"   2 hours ago         Exited (137) 2 hours ago                       gifted_brown
414bf796cbe4        ubuntu:latest       "/bin/bash"              2 hours ago         Exited (0) 2 hours ago                         pedantic_galileo
512061ebfa4c        ubuntu:latest       "/bin/bash"              2 hours ago         Exited (0) 2 hours ago                         wizardly_brown
aa5e9ae5e5db        ubuntu:latest       "/bin/echo 'Hello wo…"   2 hours ago         Exited (0) 2 hours ago                         affectionate_knuth

[root@zzx ~]# docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:9572f7cdcee8591948c2963463447a53466950b3fc15a247fcad1917ca215a2f
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3

更新镜像: 针对上述ubuntu的镜像,我们在里面安装一些软件,然后重新生成一个镜像。这就是更新重新commit出一个新的镜像。我们先跑一个ubuntu容器实例,同时在里面进行apt-get update更新

[root@zzx ~]# docker run -it ubuntu:latest
root@0a1556ca3c27:/# apt-get update
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:5 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [817 kB]
Get:6 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]
Get:7 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]
Get:8 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]
Get:9 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]
Get:10 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [27.5 kB]
Get:11 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [7064 B]
Get:12 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [818 kB]
Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [11.1 kB]
Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1345 kB]
Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [41.2 kB]
Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [1104 kB]
Get:17 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [4252 B]
Get:18 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [2496 B]
Fetched 17.6 MB in 10s (1759 kB/s)
Reading package lists... Done
root@0a1556ca3c27:/# exit
exit

此时ID0a1556ca3c27的容器,是按我们的需求更改的容器。我们可以通过命令docker commit来提交容器副本:

[root@zzx ~]# docker commit -m="update test" -a="zzx" 0a1556ca3c27  zzx/ubuntu:v1.0.1
sha256:b51e9f5f98cdb5b95c34181148ed7029f0150618aa8cd0e916b10b6aea1bd4c9

可以看到已经生成成功, 且镜像的大小不一样了:

[root@zzx ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zzx/ubuntu         v1.0.1              b51e9f5f98cd        5 seconds ago       92.1MB
mysql               latest              791b6e40940c        2 weeks ago         465MB
ubuntu              latest              ccc6e87d482b        4 weeks ago         64.2MB

生成镜像: 通过创建一个Dockerfile文件,其中包含一组指令来告诉Docker如何构建我们的镜像,最后使用命令docker build。具体参考Dockerfile

FROM    zzx/ubuntu:v1.0.1
MAINTAINER      zzx "zzx.tech"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd zzx
RUN     /bin/echo 'zzx:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

生成镜像: -t指定要创建的目标镜像名。·表示Dockerfile文件所在目录,可以指定Dockerfile的绝对路径

[root@zzx docker-test]# docker build -t zzx/ubuntu:v2.0.1 .
Sending build context to Docker daemon  2.048kB
Step 1/9 : FROM    zzx/ubuntu:v1.0.1
 ---> b51e9f5f98cd
Step 2/9 : MAINTAINER      zzx "zzx.tech"
 ---> Running in af026ee229ea
Removing intermediate container af026ee229ea
 ---> 0e961cb557c9
Step 3/9 : RUN     /bin/echo 'root:123456' |chpasswd
 ---> Running in 96bd9c40c55e
Removing intermediate container 96bd9c40c55e
 ---> 9e8549720043
Step 4/9 : RUN     useradd zzx
 ---> Running in 0117278f243c
Removing intermediate container 0117278f243c
 ---> 87c478df56da
Step 5/9 : RUN     /bin/echo 'zzx:123456' |chpasswd
 ---> Running in e0381eabe71a
Removing intermediate container e0381eabe71a
 ---> 84fd07f978ae
Step 6/9 : RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
 ---> Running in 8d0052d9921f
Removing intermediate container 8d0052d9921f
 ---> 3ed0b248224c
Step 7/9 : EXPOSE  22
 ---> Running in 4b5d540567cd
Removing intermediate container 4b5d540567cd
 ---> c0a72ad140dd
Step 8/9 : EXPOSE  80
 ---> Running in c9620707d038
Removing intermediate container c9620707d038
 ---> df42b714ecc1
Step 9/9 : CMD     /usr/sbin/sshd -D
 ---> Running in e178826b43fe
Removing intermediate container e178826b43fe
 ---> a733d5a264b5
Successfully built a733d5a264b5
Successfully tagged zzx/ubuntu:v2.0.1

使用docker images查看创建的镜像已经在列表中存在,镜像IDa733d5a264b5

[root@zzx docker-test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zzx/ubuntu         v2.0.1              a733d5a264b5        5 minutes ago       92.5MB
zzx/ubuntu         v1.0.1              b51e9f5f98cd        15 hours ago        92.1MB
mysql               latest              791b6e40940c        2 weeks ago         465MB
ubuntu              latest              ccc6e87d482b        4 weeks ago         64.2MB

我们可以使用新的镜像来创建容器

[root@zzx docker-test]# docker run -it zzx/ubuntu:v2.0.1 /bin/bash
root@f5332ebce695:/# id zzx
uid=1000(zzx) gid=1000(zzx) groups=1000(zzx)
root@f5332ebce695:/# exit
exit

镜像标签: 设置镜像的Tag,类似于Gittag。我们可以使用docker tag命令,为镜像添加一个新的标签

[root@zzx ~]# docker tag a733d5a264b5 zzx/ubuntu:v3.0.1
[root@zzx ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zzx/ubuntu         v2.0.1              a733d5a264b5        9 minutes ago       92.5MB
zzx/ubuntu         v3.0.1              a733d5a264b5        9 minutes ago       92.5MB
zzx/ubuntu         v1.0.1              b51e9f5f98cd        15 hours ago        92.1MB
mysql               latest              791b6e40940c        2 weeks ago         465MB
ubuntu              latest              ccc6e87d482b        4 weeks ago         64.2MB

 ■ docker tag 镜像ID这里是a733d5a264b5 ,用户名称、镜像源名(repository name)和新的标签名(tag)。
 ■ 使用docker images命令可以看到,IDa733d5a264b5的镜像多一个v3.0.1标签。

镜像导出和导入: 镜像导出

[root@zzx ~]# docker images
dockREPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
zzx/ubuntu                  v2.0.2              57544a04cd1a        3 months ago        91.5MB
[root@zzx ~]# docker save > zzx-ubuntu-v2.0.2.tar 57544a04cd1a
[root@zzx ~]# ll | grep zzx-u
-rw-rw-r-- 1 root root 93898240 Jun  4 09:06 zzx-ubuntu-v2.0.2.tar
[root@zzx ~]#

镜像导入

docker load < zzx-ubuntu-v2.0.2.tar

其中-i或者<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
 ■ 若是只想备份images,使用saveload即可
 ■ 若是在启动容器后,容器内容有变化,需要备份,则使用exportimport

【2】容器(Container): 利用容器独立运行的一个或一组应用。容器是镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一层一层的统一视角,唯一的区别是容器的最上面是可读可写的。

容器启动:

[root@zzx docker-test]# docker run -it zzx/ubuntu:v2.0.1 /bin/bash
root@f5332ebce695:/# id zzx
uid=1000(zzx) gid=1000(zzx) groups=1000(zzx)
root@f5332ebce695:/# exit
exit

 ■ -i: 允许你对容器内的标准输入 (STDIN) 进行交互
 ■ -t: 在新容器内指定一个伪终端或终端

容器查看:

[root@zzx ~]# docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                      PORTS               NAMES
f5332ebce695        zzx/ubuntu:v2.0.1   "/bin/bash"              20 minutes ago      Exited (0) 20 minutes ago                       jolly_kepler
0a1556ca3c27        ubuntu:latest        "/bin/bash"              16 hours ago        Exited (0) 16 hours ago                         stoic_hodgkin
1a51d2f023c9        ubuntu:latest        "/bin/sh -c 'while t…"   18 hours ago        Exited (137) 18 hours ago                       gifted_brown
414bf796cbe4        ubuntu:latest        "/bin/bash"              18 hours ago        Exited (0) 18 hours ago                         pedantic_galileo
512061ebfa4c        ubuntu:latest        "/bin/bash"              18 hours ago        Exited (0) 18 hours ago                         wizardly_brown
aa5e9ae5e5db        ubuntu:latest        "/bin/echo 'Hello wo…"   18 hours ago        Exited (0) 18 hours ago                         affectionate_knuth

容器再启动: 刚才zzx/ubuntu:v2.0.1的实例f5332ebce695已经停止了Exited (0) 20 minutes ago,我们能否再启这个实例?

[root@zzx ~]# docker start f5332ebce695
f5332ebce695
[root@zzx ~]# docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS               NAMES
f5332ebce695        zzx/ubuntu:v2.0.1   "/bin/bash"         32 minutes ago      Up 4 seconds        22/tcp, 80/tcp      jolly_kepler

容器停止和重启: 我们将上述容器停止,再重启

[root@zzx ~]# docker stop f5332ebce695
f5332ebce695
[root@zzx ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@zzx ~]# docker restart f5332ebce695
f5332ebce695
[root@zzx ~]# docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                      PORTS               NAMES
f5332ebce695        zzx/ubuntu:v2.0.1   "/bin/bash"              33 minutes ago      Up 2 seconds                22/tcp, 80/tcp      jolly_kepler
0a1556ca3c27        ubuntu:latest        "/bin/bash"              16 hours ago        Exited (0) 16 hours ago                         stoic_hodgkin
1a51d2f023c9        ubuntu:latest        "/bin/sh -c 'while t…"   18 hours ago        Exited (137) 18 hours ago                       gifted_brown
414bf796cbe4        ubuntu:latest        "/bin/bash"              18 hours ago        Exited (0) 18 hours ago                         pedantic_galileo
512061ebfa4c        ubuntu:latest        "/bin/bash"              18 hours ago        Exited (0) 18 hours ago                         wizardly_brown
aa5e9ae5e5db        ubuntu:latest        "/bin/echo 'Hello wo…"   19 hours ago        Exited (0) 19 hours ago                         affectionate_knuth

后台模式与进入: 在使用-d参数时,容器启动后会进入后。

第一种:使用docker attach进入后,exit便容器也停止了。

[root@zzx ~]# docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS               NAMES
f5332ebce695        zzx/ubuntu:v2.0.1   "/bin/bash"         38 minutes ago      Up 2 seconds        22/tcp, 80/tcp      jolly_kepler
[root@zzx ~]# docker attach f5332ebce695
root@f5332ebce695:/# echo 'zzx'
zzx
root@f5332ebce695:/# exit
exit
[root@zzx ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

第二种:docker exec我特意在容器停止状态下执行了docker exec,是让你看到docker exec是在容器启动状态下用的,且注意下错误信息。推荐大家使用docker exec命令,因为此退出容器终端,不会导致容器的停止。

[root@zzx ~]# docker exec -it f5332ebce695 /bin/bash
Error response from daemon: Container f5332ebce69520fba353f035ccddd4bd42055fbd1e595f916ba7233e26476464 is not running
[root@zzx ~]# docker restart f5332ebce695
f5332ebce695
[root@zzx ~]# docker exec -it f5332ebce695 /bin/bash
root@f5332ebce695:/# exit
exit
[root@zzx ~]# docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS               NAMES
f5332ebce695        zzx/ubuntu:v2.0.1   "/bin/bash"         42 minutes ago      Up 8 seconds        22/tcp, 80/tcp      jolly_kepler

容器导出和导入: 在生产环境中,很多时候是无法连接外网的,所以有时候需要用到容器的导入和导出。

容器的导出: 同时你可以发现,导出容器的时候,容器无需关闭。

[root@zzx ~]# docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS               NAMES
f5332ebce695        zzx/ubuntu:v2.0.1   "/bin/bash"         42 minutes ago      Up 8 seconds        22/tcp, 80/tcp      jolly_kepler
[root@zzx ~]# docker export f5332ebce695 > ubuntu-zzx-v2.tar
[root@zzx ~]# ll
-rw-rw-r-- 1 root root 93891072 Feb 18 09:42 ubuntu-zzx-v2.tar

容器导入: 注意看,SIZE可能是不一样的。

[root@zzx ~]# docker import ubuntu-zzx-v2.tar zzx/ubuntu:v2.0.2
sha256:57544a04cd1ad330371ca9142184ff031dc2b6df70df177994477c08fe547b25
[root@zzx ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zzx/ubuntu         v2.0.2              57544a04cd1a        7 seconds ago       91.5MB
zzx/ubuntu         v2.0.1              a733d5a264b5        About an hour ago   92.5MB
zzx/ubuntu         v3.0.1              a733d5a264b5        About an hour ago   92.5MB
zzx/ubuntu         v1.0.1              b51e9f5f98cd        16 hours ago        92.1MB
mysql               latest              791b6e40940c        2 weeks ago         465MB
ubuntu              latest              ccc6e87d482b        4 weeks ago         64.2MB

强制停止容器: 加上-f之后是允许强制删除一个运行的容器。

[root@zzx ~]# docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS               NAMES
f5332ebce695        zzx/ubuntu:v2.0.1   "/bin/bash"         About an hour ago   Up 24 minutes       22/tcp, 80/tcp      jolly_kepler
[root@zzx ~]# docker rm -f f5332ebce695
f5332ebce695
[root@zzx ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
0a1556ca3c27        ubuntu:latest       "/bin/bash"              17 hours ago        Exited (0) 17 hours ago                         stoic_hodgkin
1a51d2f023c9        ubuntu:latest       "/bin/sh -c 'while t…"   19 hours ago        Exited (137) 19 hours ago                       gifted_brown
414bf796cbe4        ubuntu:latest       "/bin/bash"              19 hours ago        Exited (0) 19 hours ago                         pedantic_galileo
512061ebfa4c        ubuntu:latest       "/bin/bash"              19 hours ago        Exited (0) 19 hours ago                         wizardly_brown
aa5e9ae5e5db        ubuntu:latest       "/bin/echo 'Hello wo…"   19 hours ago        Exited (0) 19 hours ago                         affectionate_knuth

清理停止的容器: 我们看到下面还有好几个容器出于停止状态,能不能删除它们呢?

[root@zzx ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
0a1556ca3c27        ubuntu:latest       "/bin/bash"              17 hours ago        Exited (0) 17 hours ago                         stoic_hodgkin
1a51d2f023c9        ubuntu:latest       "/bin/sh -c 'while t…"   19 hours ago        Exited (137) 19 hours ago                       gifted_brown
414bf796cbe4        ubuntu:latest       "/bin/bash"              19 hours ago        Exited (0) 19 hours ago                         pedantic_galileo
512061ebfa4c        ubuntu:latest       "/bin/bash"              19 hours ago        Exited (0) 19 hours ago                         wizardly_brown
aa5e9ae5e5db        ubuntu:latest       "/bin/echo 'Hello wo…"   19 hours ago        Exited (0) 19 hours ago                         affectionate_knuth

清理停止的容器: docker container prune

[root@zzx ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
0a1556ca3c275cc692ecd6d19caed4c5be42578f81b3dfea52b24208790d160a
1a51d2f023c947f2be2d9a78eb863e854ca302c89bf354654c409e23e7dd25d7
414bf796cbe403e01b5414f2b6232c6a037af78deee4581f4935c94859b5164e
512061ebfa4c340eb03833e54d77052e33fb62cd42ab7dd7e09bf0b02a761552
aa5e9ae5e5db1760bdb8c7ddb92e4293cd7b4736be7e97314f3ef44a71bf8930

Total reclaimed space: 27.93MB
[root@zzx ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

容器别名及操作: 我们上述对容器的操作都是针对容器ID,这个ID是随机的,我们添加一个name对我们自己设置的name操作。

[root@zzx ~]# docker run -itd --name zzx-ubuntu-202 zzx/ubuntu:v2.0.2 /bin/bash
11de9755a08402d963d263a559a7daf48f4a2188398f258641240b5eb50fbc89
[root@zzx ~]# docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS               NAMES
11de9755a084        zzx/ubuntu:v2.0.2   "/bin/bash"         5 seconds ago       Up 4 seconds                            zzx-ubuntu-202
[root@zzx ~]# docker stop zzx-ubuntu-202
zzx-ubuntu-202
[root@zzx ~]# docker ps -a
CONTAINER ID        IMAGE                COMMAND              CREATED              STATUS                     PORTS               NAMES
11de9755a084        zzx/ubuntu:v2.0.2   "/bin/bash"          26 seconds ago       Exited (0) 4 seconds ago                       zzx-ubuntu-202   

容器错误日志

//例:实时查看docker容器名为user-uat的最后10行日志
docker logs -f -t --tail 10 user-uat

//例:查看指定时间后的日志,只显示最后100行:
docker logs -f -t --since="2018-02-08" --tail=100 user-uat

//例:查看最近30分钟的日志:
docker logs --since 30m user-uat

//例:查看某时间之后的日志:
docker logs -t --since="2018-02-08T13:23:37" user-uat

//例:查看某时间段日志:
docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" user-uat

//例:将错误日志写入文件:
docker logs -f -t --since="2018-02-18" user-uat | grep error >> logs_error.txt

【3】仓库(Repository): 是集中存放镜像文件的场所。与仓库注册服务器Registry是有区别的。仓库注册服务器往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签tag。仓库分为公有库Public和私有库Private两种形式。最大的公有库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公共仓库包括阿里云、网易云等。当然也可以自己搭建Docker Registry。带界面的也可以使用Harbor等。

结论: Docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件,可以生成多个同时运行的实例。
 ● image文件生成的容器实例,本身就是一个文件,称为镜像文件。
 ● 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器。
 ● 至于仓库,就是存放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉去下来即可。

三、Docker的安装

【1】yum install -y epel-releaseDocker使用EPEL发布,RHEL系的OS首先要确保已经持有EPEL仓库,否则先检查OS的版本,然后安装相应的EPEL包)

【2】yum install -y docker-io

【3】安装后的配置文件:/etc/sysconfig/docker
【4】启动Docker后台服务:service docker start
【5】docker version验证。

[root@learnVM sysconfig]# docker version
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2

四、配置国内阿里云镜像加速(默认的Docker Hub 为外国仓库,外国的仓库访问慢)

【1】阿里云镜像加速 https://help.aliyun.com/document_detail/60750.html(国外Docker Hub仓库访问慢,使用国内镜像网站)

网易加速器:http://hub-mirror.c.163.com
Docker官方中国加速器:https://registry.docker-cn.com ustc
的镜像:https://docker.mirrors.ustc.edu.cn
daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)

【2】进入网站搜索“容器镜像服务”-“镜像加速器”,复制自己的加速地址:

【3】配置本地Docker运行镜像加速器:经验证,coreos下是可以通过标准方式进行加速器的配置的。

# 创建并编辑文件
vi /etc/docker/daemon.json

# 编辑文件内容
{
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}

# 重启服务
systemctl daemon-reload
systemctl restart docker.service

#验证
docker info

【4】Linux系统配置下检查是否生效:ps -ef|grep docker(会显示你配置的阿里云仓库地址)

五、Hello World 上手实践

【1】运行 docker run hello-world

【2】run 命令的作用:

六、Docker底层原理

【1】Docker是如何工作的?
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Docker连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。容器,是一个运行时环境,就是我们所说的集装箱。

【2】为什么DockerVM快?
 1)、Docker有着比虚拟机更少的抽象层。由于Docker不需要Hypervisor(结合下图)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上Docker将会在效率上有明显优势。
 2)、Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。从而避免了加载操作系统内核浪费资源和时间的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个过程是分钟级别的。而docker由于直接利用宿主机的操作系统,省略了此过程,因此docker容器只需要几秒钟。(参考下图)

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿进阶

千言万语都不及一句“谢谢”

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值