docker的一些基本概念

Docker与K8s

关系:

  • docker通过dockerfile 将应用程序所需的设置和依赖打包到一个容器中,从而实现迁移性的特点。
  • kubernets用于关联和编排在多个主机上运行的容器。

容器化技术

Docker 相对比较简单

K8s 概念较多(虚拟化,集群),不易理解

容器和虚拟机的主要区别

传统虚拟机的运行需要依赖虚拟硬件,必须要安装系统才能运行软件。

虚拟软件和虚拟系统会占用和浪费大量资源。

容器是运行在容器引擎上,会直接共享真机的操作系统内核运行,可以节省大量的资源,

对比传统虚拟机总结:

特性容器虚拟机
启动秒级分钟级
硬盘使用一般为 MB一般为 GB
性能接近原生弱于,有损耗
系统支持量单机支持上千个容器一般几十个

Docker基础

概念:

  • Docker是一个容器引擎。是一个用于管理容器的软件。(镜像 => 容器)

  • 属于IT行业的集装箱。(使用go语言开发实现的)

容器:

精简”的虚拟机,但和传统虚拟机是有较大的区别。

虚拟化技术

虚拟化与物理主机:

与**物理主机(一台真实的电脑)**相对应

为了更好的,更充分的利用物理主机的硬件资源,而产生的一种技术,可以在一台物理主机上同时使用多个操作系统在相对独立的环境中去

特点:

  1. 容器几乎可以在所有平台上运行
    • CentOS6.5+
    • Ubuntu14.04 + Ubuntu16.04 Ubuntu18.04 Ubuntu20.04 Ubuntu22.04 LTS版本
    • Windows 10/server
  2. 占用资源少
  3. 使用镜像部署更加高效,更加方便,一条命令足以安装整个项目

Docker架构

C/S架构 Client/Server (MySQL,Redis)

docker命令是客户端

docker deamon(守护进程,后台服务)命令是服务端

【systemctl start docker】

容器 — 镜像 — 仓库 — daemon — client 之间的关系

clientdaemon.jpg

  • Containers 被docker daemon 管理的容器,用于运行应用。
  • Images 镜像(远程和本地),用于生成可运行的容器。
  • Registry 注册中心(远程仓库),用于镜像的下载。
    • 公共
      • 开源镜像(个人或公司上传的),给所有人免费使用
    • 私有
      • 公司或个人的闭源镜像
  • 无状态的服务:Nginx,Tomcat,Httpd,PHP
  • 有状态的服务:MySQL,数据卷技术将数据保留在本地。

安装Docker

一·yum安装:

先将yum源进行更换:更换为阿里云

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

