Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
一、Docker 架构
Docker 包括三个基本概念:
●镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
●容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
●仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
1.1:容器与虚拟机的区别
二、docker安装:
1.安装依赖包
[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
yum-utils 提供了yum-config-manager
●Device mapper:存储驱动程序需要device-mapper-persistent-data lvm2
●Device mapper是Liunx2.6内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构
2.设置阿里云镜像资源,下载一个docker-ce
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装docker-ce,并启动
[root@localhost ~]# yum -y install docker-ce
[root@localhost ~]# systemctl start docker.service ##开启docker
4.配置镜像加速,用浏览器打开阿里云官网
5.回到虚拟机在/etc目录下配置镜像加速,并重新加载
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
6.镜像加速
使用刚才在阿里云官网的加速,每个人都有不同的
7.配置网络优化
[root@localhost docker]# vim /etc/sysctl.conf ##开启路由功能
net.ipv4.ip_forward=1 ##底行加入
[root@localhost docker]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost docker]# service network restart ##重启网络功能
[root@localhost docker]# systemctl restart docker ##重启服务
到此docker就安装完成了
2.1:镜像基础命令操作
查看版本
[root@localhost docker]# docker version
Client: Docker Engine - Community
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:03:45 2020
OS/Arch: linux/amd64
Experimental: false
省略....
搜索nginx镜像
[root@localhost docker]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 13757 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1876 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 787 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 128
下载nginx镜像
[root@docker ~]# docker pull nginx
在下载的时候是分成若干个部分进行下载的,AUFS(联合文件系统)
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
下载后存放在/var/lib/docker中
查看下载的镜像列表
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
其中TAG为标签,在准备私有仓库的时候有用,ID为镜像id号
查看镜像信息
[root@docker ~]# docker inspect 7e4d58f0e5f3(ID号)或者
[root@localhost ~]# docker inspect nginx:latest
添加新标签
复制了一份,只是标签不同
[root@localhost ~]# docker tag nginx:latest nginx:web
[root@localhost ~]# 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
删除镜像
删除镜像可以使用标签,也可以使用ID,在使用ID的时候,如果有多个标签不同的相同镜像,则无法删除,关于镜像删除,只要镜像在容器中就不可以被删除,不管容器是运行还是停止状态
[root@docker ~]# docker rmi nginx:latest
Untagged: nginx:latest
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx web 7e4d58f0e5f3 8 days ago 133MB
[root@docker ~]# docker pull nginx
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 8 days ago 133MB
nginx web 7e4d58f0e5f3 8 days ago 133MB
使用ID删除时报错
[root@docker ~]# docker rmi 7e4d58f0e5f3
Error response from daemon: conflict: unable to delete 7e4d58f0e5f3 (must be forced) - image is referenced in multiple repositories
存出镜像
存出镜像nginx:latest到当前目录下名为nginx
[root@localhost ~]# docker save -o /opt/nginx nginx:latest
[root@localhost ~]# ls /opt
containerd nginx rh
[root@localhost ~]# ll -h /opt
总用量 131M
drwx--x--x. 4 root root 28 9月 20 12:23 containerd
-rw-------. 1 root root 131M 9月 20 13:32 nginx
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
载入镜像
[root@localhost ~]# docker load < /opt/nginx
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
三、Docker基础操作
创建容器
[root@localhost ~]# docker create -it nginx:latest /bin/bash
eecc6eff0159101940b2029d83877227af216e4319496d5278e5fe9154e59095
查看容器状态
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eecc6eff0159 nginx:latest "/docker-entrypoint.…" 9 seconds ago Created sleepy_rhodes
启动容器
[root@localhost ~]# docker start eecc6eff0159
eecc6eff0159
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eecc6eff0159 nginx:latest "/docker-entrypoint.…" About a minute ago Up 2 seconds 80/tcp sleepy_rhodes
查看网卡信息
●在创建容器之后会有一个docker0的网卡,供docker连接
[root@localhost ~]# ifconfig
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:7eff:fe0b:9c27 prefixlen 64 scopeid 0x20<link>
ether 02:42:7e:0b:9c:27 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1784 (1.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在上面的操作中,启动容器的步骤有三个,下载镜像->创建容器->开启容器
[root@docker ~]# docker search centos7
paigeeworld/centos7
[root@docker ~]# dcoker pull paigeeworld/centos7
[root@docker ~]# docker create -it paigeeworld/centos7 /bin/bash
[root@docker ~]# docker start 44d19a107964
使用run命令可涵盖这三个步骤
-c 后跟指令查看根目录
[root@localhost ~]# docker run centos:7 /bin/bash -c ls /
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
查看状态,可看到状态为退出,执行完任务后就自动退出了,释放了资源
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
673259bb2525 centos:7 "/bin/bash -c ls /" 32 seconds ago Exited (0) 31 seconds ago cranky_northcutt
如果希望一直在后台运行的话
run -d表示在后台运行并打印ID号,
[root@localhost ~]# docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
b6a6d7681d0dbeca81916d43ea2b6bb56cb221e7707e78b010d1c13f25c3368c
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6a6d7681d0d centos:7 "/bin/bash -c 'while…" 10 seconds ago Up 9 seconds angry_rhodes
终止镜像运行
[root@localhost ~]# docker stop b6a6d7681d0d
b6a6d7681d0d
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6a6d7681d0d centos:7 "/bin/bash -c 'while…" 2 minutes ago Exited (137) 4 seconds ago angry_rhodes
进入容器
[root@localhost ~]# docker ps -a 容器一定要是up状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9ad5d33ae4f centos:7 "/bin/bash" 26 seconds ago Up 1 second boring_hoover
b6a6d7681d0d centos:7 "/bin/bash -c 'while…" 4 minutes ago Exited (137) 2 minutes ago angry_rhodes
673259bb2525 centos:7 "/bin/bash -c ls /" 8 minutes ago Exited (0) 8 minutes ago cranky_northcutt
b89b7044bbd6 nginx:latest "/docker-entrypoint.…" 49 minutes ago Exited (0) 20 minutes ago fervent_ritchie
[root@localhost ~]# docker exec -it f9ad5d33ae4f /bin/bash
[root@f9ad5d33ae4f /]#
[root@f9ad5d33ae4f /]# exit
exit
[root@localhost ~]#
exit退出
容器导出
[root@localhost ~]# docker export b89b7044bbd6 > /opt/nginx_c
[root@localhost ~]# cd /opt
[root@localhost opt]# ls
containerd nginx nginx_c rh
容器导入(会生成镜像,而不会创建容器)
[root@localhost opt]# cat nginx_c |docker import - nginx:abc
sha256:cad91aaab6a8ebc3ff50e52f181df8283ccd151b95cb4fa84ea209e61755e0c4
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx abc cad91aaab6a8 16 seconds ago 131MB
nginx latest 7e4d58f0e5f3 10 days ago 133MB
busybox latest 6858809bf669 12 days ago 1.23MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
删除容器
删除容器不能删除正在运行的容器,要先终止运行stop
[root@docker ~]# docker rm a3d5f5a4247a
批量删除容器
[root@localhost opt]# docker ps -a | awk '{print "docker rm "$1}' | bash
Error: No such container: CONTAINER
Error response from daemon: You cannot remove a running container f9ad5d33ae4f9bf2f7bd72cb55af9856084c3455e7facf550e7e58072bef977f. Stop the container before attempting removal or force remove
b6a6d7681d0d
673259bb2525
b89b7044bbd6
[root@localhost opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9ad5d33ae4f centos:7 "/bin/bash" 31 minutes ago Up 31 minutes boring_hoover
删除了stop状态的容器,up状态的不能被删除