Docker---安装与使用

一、Docker的简单介绍

一、什么是Docker

docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把hello word放在docker中,可以把网站放入docker中,可以把任何想得到的程序放在docker中。

二、Docker的三个概念

一、镜像(Image)

类似于虚拟机中的镜像。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。

Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。

二、容器(Container):

类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

三、仓库(Repository)

类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

三、Docker的安装卸载

四、Docker的基本命令

[root@localhost ~]# docker version                 # 查看docker的版本信息,包括客户端、服务端
[root@localhost ~]# docker info                    # 查看docker的系统信息,包括镜像和容器的数量
[root@localhost ~]# docker --help                  # 帮助命令

[root@localhost ~]# systemctl start docker         # 启动docker服务
[root@localhost ~]# systemctl status docker        # 查看docker服务状态

五、Docker的镜像命令

[root@localhost ~]# docker images             # 查看所有本地主机上的镜像。
[root@localhost ~]# docker images -a          # -a:列出所有镜像,-q:只显示镜像的id。如:docker images -aq
[root@localhost ~]# docker images centos      # 查看centos镜像的信息
  
[root@localhost ~]# docker search imagename                      # 查询docker hub可拉取镜像列表, 搜索镜像。
[root@localhost ~]# docker search mysql --filter=STARS=3000      # 搜索出来的镜像就是STARS大于3000的
  
[root@localhost ~]# docker pull imagename<imageid>               # 下载镜像:从远端docker hub下载拉取镜像
[root@localhost ~]# docker pull mysql                            # 下载mysql镜像,等价于:docker.io/library/mysql:latest。也可以指定版本:docker pull mysql:5.7     
[root@localhost ~]# docker pull ubuntu:14.04                     # 下载ubuntu指定版本的镜像      
  
[root@localhost ~]# docker rmi imagename<imageid>                # 删除镜像
[root@localhost ~]# docker rmi -f bf756fb1ae65                   # 根据镜像id删除
[root@localhost ~]# docker rmi -f mysql                          # 根据镜像名称删除,也可以删除指定版本如:docker rmi -f mysql:5.7
[root@localhost ~]# docker rmi -f mysql ubuntu:14.04             # 删除多个镜像
[root@localhost ~]# docker rmi -f bf756fb1ae65 bc356fa1ae68      # 删除多个镜像
[root@localhost ~]# docker rmi -f $(docker images -aq)           # 递归删除所有的镜像

[root@localhost ~]# docker inspect redis:latest                  # 查看镜像详细信息
[root@localhost ~]# docker image inspect redis:latest            # 查看镜像详细信息

六、Docker的容器命令

[root@localhost ~]# docker pull centos            # 有了镜像才可以创建容器,下载一个centos镜像来学习
 
[root@localhost ~]# docker run [可选参数] imagename(镜像名)
[root@localhost ~]# docker run -d centos /bin/bash      # 后台方式运行容器。
[root@localhost ~]# docker run -it centos /bin/bash     # 交互方式运行容器。启动并进入容器之后,可以使用命令查看容器内的centos。使用exit退出容器。
[root@localhost ~]# docker run -it --name='liu' centos /bin/bash   # --name:容器名字。如:tomcat1,tomcat2,用来区分容器。
# -p          指定容器的端口(-p 容器端口 | -p 主机端口:容器端口 | -p ip:主机端口:容器端口)
# -P          随机指定端口
 
[root@localhost ~]# docker ps              # 列出当前正在运行的容器
[root@localhost ~]# docker ps -a           # 列出当前正在运行的容器 + 历史运行过的容器)
[root@localhost ~]# docker ps -aq          # 只显示容器的编号(容器id)
[root@localhost ~]# docker ps -a -n=1      # 显示最近创建的容器
 
[root@localhost ~]# docker rm containerid<containernames>           # 根据容器id删除指定的容器。不能删除正在运行的容器,如果要强制删除,使用rm -f。
[root@localhost ~]# docker rm -f 90aad472e7e8                       # 方式一,删除单个容器
[root@localhost ~]# docker rm -f $(docker ps -aq)                   # 方式二,删除所有容器
[root@localhost ~]# docker ps -aq|xargs docker rm -f                # 方式三,删除所有容器
 
