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,支付宝账号登录即可:

其他云服务厂商提供的国内镜像加速器地址:

将加速器地址配置进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 - Community
 Version:    24.0.7
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.11.2
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.21.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 4
  Running: 4
  Paused: 0
  Stopped: 0
 Images: 2
 Server Version: 24.0.7
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 3dd1e886e55dd695541fdcd67420c2888645a495
 runc version: v1.1.10-0-g18a0cb0
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 6.2.0-39-generic
 Operating System: Ubuntu 22.04.3 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 20
 Total Memory: 62.71GiB
 Name: system
 ID: 8e230ab4-2d88-42ab-9243-21f65c050128
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry 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

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咀个栗子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值