Docker——

Docker

一、Docker

1、入门

a、引言和介绍

Docker——_第1张图片

b、docker 与传统容器

Docker——_第2张图片

c、docker 应用场景

Docker——_第3张图片

d、docker 核心组件

Docker——_第4张图片

e、docker相关技术

  1. 隔离性
  2. 可度量性
  3. 移植性
  4. 安全性

2、安装

a、CentOS7 安装 Docker

1. 安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖 
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

3. 查看可以安装的版本
yum list docker-ce --showduplicates | sort -r

4. yum -y install docker-ce-20.10.7
5. 启动 Docker 并设置开机自启
systemctl start docker
systemctl enable docker

安装成功后,在命令行输入 docker 回车,有反应就说明是成功了。

b、Ubuntu 安装 Docker

1. 安装
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

2. 启动 Docker
sudo systemctl enable docker
sudo systemctl start docker

确认 Docker 是否安装成功:

docker run --name nginx1 -d -p 8080:80 nginx
执行完成后,打开浏览器,如果能访问到 nginx,就表示装好了。

3、容器基本操作

a、基本指令

查看容器:docker ps
查看所有容器:docker ps -a
Docker——_第5张图片
查看最新创建的容器:docker ps -l
查看最新创建的n个容器:docker ps -n=XXX

b、创建容器

例如创建一个 nginx 容器:docker create nginx——此时容器处于停止状态。

此时创建的容器并未运行,处于停止状态,容器的 name 是随机生成的,开发者也可以在创建容器时指定 name,如下:
docker create --name=nginx nginx

此时的name属性就不是随机生成的,而是用户指定的name。

这种方式只是单纯的创建了一个用户,并未启动。

c、容器创建+启动

如果开发者需要既创建又启动容器,则可以使用docker run命令。docker run命令又可以启动两种不同模式的容器:后台型容器和交互型容器,顾名思义,后台型容器就是一个在后台运行的容器,默默的在后台执行计算就行了,不需要和开发者进行交互,而交互型容器则需要接收开发者的输入进行处理给出反馈。对于开发者而言,大部分情况下创建的都是后台型容器,不过在很多时候,即使是后台型容器也不可避免的需要进行交互,下面分别来看。

(1)、后台型容器

后台型容器以nginx为例,一般nginx在后台运行即可:
docker run --name nginx1 -d -p 8080:80 nginx

Docker——_第6张图片
首先依然会去本地检查,本地没有相应的容器,则会去Docker Hub上查找,查找到了下载并运行,并且生成了一个容器id。运行成功后,在浏览器中输入http://localhost:8080就能看到Nginx的默认页面了

(2)、交互型容器(用得少)

也可以创建交互型容器,例如创建一个ubuntu容器,开发者可能需要在ubuntu上面输入命令执行相关操作,交互型容器创建方式如下:
docker run --name ubuntu -it ubuntu /bin/bash
Docker——_第7张图片

d、容器重启

容器在运行过程中,会不可避免的出问题,出了问题时,需要能够自动重启,在容器启动时使用–restart参数可以实现这一需求。根据docker官网的解释,docker的重启策略可以分为4种,如下:
Docker——_第8张图片
Docker——_第9张图片拿 3 举例子:
docker run -d --name mynginx -p 8080:80 --restart=always nginx

e、容器停止

Docker——_第10张图片

f、容器删除

(1)、单个删除

容器停止后还依然存在,如果需要,还可以通过docker start命令再次重启一个容器,如果不需要一个容器,则可以通过docker rm命令删除一个容器。删除容器时,只能删除已经停止运行的容器,不能删除正在运行的容器。

可以通过name或者id删除一个容器。如果非要删除一个正在运行的容器,可以通过 -f 参数实现,如下:
在这里插入图片描述

(2)、批量删除

容器也可以批量删除,命令如下:
docker rm $(docker ps -a -q)

docker ps -a -q会列出所有容器的id,供rm命令删除。

如下命令也支持删除已退出的孤立的容器:
docker container prune

g、容器内执行命令

如果容器在后台启动,则可以使用docker exec在容器内执行命令。不同于docker attach,使用docker exec即使用户从终端退出,容器也不会停止运行,而使用docker attach时,如果用户从终端退出,则容器会停止运行。如下图:
在这里插入图片描述
Docker——_第11张图片

4、容器操作进阶

a、查看容器信息

容器创建成功后,用户可以通过docker inspect命令查看容器的详细信息,这些详细信息包括容器的id、容器名、环境变量、运行命令、主机配置、网络配置以及数据卷配置等信息。

使用format参数可以只查看用户关心的数据,例如:
Docker——_第12张图片

b、查看容器进程

使用docker top命令可以查看容器中正在运行的进程,首先确保容器已经启动,然后执行docker top命令,如下:
在这里插入图片描述

c、查看容器日志

