Docker介绍和安装
docker
一、docker介绍
1.1 什么是docker
Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了Apache2.0协议,项目代码在GitHub上进行维护。Docker自开源后受到广泛的关注和讨论,以至于dotCloud公司后来都改名为DockerInc。Redhat已经在其RHEL6.5中集中支持Docker;Google也在其PaaS产品中广泛应用。Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销极低。
1.2 为何要用docker
在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;同时必须满足“任何时间任何地点”可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序的方式,快速分发部署,而这正是Docker所能够提供的最大优势。Docker提供了一种更为聪明的方式,通过容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风险。
1.3 docker与虚拟机的比较
作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机的方式相比具有如下显著优势:
1.Docker容器启动很快,启动和停止可以实现秒级,相比传统的虚拟机方式(分钟级)要快速很多。
2.Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。
3.Docker通过类似git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新。
4.Docker通过Dockerfile支持灵活的自动化创建和部署机制,可以提高工作效率,并标准化流程。
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 性能 | 接近原生 | 较好 |
| 内存 | MB级hb | GB级 |
| 硬盘适应 | MB级 | GB级 |
| 运行密度 | 单台主机支持上千个 | 单台主机支持几个 |
| 隔离性 | 安全隔离 | 完全隔离 |
| 迁移 | 优秀 | 一般 |
二、docker的概念与安装
Docker中有三个核心概念:镜像、容器和仓库
# 镜像:启动容器的模板
# 容器:对外提供服务的实列
# 仓库:存放镜像的地方
2.1 centos下安装
# 如果之前安装过docker,需要自行卸载
yum remove docker docker-common docker-selinux docker-engine -y
# 初始化系统环境
yum install -y yum-utils device-mapper-persistent-data lvm2
# 安装yum源
wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
yum clean all
yum makecache
# 安装docker
yum install docker-ce -y
# docker优化
打开阿里云官网 产品 --> 容器与中间件 --> 容器与镜像服务ACR --> 管理控制台 --> 镜像加速器 --> CentOS
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://8mh75mhz.mirror.aliyuncs.com"]
}
EOF
# 开机自启
systemctl enable --now docker
# 检查
docker info
2.2 常用的docker命令
# 下载镜像(默认到官方仓库下载)
格式:docker pull [仓库URL]/[仓库命名空间]/[仓库名称]:[版本号]
docker pull mysql:5.7
# 查看镜像
格式: docker image ls 和 docker images
参数:
-q:只显示镜像ID
[root@docker ~]# docker images -q
08b152afcfae
08b152afcfae
8cf625070931
# 查看镜像的详细信息
格式:docker inspect [镜像名称或镜像ID]
参数:
-f:格式化输出
[root@docker ~]# docker inspect -f '{{ .Id}}' 08b152afcfae
sha256:08b152afcfae220e9709f00767054b824361c742ea03a9fe936271ba520a0a4b
# 查看构建历史
格式:docker history [镜像ID|名称]
案列:
[root@docker ~]# docker history mysql:5.7
IMAGE CREATED CREATED BY SIZE COMMENT
8cf625070931 4 days ago /bin/sh -c #(nop) CMD ["mysqld"] 0B
<missing> 4 days ago /bin/sh -c #(nop) EXPOSE 3306 33060 0B
<missing> 4 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 4 days ago /bin/sh -c ln -s usr/local/bin/docker-entryp… 34B
# 搜索镜像(默认在官方镜像仓库中搜索)
格式:docker search [镜像ID|名称]
案列:
[root@docker ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15210 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2051 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 816 [OK]
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 223
linuxserver/nginx An Nginx container, brought to you by LinuxS… 149
NAME : 镜像名称
DESCRIPTION : 镜像描述
STARS : 收藏个数
OFFICIAL : 是否是官方构建镜像
AUTOMATED:是否是自构建镜像
参数:
--limit : 查询出几条
-f : 指定字段
--no-trunc :显示所有的简介
# 删除镜像
格式: docker rmi [镜像名称或ID]
参数:
-f:强制删除
[root@docker ~]# docker rmi -f nginx
Untagged: nginx:latest
Untagged: nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
# 注:当有容器正在使用镜像时,强制删除镜像,只能删除镜像的所有tag, 不会删除镜像。
# 清理镜像
格式:docker image prune
参数:
-a : 删除所有未背使用到的镜像
-f : 强制删除
# 保存镜像
# commit(将容器直接保存为镜像)
格式:docker commit [容器ID|容器名称]
案列:
[root@Centos7 ~]# docker commit -a "Alvin" -m "这是一个docker镜像" -p be3b92e2886b test:v1
sha256:4a06cd2af42877b5e2908073061f7ae1bf9e308a470bdfc0c6f906ef368aaed8
[root@Centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 4a06cd2af428 5 seconds ago 104MB
# export/import(将容器打包成镜像)
格式:docker export [容器ID] [保存的压缩包]
docker import
案列:
[root@docker ~]# docker export -o nginx.tar 578a5a5acdd6
[root@docker ~]# docker import nginx.tar nginx:latest
# save/load(将镜像打包成镜像压缩包)
格式:docker save
docker load
案例:
[root@docker ~]# docker save -o nginx-save.tar 3d5034ce1bd6
[root@docker ~]# docker load < nginx-save.tar
# 镜像标签
构成:
docker.io/library/redis:latest
docker.io : 镜像仓库的URL
library :镜像仓库命名空间
redis : 镜像名称
latest : 镜像版本号
格式:
docker tag [镜像ID] 镜像标签
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 621ceef7494a 2 months ago 104MB
nginx latest f6d0b4767a6c 2 months ago 133MB
[root@docker ~]# docker tag 621ceef7494a registry.cn-hangzhou.aliyuncs.com/alvinos/redis:v2
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 621ceef7494a 2 months ago 104MB
registry.cn-hangzhou.aliyuncs.com/alvinos/redis v2 621ceef7494a 2 months ago 104MB
nginx latest f6d0b4767a6c 2 months ago 133MB
# 登录镜像仓库
格式:docker login
注:默认情况下,docker login登录的是官方仓库,如果登录其他镜像仓库则需要指定镜像仓库的URL连接。
# 实列
[root@docker ~]# docker login registry.cn-hangzhou.aliyuncs.com
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@docker ~]# cat ~/.docker/config.json
{
"auths": {
"registry.cn-hangzhou.aliyuncs.com": {
"auth": "Z2pseXVuamlzdWFuOjEwNTE3MjI4NTNh"
}
}
参数:
--username|-u : 指定用户名
--password|-p : 指定密码
# 镜像上传
格式:docker push [仓库URL]/[仓库命名空间]/[仓库名称]:[版本号]
# 注:要想上传镜像,首先得登录镜像仓库,其次设置对应镜像仓库的tag
案列:
[root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/alvinos/redis:v2
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/alvinos/redis]
3480f9cdd491: Pushed
a24a292d0184: Pushed
f927192cc30c: Pushed
1450b8f0019c: Pushed
8e14cb7841fa: Pushed
cb42413394c4: Pushed
v2: digest: sha256:7ef832c720188ac7898dbd8d1e237b0738e94f94fc7e981cb7b8efe84555e892 size: 1572

浙公网安备 33010602011771号