Docker基础(小白篇)

2024-01-22 15:30
文章标签 基础 docker 小白篇

本文主要是介绍Docker基础(小白篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Docker 概述 

1、docker 是什么,有啥用?

        我们先来回顾一下传统的产品开发上线涉及到的难点。一款产品从开发到上线,经历了开发环境、测试环境、生产环境等不同的操作系统、运行环境和应用配置等环境。在项目管理中,还涉及到不同版本以及不同版本之间兼容性等问题。

        这些问题对开发人员和运维人员都是极大的考验,同时对各方的协作也有一定的要求。不然就会出现"代码在我这里运行的好好的呀",这种尴尬的局面。而 Docker 的出现就是提供了一套用来解决此类问题的标准解决方案。

        Docker 的口号是"一次创建或配置,可以在任意地方正常运行"。Docker 可以理解为:软件是带环境安装的,也就是说,安装的时候把原始环境一模一样的复制过来一份。这样也就消除了不同机器运行结果不同的问题。

        那么,Docker 是什么呢?Docker 是一个开源的应用容器引擎,Go 语言开发,并遵从 Apache2.0 协议开源。它可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 可用于开发应用、交付应用、运行应用等场景。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。Docker 允许用户将基础设施中的应用单独分割出来,形成更小的部分容器,从而提高软件交付速度。

 2、docker 有什么优势?

        有小伙伴会发现,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博客icon-default.png?t=N7T8https://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基础(小白篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/633397

相关文章

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

ubuntu如何部署Dify以及安装Docker? Dify安装部署指南

《ubuntu如何部署Dify以及安装Docker?Dify安装部署指南》Dify是一个开源的大模型应用开发平台,允许用户快速构建和部署基于大语言模型的应用,ubuntu如何部署Dify呢?详细请... Dify是个不错的开源LLM应用开发平台,提供从 Agent 构建到 AI workflow 编排、RA