安装依赖
# 安装依赖
[root@zuolaoshi ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

# 替换成清华源
[root@zuolaoshi ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
安装docker

如果有旧版本则需删除

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

安装

yum -y install https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.31-3.1.el7.x86_64.rpm

yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum -y install docker-ce

启动docker

systemctl enable docker

systemctl start docker

验证启动

systemctl status docker

验证版本

docker -v

docker -v
Docker version 26.0.1, build d260a54

docker run --name zabbix-agent -t \
   -v zabbix_agent:/etc/zabbix \
   -e ZBX_HOSTNAME="host-01" \
   -e ZBX_SERVER_HOST="172.17.0.4" \
   -e ZBX_SERVER_PORT=10051 \
   -p 10050:10050 \
   --restart=unless-stopped \
   --privileged \
   -d zabbix/zabbix-agent:alpine-6.2-latest

二·docker client 和 daemon分离

关闭docker

systemctl stop docker

修改docker启动方式,要求加载配置文件启动

sed -i.bak ‘/^ExecStart=/c\ExecStart=/usr/bin/dockerd’ /usr/lib/systemd/system/docker.service

设置docker配置文件(默认没有)

vim /etc/docker/daemon.json

{
"hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
}
重载docker服务、重启docker生效配置

systemctl daemon-reload

systemctl restart docker

查看docker的监听地址和端口
netstat -ntpl |grep 2375

tcp6   0  0 :::2375  :::*   LISTEN 21219/dockerd 
客户端连接docker daemon,执行命令

docker -H 192.168.8.14 images

Docker镜像

查找镜像

docker search centos

[root@zuolaoshi ~]# docker search centos
NAME    DESCRIPTION    STARS     OFFICIAL
centos  DEPRECATED;    7720      [OK]
......以下省略

#字段说明:
NAME:镜像名称
DESCRIPTION:镜像描述 
STARS:镜像星级,数字越大表示用的人越多
OFFICIAL:是否为官方  跟[OK]说明是官方
AUTOMATED: 是否为自动化构建的镜像

镜像下载

docker pull centos

镜像下载加速(各种云厂家)

阿里云

{
"reg istry-mirrors": ["https://vgqctehu.mirror.aliyuncs.com"]
}

本地镜像查看-images命令

docker images

[root@zuolaoshi ~]# docker images
REPOSITORY   TAG       IMAGE ID    CREATED       SIZE
centos     latest    5d0da3dc9764   2 years ago   231MB

#字段说明:
REPOSITORY:镜像的名字
TAG:镜像的标签
IMAGE ID:镜像的ID号
CREATED:镜像建立时间
SIZE: 镜像大小

镜像详细信息-inspect命令

docker inspect centos

镜像保存-save命令

docker save -o centos_base.tar centos

本地镜像删除-rmi命令

先找到镜像的id号

docker images

输入第一个id号进行删除

docker rmi id

(当容器使用镜像时默认不能删除)

docker rmi 605c77e624dd
Untagged: nginx:latest
Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f

强制删除:

docker rm -f

[root@manage01 ~]  docker rmi -f ba6acccedd29
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Deleted: sha256:ba6acccedd2923aee4c2acc6a23780b14ed4b8a5fa4e14e252a23b846df9b6c1
Deleted: sha256:9f54eef412758095c8079ac465d494a2872e02e90bf1fb5f12a1641c0d1bb78b]

镜像载入load命令

导入由save保存出来的压缩文件镜像

docker load -i centos_base.tar

docker容器管理

容器查看-ps命令

docker ps

容器详细信息-inspect命令

docker inspect centos

容器运行(镜像->容器)

docker run [options]

#后台执行容器
docker run -it --name centos7_1 centos
#但是看不到centos7_1的进程
docker ps 
#docker容器运行必须有一个进程, 如果没有进程执行,容器认为空闲,就会自行退出
docker ps -a
#前台执行的容器
docker run -it --name centos7_2  centos /bin/bash

/bin/bash

当容器中没有正在运行的进程时,会被挂起(暂时执行),以节省

删除容器:

先找到容器id

docker ps -a

通过id进行删除

docker rm id

[root@manage01 ~]# docker rm 98d99dd0df62
98d99dd0df62

容器的导入与导出

将容器导出:一个镜像为压缩文件

Docker安装WordPress

先安装mysql:

#下载指定版本的镜像
docker pull mysql:8.0.20
#创建本地文件夹目录,用于挂载容器中的数据目录
mkdir -p /data/mysql/{data,conf}

cat > /data/mysql/conf/my.cnf << EOF
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
EOF

docker run -itd --name mysql-test \
        -p 3306:3306 \
        -e MYSQL_ROOT_PASSWORD=123456 \
        -v /data/mysql/data:/var/lib/mysql \
        -v /data/mysql/conf:/etc/mysql/  \
        --restart=always \
        mysql

Docker运行报错docker0: iptables: No chain/target/match by that name.

一般是关于防火墙的问题,启动docker服务的时候,防火墙是开着的,那么docker会默认对其进行操作,我关掉防火墙之后docker不能去操作防火墙,自然就报错了

两个解决办法:

  1. 把防火墙开起来: systemctl start firewalld
  2. 在防火墙关闭的情况下直接重启一下docker服务,让他默认不操作防火墙: systemctl restart docker

安装wordpress

mysql 中创建wp1库

mysql> create database wp1 charset utf8mb4;

安装wordpress

docker run -itd --name wodpress1 \
        -e WORDPRESS_DB_HOST=192.168.8.101:3306 \
        -e WORDPRESS_DB_USER=root \
        -e WORDPRESS_DB_PASSWORD=123456 \
        -e WORDPRESS_DB_NAME=wp1 \
        -p 8086:80 \
        --restart=always \
        wordpress

Docker 安装nginx进行反向代理

# 创建本地目录用于映射nginx容器
mkdir -p /data/nginx/conf
cat > /data/nginx/conf/default.conf << EOF
server {
 listen       80;
 listen  [::]:80;
 server_name  localhost;
 location / {
     proxy_pass http://本机地址:8086;
 }
 error_page   500 502 503 504  /50x.html;
 location = /50x.html {
     root   /usr/share/nginx/html;
 }
}
EOF

# 搜索镜像
docker search nginx
# 下载镜像
docker pull nginx
# 查看镜像
docker images
# 启动镜像
docker run -itd --name nginx01 \
        -p 80:80 \
        -v /data/nginx/conf:/etc/nginx/conf.d \
        --restart=always \
        nginx
# 查看容器
docker ps
# 本机自测
curl localhost

Docker安装nextcloud网盘

mysql 中创建 nextcloud 库

create database nextcloud charset utf8mb4;

安装nextcloud

docker run -d --name nextcloud \
 -v nextcloud:/var/www/html \
 --link mysql-text:mysql \
 -p 8080:80 nextcloud

DockerFile文件

用于构建镜像的一种脚本格式。

手动构建镜像:nginx -> nginx01 -> docker cp -> game -> commit -> save.tar 文件 -> load

  • 镜像:由联合文件系统构成的文件,镜像的特点
    • 分层
    • 只读
  • 容器:镜像+容器层构成的。特点
    • 容器层是可读可写的
    • 当将容器转换为新的镜像时,我们修改的数据会成为新镜像的上层

联合文件:可以将不同目录挂载到同一个虚拟文件系统下,支持对文件系统的修改作为一次提交来一层层的叠加,是docker镜像的基础。

构建发布镜像的基本流程

  1. 编写Dockerfile文件,设计
  2. docker build 构建成一个镜像
  3. docker run 镜像
  4. 将docker镜像发布到公有仓库(Docker Hub,阿里云镜像仓库等。。)或私有仓库。
    • docker pull
DOCKERFILE 指令说明
FROM指定基础镜像,用于后续的指令构建。
MAINTAINER指定Dockerfile的作者/维护者。(新版已弃用,推荐使用LABEL指令)
LABEL添加镜像的元数据,使用键值对的形式。
RUN在构建过程中在镜像中执行命令。
CMD指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT设置容器创建时的主要命令。(不可被覆盖)
EXPOSE声明容器运行时监听的特定网络端口。
ENV在容器内部设置环境变量。
ADD将文件、目录或远程URL复制到镜像中。(自动解压缩)。
COPY将文件或目录复制到镜像中。
VOLUME为容器创建挂载点或声明卷。
WORKDIR设置后续指令的工作目录。
USER指定后续指令的用户上下文。
ARG定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。
ONBUILD当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL设置发送给容器以退出的系统调用信号。
HEALTHCHECK定义周期性检查容器健康状态的命令。
SHELL覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。

Docker-Compose

用于生成容器的一种yaml的一种文件格式,使用docker-compose的命令生成容器。

  • 一条命令可以同时管理多个容器。
  • 创建,删除,启动,关闭,重启,查看容器
  • 通过docker-compose.yml文件来进行管理一组容器
文本基本结构

关键字:

  • 开头先写版本:version: 3 #docker-compose的版本格式
  • 服务:services #定义了每个容器的基本设置,依赖文件,环境变量。
    • db\log\web: #容器在集群中的名称,只在当前文件中生效。
      • 镜像:image #镜像不存在时,自动下载
      • 容器名:container_name#容器运行时在 docker ps 中可以看到
      • 重启:restart #控制容器的重启策略。在容器退出时,根据指定的策略自动重启容器。
        • no: #不自动重启。
        • always: #无论退出状态码如何,总是重启容器。
        • on-failure: #仅在容器非正常退出时(退出状态码非零)重启。
        • unless-stopped: # 除非手动停止,否则总是重启
      • 数据卷:volumes
        • 宿主机目录:容器目录
        • /data/mysql:/var/lib/mysql
        • data:/var/lib/mysql
        • /var/lib/mysql #随机生成一个挂载目录
          • :ro #只读
          • :rw #读写
          • 😒 #安全模式
      • 端口:ports
        • 127.0.0.1:1514:10514
        • 80:80 0.0.0.0
        • 80 #随机指定一个端口
      • 网络:networks
        • harbor 网桥名
      • 依赖:depends_on #依赖容器集群中的其他容器别名
      • 环境变量:env_file #环境变量配置文件路径
    • 网络:network #用于创建新的网桥

docker-compose down

删除当前项目所有的容器

docker-compose restart

重启当前项目所有的容器

docker-compose up -d

启动当前项目所有的容器

Docker网络

让容器联网的几种方式(4种)。

  • 容器 -> 宿主机
  • 容器 -> 容器
  • 容器 -> 外网

网络模式

  • bridge 网桥(默认的网络模式):会默认生成docker0的虚拟网卡(docker0)
    • 使用该docker0(172.17.0.2)网卡可以让容器和宿主·外网服务器通信。
    • NAT(网络地址转换),容器会被自动分配一个IP和子网掩码
    • 172.17.0.2 ~ 172.17.255.254(65534个)
    • docker0作为“路由”和“交换机”。
    • 通过宿主机iptables防火墙的nat表实现与外网的联系。
  • host 主机
    • 容器和真机共用网卡及对应的端口,缺点就是同一个端口只能宿主机或者某个容器使用,其他容器不能用。
  • none 空
    • 容器仅有lo网卡,是一个不能联网的本地容器
  • container 容器网络或联盟网络

Docker卷组

数据的持久化。将容器的数据目录挂载到宿主机上,当删除容器时可以保留数据。

  • ECS 弹性云服务器
宿主机目录容器目录
为空为空空目录
不为空为空宿主机内容
为空不为空容器的内容
不为空不为空

案例:

创建一个docker管理的卷(–rm 是指临时创建的)

在Docker中运行一个名为httpd1的容器,使用busybox镜像,并且将本地磁盘中的/disk目录挂载到容器内的/data目录。容器启动后会进入交互模式,并在容器停止后会自动删除。

[root@host1 ~]# docker run --name httpd1 -it --rm -v /data busybox
/ # 
/ # echo "test message">>/data/test.txt
/ #
[root@host1 ~]# docker inspect httpd1
"Mounts": [
         {
             "Type": "volume",
             "Name": "636a1967c63705161f941550edf4b0ced1584bf71087596ad61a49df4cd6ae4c",
             "Source": "/var/lib/docker/volumes/636a1967c63705161f941550edf4b0ced1584bf71087596ad61a49df4cd6ae4c/_data",
             "Destination": "/data",
             "Driver": "local",
             "Mode": "",
             "RW": true,
             "Propagation": ""
         }
     ]
[root@host1 ~]# cd /var/lib/docker/volumes/636a1967c63705161f941550edf4b0ced1584bf71087596ad61a49df4cd6ae4c/_data
[root@host1 _data]# cat test.txt 
test message
[root@host1 _data]#

Docker Swarm

Docker Swarm是什么:

集群版的docker,容器编排技术。和k8s类似,但比较简单。

官方提供的一个容器集群编排管理工具。

Docker Swarm干什么:

  • 管理多台主机上的容器,创建容器,修改容器,删除容器

  • 管理Docker网络

  • 管理节点信息

Docker Swarm使用条件:

当单机性能不足时,增加主机。

主机较多,容器分散在不同的服务器上,就可以使用容器的集群编排管理工具(docker swarm)

Docker Swarm与k8s的区别:

  • Docker swarm 是单体架构应用 (所有功能包括资源调度,网络连接,路由转发,容器管理),Docker Swarm自带的

  • k8s 是分布式,微服务化的架构应用,所有功能由不同的软件应用提供。

    • 只是一个框架,本身并不提供网络,容器管理,数据存储等功能。需要安装一大堆

Docker镜像私有仓库

为了更好的管理镜像

  • 公网仓库:docker hub
  • 私网仓库: registry、harbor

搭建私有registry仓库

搭建步骤

  • 拉取 registry 容器镜像
  • 创建 registry 仓库容器
  • 测试容器应用
安装registry仓库
docker pull registry 

#1、创建持久化存储,将容器镜像存储目录/var/lib/registry挂载到本地/opt/myregistry下:

mkdir /opt/myregistry

# 2、创建 registry 容器:
docker run -d -p 5000:5000 -v /opt/myregistry:/var/lib/registry  --restart=always registry:latest

# 显示仓库中没有任何镜像
curl http://192.168.1.150:5000/v2/_catalog
{"repositories":[]}
上传步骤
#1.修改标签tag,将私有仓库的域名或IP地址添加到镜像上。
docker tag hello 192.168.8.14:5000/hello-lasest:latest
#2.使用docker push上传
docker push 192.168.8.14:5000/hello-lasest:latest
#3.如果上传成功则可输入查看
curl http://192.168.1.150:5000/v2/_catalog

push过程报错

Get https://172.18.11.126:5000/v2/: http: server gave HTTP response to HTTPS client

排错

#docker默认要求仓库是https的协议
#1.服务端nginx反向代理,配置ssl加密证书。

#2.修改客户端的配置文件,让客户端允许不安全的http网址
cat /etc/docker/daemon.json 
{
 "insecure-registries": ["http://192.168.8.14:5000"]
}
#忽略https

进行重启Docker

systemctl daemon-reload
systemctl restart docker
进行下载

设置机器的docker仓库为registry仓库

#1、设置docker启动文件
[root@zuolaoshi_node1 ~]# sed -i.bak '/^ExecStart=/c\ExecStart=\/usr\/bin\/dockerd' /usr/lib/systemd/system/docker.service

#2、设置docker配置文件
[root@zuolaoshi_node1 ~]# cat  /etc/docker/daemon.json 
{
"insecure-registries": ["http://182.168.8.14:5000"]
}

拉取镜像

docker pull 192.168.8.14:5000/hello-lasest:latest
最后进行验证

docker images

如果显示有即为正确!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值