交互型容器查看日志很方便,但是对于后台型容器,如果要查看日志,则可以使用docker提供的docker logs命令来查看,如下:
Docker——_第13张图片
如下图,首先启动一个不停打日志的容器,然后利用docker logs命令查看日志,但是默认情况下只能查看到历史日志,无法查看实时日志,使用-f参数后,就可以查看实时日志了。

使用--tail参数可以精确控制日志的输出行数,-t参数则可以显示日志的输出时间。
Docker——_第14张图片该命令在执行的过程中,首先输出最近的三行日志,同时由于添加了-f参数,因此,还会有其他日志持续输出。同时,因为添加了-t参数,时间随同日志一起打印出来了。

5、容器导入和导出

比如现在用的虚拟机 vmware,如果里面有某些东西不一样,想给别人,就可以直接复制虚拟机文件目录即可;但如果是 docker,则需要打包。

a、容器导出

使用export命令可以导出容器,具体操作如下:

  1. 创建一个容器,进行基本的配置操作

本案例中我首先创建一个nginx容器,然后启动,启动成功后,将本地一个index.html文件上传到容器中,修改nginx首页的显示内容。具体操作步骤如下:

docker run -itd --name nginx -p 80:80 nginx
vi ./blog/docker/index.html
docker cp ./blog/docker/index.html nginx:/usr/share/nginx/html/

Docker——_第15张图片

b、容器导入

Docker——_第16张图片

6、镜像

a、镜像介绍

镜像也是docker的核心组件之一,镜像是容器运行的基础,容器是镜像运行后的形态。

总体来说,镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一层的改变以读写层的形式增加到原来的只读文件上。

镜像与容器的关系:

前文已经向读者介绍过容器的使用了,细心的读者可能已经发现,容器在启动或者创建时,必须指定一个镜像的名称或者id,其实,这时镜像所扮演的角色就是容器的模版,不同的镜像可以构造出不同的容器。如下命令:

docker run -itd --name nginx nginx

命令中的最后一个nginx即表示创建该容器所需要的模版,当然这里还省略了一些信息,这些我们后文会详细介绍。

镜像的体系结构:
镜像的最底层是一个启动文件系统(bootfs)镜像,bootfs的上层镜像叫做根镜像,一般来说,根镜像是一个操作系统,例如Ubuntu、CentOS等,用户的镜像必须构建于根镜像之上,在根镜像之上,用户可以构建出各种各样的其他镜像。
从上面的介绍读者可以看出,镜像的本质其实就是一系列文件的集合,一层套一层的结构有点类似于Git。

镜像的写时复制机制:
通过docker run命令指定一个容器创建镜像时,实际上是在该镜像之上创建一个空的可读写的文件系统层级,可以将这个文件系统层级当成一个临时的镜像来对待,而命令中所指的模版镜像则可以称之为父镜像。父镜像的内容都是以只读的方式挂载进来的,容器会读取共享父镜像的内容,用户所做的所有修改都是在文件系统中,不会对父镜像造成任何影响。当然用户可以通过其他一些手段使修改持久化到父镜像中,这个我们后面会详细介绍到。

b、本地镜像管理

用户可以通过docker images命令查看本地所有镜像。

c、下载镜像

当用户执行docker run命令时,就会自动去Docker Hub上下载相关的镜像,这个就不再重复演示,开发者也可以通过search命令去Docker Hub上搜索符合要求的镜像,如下:
Docker——_第17张图片
Docker——_第18张图片
在执行docker run命令时再去下载,速度会有点慢,如果希望该命令能够快速执行,可以在执行之前,先利用docker pull命令将镜像先下载下来,然后再运行。

d、删除镜像

镜像可以通过docker rmi命令进行删除,参数为镜像的id或者镜像名,参数可以有多个,多个参数之间用空格隔开。
Docker——_第19张图片
有的时候,无法删除一个镜像,大部分原因是因为该镜像被一个容器所依赖,此时需要先删除容器,然后就可以删除镜像了。

7、Dockerfile

二、Dockerfile

1、引言和介绍

在实际的开发环境或者生产环境,容器往往都不是独立运行的,经常需要多个容器一起运行,此时,如果继续使用run命令启动容器,就会非常不便,在这种情况下,docker-compose是一个不错的选择,使用docker-compose可以实现容器编排,本文就来看看docker-compose的使用。

本文以jpress这样一个开源网站的部署为例,向读者介绍docker-compose的使用。jpress是Java版的wordPress,不过我们不必关注jpress的实现,在这里我们只需要将之当作一个普通的应用即可,完成该项目的部署工作。

简而言之就是:容器很多,一个个启动太傻逼了,所以如果有一种方式可以批量启动和关闭就很舒服。这就是 Dockerfile。

2、后续补上

你可能感兴趣的:(docker,linux,docker,容器)