Docker简介

  • 是一个软件,一个可以在Windows、mac、Linux等各种操作系统上运行的软件
  • 是一个开源的应用容器引擎,它是基于Go开发的,项目目前是在Github上开源维护的
  • 可以让开发打包应用以及依赖包到一个轻量级、可移植的容器中,然后发布到各种流行的Linux机器上
  • 容器是完全使用沙箱机制,相互之间不会有任何的API交互,最主要的是容器性能方面开销成本很低

Docker组成部分

  • docker主机(Host):安装了Docker程序的机器,Docker是直接可安装在各种操作系统上的,可以理解它就是一个软件 
  • docker仓库(Registry):用来保存各种打包好的软件镜像,仓库分为公有和私有,跟maven很相似,它也有仓库官网地址,维护了各种镜像
  • docker镜像(Images):软件打包好的镜像,放在docker仓库中
  • docker容器(Container):镜像启动后的实例称为容器,容器是独立运行的一个或一组应用

Docker安装

安装docker的时候,我们会接触到两个重要组件:Docker CLI客户端和Docker daemon服务端

安装环境是我自己搭建的一个虚拟机:使用的是centos7.8,安装我就不做赘述了

配置阿里云yum源

1、下载安装wget

yum install -y wget

有些时候运行这个命令会报错:yum repolist all“ to see the repos you have

具体的解决方案看这篇文章:

https://blog.csdn.net/qq_38377525/article/details/123388012https://blog.csdn.net/qq_38377525/article/details/1233880122、备份默认的yum

mv /etc/yum.repos.d /etc/yum.repos.d.backup

3、设置新的yum目录

mkdir -p /etc/yum.repos.d

4、下载阿里yum配置到刚才的目录,选择对应版本

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

查看系统版本的命令:cat /etc/centos-release

5、更新epel源为阿里云epel源

mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup 
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup 
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

6、重建缓存

yum clean all 
yum makecache

7、查看yum仓库包

yum repolist

安装Docker 

1、安装插件

yum install -y yum-utils device-mapper-persistent-data lvm2

2、添加源

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

本地缓存一份:yum makecache fast

3、查看docker版本

yum list docker-ce --showduplicates | sort -r

4、正式安装docker

推荐大家安装最新版本

yum -y install docker-ce

也可以指定版本,语法如下:

yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

举例:yum install -y docker-ce-19.03.9-3.el7 docker-ce-cli-19.03.9-3.el7

5、开启服务

#开启服务
systemctl start docker
#关闭服务
systemctl stop docker

6、安装阿里云镜像加速器

原因是下载镜像的时候,会走阿里的快一点

#创建文件
mkdir -p /etc/docker 

#文件内容
tee /etc/docker/daemon.json <<-'EOF' 
{ 
    "registry-mirrors": ["https://复制自己的加速器地址.mirror.aliyuncs.com"] 
}EOF 

#3、重新加载
systemctl daemon-reload 
systemctl restart docker

7、设置docker开启开机启动服务

systemctl enable docker

8、查看版本版本信息

docker -v 
docker version 
docker info

到这里,docker就算是安装成功了


Docker镜像(image)

docker提供了一个类似maven远程仓库的地址:Docker Hub

那,怎么去理解镜像这个概念呢?

从咱们开发的角度出发的话,可以把镜像理解为一个Class类,它就是一个应用程序,使用过程和Maven差不多,我们添加maven依赖的时候,先去下载到本地,然后再使用,docker也是,我们去远程仓库中找到镜像之后,下载该镜像到本地的Docker主机,然后可以为该镜像启动一个或者多个容器


Docker常用命令

pull命令

下载镜像的命令,默认是会去Docker Hub仓库拉取镜像

实例:下载tomcat镜像

docker pull tomcat:9.0.20-jre8

这条命令相当于maven的下载jar包一样,docker pull docker.io/tomcat:9.0.20-jre8,默认会走DockerHub地址

常用参数:

  • -a,--all-tags=true/false:是否获取仓库中所有镜像,默认是false
  • --disable-content-trust:跳过镜像内容的校验,默认是true

 images命令

查询本机已存在的所有镜像:

docker images 
docker image ls

