Docker安装

安装指南: https://docs.docker.com/engine/install/centos/

# 先卸载旧版本
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

一、安装方法

使用存储库安装

在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker。

设置存储库

安装yum-utils软件包(提供yum-config-manager 实用程序)并设置稳定的存储库。

#需要的安装包
sudo yum install -y yum-utils
#设置镜像仓库
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #默认是国外仓库,需要换成国内加速
    
# 更新yum软件索引
yum makecache fast
# 安装docker引擎  docker-ce社区   docker-ee企业版
sudo yum install docker-ce docker-ce-cli containerd.io
# 使用docker version 查看docker是否安装成功
docker version
# 启动docker
sudo systemctl start docker
# 运行hello-world
sudo docker run hello-world

1594784769745

# 使用 docker images 查看下载的镜像
docker images

1594784929115

二、卸载Docker:

  1. 卸载相关依赖:

    sudo yum remove docker-ce docker-ce-cli containerd.io
  2. 删除资源

    # docker的默认工作路径 /var/lib/docker
    sudo rm -rf /var/lib/docker

必须手动删除所有已编辑的配置文件。

三、Docker是怎么工作的?

Docker 是一个 C-S 架构的系统,Docker的守护进程运行在主机上。通过socket从客户端访问。

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

Docker 为什么比虚拟机快?

  1. docker有比虚拟机更少的抽象层。docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的是实际物理机的硬件资源。因此在cpu、内存利用率上docker将会在效率上有明显的优势。
  2. docker利用的是宿主机的内核,而不需要Guest OS。因此创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返回新建过程是分钟级别的。而新建一个docker容器只需要几秒钟。
Docker容器虚拟机(VM)
操作系统与宿主机共享OS宿主机OS上运行宿主机OS
存储大小镜像小,便于存储与传输镜像庞大(vmdk等)
运行性能几乎无额外性能损失操作系统额外的cpu、内存消耗
移植性轻便、灵活、适用于Linux笨重、与虚拟化技术耦合度高
硬件亲和性面向软件开发者面向硬件运维者

Docker和JVM相比:

  • Docker运行几乎没有额外性能损失,JVM操作系统额外的CPU、内存消耗
  • Docker移植性轻便、灵活、适应于Linux,而JVM笨重,和虚拟机耦合度高
  • Docker存储的镜像小,便于存储和传输。JVM镜像庞大。

四、Docker 的常用命令

1. 帮助命令

docker  version            # 显示docker的版本信息
docker info                    # 显示Docker的系统信息,包括镜像和容器的数量
docker 命令 --help     # 万能命令

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

2. 镜像命令


docker images 查看所有镜像

