Docker的安装及各种操作
Docker简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
容器虚拟化与传统虚拟化
传统虚拟化
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样
缺点 :1 资源占用多 2 冗余步骤多 3 启动慢
容器虚拟化
Linux 容器(Linux Containers,缩写为 LXC)。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
传统虚拟化和容器虚拟化对比
特性 | 虚拟机的架构 | 容器的架构 |
---|---|---|
启动 | 分钟级 | 秒级 |
性能 | 弱于原生 | 接近原生 |
硬盘使用 | 一般为GB | 一般为MB |
系统支持量 | 一般几十个 | 单机上千个容器 |
Docker基本思想
1.集装箱:
会将所需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了
2.标准化:
1.运输的标准化:Docker有一个码头,所有上传的集装箱放到了这个码头上,当谁需要某一个环境,就直接指派大海豚搬运这个集装箱就可以了。
2.命令的标准化:Docker提供了一系列的命令,帮助我们去获取集装箱的操作。
3.提供了PEST的API:衍生出很多的图形化界面,如Runcher。
3.隔离性:
Docker在运行集装箱内的内容时,会在Linux的内核中,单独开辟一片空间,不会影响到其他的程序。
- 仓库。(超级码头,上面放的就是集装箱)
- 镜像(集装箱):镜像运行起来以后就变成了容器
- 容器(运行起来的镜像)
Docker的优势
- 更高效的利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
Docker三要素
镜像(Image)
镜像是用来创建容器的,Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像的分层结构
可写容器层(读写):容器层操作的数据/可写数据能够保持下拉
应用层叠加镜像(只读):用户添加工具,安装lrxsz
应用层叠加 镜像(只读):用户添加工具,安装VIM
Base镜像(只读):1.不依赖于其他的镜像,从Scratch镜像构建(空镜像)
2.其他镜像都可以把它作为基础,在它的基础之上进行扩展(各种发行版的Linux)
3.内核:提供了内核空间(联合文件系统(UFS)(rootFS(提供了系统级目录/bin、/dev、/proc、/etc )、bootFS))、用户空间
镜像的Copy On Write()特性
1.新增的数据直接存放在最上边的容器层
2.修改现有的数据先从镜像层将数据复制到容器层,修改后,数据直接存放在容器层里,镜像保持不变
3.如果多个层中有命名相同的,用户只能看到最上边的那层文件
创建镜像
镜像包括公共镜像(Docker Hup仓库)、自定义镜像
创建自定义镜像
第一种方式:
将容器打包成镜像
场景:在一个容器中,操作安装了一些程序,要把这个经过操作后的容器打包成一个镜像,但是不支持启动命令的封装
docker commit -a "作者的名字" -m "描述信息" 容器ID 镜像名称:tag # 将容器打包成镜像
举例
[root@slave1 ~]# docker exec -it acdbcb7e9a8e /bin/bash # 进入到正在运行的容器中
root@acdbcb7e9a8e:/# apt-get update # 执行了升级命令
root@acdbcb7e9a8e:/# apt-get yum install -y vim # 安装了vim编辑器
root@acdbcb7e9a8e:/# exit # 将现有的容器安装了一些东西
# 将修改后的容器打包成镜像
docker commit -a "HelloWorld" -m "update" acdbcb7e9a8e ubuntu:v3 # 生成新的镜像文件
第二种方式:
创建镜像
1.创建Dockerfile文件
Dockerfile文件的创建格式
vim Dockerfile
FROM 服务 #第一行,基础镜像是谁
MAINTANIER # 提供作者的信息
USER # 设置启动容器的用户,默认是root用户
ADD src路径 dest路径 # 向镜像中增加内容,如果要增加压缩包的话,会自动解压(文件或目录)
COPY src路径 dest路径 # 仅仅是单纯的拷贝,拷贝压缩包不会解压
RUN # 执行命令,例如yum install -y vim
CMD # 用于container启动时指定的操作。如果有多个CMD,最后一个生效,该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条
ENTRYPOINT # 设置container启动时执行的操作,和CMD等效,如果出现多个,只执行最后一个,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。
EXPOSE # 指定容器需要映射到宿主机器的端口,预暴露端口
ENV # 用于设置环境变量
VOLUME # 指定挂载点,数据的持久化,容器的目录映射到宿主机上的目录:宿主机目录:容器目录
WORKDIR # 切换目录,相当于cd命令,对RUN,CMD,ENTRYPOINT生效
ONBUILD # 在子镜像中执行的命令
2.创建镜像
docker build -t 镜像名称:tag . # 构建镜像, 基础镜像默认去docker的官方仓库下载
举例1
# 1.创建Dockerfile文件
vim Dockerfile
FROM nginx
RUN echo "hello world" > /usr/share/nginx/html/index.html
# 2.创建镜像
docker build -t nginx:v1 .
Sending build context to Docker daemon 47.1kB
Step 1/2 : FROM nginx
---> f6d0b4767a6c
Step 2/2 : RUN echo "hello world" > /usr/share/nginx/html/index.html
---> Running in c2c023cb1e04
Removing intermediate container c2c023cb1e04
---> 6029ea8e6e26
Successfully built 6029ea8e6e26
Successfully tagged nginx:v1
举例2
# 1.创建Dockerfile文件
FROM nginx
RUN echo "hello world" > /usr/share/nginx/html/index.html
ADD key.sh /root/key.sh #向nginx中的/root目录下添加key.sh文件
CMD ["/root/key.sh"] # 执行key.sh文件
# 2.创建镜像
docker build -t nginx:v4 .
Sending build context to Docker daemon 42.5kB
Step 1/4 : FROM nginx
---> f6d0b4767a6c
Step 2/4 : RUN echo "hello world" > /usr/share/nginx/html/index.html
---> Using cache
---> 6029ea8e6e26
Step 3/4 : ADD key.sh /root/key.sh
---> 60c29beca61b
Step 4/4 : CMD ["/root/key.sh"]
---> Running in 85f78e1423a6
Removing intermediate container 85f78e1423a6
---> 989dfe15804e
Successfully built 989dfe15804e
Successfully tagged nginx:v4
容器(Container)
容器就是运行起来的镜像,容器是镜像创建的一个实例
仓库(Repository)
Docker仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker仓库的概念跟 Git类似,注册服务器可以理解为 GitHub这样的托管服务。实际上,一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像。所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。
三者之间的关系:镜像存放在仓库,镜像可以创建容器,容器也可以打包成镜像
私有仓库
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://ebquvvbu.mirror.aliyuncs.com"],
"insecure-registries": ["IP:port"] # 私有仓库
}
安装Docker
Docker环境准备
1.下载阿里源和扩展源
wget -O /etc/yum.repos.d/Centos7.Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2.下载docker需要的依赖
yum install -y yum-utils device-mapper-persistent-data lvm2 #docker的依赖
3.添加aliyun的docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #添加阿里docker源
4.清除旧缓存,建立新缓存
yum clean all #清理旧缓存
yum makecache #生成新缓存
docker安装
1.查看系统支持的docker版本
yum list docker-ce --showduplicates | sort -r #列出所有的docker版本,选择docker的稳定版本(18.09.9)
2.选择稳定版本 --18.09.9
yum install -y docker-ce-18.09.9 docker-ce-cli-18.09.9 #安装docker的server端和client端,不指定版本默认安装最新版本
3.启动docker
systemctl start docker #启动docker
systemctl enable docker #设置开机自启
4.查看docker是否正常启动
Docker是一个C/S架构,所以它有server端和client端,Client端和Sever端都正常启动,表示docker启动正常,否则失败
docker version # 出现server端和client端表示启动成功
Client:
Version: 18.09.9 #服务端正常启动
API version: 1.39
Go version: go1.11.13
Git commit: 039a7df9ba
Built: Wed Sep 4 16:51:21 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.9 #客户端正常启动
API version: 1.39 (minimum version 1.12)
Go version: go1.11.13
Git commit: 039a7df
Built: Wed Sep 4 16:22:32 2019
OS/Arch: linux/amd64
Experimental: false
5.配置docker镜像加速器
登录你的阿里云账号—>搜索容器镜像服务—>镜像加速器
创建加速器文件
cat > /etc/docker/daemon.json << LL
{
"registry-mirrors": ["https://ebquvvbu.mirror.aliyuncs.com"]
}
LL
6.重新加载docker
systemctl daemon-reload
systemctl restart docker
Docker的生态
docker三要素:镜像仓库、镜像、容器
镜像和容器的关系
Docker的中央仓库
1.Docker官方的中央仓库:这个仓库的镜像是最全的,但是下载速度比较慢
2.国内的镜像网站:网易蜂巢(https://c.163yun.com/hub#/m/home/)、daoCloud(https://hub.daocloud.io/ )推荐使用、aliyun…
3.在公司内部会采用私服的方式拉取镜像
私服需要添加的配置
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
"insecure-registries":["ip:port"] # 私服的IP和port
}
# 重启两个服务
systemctl daemon-reload
systemctl docker restart
镜像的基本操作
镜像的查找
docker search 镜像名称 # 默认是在官方的镜像仓库查找
举例
docker search nginx #查找nginx镜像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
#镜像名称 #镜像的描述 #对镜像的评分 #是否是官方的
nginx Official build of Nginx. 14228 [OK]
拉取镜像
从镜像仓库拉取镜像到本地保存,默认都是在中央仓库拉取
docker pull 镜像名称[:tag] # 拉取镜像到本地,:tag即:+镜像版本,默认拉取的都是最新版本
举例:
docker pull nginx #拉取nginx镜像到本地 ##########拉取的版本默认是最新版本#############
Using default tag: latest
latest: Pulling from library/nginx #配置镜像加速以后下载会很快
6ec7b7d162b2: Pull complete
cb420a90068e: Pull complete
2766c0bf2b07: Pull complete
e05167b6a99d: Pull complete
70ac9d795e79: Pull complete
Digest: sha256:4cf620a5c81390ee209398ecc18e5fb9dd0f5155cd82adcbae532fec94006fb9 #镜像的地址是一个哈希值
Status: Downloaded newer image for nginx:latest
查看本地镜像
docker images # 查看本地全部镜像
举例
docker images #查看下载到本地的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
#仓库 #版本 #下载镜像的ID #创建的时间 #镜像大小
nginx latest ae2feff98a0c 2 weeks ago 133MB
ubuntu 18.04 2c047404e52d 5 weeks ago 63.3MB
删除本地镜像
删除镜像可以使用镜像的ID号、名称、名称:TAG值(当ID和名称相同的时候使用TAG值)
docker rmi 镜像名称|ID:TAG|ID # 删除本地镜像
举例:
docker rmi ae2feff98a0c #删除镜像可以指定镜像的ID或者名称,每个镜像的ID是唯一的,但是名称不是,建议使用ID删除
Untagged: nginx:latest #这里删除的是Nginx的镜像
Untagged: nginx@sha256:4cf620a5c81390ee209398ecc18e5fb9dd0f5155cd82adcbae532fec94006fb9
Deleted: sha256:ae2feff98a0cc5095d97c6c283dcd33090770c76d63877caa99aefbbe4343bdd
Deleted: sha256:782ae030602867e568a53a99643844e8b06702a851c4b0a09c817deae2520b28
Deleted: sha256:8b5b86a154fd4e4098f3f55cd5b71204560cef2e9f50e18e84ada5cb8fb3ae03
Deleted: sha256:528e7c6bece2def770f60aa8722648031a17de5e2df10e776acf955ef8ec90d0
Deleted: sha256:ffb8d6c7eb6938709ca6d1f39f58971ccc5f10372ec3e37e72c7cbc065bbfb57
Deleted: sha256:87c8a1d8f54f3aa4e05569e8919397b65056aa71cdf48b7f061432c98475eee9
镜像标签
给镜像打一个标记,来给镜像指定不同的版本
docker tag 镜像名称 仓库名称/标记名称:版本 # 为镜像打上不同的标签
举例
docker tag ubuntu aliyun/ubuntu:v1 #将ubuntu的TAG标记为v1
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aliyun/ubuntu v1 f643c72bc252 5 weeks ago 72.9MB
ubuntu latest f643c72bc252 5 weeks ago 72.9MB
#发现v1的ID和latest的ID相同,