以上两个命令的效果是一样的,接下来对查询出来的格式标题进行讲解一下:

  • REPOSITORY:表示镜像的仓库源,也可以理解为是什么软件
  • TAG:镜像的标签,一般都是版本号信息
  • IMAGE ID:镜像ID,相当于MySQL的主键ID
  • CREATED: 镜像创建时间
  • SIZE: 镜像大小

save命令

 相当于备份, 将指定镜像保存成 tar 归档文件

mkdir -p /data 
cd /data 

#单个文件
docker save tomcat:9.0.20-jre8-alpine -o tomcat9.tar 
docker save tomcat:9.0.20-jre8-slim > tomcat9.slim.tar

#多个文件
docker save \ 
ubuntu:20.04 \ 
alpine:3.12.1 \ 
centos:7.8.2003 \ 
debian:10.6-slim \ 
-o linux.tar

常用参数:

  • -o:输出到的文件,相当于压缩之后的文件名称和格式

load命令 

 导入使用 docker save命令导出的镜像。

mkdir -p /data 
cd /data 

docker load -i linux.tar 
docker load < tomcat9.0.20.tar

常用参数:

  • -i:指定导入的文件
  • -q:精简输出信息

search命令 

很多地方都不推荐用search,因为输出的信息有限,一般来说都推荐使用inspect命令

inspect命令

查看镜像全部信息

docker inspect tomcat:9.0.20-jre8-alpine

输入的是一个json文本,返回结果如下:

[
    {
        "Id": "sha256:387f9d021d3ae76a2dafd661142a2659939389def2f390d40ab73bd49df242ba",
        "RepoTags": [
            "tomcat:9.0.20-jre8-alpine"
        ],
        "RepoDigests": [
            "tomcat@sha256:17accf0afeeecce0310d363490cd60a788aa4630ab9c9c802231d6fbd4bb2375"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2019-05-16T00:57:50.863755612Z",
        "Container": "24ab35a23fd83a3748e701f6fdca86f3618ffb29a29bd32ed2db6f9b4336056d",
        "ContainerConfig": {
            "Hostname": "24ab35a23fd8",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "8080/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin",
                "LANG=C.UTF-8",
                "JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk/jre",
                "JAVA_VERSION=8u212",
                "JAVA_ALPINE_VERSION=8.212.04-r0",
                "CATALINA_HOME=/usr/local/tomcat",
                "TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib",
                "LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib",
                "GPG_KEYS=05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23",
                "TOMCAT_MAJOR=9",
                "TOMCAT_VERSION=9.0.20",
                "TOMCAT_SHA512=6d2df51f0bfc6a90cfca61c86473b8843da4162c430ab06b8f66f364931f3d8a3ad399703acdd600ff4f633d7d6725edf05d5d5d19534716a2f3f9f5238a32a0",
                "TOMCAT_TGZ_URLS=https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz \thttps://www-us.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz \thttps://www.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz \thttps://archive.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz",
                "TOMCAT_ASC_URLS=https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz.asc \thttps://www-us.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz.asc \thttps://www.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz.asc \thttps://archive.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz.asc"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"catalina.sh\" \"run\"]"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:a9ebb0fcc929c1b8ddd758efe32531ddadb78547da29a01dd8854c2d32ab5eb8",
            "Volumes": null,
            "WorkingDir": "/usr/local/tomcat",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "18.06.1-ce",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "8080/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin",
                "LANG=C.UTF-8",
                "JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk/jre",
                "JAVA_VERSION=8u212",
                "JAVA_ALPINE_VERSION=8.212.04-r0",
                "CATALINA_HOME=/usr/local/tomcat",
                "TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib",
                "LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib",
                "GPG_KEYS=05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23",
                "TOMCAT_MAJOR=9",
                "TOMCAT_VERSION=9.0.20",
                "TOMCAT_SHA512=6d2df51f0bfc6a90cfca61c86473b8843da4162c430ab06b8f66f364931f3d8a3ad399703acdd600ff4f633d7d6725edf05d5d5d19534716a2f3f9f5238a32a0",
                "TOMCAT_TGZ_URLS=https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz \thttps://www-us.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz \thttps://www.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz \thttps://archive.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz",
                "TOMCAT_ASC_URLS=https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz.asc \thttps://www-us.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz.asc \thttps://www.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz.asc \thttps://archive.apache.org/dist/tomcat/tomcat-9/v9.0.20/bin/apache-tomcat-9.0.20.tar.gz.asc"
            ],
            "Cmd": [
                "catalina.sh",
                "run"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:a9ebb0fcc929c1b8ddd758efe32531ddadb78547da29a01dd8854c2d32ab5eb8",
            "Volumes": null,
            "WorkingDir": "/usr/local/tomcat",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 107881954,
        "VirtualSize": 107881954,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/6090fc321bb15ef2c6e27c262cb559a9acfe5151b2b4d2a90eb8cc99e910c342/diff:/var/lib/docker/overlay2/3d0e4871a759c3f3e3a0d604ab689f19c09350a405f94a5311ba877d636e2a51/diff:/var/lib/docker/overlay2/be9c92fa96e7e2a315124e57745d457d8fe88a5682cf028d78a437dcea11e687/diff:/var/lib/docker/overlay2/9c702a0274a3a8a7029d6a46290e99d941797af406322d30f38a0922b3891b46/diff:/var/lib/docker/overlay2/8bb926a33b761565ece581b256eb32c4c76d9f64b8db7450904d14de45abb8dd/diff",
                "MergedDir": "/var/lib/docker/overlay2/534de22b26cea4a350034b50e39c7618f0651a6836e0fda7b2f08c8a79076d31/merged",
                "UpperDir": "/var/lib/docker/overlay2/534de22b26cea4a350034b50e39c7618f0651a6836e0fda7b2f08c8a79076d31/diff",
                "WorkDir": "/var/lib/docker/overlay2/534de22b26cea4a350034b50e39c7618f0651a6836e0fda7b2f08c8a79076d31/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:f1b5933fe4b5f49bbe8258745cf396afe07e625bdab3168e364daf7c956b6b81",
                "sha256:9b9b7f3d56a01e3d9076874990c62e7a516cc4032f784f421574d06b18ef9aa4",
                "sha256:edd61588d12669e2d71a0de2aab96add3304bf565730e1e6144ec3c3fac339e4",
                "sha256:48988bb7b8615c1af859b04776a46ddeb4d2bd1aa9b0a9a3ac099cf3f73ab29d",
                "sha256:d1d0b1719b963394ea25c3936f2d67f8bdb6c90bd7166137167c7b7f135742e1",
                "sha256:b7d850202de0030b2e8e076a40364bb695c891339ba321e6a743e9db0cc72766"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

查看json中指定的key的值:

#查看ID
docker inspect -f {{".Id"}} tomcat:9.0.20-jre8-alpine

rmi命令 

 删除镜像有两种方式的命令:

docker rmi tomcat:9.0.20-jre8-alpine 
docker image rm tomcat:9.0.20-jre8-alpine

常用参数:

  • -f:强制删除镜像,哪怕这个镜像被其他的容器引用,但是一般来说不推荐这么暴力,推荐两步走的优雅删除镜像的方式:先删除引用这个镜像的容器,再删除这个镜像
  • -no-prune:不删除未带标签的父镜像

按照镜像ID查询:

#这个id是使用docker images命令回显的IMAGE ID
docker rmi 11d8667108c2

清理镜像命令 

 主要是清理一些临时、没有被使用的镜像

docker image prune

常用参数:

  • -a:删除所有没有用的镜像,不仅是临时文件
  • -f:强制删除镜像文件,没有任何提示确认是否删除

Docker容器

说到容器应该能联想到Spring容器,Servlet容器、Tomcat容器等等,docker也是容器,也具备生命周期

常用命令

新建并启动容器

语法:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

示例:运行tomcat

docker run -it --rm -p 8080:8080 tomcat:9.0.20-jre8-alpine

常用参数:

  • -d:后台运行并返回容器ID
  • -i:以交互模式运行容器,通常与-t同时使用
  • -P:随机端口映射,不过不推荐用
  • -p:指定端口映射,格式是主机端口:容器端口,比较推荐使用这个
  • -t:为容器重新分配一个伪输入终端,通常与-i同时使用
  • --name="xxx":为容器指定一个名称
  • -h:指定容器的hostname
  • -e:设置环境变量
  • --net="bridge":指定容器的网络链接类型,支持bridge/host/none/container
  • --link=[]:添加链接到另一个容器,同样不推荐使用
  • -v:绑定一个卷
  • --privileged=false:指定容器是否为特权容器,特权容器拥有所有的capabilities
  • --rm=false:指定容器停止后自动删除容器,但是对docker run -d启动的容器无效
  • --restart=no:指定容器停止后的重启策略
  1. no:容器退出时不重启
  2. on-failure:容器故障退出时(返回的状态非0)重启
  3. always:容器退出时总是重启,这个比较保险,所以要设置的话就设置这一个参数即可

容器日志 

获取容器日志

语法:

docker logs [OPTIONS] CONTAINER

示例:

docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine 

docker logs -f tomcat9

常用参数:

  • -f:跟踪日志输出
  • --tail:仅列出最新N条容器日志

删除容器 

不能删除正在运行的容器

语法:

docker rm [OPTIONS] CONTAINER [CONTAINER...]

 示例:

docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine 
#需要先停止运行中的容器再删除,否则无法删除容器 
docker stop tomcat9 
#按照容器名称删除 
docker rm tomcat9 
#按照容器ID删除 
docker rm 8dd95a95e687

常用参数:

  • -f:通过SIGKILL信号强制删除一个运行中的容器
  • -l:移除容器之间的网络连接,并不是容器本身
  • -v:删除与容器关联的卷

列出容器

语法:

docker ps [OPTIONS]

示例:

docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine 
#查看运行中的容器 
docker ps tomcat9 
#查看所有容器 
docker ps -a tomcat9

解析一下返回的内容:

  • CONTAINER ID:容器ID
  • IMAGE:使用的镜像
  • COMMAND:启动容器的命令
  • CREATED:创建时间
  • STAUTS:状态,created、restarting、running、removing、paused、exited、dead
  • PORTS:容器的端口和使用的连接类型
  • NAMES:自动分配的容器名称

常用参数:

  • -a:显示所有容器,不管什么状态
  • -q:只显示容器编号

创建容器

创建一个新的容器但不启动它

语法:

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

示例:

docker create -it --name tomcat9 -p 8080:8080 9.0.20-jre8-alpine

常用参数大致和run命令一样

启动、重启、停止容器

语法:

docker start [OPTIONS] CONTAINER [CONTAINER...] 
docker stop [OPTIONS] CONTAINER [CONTAINER...] 
docker restart [OPTIONS] CONTAINER [CONTAINER...]

示例:

docker start tomcat9 
docker stop tomcat9 
docker restart tomcat9

 进入容器

在运行的容器中执行命令。早期有attach命令,对于阻塞命令会等待,所以不方便。在 Docker 1.3.0后提供了exec 可以在容器内直接执行任意命令

语法:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

示例:

#有bash命令的linux系统:例如centos 
docker run -it --name tomcat9.1 -p 8080:8080 tomcat:9.0.20-jre8-slim 
docker exec -it tomcat9.1 /bin/bash 

#没有bash命令的linux系统:例如alpine系统 
docker run -it --name tomcat9.2 -p 8081:8080 tomcat:9.0.20-jre8-alpine 
docker exec -it tomcat9.2 sh

常用参数:

  • -i:即使没有附加也要保持STDIN打开
  • -t:分配一个伪终端

查看容器 

获取容器/镜像的元数据

语法: 

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

示例:

docker run -it --name tomcat9 -p 8081:8080 tomcat:9.0.20-jre8-alpine 
docker inspect tomcat9

常用参数:

  • -f:指定返回值的模版文件
  • -s:显示总的文件大小
  • --type:为指定类型返回json

更新容器 

可以动态地更新容器配置,但是官方好像说这个命令不成熟,所以还是推荐rm容器之后再run

语法:

docker update [OPTIONS] CONTAINER [CONTAINER...]

示例:

docker run -it --name tomcat9 -p 8081:8080 tomcat:9.0.20-jre8-alpine 

#更新容器restart策略 
docker update --restart always tomcat9

杀掉容器

杀掉一个运行中的容器

语法:

docker kill [OPTIONS] CONTAINER [CONTAINER...]

示例:

docker run -it --name tomcat9 -p 8081:8080 tomcat:9.0.20-jre8-alpine 

docker kill tomcat9 

docker ps 

docker ps -a 

docker start tomcat9

常用参数:

  • -s:向容器发送一个信号
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