[root@iZ2zefd6hest2pny6ga9baZ ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED               SIZE
hello-world         latest              bf756fb1ae65        6 months ago          13.3kB
# 解释
REPOSITORY  镜像的仓库源
TAG                 镜像的标签
IMAGE ID         镜像的id
CREATED            镜像的创建时间
SIZE                镜像的大小

# 可选项
Name, shorthand    Default    Description
--all , -a        Show all images (default hides intermediate images)
--quiet , -q        Only show numeric IDs
    .......

docker search 镜像搜索

[root@iZ2zefd6hest2pny6ga9baZ ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9731                [OK]
mariadb                           MariaDB is a community-developed fork of MyS…   3550                [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   713                                     [OK]

# 可选项 , 通过收藏过滤
--filter = stars=3000         # 搜索出来的镜像就是Stars大于3000的

docker pull 下载镜像

# 下载镜像 docker pull 镜像名[:tag]
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker pull mysql
Using default tag: latest        # 如果不写tag,默认就是latest
latest: Pulling from library/mysql
8559a31e96f4: Pull complete    # 分层下载,docker image 的核心  联合文件系统
d51ce1c2e575: Pull complete
c2344adc4858: Pull complete
fcf3ceff18fc: Pull complete
16da0c38dc5b: Pull complete
b905d1797e97: Pull complete
4b50d1c6b05c: Pull complete
571e8a282156: Pull complete
e7cc823c6090: Pull complete
61161ba7d2fc: Pull complete
74f29f825aaf: Pull complete
d29992fd199f: Pull complete
Digest: sha256:fe0a5b418ecf9b450d0e59062312b488d4d4ea98fc81427e3704f85154ee859c
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

1594791808761

docker rmi 删除镜像

[root@iZ2zefd6hest2pny6ga9baZ ~]# docker rmi -f 镜像id   # 删除指定的镜像
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker rmi -f 镜像id1 镜像id2 镜像id3   # 删除多个镜像
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker rmi -f $(docker images -q)   # 删除所有镜像

3. 容器命令


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

docker pull centos

新建容器并启动

docker run [可选参数] image

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

# 测试,启动并进入容器
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker run -it centos /bin/bash
[root@8f8bc26d16ee /]#
# 查看容器内的centos,基础版本,很多命令都不完善
[root@8f8bc26d16ee /]# ls  
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
# 从容器中退回主机
[root@8f8bc26d16ee /]# exit
[root@iZ2zefd6hest2pny6ga9baZ ~]#

查看所有运行的容器

# docker ps 命令
        # 列出当前正在运行的容器
-a      # 列出当前正在运行的容器,带出历史运行过的容器(all)
-n=?  # 显示最近创建的容器
-q      # 只显示容器的编号

[root@iZ2zefd6hest2pny6ga9baZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
8f8bc26d16ee        centos              "/bin/bash"         4 minutes ago       Exited (130) 2 minutes ago                       jovial_archimedes
5bdaf30b6552        bf756fb1ae65        "/hello"            2 hours ago         Exited (0) 2 hours ago                           blissful_perlman
[root@iZ2zefd6hest2pny6ga9baZ ~]#

退出容器

exit         # 停止容器并退出
Ctrl + P + Q  # 容器不停止退出

进入当前正在运行的容器

# 容器通常都是使用后台方式运行的,需要进入容器,修改一些配置,如何进入?
# 方式一
# 命令: docker exec -it 容器id bashShell
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker exec -it b5c519b1b015 /bin/bash
[root@b5c519b1b015 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@b5c519b1b015 /]#

# 方式二
# 命令: docker attach 容器id
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker attach b5c519b1b015
[root@b5c519b1b015 /]#

# docker exec    进入容器后开启一个新的终端
# docker attach  进入容器正在运行的终端,不会启动新进程

删除容器

docker rm 容器id    # 删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq)        # 删除所有的容器
dcoker ps -a -ql|xargs docker rm  # 删除所有的容器

启动和停止容器的操作

docker start 容器id            # 启动容器
docker restart 容器id        # 重新启动容器
docker stop 容器id            # 停止当前正在运行的容器
docker kill 容器id            # 强制停止当前容器

4. 常用的其他命令


后台启动容器

# 命令: docker run -d 镜像名
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker run -d centos
# docker ps,发现centos停止了
# 原因:docker容器使用后台运行,必须要有一个前台进程,docker发现没有应用,就会自动停止运行
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

-t  # 显示时间戳
-f  # 日志跟随输出
docker logs -tf --tail 行数 容器id

查看容器中进程信息 ps

# 命令:  docker top 容器id
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker top b5c519b1b015
UID      PID      PPID       C      STIME      TT     Y     TIME       CMD
root     5909     5873       0      14:08      ?            00:00:00   /bin/bash
[root@iZ2zefd6hest2pny6ga9baZ ~]#

查看容器的元数据

# 命令: docker inpect 容器id
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker inspect b5c519b1b015

从容器内拷贝文件到主机

# 命令: docker cp 容器id:容器内路径  目的主机路径

# 在容器内部/home新建一个test.java文件
[root@b5c519b1b015 /]# cd /home
[root@b5c519b1b015 home]# touch test.java
[root@b5c519b1b015 home]# ls
test.java
[root@b5c519b1b015 home]# exit
exit
[root@iZ2zefd6hest2pny6ga9baZ home]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
b5c519b1b015        centos              "/bin/bash"         41 minutes ago      Exited (0) 6 seconds ago                          gifted_proskuriakova
[root@iZ2zefd6hest2pny6ga9baZ home]# ls
java  task.jar  task.log  www  xsyu  xsyu.jar
# 将文件拷贝到当前主机上/home目录下
[root@iZ2zefd6hest2pny6ga9baZ home]# docker cp b5c519b1b015:/home/test.java /home
[root@iZ2zefd6hest2pny6ga9baZ home]# ls
java  task.jar  task.log  test.java  www  xsyu  xsyu.jar
[root@iZ2zefd6hest2pny6ga9baZ home]#

# 拷贝是一个手动过程,未来使用-v ,卷的技术,可以实现自动同步

5. docker 基础使用练习

docker安装nginx

# 1. 搜索镜像
docker search nginx
# 2. 拉取镜像
docker pull nginx
# 3. 启动容器
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker run -d --name nginx01 -p 3344:80 nginx
# 4. 进入容器
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker exec -it nginx01 /bin/bash
# 5. 停止容器
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker stop nginx01
nginx01
[root@iZ2zefd6hest2pny6ga9baZ ~]# docker ps
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS    PORTS

我们每次改动nginx配置文件,都需要进入容器内部,十分麻烦。在容器外部提供一个映射路径,达到在容器里修改文件名,容器里就可以自动修改—— 数据卷!

docker安装tomcat

# 官方的使用指南
docker run -it --rm tomcat:9.0
# --rm 一般用来测试,用完就删除

# 1. 下载再启动
docker pull tomcat:9.0
# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0
# 测试访问没有问题,但进入之后发现linux命令少了,并且webapps下没有默认页面
# 默认使用的最小的镜像,只保留核心运行环境

五、 Docekr 镜像详解

1.Docker镜像概念

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

2.UnionFS(联合文件系统)

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

3.Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

在这里插入图片描述

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

4.分层的镜像

以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载。

5.为什么Docker镜像要采用这种分层结构呢

最大的一个好处就是 - 共享资源
比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

6.Docker镜像特点

Docker镜像都是只读的 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

1594820058281

Docker镜像commit

如何提交容器副本使之成为一个新的镜像。

docker commit     # 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名,[TAG]

如果你想保存当前容器的状态,就可以通过commit来提交,获得一个镜像!

六、容器数据卷

什么是容器数据卷?

docker将应用和环境打包成一个镜像。如果数据都在容器中,那么容器删除,数据就会丢失。容器数据卷就可以解决这个问题。

容器数据卷可将容器中的数据与本地同步(目录挂载)。

使用数据卷

方式一、直接使用命令挂载 -v

# 命令: docker run -it -v 主机目录:容器内目录
docker run -it -v /home/ceshi:/home centos /bin/bash

# 挂载之后容器内/home目录中的文件与主机/home/ceshi目录下的文件会同步,一方有变化,另一方自动同步
# docker inspect 容器id  可以查看挂载情况

1594882024225