[root@localhost ~]# docker kill containerid <containernames>        # 强制停止当前容器
[root@localhost ~]# docker stop containerid <containernames>        # 停止当前正在运行的容器,停止指定容器
[root@localhost ~]# docker start containerid <containernames>       # 启动容器。注意与run的区别:run是镜像创建并运行容器,start是启动已经存在的容器,即再次运行容器。
[root@localhost ~]# docker restart containerid <containernames>     # 重启容器(最好使用容器id来重启,上面三条也是)
	
[root@localhost ~]# docker exec -it 容器id command            # 进入当前正在运行的容器,方式1:进入容器后开启一个新的终端,可以在里面操作(常用)。
[root@localhost ~]# docker exec -it a6e3963fd253 /bin/bash
[root@localhost ~]# docker attach 容器id或容器名              # 进入当前正在运行的容器,方式2:进入容器正在执行的终端,不会启动新的进程。
	
[root@localhost ~]# docker logs containername<containerid>          # 查看容器的日志信息
[root@localhost ~]# docker logs -tf --tail 10 容器id                # 显示10条日志。-t:显示时间戳,-f:动态显示,--tail:显示多少条。

[root@localhost ~]# docker cp 容器id:容器内路径 目的主机路径        # 从容器内拷贝文件到主机上
[root@localhost ~]# docker cp 容器id:/home/test.py /home 

[root@localhost ~]# docker top 容器id                               # 查看容器中进程信息

[root@localhost ~]# docker inspect 容器id                           # 查看容器的元数据

七、Docker的镜像原理

一、镜像原理之联合文件系统

UnionFS(联合文件系统)是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。

二、镜像原理之分层理解

1. 所有的docker镜像都起始于一个基础镜像层,当进行修改或者添加新的内容时,就会在当前镜像层之上,创建新的镜像层。

2. 假设基于centos创建一个新的镜像,centos就是新镜像的第一层,如果在该镜像中添加python包,就会在基础镜像层之上创建第二个镜像层,如果继续添加一个安全补丁,就会创建第三个镜像层。则该镜像当前已经包含3个镜像层。

3. 在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。假设有三个镜像层,前两层镜像层都包含3个文件,第三层镜像层只有一个文件(假设第一个镜像层三个文件分别是:centos、mysql、tomcat。第二个镜像层三个文件分别是:redis、app1.0、es。第三个镜像层的文件是app2.0),如果把这三个镜像层打包成一个新的镜像(三层镜像),新的镜像在外部看来只有6个文件,这是因为最上层中的文件app2.0是app1.0的一个更新版本。这时候如果docker pull下载这个镜像,就会发现有6个layer(即6层)。

4. docker镜像都是只读的,当容器启动时(运行run命令),一个新的可写层被加载到镜像的顶部,这一层就是我们通常说的容器层,容器层之下的都叫镜像层。镜像层是从远程pull下来的。镜像层无法改变,所有操作都是基于容器层的。这时候可以通过commit命令将整个打包,如果原来的镜像(如redis)有6层,现在加上容器层就是7层了。

5. 镜像都是分层的,因此当pull一个镜像时,是分层下载的,如果已经下载过了,就直接复用,跳过这一层下载下一层的。

三、commit 命令生成新的镜像

如果你想要保存当前容器的状态,就可以通过commit命令来提交,获得一个镜像。就好比虚拟机的快照。将操作过的容器通过commit命令,提交成为一个镜像,我们以后就可以使用修改过后的镜像了(这个镜像是新生成的,原来的镜像不会变)。

[root@localhost ~]# docker commit -a='作者' -m='修改的信息' 容器id 镜像名称(可以加上版本)
[root@localhost ~]# docker commit -a -m='add webapps' 2958d9839b09 tomcat01:1.0

八、配置镜像加速

一、配置阿里云镜像加速

[root@localhost ~]# sudo mkdir -p /etc/docker
[root@localhost ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://sgp9zikk.mirror.aliyuncs.com"]
}
EOF
[root@localhost ~]# sudo systemctl daemon-reload
[root@localhost ~]# sudo systemctl restart docker

二、配置腾讯云镜像加速

[root@localhost ~]# vi /etc/docker/daemon.json 
{
    "registry-mirrors": [
        "https://mirror.ccs.tencentyun.com"
    ]
}
[root@localhost ~]# sudo systemctl daemon-reload
[root@localhost ~]# sudo systemctl restart docker

三、检查加速器是否生效

[root@localhost ~]# docker info    # 查看Registry Mirrors参数的值

  

posted @ 2020-07-25 16:20  刘_love_田  阅读(276)  评论(0编辑  收藏  举报