Docker (一)安装与基本命令

此篇笔记来自与B站大佬《狂神说Java》的docker教学视频。视频地址 https://www.bilibili.com/video/BV1og4y1q7M4?p=17&spm_id_from=pageDriver

由于是奔着学了会用的目标去的,因此不能达到狂神老师要求的精通,因此在老师的笔记基础上做了简单的整理修改,希望老师看到不要打我。有了这篇笔记方便以后借鉴。再次推荐 狂神老师的

学习网站 https://www.kuangstudy.com/course,希望看了狂神老师的同鞋能实际动手操作一遍,加深印象,如果你看视频打瞌睡,对着我的笔记敲一遍也是一样的,然后那就真的学会了哦!

一、docker简介

1. 什么是docker?

  Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的服务器机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

2. Docker能干什么?

  可以理解为docker是一种应用于项目部署的容器,本身就是对一系列应用做了封装标准化,在此基础上做了一些扩展。比如Tomcat已经有了给种服务器版本,为什么还需要Docke呢?看下面四点,共同探讨:

  环境:借助镜像可以快速进行项目部署,重要的是官方会提供很多可以支持项目程序部署环境的镜像,轻轻一拉便可运行。

  资源:每个运行的容器都是基本最小的虚拟机环境,可以简单理解为阉割版的虚拟机。不要问为什么,因为资源有限。

  伸缩扩容:在服务资源升级和回滚上,借助升级扩容,一键能完成成千上百的服务集群的快速部署。

  网络:内部也有自己的一套网络管理,省时省力。

  讲真,我看到上面的东西仍然是懵逼的。我在一台应用服务器上部署N个Tomcat不比部署N个Docke版的tomcat性能要好吗?毕竟后者还是做了封装。知道看到了这篇文章《Docker是什么?可

Docker做什么》。下面是原文

  Docker理解成一个专门为应用程序与执行环境的轻型虚拟机。

  Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需

要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。

  1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一

些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机

开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。

  2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部

署速度快。

  3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。

  总之docker就是集装箱原理的容器。一台机器上vm虚拟机,3到10个实例,docker 100到10000。

3. Dokcer的基本组成

Docker (一)安装与基本命令

镜像(image):

  docker镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

容器(container):

  Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的

