文章目录
一、Docker简介
1.什么Docker?
Docker是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
简单来说Docker就是一个解决运行环境和配置问题软件容器,方便做持续集成和持续交付(CI/CD)并有助于整体发布的容器虚拟化技术
2.Docker使用的机制?
容器是使用沙箱机制,相互之间不会有任何接口(类似手机app),更重要的是容器性能开销极低,无需为其单独创建底层系统支持,多个容器可共用一个系统
3.Docker的三要素?
3.1 镜像
镜像(images):一个面向Docker容器引擎的只读模板
3.2 容器
容器 (Container):从镜像创建的运行实例
3.3 仓库
仓库 (Repository):集中保存镜像的地方;分公有和私有仓库
3.3.1 public(公有仓库)
是开放给用户使用、允许用户管理镜像的 Registry 服务
3.3.2 private(私有仓库)
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry
4.容器种类
4.1 Linux容器(LXC)
最初的Linux容器技术是Linux容器,通常称为LXC。LXC是Linux操作系统级别的虚拟化方法,用于在单个主机上运行多个隔离的Linux系统。
4.2 Docker
Docker起初是一个构建单一应用程序LXC容器的项目,它对LXC进行了多次改造,使容器更加便携和灵活使用。后来它变成了自己的容器运行环境。从较高的层次上讲,Docker是一个Linux实用程序,可以有效地创建,运送和运行容器。
5.虚拟机与容器的区别?
Docker以容器的方式实现了应用程序的隔离,隔离和安全性可以给主机上同时运行多个容器。容器时轻量级的,因为不需要要管理撑的额外负担,而时直接在主机的内核中运行。
与虚拟机相比,可以在给定的硬件组件上运行更多的容器,甚至可以在虚拟机的主机中运行docker
6.Docker的优点有什么?
6.1 更快速的交付和部署
- 对于开发与运维人员来说,最希望的就是一次创建或配置,可以在任意的地方正常运行,Docker是可以快速创建容器,快速迭代(重复反馈的活动)应用程序,并且还让整个过程全程可见,可以让使用这个应用程序的人更容易的理解它是如何创建与工作的,另外Docker容器它的启动时间是秒级的,可以大大节约开发、测试、部署的时间。
6.2 更高效的虚拟化
- Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率的虚拟化。
6.3 更轻松的迁移和扩展
- Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
6.4 更简单的管理
- 使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。并且所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
7.Docker的应用场景
- 1.Web 应用的自动化打包和发布。
- 2.自动化测试和持续集成、发布。
- 3.在服务型环境中部署和调整数据库或其他的后台应用。
- 4.从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
二、安装流程
1.安装依赖包
yum install -y yum-utils device-mapper-persistent-date lvm2
2.设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装Docker-CE(社区版docker)(在yum安装的时候,除了必要的镜像源之外,还要有以前的repo包,防止报错)
yum -y install docker-ce
在安装Docker-ce的时候可以会出现错误:container-selinux版本低或是没安装的原因
可以参考:https://blog.csdn.net/F2001523/article/details/114488938
4. 关闭防火墙、核心防护
systemcetl stop firewalld
setence 0
5.启动服务与自启动
systemctl start docker
systemctl enable docker
6.查看docker版本
docker version
7.查看docer信息
docker info
三、镜像操作
镜像加速
每个人在阿里云官网上都能找到自己的镜像加速器,请自行获取
操作方法如下:
登录以后 ,点右上角的控制台
这里能看到一个容器镜像服务
这边就是你个人的镜像加速器,如果是root登录就不用sudo
1.镜像加速
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://........."]
}
EOF
2.重新加载服务配置文件
systemctl daemon-reload
3.重启docker
systemctl restart docker
重启后再次查看docer信息可以看到最后的镜像地址变为阿里云的地址了
4.配置路由转发
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@localhost ~]# sysctl -p
[root@localhost ~]# systemctl restart docker
5.查看镜像信息(在公有仓库进行搜索)
搜索出来的镜像按热度降序排序 ,被下载最高的排在上面
docker search nginx
6.下载镜像
docker pull nginx
7.查看镜像
docker images
8.获取镜像信息
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 35c43ace9216 3 days ago 133MB
[root@localhost overlay2]# docker inspect 35c43ace9216
9.添加新标签
格式:docker tag 需要添加标签的镜像标签 新标签
[root@localhost ~]# docker tag nginx:latest nginx:new
[root@localhost ~]# docker images ##可以看到标签不一样,ID是一样的
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 35c43ace9216 2 weeks ago 133MB
nginx new 35c43ace9216 2 weeks ago 133MB
[root@localhost ~]# docker tag nginx:latest ng:wed
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 35c43ace9216 2 weeks ago 133MB
nginx new 35c43ace9216 2 weeks ago 133MB
nginx wed 35c43ace9216 2 weeks ago 133MB
10.改标签
[root@localhost ~]# docker tag nginx:latest abner/nginx:web //用户名/仓库名:镜像名
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
abner/nginx web f6d0b4767a6c 7 weeks ago 133MB
nginx latest f6d0b4767a6c 7 weeks ago 133MB
11.镜像删除
多标签时只是把别名删掉了,镜像还在
格式:docker rmi 标签/id
[root@localhost ~]# docker rmi ng:web
Untagged: ng:web
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 35c43ace9216 2 weeks ago 133MB
nginx new 35c43ace9216 2 weeks ago 133MB
[root@localhost ~]# docker rmi nginx:new
Untagged: nginx:new
删除只剩一个镜像,删除标签或id都删掉了 ,但是存在多个标签时,不能直接删掉id,并且必须把镜像生成的容器删了,才能删镜像
[root@localhost ~]# docker rmi 35c43ace9216
Untagged: nginx:latest
Untagged: nginx@sha256:f3693fe50d5b1df1ecd315d54813a77afd56b0245a404055a946574deb6b34fc
Deleted: sha256:35c43ace9216212c0f0e546a65eec93fa9fc8e96b25880ee222b7ed2ca1d2151
Deleted: sha256:61f2666cb67e4572a31412367fa44567e6ac238226385762ea65670ed39034a8
Deleted: sha256:622fb7fb6a35078e3a2d446bb0e74c6a0cd500e3a211fd17ecbbcea5377ded38
Deleted: sha256:69a8591f1aaa7d694fa79a187886f6690e6e51e8c2bc91727be01a9e87daacd2
Deleted: sha256:8a451c701633832102e10093db7545eada8e5639a1b35bb14afaf48601948802
Deleted: sha256:2edbde38832e9e0e07d113df74817dc736fd49ea2f9c0d7ce8e40e3446b49b82
Deleted: sha256:9eb82f04c782ef3f5ca25911e60d75e441ce0fe82e49f0dbf02c81a3161d1300
这样才可以删除镜像
12.镜像存储
存出镜像命名为nginx存在当前目录下 必须下载镜像才能存
格式:docker save -o 存储路径 镜像
[root@localhost ~]# docker save -o /opt/nginx nginx:latest
13.镜像载入
格式:docker load < 镜像文件
先把原镜像删了
[root@localhost ~]# docker rmi nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:aeade65e99e5d5e7ce162833636f692354c227ff438556e5f3ed0335b7cc2f1b
Deleted: sha256:c39a868aad02a383c7e490e0fc4a5b0217f667f2de764bc2755e315a5adf64a1
Deleted: sha256:1af47386c12cb24b362bd785e71058ab675fbdcbda8e7a7ba0dd10c3cff75a2a
Deleted: sha256:25ee02f9e42f8cdca7ca8bc522cb69ac4a86a55401818a13c7a01e52a81894fe
Deleted: sha256:b1d2bc3292aa3d64794f99d2885d35b454993b4af24ad350a969d27925db7ebb
Deleted: sha256:4216e20d59f9fc90bccdd14493452532806d4803a25514366de2a9c5560624d0
Deleted: sha256:d0fe97fa8b8cefdffcef1d62b65aba51a6c87b6679628a2b50fc6a7a579f764c
再载入
[root@localhost ~]# docker load < /opt/nginx
d0fe97fa8b8c: Loading layer 72.49MB/72.49MB
2baf69a23d7a: Loading layer 64.54MB/64.54MB
2f57e21e4365: Loading layer 3.072kB/3.072kB
aee208b6ccfb: Loading layer 4.096kB/4.096kB
7b5417cae114: Loading layer 3.584kB/3.584kB
Loaded image: nginx:latest
四、容器操作
1.docker create [选项] 镜像运行的程序
-i 让容器的标准输入保持打开
-t 让Docker分配一个伪终端
2.查看容器运行状态
docker ps [选项]
-a 列出所有的容器,包括未运行的容器
[root@localhost ~]# docker create -it nginx:latest /bin/bash
40f146ff983253daacf9b62baaf866a4c16074278e870ec974d7cf84ba6a0092
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40f146ff9832 nginx:latest "/docker-entrypoint.…" About a minute ago Created wonderful_swanson
此时状态为created,不能进入容器
启动容器
[root@localhost ~]# docker start 40f146ff9832
40f146ff9832
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40f146ff9832 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 15 seconds 80/tcp wonderful_swanson
容器一定要是Up状态,才能进入
[root@localhost ~]# docker exec -it 40f146ff9832 /bin/bash
root@40f146ff9832:/# exit
exit
1.容器平稳运行三步骤:下载镜像、创建容器、启动容器(一次性启动)
三合一:
[root@localhost ~]# docker run paigeeworld/centos7 /usr/bin/bash -c ls #启动容器(一次性启动)
Unable to find image 'paigeeworld/centos7:latest' locally
latest: Pulling from paigeeworld/centos7
Image docker.io/paigeeworld/centos7:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
a3ed95caeb02: Pull complete
7235103339cf: Pull complete
c962e85f182c: Pull complete
e945c72281a4: Pull complete
bd558d66c6e0: Pull complete
b6d31d07a319: Pull complete
Digest: sha256:356b32d72680f0b9e0489af16961b2c3de74e18cbd391ffcf5ab085997fedf2b
Status: Downloaded newer image for paigeeworld/centos7:latest
bin
boot
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@localhost ~]# docker images #可以看到镜像下载了
REPOSITORY TAG IMAGE ID CREATED SIZE
abner/nginx web f6d0b4767a6c 7 weeks ago 133MB
nginx latest f6d0b4767a6c 7 weeks ago 133MB
paigeeworld/centos7 latest 4cbe7aa905e7 6 years ago 382MB
[root@localhost ~]# docker ps -a #可以看到执行命令后容器关闭了
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f662b2d98587 paigeeworld/centos7 "/usr/bin/bash -c ls" 4 minutes ago Exited (0) 4 minutes ago sleepy_elgamal
40f146ff9832 nginx:latest "/docker-entrypoint.…" 11 minutes ago Up 7 minutes 80/tcp wonderful_swanson
2.容器导出
[root@localhost ~]# docker export 4cbe7aa905e7 >/opt/nginx_c
[root@localhost ~]# ls /opt
containerd nginx nginx_c rh
3.删除单个容器
[root@docker ~]# docker rm 40f146ff9832
40f146ff9832
4.容量批量删除
批量删除容器,只会删除关闭状态的容器,没有关闭的是不会删除的
[root@localhost ~]# docker stop 0ba8724a6d0e
0ba8724a6d0e
[root@localhost ~]# docker stop 40f146ff9832
40f146ff9832
[root@localhost ~]# docker ps -a | awk '{print "docker rm "$1}' |bash
Error: No such container: CONTAINER 这一行是提示行,不符合所以报错
0ba8724a6d0e
40f146ff9832
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
注意: rm后面有个空格然后跟$1,空格必须在“”内
5.容器导入(会生成镜像,而不会创建容器)
[root@localhost ~]# cat /opt/nginx_c | docker import - nginx:web
sha256:7924464f235da8258fc02712b5b0ad5ff165c81d85a149390057a43660c3b207
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx web 7924464f235d 8 minutes ago 0B
abner/nginx web f6d0b4767a6c 7 weeks ago 133MB
nginx latest f6d0b4767a6c 7 weeks ago 133MB
paigeeworld/centos7 latest 4cbe7aa905e7 6 years ago 382MB
进程放在后台运行
[root@localhost ~]# docker run -itd centos:7 /bin/bash
Unable to find image 'centos:7' locally
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Downloaded newer image for centos:7
914f455fb7c3bef0ea80f181fe2e926ae0096b7fb85074da01e80cc540c4caaa
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
914f455fb7c3 centos:7 "/bin/bash" About a minute ago Up About a minute recursing_banzai