前言
只有光头才能变强。
想要自强必先什么?当然是学习了!!
估计大家也可能听过Docker这项技术(在论坛上、招聘技能上、交流群上等等),要是不了解Docker,都不好意思在网上冲浪的时候吹牛逼了。
所以这几天学了一下Docker,总结了Docker入门的相关知识,分享给大家(好让我们一起吹牛逼)。
一:什么是Docker?
Docker是Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。
Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
二、Docker的概念
Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为集装箱化。使用docker轻松部署应用程序。
2.1:Docker的核心概念
- 镜像
一个面向Docker容器引擎 的只读模板
- 容器
从镜像创建的运行示例
-
仓库
-
【公有】:Docker官网提供
-
【私有】:自己搭建的
集中保存镜像的地方
2.2:Centos安装Docker的两种方式
-
使用CURL获得的Docker的安装脚本啊进行安装
-
使用YUM仓库来安装Docker
2.1:集装箱化的优点:
- 灵活:即使是复杂的应用程序也可封装。
- 轻量级:容器利用并共享主机内核。
- 便携式:您可以在本地构建,部署到云上并在任何地方运行。
- 可扩展性:您可以增加和自动分发容器副本。
- 可堆叠:您可以垂直堆叠服务并及时并及时堆叠服务。
2.:3:images和容器
通过运行images启动容器,一个images是一个可执行的包,其中包括运行应用程序所需要的所有内容-代码,运行时,库、环境变量和配置文件。
容器时images运行时示例-当被执行时(即,images状态,或者用户进程)在内存中,可以使用命令查看正在运行容器的列表docker
ps,就像在Linux中一样。
三:虚拟机
虚拟机(virtual
machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统。应用程序对此毫无感知,因为虚拟机看上去跟真丝系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其它部分毫无影响。
3.1:虚拟机的缺点:
- 资源占用多:虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有1M,虚拟机依然需要几百MB的内容才能运行。
- 冗余步骤多:虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
- 启动慢:启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用陈故乡才能真正运行。
四:Linux容器
由于虚拟机存在这个缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写为LXC)。
Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。由于容器是进程级别的,相比虚拟机又很多优势。
- 启动快:容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
- 资源占用少:容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所以资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
- 体积小:容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
五:容器和虚拟机对比
一个容器中运行原生Linux和共享主机与其它容器的内核,它运行一个独立的进程,不占用任何其它可执行文件的内存,使其轻量化。
相比之下,虚拟机(VM)运行一个完整的“客户”操作系统,通过虚拟机管理程序虚拟访问主机资源。一般来说,虚拟机提供的环境比大多数应用程序需要的资源多。
六:Docker安装与优化
1.安装环境
#yum utils提供yum-config-manager
#device mapper存储驱动需要device-manager-persistent-data和lvm2
#device Mapper是Linux2.6内核中支持逻辑卷管理的通用设备映射机制
它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
2.设置阿里云镜像源
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看一下yum仓库
[root@localhost ~]# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-Media.repo docker-ce.repo
CentOS-Debuginfo.repo CentOS-Sources.repo
3.设置防火墙规则
[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -t nat -F
4.安装Docker-CE
[root@localhost ~]# yum -y install docker-ce
5.启动服务设置开机自启
[root@localhost ~]# systemctl start docker.service
[root@localhost ~]# systemctl enable docker.service
已经安装完成但是你用的时候特别不舒服,下载镜像等特别慢,我们需要用到阿里云的镜像加速来实现下载提速
6.1:镜像加速
1.打开阿里云官网----》搜索"镜像加速"
- 镜像加速
[root@localhost ~]# cd /etc/docker/ '//切换到加速目录'
[root@localhost docker]# ls
key.json
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://rsezwjwx.mirror.aliyuncs.com"]
}
EOF
#使系统重新加载
[root@localhost docker]# systemctl daemon-reload
#重启docker服务
[root@localhost docker]# systemctl restart docker.service
6.2:网络优化
#开启路由转发
[root@localhost docker]# vim /etc/sysctl.conf
'//编写'
net.ipv4.ip_forward=1
#使命令生效
[root@localhost docker]# sysctl -p
[root@localhost docker]# service network restart
Restarting network (via systemctl): [ 确定 ]
[root@localhost docker]# systemctl restart docker.service
七:Docker基本操作
7.1:Docker镜像常用命令
docker version #查看docker版本
docker search #搜索镜像
docker images #查看镜像列表
docker history #查看镜像制作历史
docker inspect #查看镜像底层信息
docker pull #下载镜像
docker push #上传镜像
docker rmi #删除本地镜像
docker save #镜像另存为tar包
docker load #使用tar包导入镜像
docker tag #添加新镜像名称和标签
1.查看docker版本
[root@localhost docker]# docker version
2.搜索镜像:docker search 镜像名称
docker search 关键字
示例
#搜索nginx镜像(工业仓库)
[root@localhost docker]# docker search nginx
3.获取镜像
docker pull 仓库名称:[:标签]
- 【stars-星级 代表镜像的使用率】
#下载nginx镜像
[root@localhost docker]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
d121f8d1c412: Pull complete
ebd81fc8c071: Pull complete
655316c160af: Pull complete
d15953c0e0f8: Pull complete
2ee525c5c3cc: Pull complete
Digest: sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
#下载内核
[root@localhost docker]# docker pull busybox
#查看镜像列表
[root@localhost docker]# docker images '//两个镜像已经被I下载好了 '
名称 标签 ID等于身份证号 创建时间 文件大小
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
//9days ago:表示该镜像是官网9天前更新的
镜像是面向docker引擎提供的模板,想要它提供服务要把它装在容器里运行起来所以要启动
下载后存放在/var/lib/docker
[root@localhost docker]# cd /var/lib/docker/image/overlay2/
[root@localhost overlay2]# ls
distribution imagedb layerdb repositories.json //在repositories.json是秘文
4.查看镜像详细信息
docker images 仓库名称[:标签]
docker inspect 镜像ID号
示例
[root@localhost overlay2]# docker inspect nginx:latest
....省略信息.....
5.添加新镜像标签
docker tag 名称[:标签] 新名称[:新标签]
示例
'//基于lastest为副本 复制了一个信息 并不是修改是增加了一个镜像标签 相当于重命名'
[root@localhost overlay2]# docker tag nginx:latest nginx:web
[root@localhost overlay2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
nginx web 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
'//查看标签'
[root@localhost overlay2]# docker images | grep nginx
nginx latest 7e4d58f0e5f3 9 days ago 133MB
nginx web 7e4d58f0e5f3 9 days ago 133MB
6.删除镜像
docker rmi 仓库名称[:标签]
或
docker rmi 镜像ID号
示例:
#删除容器不用加i 删除镜像要加i
[root@localhost overlay2]# docker rmi nginx:web
Untagged: nginx:web
#已经删除
[root@localhost overlay2]# docker images | grep nginx
nginx latest 7e4d58f0e5f3 9 days ago 133MB
#在添加便签
[root@localhost overlay2]# docker tag nginx:latest nginx:web
#查看
[root@localhost overlay2]# docker images | grep nginx
nginx latest 7e4d58f0e5f3 9 days ago 133MB
nginx web 7e4d58f0e5f3 9 days ago 133MB
#删除ID呢?
[root@localhost overlay2]# docker rmi 7e4d58f0e5f3
Error response from daemon: conflict: unable to delete 7e4d58f0e5f3 (must be forced) - image is referenced in multiple repositories
#我们单独把nginx:web镜像删除
[root@localhost overlay2]# docker rmi nginx:web
Untagged: nginx:web
#再去删除ID就可以删除了 说明了什么??
[root@localhost overlay2]# docker rmi 7e4d58f0e5f3
Untagged: nginx:latest
Untagged: nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Deleted: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d
Deleted: sha256:eedfd37abc0b05520a719addf6675b372687fe9a2ed1746fa988335720
多个别名的镜像不支持删除ID删除;如果有别名的镜像,要先把别名的镜像删除才能用ID删除
[root@localhost overlay2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 6858809bf669 11 days ago 1.23MB
7.存出镜像
docker save -o 存出文件名 存出的镜像
示例:
#导出到家目录命名为shuai
[root@localhost ~]# docker save -o shuai nginx:latest
#查看 可以发现shuai已经存在了
[root@localhost ~]# ll -h
总用量 131M
-rw-------. 1 root root 2.1K 6月 17 23:17 anaconda-ks.cfg
-rw-r--r--. 1 root root 2.1K 6月 17 23:17 initial-setup-ks.cfg
-rw-------. 1 root root 131M 9月 20 10:57 shuai
#我们直接删除nginx:latest
[root@localhost ~]# docker rmi nginx:latest
Untagged: nginx:latest
#查看一下 已经删除
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 6858809bf669 11 days ago 1.2
8.载入镜像
docker load --input 存出文件名
或docker load < 存出文件名
示例:
[root@localhost ~]# docker load < shuai
07cab4339852: Loading layer 72.49MB/72.49MB
f431d0917d41: Loading layer 64.31MB/64.31MB
60c688e8765e: Loading layer 3.072kB/3.072kB
eabfa4cd2d12: Loading layer 4.096kB/4.096kB
908cf8238301: Loading layer 3.584kB/3.584kB
Loaded image: nginx:latest
#再次查看镜像列表 已经恢复
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.2
9.上传镜像
docker push 仓库名称[:标签]
示例:
#上传镜像
"改标签"
docker tag nginx:latest abner/nginx:web "用户名abner/仓库名:镜像名
"登陆"
docker logion
Username: docker
password
Email: xxx@xxx.com
"上传"
docker push abner/nginx:web
八:容器的操作
docker create -it #创建容器;-i让容器的标准输入打开,-t让docker分配一个伪终端
docker run #运行容器
docker ps #查看容器列表
docker stop #关闭容器
docker start id #启动容器
docker restart #重启容器
docker attach|exec #进入容器
docker inpect #查看容器底层信息#
docker top #查看容器进程列表
docker export id > nginx-am #保存容器到本地#
cat nginx-am|docker import - nginx:web "从本地导入容器
容器" "容器要先关闭,才能删除
1.查看容器运行状态
docker ps 【选项】
-a 列出所有的容器,包括未运行的容器
- 里面是空的
[root@localhost ~]# docker ps -a
容器ID 来源镜像 执行指令
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2.容器创建
docker create【选项】镜像运行的程序
-i:让容器的标准输入保持打开
-t:让Docker分配一个伪终端
示例
[root@localhost ~]# docker create -it nginx:latest /bin/bash
c189193d23c440dc0f3ffaeba5d9eb4264df27efd62be1df1d2a232d6a308ee3
#查看容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c189193d23c4 nginx:latest "/docker-entrypoint.…" About a minute ago Created infallible_ishizaka
'//状态为Created'
#启动容器
[root@localhost ~]# docker start c189193d23c4
c189193d23c4
#查看容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c189193d23c4 nginx:latest "/docker-entrypoint.…" 4 minutes ago Up About a minute 80/tcp infallible_ishizaka
'//状态为UP 对内端口号为80'
[root@localhost ~]# ifconfig '//会生成一个新的网卡 充当着容器的网关 容器互联都依赖于docker0'
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:91ff:fe2a:3c5c prefixlen 64 scopeid 0x20<link>
ether 02:42:91:2a:3c:5c txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1768 (1.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3.启动执行命令查看系统跟目录
- 方法一
[root@localhost ~]# docker pull centos:7
[root@localhost ~]# docker create -it centos:7 /bin/bash
#查看容器列表
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
869e0c852bb8 centos:7 "/bin/bash" 40 seconds ago Created gallant_shtern
c189193d23c4 nginx:latest "/docker-entrypoint.…" 16 minutes ago Up 12 minutes 80/tcp infallible_ishizaka
#启动容器
[root@localhost ~]# docker start 869e0c852bb8
869e0c852bb8
#关闭容器
[root@localhost ~]# docker stop 869e0c852bb8
#执行完成直接关闭 状态是Exited
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
869e0c852bb8 centos:7 "/bin/bash" 4 minutes ago Exited (137) About a minute ago gallant_shtern
c189193d23c4 nginx:latest "/docker-entrypoint.…" 20 minutes ago Up 17 minutes 80/tcp infallible_ishizaka
#删除容器 rm后面加id
[root@localhost ~]# docker rm 869e0c852bb8
869e0c852bb8
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c189193d23c4 nginx:latest "/docker-entrypoint.…" 23 minutes ago Up 20 minutes 80/tcp infallible_ishizaka
- 方法二
[root@localhost ~]# docker run centos:7 /bin/bash -c ls / -c:执行命令
'//持续在后台执行'
[root@localhost ~]# docker run /centos7 /user/bin/bash -c "while true;do echo hello;done"
'//终止运行'
[root@localhost ~]# docker stop
a3db11ea9c0d
4.进入容器
docker exec [选项]容器的ID/名称 /bin/bash
示例:
#启动容器
[root@localhost ~]# docker start 835fe0ae1a70
#进入容器 前提是UP状态!!
[root@localhost ~]# docker exec -it 835fe0ae1a70 /bin/bash
[root@835fe0ae1a70 /]#
#离开容器
[root@835fe0ae1a70 /]# exit
exit
5.容器导出
docker export 容器的ID/名称 > 文件名
示例
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
835fe0ae1a70 centos:7 "/bin/bash" 11 minutes ago Up 10 minutes heuristic_davinci
c189193d23c4 nginx:latest "/docker-entrypoint.…" 59 minutes ago Up 55 minutes 80/tcp infallible_ishizaka
#把nginx容器导入到opt命名为mei
[root@localhost ~]# docker export c189193d23c4 > /opt/mei
[root@localhost ~]# ll -h /opt
-rw-r--r--. 1 root root 129M 9月 20 12:18 mei //导出成功
6.导入容器
cat 文件名| docker import -生成的镜像名称:标签
示例:
#会生成镜像,而不会创建容器
cat nginx-am|docker import - nginx:web
7.删除容器
docker rm [选项]容器的ID/名称
示例
[root@localhost ~]# docker stop 835fe0ae1a70 #不是不是运行状态才能删除
835fe0ae1a70
[root@localhost ~]# docker rm 835fe0ae1a70
835fe0ae1a70
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c189193d23c4 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp infallible_ishizaka
8.批量删除
docker ps -a | awk '{print "docker rm "$1}'|bash
- 基于镜像容器在,就删不掉镜像,除非把容器删掉,才能删除镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c189193d23c4 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp infallible_ishizaka
[root@localhost ~]# docker rmi 7e4d58f0e5f3
Error response from daemon: conflict: unable to delete 7e4d58f0e5f3 (cannot be forced) - image is being used by running container c189193d23c4
#现在我们把容器删掉
[root@localhost ~]# docker rm c189193d23c4
#在删除
[root@localhost ~]# docker rmi 7e4d58f0e5f3
#查看镜像列表
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 6858809bf669 11 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
9.创建交互式容器
#创建交互式容器
docker container run -it id "i表示交互式 t表示开启新的终端"
#创建守护式容器
docker run -d --name="nginx" nginx:1.14 "-d 表示守护式 如果没有这个镜像会自动Pull 拉取命令
#交互式的容器用于: 工具类: 开发,测试,临时性的任务()
#守护式容器用于: 服务器上 网络服务
#把容器的80端口映射到外部的8080端口提供外部访问
docker container run -d -p 8080:80 --name="nginx" nginx:1.14
docker container run -d -p 10.0.0.100:8081:80 --name='n3' nginx:1.14 "映射到外部801"
#演示
[root@localhost ~]# docker container run -d -p 8080:80 nginx:latest
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f6af8b72b306 nginx:latest "/docker-entrypoint.…" 31 seconds ago Up 30 seconds 0.0.0.0:8080->80/tcp crazy_rosalind
感谢观看,欢迎评论