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

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

禅道Docker安装包发布

禅道Docker安装包发布 大家好, 禅道Docker安装包发布。 一、下载地址 禅道开源版:   /dl/zentao/docker/docker_zentao.zip  备用下载地址:https://download.csdn.net/download/u013490585/16271485 数据库用户名: root,默认密码: 123456。运行时,可以设置 MYSQL_ROOT_P

c++基础版

c++基础版 Windows环境搭建第一个C++程序c++程序运行原理注释常亮字面常亮符号常亮 变量数据类型整型实型常量类型确定char类型字符串布尔类型 控制台输入随机数产生枚举定义数组数组便利 指针基础野指针空指针指针运算动态内存分配 结构体结构体默认值结构体数组结构体指针结构体指针数组函数无返回值函数和void类型地址传递函数传递数组 引用函数引用传参返回指针的正确写法函数返回数组

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)