仓库(repository):

  仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库。(很类似git)。Docker Hub是国外的。阿里云…都有容器服务器(配置镜像加速

官网地址 https://www.docker.com/

官网仓库地址  https://hub.docker.com/

二、docker安装

环境配置

  虽然目前docker支持不仅限于linux系统,但是这里使用的是linux Centos系统。且dokcer对环境有两个硬性要求:

1.linux要求内核3.0以上

2.Centos7以上

cat /etc/os-release 

输入以上命名,看你的环境是否达标,反正我的是达标了。

Docker (一)安装与基本命令

安装官网文档 https://docs.docker.com/engine/install/centos/

1.卸载旧版本


yum remove docker 
                  docker-client 
                  docker-client-latest 
                  docker-common 
                  docker-latest 
                  docker-latest-logrotate 
                  docker-logrotate 
                  docker-engine

这里安装出现了一个小插曲,由于我的服务器上面安装了nginx、tomcat、mysql等一些软件,报了一个删除数据错误的问题,直接换了一台服务器就OK了。

2.需要的安装包

yum install -y yum-utils

3.设置镜像的仓库

推荐使用国内阿里云的

yum-config-manager 
--add-repo 
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.更新yum软件包索引

yum makecache fast

5.安装docker相关的 docker-ce 社区版 而ee是企业版

这里安装社区版的

yum install docker-ce docker-ce-cli containerd.io 

6.启动docker

systemctl start docker

7. 使用docker version查看是否按照成功

docker version

8. 测试

docker run hello-world

注意这个 hello-world 是一个测试镜像,所以名字不能任性哦

Docker (一)安装与基本命令

8.查看已经下载的镜像

docker images

Docker (一)安装与基本命令

 9. 卸载docker

卸载依赖

yum remove docker-ce docker-ce-cli containerd.io

删除资源,/var/lib/docker 是docker的默认工作路径!

rm -rf /var/lib/docker

三、docker运行原理

1.docker run 流程图

如下图,开始后会在本地查找镜像,如果存在就使用这个镜像。如果不存在,就去docker仓库中下载这个镜像到本地,然后执行这个镜像。

Docker (一)安装与基本命令

2.docker是怎么工作的

docker是一个C/S结构的系统,docker的守护进行在主机上,通过socket访问。docker-server接收到docker-client的指令,就会执行这个命令。

Docker (一)安装与基本命令

3.docker与VM虚拟机的比较

Docker (一)安装与基本命令

为什么Docker比Vm快
1、docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
2、docker利用的是宿主机的内核,而不需要Guest OS。

GuestOS: VM(虚拟机)里的的系统(OS)

HostOS:物理机里的系统(OS)


因此,当新建一个 容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引导、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个docker容器只需要几秒钟。

三、docker基本命令 

1.帮助命令

docker version #显示docker的版本信息。
docker info #显示docker的系统信息,包括镜像和容器的数量
docker [命令] --help #帮助命令,不选择命令则显示所有

帮助文档的地址:https://docs.docker.com/engine/reference/commandline/build/

2.镜像命令

查看本地镜像

新手可以多使用 docker [option] --help 获取帮助

docker images #查看所有本地主机上的镜像 可以使用docker image ls代替

实例解析

[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED           SIZE
hello-world           latest              bf756fb1ae65        4 months ago     13.3kB
mysql                 5.7                 b84d68d0a7db        6 days ago       448MB

# 解释
#REPOSITORY            # 镜像的仓库源
#TAG                # 镜像的标签(版本)        ---lastest 表示最新版本
#IMAGE ID            # 镜像的id
#CREATED            # 镜像的创建时间
#SIZE                # 镜像的大小

# 可选项
Options:
  -a, --all         Show all images (default hides intermediate images) #列出所有镜像
  -q, --quiet       Only show numeric IDs # 只显示镜像的id
  
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images -a  #列出所有镜像详细信息
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images -aq #列出所有镜像的id
d5f28a0bb0d0
f19c56ce92a8
1b6b1fe7261e
1b6b1fe7261e
搜索镜像
docker search [mysql] #搜索镜像

实例解析

[root@iz2zeak7sgj6i7hrb2g862z ~]# docker search mysql

# --filter=STARS=3000 #过滤,搜索出来的镜像收藏STARS数量大于3000的
Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output
      
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker search mysql --filter=STARS=3000
NAME        DESCRIPTION         STARS            OFFICIAL        AUTOMATED
mysql       MySQL IS ...        9520             [OK]                
mariadb     MariaDB IS ...      3456             [OK]  
下载镜像
docker pull [mysql] #下载镜像 

实例解析

# 下载镜像 docker pull 镜像名[:tag]
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker pull tomcat:8
8: Pulling from library/tomcat #如果不写tag,默认就是latest
90fe46dd8199: Already exists   #分层下载: docker image 的核心 联合文件系统
35a4f1977689: Already exists 
bbc37f14aded: Already exists 
74e27dc593d4: Already exists 
93a01fbfad7f: Already exists 
1478df405869: Pull complete 
64f0dd11682b: Pull complete 
68ff4e050d11: Pull complete 
f576086003cf: Pull complete 
3b72593ce10e: Pull complete 
Digest: sha256:0c6234e7ec9d10ab32c06423ab829b32e3183ba5bf2620ee66de866df # 签名防伪
Status: Downloaded newer image for tomcat:8
docker.io/library/tomcat:8 #真实地址

#等价于
docker pull tomcat:8
docker pull docker.io/library/tomcat:8
删除镜像
docker rmi -f 镜像id #删除指定id的镜像

实例解析

docker rmi -f 镜像id #删除指定id的镜像
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker rmi -f f19c56ce92a8

docker rmi -f $(docker images -aq) #删除全部的镜像
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker stop $(docker ps -a -q)

3.容器命令

说明:我们有了镜像才可以创建容器,Linux,下载centos镜像来学习

镜像下载
docker pull centos
启动镜像
docker run 镜像id或镜像名称

实例解析

docker run [可选参数] image | docker container run [可选参数] image 
#参书说明
--name="Name"        #容器名字 tomcat01 tomcat02 用来区分容器
-d                    #后台方式运行
-it                 #使用交互方式运行,进入容器查看内容
-p                    #指定容器的端口 -p 8080(宿主机):8080(容器)
        -p ip:主机端口:容器端口
        -p 主机端口:容器端口(常用)
        -p 容器端口
        容器端口
-P(大写)                 随机指定端口

# 测试、启动并进入容器
[root@iz2zeak7sgj6i7hrb2g
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -it centos /bin/bash
[root@241b5abce65e /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@241b5abce65e /]# exit #从容器退回主机

 这里注意 -it 和 -d 的区别,it是新增一个后台窗口。

查看正在运行的容器
docker ps [-all] #列出所有运行的容器 docker container list

实例解析

docker ps 命令          #列出当前正在运行的容器
  -a, --all          #列出当前正在运行的容器 + 带出历史运行过的容器
  -n=?, --last int   #列出最近创建的?个容器 ?为1则只列出最近创建的一个容器,为2则列出2个
  -q, --quiet        #只列出容器的编号
退出容器
exit         #容器直接退出
ctrl +P +Q  #容器不停止退出     ---注意:这个很有用的操作
删除指定容器
docker rm 容器id #删除指定容器
启动容器
docker start 容器id #启动容器
重启容器
docker restart 容器id #重启容器
停止当前正在运行的容器
docker stop 容器id #停止当前正在运行的容器
杀掉当前运行的容器
docker kill 容器id #强制停止当前容器

4.常用其他命令

后台启动命令
docker run -d 镜像名
查看日志
docker logs --help
Options:
      --details        Show extra details provided to logs 
*  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
*      --tail string    Number of lines to show from the end of the logs (default "all")
*  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
➜  ~ docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模拟日志      
#显示日志
-tf        #显示日志信息(一直更新)
--tail number #需要显示日志条数
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #跟着日志
查看容器中进程信息
docker top 容器id

查看镜像的元数据

docker inspect 容器id
进入容器修改配置
docker exec -it 容器id /bin/bash #方式一
docker attach 容器id #方式二

区别

#docker exec   #进入当前容器后开启一个新的终端,可以在里面操作。(常用)
#docker attach # 进入容器正在执行的终端
从容器内拷贝到主机上
docker cp 容器id:容器内路径  主机目的路径

总结

Docker (一)安装与基本命令

attach      Attach local standard input, output, and error streams to a running container
  #当前shell下 attach连接指定运行的镜像
  build       Build an image from a Dockerfile # 通过Dockerfile定制镜像
  commit      Create a new image from a container's changes #提交当前容器为新的镜像
  cp          Copy files/folders between a container and the local filesystem #拷贝文件
  create      Create a new container #创建一个新的容器
  diff        Inspect changes to files or directories on a container's filesystem #查看docker容器的变化
  events      Get real time events from the server # 从服务获取容器实时时间
  exec        Run a command in a running container # 在运行中的容器上运行命令
  export      Export a container's filesystem as a tar archive #导出容器文件系统作为一个tar归档文件[对应import]
  history     Show the history of an image # 展示一个镜像形成历史
  images      List images #列出系统当前的镜像
  import      Import the contents from a tarball to create a filesystem image #从tar包中导入内容创建一个文件系统镜像
  info        Display system-wide information # 显示全系统信息
  inspect     Return low-level information on Docker objects #查看容器详细信息
  kill        Kill one or more running containers # kill指定docker容器
  load        Load an image from a tar archive or STDIN #从一个tar包或标准输入中加载一个镜像[对应save]
  login       Log in to a Docker registry #
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes