Dock概述

常用地址

为什么会出现Docker

一款产品要经过开发、测试、上线等过程,在不同的阶段可能会使用不同的环境、不同的应用配置。

故经常会有人发出这样的疑问:我这电脑上运行都整挺好的,怎么到你这就拉跨了呢?!

这就关系到环境配置问题了,环境配置十分麻烦,得一个机器一个机器配置、部署,费时费力。

一般一个项目成型后要打成一个 jar包 ,环境得自己配,这时候docker就出现了

docker 把 [ jar包、Redis、Mysql、jdk、ES、……] (项目 + 环境)打包在一起,就可以解决这样的问题了。

docker核心思想:隔离!

docker通过隔离机制,可以将服务器利用到极致!

image-20200517172233728

Docker能干嘛

  • 传统的虚拟机技术

    image-20200517181221006

    传统虚拟机,虚拟出一条硬件运行一个完整的操作系统,然后在这个系统上安装和运行软件

    缺点:

    1. 资源占用十分多
    2. 冗余步骤多
    3. 启动慢
  • 容器化技术

    容器化技术不是模拟的一个完整的操作系统

    image-20200517181501805

    容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的也没有虚拟我们的硬件,所以就轻便了

    容器间相互隔离,每个容器内有自己的文件系统,互不影响!

  • DevOps(开发、运维)

    • 应用更快的交付和部署

      传统:开发写好一堆帮助文档交给运维,运维根据帮助文档安装程序测试运行

      Docker:打包镜像发布测试,一键运行

    • 更便捷的升级和扩缩容

    • 更简单的系统运维

      在容器化后,开发、测试环境都是高度一致的

    • 更高效的计算机资源利用

      Docker 是内核级别的虚拟化,可以在一个物理机上运行很多容器实例!服务器性能可以压缩至极致。

Docker安装

Docker的基本组成

image-20200518175427253
  • 镜像(image)

    Docker 镜像就好比是一个模板,可以通过这个模板创建容器服务

  • 容器(container)

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

    基本命令:启动、停止、删除……

    可以简单理解为一个简易的 Linux 系统

  • 仓库(repository)

    存放镜像的地方

    分为公有仓库和私有仓库

安装Docker

  1. 环境准备

    Docker需要搭建到 Linux 系统上

    我们这里用自己购买的阿里云服务器上的 CentOS 7 系统,使用Xshell进行远程连接

    没有的也可以用 Vmware 代替~

  2. 环境查看

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Welcome to Alibaba Cloud Elastic Compute Service !

    #系统内核是 3.10 以上的
    [admin@iZuf6iwj4bpbjtsf1yoaqlZ ~]$ uname -r
    3.10.0-514.26.2.el7.x86_64

    #系统版本
    [admin@iZuf6iwj4bpbjtsf1yoaqlZ ~]$ cat /etc/os-release
    NAME="CentOS Linux"
    VERSION="7 (Core)"
    ID="centos"
    ID_LIKE="rhel fedora"
    VERSION_ID="7"
    PRETTY_NAME="CentOS Linux 7 (Core)"
    ANSI_COLOR="0;31"
    CPE_NAME="cpe:/o:centos:centos:7"
    HOME_URL="https://www.centos.org/"
    BUG_REPORT_URL="https://bugs.centos.org/"

    CENTOS_MANTISBT_PROJECT="CentOS-7"
    CENTOS_MANTISBT_PROJECT_VERSION="7"
    REDHAT_SUPPORT_PRODUCT="centos"
    REDHAT_SUPPORT_PRODUCT_VERSION="7"
  3. 正式安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    # 1.卸载旧版本
    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine

    # 2.需要的安装包
    yum install -y yum-utils

    # 3.设置镜像仓库
    # 国外的仓库,下载缓慢,不推荐
    yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

    # 阿里云的仓库,推荐!
    yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    # 3.5.更新yum软件包索引
    yum makecache fast

    # 4.安装 docker 相关的内容 docker-ce:社区版 docker-ee:企业版
    yum install docker-ce docker-ce-cli containerd.io

    # 5.启动docker
    systemctl start docker

    # 6.查看docker是否安装成功
    docker version

    image-20200521171850570

测试

  1. 运行hello-world

    docker run hello-world

    image-20200521172144938

  2. 查看下载的镜像

    docker images

    image-20200521172345307

  3. 梳理流程

    image-20200521174420079

卸载Docker

1
2
3
4
5
# 1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io

# 2.删除资源
re -rf /var/lib/docker #docker的默认工作路径

阿里云镜像加速

  1. 登录阿里云,找到容器镜像服务

    image-20200521173233168

  2. 找到镜像加速地址

    image-20200521173534263

  3. 配置使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sudo mkdir -p /etc/docker

    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://ljk3xy6r.mirror.aliyuncs.com"]
    }
    EOF

    sudo systemctl daemon-reload
    sudo systemctl restart docker

底层原理

1. Docker时怎么工作的?

Docker 是一个 Client-Server 结构的系统,Docker 的守护进程运行在主机上,通过 Socket 从客户端访问

Docker-Server 收到 Docker-Client 的指令,就会执行这个命令!

image-20200522114439607

2. Docker 为什么比 VM 快?

  1. Docker 有比虚拟机更少的抽象层

  2. Docker 利用的是宿主机的内核,VM 需要的是Guest OS

    image-20200522114647782

所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载 Guest OS,分钟级别的,而daocker 利用宿主机的操作系统,省略了这个复杂的过程,是秒级别的!

image-20200522115133985

Docker常用命令

帮助命令

1
2
3
docker version		# 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令

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

镜像命令

docker images
1
2
3
4
5
6
7
8
9
10
11
12
13
#列举镜像
docker images

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

# 常用可选项
-a, --all Show all images (default hides intermediate images)
-q, --quiet Only show numeric IDs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#搜索镜像
docker search 镜像名

# 解释
NAME
DESCRIPTION
STARS 收藏数
OFFICIAL 是否来自官方
AUTOMATED

# 常用可选项
-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

# 实例
docker search mysql --filter=starts=3000 # 收藏数不小3000的
docker pull
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 下载镜像
docker pull 镜像名 [:tag]

# 解释
[root@wxshhh ~]# docker pull mysql
Using default tag: latest # 不设置tag,默认下载最新版
latest: Pulling from library/mysql
afb6ec6fdc1c: Pull complete # 分层下载,docker image的核心
0bdc5971ba40: Pull complete
97ae94a2c729: Pull complete
f777521d340e: Pull complete
1393ff7fc871: Pull complete
a499b89994d9: Pull complete
7ebe8eefbafe: Pull complete
597069368ef1: Pull complete
ce39a5501878: Pull complete
7d545bca14bf: Pull complete
211e5bb2ae7b: Pull complete
5914e537c077: Pull complete
Digest: sha256:a31a277d8d39450220c722c1302a345c84206e7fd4cdb619e7face046e89031d # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址

docker pull mysql 等价于 docker pull docker.io/library/mysql:latest

# 指定版本下载
docker pull mysql:5.7
docker rmi
1
2
3
4
5
6
7
8
# 删除镜像
docker rmi -f 镜像id

# 删除多个镜像
docker rmi -f 镜像id 镜像id 镜像id

#删除全部镜像
docker rmi -f $(docker images -aq)

容器命令

说明:我们有了镜像才可以创建容器,先要下载一个 CentOS 镜像来学习

1
docker pull centos
新建容器并启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
docker run [可选参数] image

# 参数说明
-- name="Name" # 容器名字,用来区分容器
-d # 后台方式运行
-it # 使用交互方式运行,进入容器查看内容
-p(小写) # 指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P(大写) # 随机指定端口

# 测试,启动并进入容器
[root@iZuf6iwj4bpbjtsf1yoaqlZ ~]# docker run -it centos /bin/bash
[root@7a98c694480d /]#
# 查看容器内的centos,基础版本很多命令是不完善的
[root@7a98c694480d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

# 退出容器到主机
[root@7a98c694480d /]# exit
exit
[root@iZuf6iwj4bpbjtsf1yoaqlZ ~]#
[root@iZuf6iwj4bpbjtsf1yoaqlZ /]# ls
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
列出正在运行的容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 列出容器
docker ps

# 常用参数
-a # 列出当前正在运行的容器和历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号

[root@iZuf6iwj4bpbjtsf1yoaqlZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZuf6iwj4bpbjtsf1yoaqlZ /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a98c694480d centos "/bin/bash" 4 minutes ago Exited (0) 2 minutes ago dazzling_matsumoto
8bdd901e69de hello-world "/hello" 20 hours ago Exited (0) 20 hours ago funny_leavitt
退出容器
1
2
3
4
5
# 容器之间停止并退出
exit

# 容器不停止,退出
Ctrl + P + Q
删除容器
1
2
3
4
5
6
# 指定id删除容器,不能删除正在运行的容器,如果要强制删除,用 -f 参数
docker rm 容器id

# 删除所有容器
docker rm -f $(docker ps -aq)
docker ps -a -q | xargs docker rm
启动和停止容器的操作
1
2
3
4
5
6
7
8
#启动容器
docker start 容器id
#重启容器
docker restart 容器id
#停止当前正在运行的容器
docker stop 容器id
#强制停止容器
docker kill 容器id

常用其他命令

后台启动容器
1
2
3
4
5
6
docker run -d 镜像名

# 常见的坑
# 使用 ps 查看,发现centos停止了
# docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止
查看日志
1
docker logs -tf --tail 行数 容器id
查看容器中的进程信息
1
docker top 容器id
查看镜像元数据
1
docker inspect 容器id
进入当前正在运行的容器
1
2
3
4
5
6
7
8
9
# 我们通常容器都是后台方式运行的,有时需要进入容器修改一些配置
# 方式一
docker exec -it 容器id bashShell
#方式二
docker attach 容器id

#区别
# docker exec 进入容器后开启一个新的终端,可以在里面操作
#docker attach 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
1
docker cp 容器id:容器内路径 目的的主机路径

参考

狂神说Java:https://www.bilibili.com/video/BV1og4y1q7M4?