本文主要是介绍Docker基础(小白篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、Docker 概述
1、docker 是什么,有啥用?
我们先来回顾一下传统的产品开发上线涉及到的难点。一款产品从开发到上线,经历了开发环境、测试环境、生产环境等不同的操作系统、运行环境和应用配置等环境。在项目管理中,还涉及到不同版本以及不同版本之间兼容性等问题。
这些问题对开发人员和运维人员都是极大的考验,同时对各方的协作也有一定的要求。不然就会出现"代码在我这里运行的好好的呀",这种尴尬的局面。而 Docker 的出现就是提供了一套用来解决此类问题的标准解决方案。
Docker 的口号是"一次创建或配置,可以在任意地方正常运行"。Docker 可以理解为:软件是带环境安装的,也就是说,安装的时候把原始环境一模一样的复制过来一份。这样也就消除了不同机器运行结果不同的问题。
那么,Docker 是什么呢?Docker 是一个开源的应用容器引擎,Go 语言开发,并遵从 Apache2.0 协议开源。它可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 可用于开发应用、交付应用、运行应用等场景。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。Docker 允许用户将基础设施中的应用单独分割出来,形成更小的部分容器,从而提高软件交付速度。
2、docker 有什么优势?
有小伙伴会发现,docker 容器与我们常用的虚拟机比较相似,都是虚拟化容器技术,可以做到把容器里的应用和主机相隔离,认为 docker 容器就是一种轻量版虚拟机,如果仅以隔离性角度来看,确实可以这么理解,但 docker 容器底层与虚拟机底层还是有区别的;传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件的虚拟,如下图的虚拟机架构与 docker 容器的架构:
由此可知,docker 容器比虚拟机在底层运作至少少了一层虚拟操作系统层,所以 docker 容器要比传统虚拟机更为轻便。每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源,能更加高效的利用系统资源,启动的时间也个更快,且便于迁移与部署。
3、docker 架构
docker 的基本组成是由镜像(image)、容器(container)、仓库(registry)构成,三者关系如下图:
docker 镜像(image):是一个只读的模板,是文件与元数据的集合,docker 镜像是基于分层实现的,每一层都可以增删文件而形成新的镜像,使用Dockerfile 脚本可将基础镜像制作自定义镜像。
docker 容器(container):是基于镜像生成运行的实例,是个可读写的文件,容器也可以提交制作成镜像。
docker 仓库(registry):仓库是存放 docker 镜像的地方,可分私有仓和共有仓,docker 最大的共有仓是 DockerHub,也可以搭建自己个人私有仓来存放自己的镜像,下面是提交镜像到 DockerHub 的模板:
## DockerHub注册地址:https://registry.hub.docker.com/
## 登录仓库:
[root@VM121 ~]# docker login
## 将本地镜像提交到公有仓:
[root@VM121 ~]# docker push <镜像名:[TAG]>
## 退出登录:
[root@VM121 ~]# docker logout
二、Docker 安装
1、安装前准备
## 创建对应的 docker 目录:
[root@VM121 ~]# mkdir -p /etc/docker /opt/docker
## 删除原先的Docker:
[root@VM121 ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine docker-engine-selinux docker-selinux docker-ce
## 安装yum工具包:
[root@VM121 ~]# yum install -y yum-utils
2、安装 Docker
## 自动化安装Docker:(使用阿里云镜像)
[root@VM121 ~]# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
3、配置国内镜像加速器
由于 DockerHub 属于国外仓库,在镜像的搜索和拉取如果都往 DockerHub 来,速度会巨慢而且容易掉线,而国内就有众多云服务厂商提供国内的镜像仓,比较著名的如阿里云、网易等等,下面是地址:
阿里云个人专属镜像加速器注册地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,支付宝账号登录即可:
其他云服务厂商提供的国内镜像加速器地址:
- Docker 官方中国区:https://registry.docker-cn.com
- 网易:https://hub-mirror.c.163.com
- 科大镜像:https://registry.docker-cn.com
将加速器地址配置进daemon.json文件:
## 将加速器地址配置进daemon.json文件:
[root@VM121 ~]# vim /etc/docker/daemon.json
文件一般是没有的,需要自己创建并写入以下内容:
{
"registry-mirrors": ["https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"
],
"data-root": "/opt/docker"
}
4、Docker 服务启停
## 加载加速器:
[root@VM121 ~]# systemctl daemon-reload
## 开启 docker 服务:
[root@VM121 ~]# systemctl start docker.service
## 配置开机自启:
[root@VM121 ~]# systemctl enable docker.service
## 查看 docker 服务状态:
[root@VM121 ~]# systemctl status docker.service
## 查看docker进程:
[root@VM121 ~]# ps -ef | grep docker
5、Docker 一键安装脚本
综上,可直接执行脚本,进行一键完成自动化安装 Docker :
[root@VM121 ~]# vim docker-install.sh && chmod 775 docker-install.sh
#!/bin/bash
## docker 安装目录:
DOCKER_HOME="$1"## 创建对应的 docker 目录:
mkdir -p /etc/docker "$DOCKER_HOME" ## 删除原先的Docker:
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine docker-engine-selinux docker-selinux docker-ce
## 安装yum工具包:
yum install -y yum-utils## 自动化安装Docker:(使用阿里云镜像)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun## 配置国内镜像加速器:
echo "{
\"registry-mirrors\": [\"https://registry.docker-cn.com\", \"http://hub-mirror.c.163.com\", \"https://docker.mirrors.ustc.edu.cn\"
],
\"data-root\": \"$DOCKER_HOME\"
}" > /etc/docker/daemon.json## 加载加速器:
systemctl daemon-reload
## 开启 docker 服务:
systemctl start docker.service
## 配置开机自启:
systemctl enable docker.service
## 查看 docker 服务状态:
systemctl status docker
exit 0
## 执行脚本完成安装:
[root@VM121 ~]# ./docker-install.sh /opt/docker
## 查看docker进程:
[root@VM121 ~]# ps -ef | grep docker
查看到有 docker 进程后,就可以使用 docker 愉快的玩耍了。
三、Docker 基本使用技巧
1、镜像管理
1)镜像搜索:
[root@VM121 ~]# docker search <镜像名称或关键词>
## 如:搜索centos7.6镜像:
[root@VM121 ~]# docker search centos7.6
2)镜像拉取 :
[root@VM121 ~]# docker pull <镜像名称>
## 如拉取所搜索到的vitotp/centos7.6镜像:
[root@VM121 ~]# docker pull vitotp/centos7.6
3)镜像删除:
## 格式:docker rmi -f <镜像ID1> [<镜像ID2>...]
[root@VM121 ~]# docker rmi -f mysql:8.0.30
4)重命名镜像:
[root@VM121 ~]# docker image tag <原镜像名称或原镜像ID> <新镜像名称:[TAG]>
## 删除vitotp/centos7.6镜像:
[root@VM121 ~]# docker image tag vitotp/centos7.6 myos7.6:v1.0
5)查看本地镜像:
[root@VM121 ~]# docker images
6)推送镜像:
## 登录仓库:
[root@VM121 ~]# docker login
## 将本地镜像提交到公有仓:
[root@VM121 ~]# docker push <镜像名:[TAG]>
## 退出登录:
[root@VM121 ~]# docker logout
7)Dockerfile 脚本制作新镜像:
以构建一个centos7.6带 ssh 服务的操作系统镜像为例
## 查看本地镜像:
[root@VM121 ~]# docker images
## 创建并编写Dockerfile脚本:
[root@VM121 ~]# cat ~/Dockerfile ## 基础镜像源:
FROM vitotp/centos7.6
## 运行命令:(配置ssh)
RUN yum -y install openssh-server openssh-clients lrzsz firewalld firewall-config sudo && sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config && echo "root:qwerty"|chpasswd && echo "root ALL=(ALL) ALL" >> /etc/sudoers && ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key && mkdir /var/run/sshd
## 声明默认开启的端口:
EXPOSE 22
## 容器开机启动服务:
CMD ["/usr/sbin/sshd","-D"]## 使用Dockerfile脚本构建新镜像:
[root@VM121 ~]# docker build -t myhadoop3-el7 ~
## 查看本地镜像:
[root@VM121 ~]# docker images
8) 镜像保存为镜像文件:(对本地镜像的导出)
## 将mysql镜像打包成tar文件:
## 格式: docker save -o 打包文件名 镜像名
[root@VM121 ~]# docker save -o mysql8.tgz mysql:8.0.30
9) 镜像文件包导入镜像:(对外部镜像导入本地镜像)
## 将mysql8.tar包导入镜像:
## 格式1: docker load -i 打包文件名
[root@VM121 ~]# docker load < mysql8.tgz
2、容器管理
1)后台启动运行 docker 容器服务端:
[root@VM121 ~]# docker run -d -v <主机映射目录>:<容器目录> -p <主机映射端口>:<容器端口> -h <容器hostname> --name <容器别名> --privileged <镜像ID> /sbin/init
## 如运行MySQL容器:
[root@VM121 ~]# docker run -d -m 8g -v /opt/mysql/data:usr/local/mysql/data -p 3306:3306 -h MYSQL --name mysql --privileged 2dff4a1cc153 /sbin/init
-d 参数是容器后台启动;-m 参数是限制容器使用内存大小;-v 参数是容器挂载的宿主机目录或数据卷(格式:-p 宿主机目录:容器目录);-p 参数是端口映射(格式:-p 宿主机端口:容器端口);-h 参数是容器主机名;--name 参数是容器名;--privileged 参数是容器是否使用系统root权限,指定后默认为true;/sbin/init 参数是指定容器可用的系统性命令。
2)查看容器运行状态:
[root@VM121 ~]# docker ps -a
3)进入 docker 容器客户端交互环境:
## 指定交互shell环境解释器进入容器客户端:
## 格式1:docker exec -it <容器名字或容器ID> /bin/bash
## 格式2:docker attach <容器名字或容器ID> /bin/bash
[root@VM121 ~]# docker exec -it mysql /bin/bash
4) 退出容器交互:
执行exit命令或快捷键Ctrl+p+q方式退出;一般情况下建议使用exec方式进入容器,原因是attach是直接进入容器而不启动新的进程,在使用exit命令退出容器后,容器进程也会随之关闭;exec方式是会新启动一个会话进程,exit命令退出后,容器不会关闭;快捷键Ctrl+p+q方式退出则都不会关闭容器。
5)容器提交成镜像:
## 容器提交镜像:
[root@VM121 ~]# docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名:[TAG]
## 如:将本地的MySQL容器提交镜像:
[root@VM121 ~]# docker commit -m="mysql8镜像" -a="QIQI" 2dff4a1cc153 mysql8-el7:v1.2
6) 容器导出成容器文件:(对本地容器导出成文件,容器需要关闭状态)
## 格式:docker export <容器ID> > 包名
[root@VM121 ~]# docker export 28h8f87w3h > mysql8.tgz
7) 容器文件导入成本地镜像文件:
## 格式:docker import 包名 镜像名
[root@VM121 ~]# docker import mysql8.tgz mysql:8.0.30
四、数据卷
使用docker会碰到一个问题,在容器里创建的文件跑的数据,在容器服务重启后,数据消失了!!这是因为容器是无状态的。容器内的文件系统是临时的,意味着在容器重启时,文件系统会被重置为初始状态。因此需要长期跑重要数据的容器,特别是容器里的数据库,就需要挂数据卷来对数据持久化。docker数据卷就是宿主机中的一个目录或者文件,容器挂载宿主机目录就相当于在容器和宿主机创建个共享文件夹,即使容器被删掉,不清理容器所属数据卷的情况下,所挂目录也依旧会存在;一个数据卷可支持多个容器共享。
1、数据卷管理
1) 创建数据卷:
[root@VM121 ~]# docker volume create mysqldata
2) 查看数据卷信息:
## 查看数据卷:
[root@VM121 ~]# docker volume ls
## 查看数据卷详细信息:
[root@VM121 ~]# docker volume inspect mysqldata
3) 删除数据卷:
## 删除:
[root@VM121 ~]# docker volume rm
## 清除无容器挂载的数据卷:
[root@VM121 ~]# docker volume prune
## 删除容器同时清除所属数据卷:
[root@VM121 ~]# docker rm -v mysql8
2、数据卷使用
## 创建一个MySQL容器,将数据卷mysqldata挂载到MySQL容器上:
[root@VM121 ~]# docker run -d -p 122:22 -p 3306:3306 -p 8080:8080 -v mysqldata:/opt/mysql -v /sys/fs/cgroup:/sys/fs/cgroup -h MYSQL --name=mysql --privileged=true e0bd4fea7682 /usr/sbin/init
-v 参数可直接挂数据卷,也可以直接挂宿主机目录。
五、docker网络
1、容器网络类型
网络模式 | 说明 |
bridge | 桥接模式,系统会默认给容器创建的网络模式,容器通过连接到宿主机docker0的虚拟网桥上对外通信 |
host | 主机模式,容器直接使用宿主机现有网卡 |
container | 容器共享网络模式,容器会与另一个指定的容器共享IP和端口范围 |
none | 空网卡模式,容器间与宿主机无网络通信的容器孤岛。 |
1) 桥接网络架构:
2) 主机模式(host)网络架构:
3) 容器转发模式(container)网络架构:
详细的docker网路配置测试可看博客:
Docker学习:容器五种(3+2)网络模式 | bridge模式 | host模式 | none模式 | container 模式 | 自定义网络模式详解_docker网络三种模式-CSDN博客https://blog.csdn.net/succing/article/details/122433770
2、配置自定义桥接网络
给各个已有的docker容器追加一个新的自定义桥接网络,使各个容器能使用各子固定的IP通信,便于组合成集群:
1) 创建自定义桥接网络网卡:
## 格式:docker network create --subnet <自定义网段>/24 --gateway <自定义网关> <自定义网卡名>
[root@VM121 ~]# docker network create --subnet 10.0.0.0/24 --gateway 10.0.0.1 innet
查看宿主机新增加的桥接网卡:
2) 将新桥接网卡追加到各个容器节点:
## 格式:docker network connect <自定义网卡名> --ip "<固定IP>" <容器ID>
[root@VM121 ~]# docker network connect innet --ip "10.0.0.10" e0bd4fea7682
[root@VM121 ~]# docker network connect innet --ip "10.0.0.11" 9bd880ace7ba
[root@VM121 ~]# docker network connect innet --ip "10.0.0.12" 6b1684e3c4e3
[root@VM121 ~]# docker network connect innet --ip "10.0.0.13" 03becf377cbe
3) 查看网卡:
[root@VM121 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
cd3f25423175 bridge bridge local
12157996b354 host host local
df80c0203689 innet bridge local
00db13298ca2 none null local
4) 断开容器网卡连接:
## 格式:docker network disconnect <自定义网卡名> <容器ID>
[root@VM121 ~]# docker network connect innet e0bd4fea7682
5) 删除网卡:
## 格式:docker network rm <自定义网卡名>
[root@VM121 ~]# docker network rm innet
六、系统运维
1、查看docker系统信息和容器信息
1) 查看系统信息:
[root@VM121 ~]# docker system info
Client: Docker Engine - CommunityVersion: 24.0.7Context: defaultDebug Mode: falsePlugins:buildx: Docker Buildx (Docker Inc.)Version: v0.11.2Path: /usr/libexec/docker/cli-plugins/docker-buildxcompose: Docker Compose (Docker Inc.)Version: v2.21.0Path: /usr/libexec/docker/cli-plugins/docker-composeServer:Containers: 4Running: 4Paused: 0Stopped: 0Images: 2Server Version: 24.0.7Storage Driver: overlay2Backing Filesystem: xfsSupports d_type: trueUsing metacopy: falseNative Overlay Diff: trueuserxattr: falseLogging Driver: json-fileCgroup Driver: systemdCgroup Version: 2Plugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: inactiveRuntimes: io.containerd.runc.v2 runcDefault Runtime: runcInit Binary: docker-initcontainerd version: 3dd1e886e55dd695541fdcd67420c2888645a495runc version: v1.1.10-0-g18a0cb0init version: de40ad0Security Options:apparmorseccompProfile: builtincgroupnsKernel Version: 6.2.0-39-genericOperating System: Ubuntu 22.04.3 LTSOSType: linuxArchitecture: x86_64CPUs: 20Total Memory: 62.71GiBName: systemID: 8e230ab4-2d88-42ab-9243-21f65c050128Docker Root Dir: /var/lib/dockerDebug Mode: falseExperimental: falseInsecure Registries:127.0.0.0/8Registry Mirrors:https://mirror.ccs.tencentyun.com/https://qbqltwp8.mirror.aliyuncs.com/https://mirror.baidubce.com/https://registry.docker-cn.com/https://hub-mirror.c.163.com/https://docker.mirrors.ustc.edu.cn/Live Restore Enabled: false
2) 查看容器信息:
[root@VM121 ~]# docker inspect e0bd4fea7682
2、查看docker空间
[root@VM121 ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 2 1 774.3MB 433MB (55%)
Containers 4 4 7.993GB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 5 0 341.3MB 341.3MB
2、查看docker日志
## 实时查看容器后50行日志记录,并显示时间;
[root@VM121 ~]# docker logs -f --tail 50 e0bd4fea7682
这篇关于Docker基础(小白篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!