Bootstrap

Docker入门


Docker学习笔记

概念

Docker是一个快速交付应用、运行应用的技术:

  1. 可以将程序及其依赖、运行环境一起打包为一个镜像,
    可以迁移到任意Linux操作系统
  2. 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
  3. 启动、移除都可以通过一行命令完成,方便快捷

image-20240213140337960

用白话来说就是,我们在部署项目到服务器时,很多应用(比如nodejs,redis等)可能依赖于不同的系统应用的系统函数库,而当你把应用镜像放到docker的时候,docker就会将其对系统依赖的函数库,配置,运行环境一起打包,且他们之间互不影响。当我们要调用某个应用的时候,该应用的打包好的函数库会直接调用内核,内核再调用计算机硬件完成指令,不再关心系统应用的问题。

Docker与虚拟机

虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在Windows系统里面运行
Ubuntu系统,这样就可以运行任意的Ubuntu应用了。

特性Docker虚拟机
性能接近原生性能较差
硬盘占用一般为MB般为GB
启动秒级分钟级

Docker和虚拟机的差异:

  • docker是一个系统进程;虚拟机是在操作系统中的操作系统
  • docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

镜像和容器

镜像(Image):Docker>将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。

DockerHub(镜像共享平台)

  • DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。
  • 国内也有类似于DockerHub的公开服务,比如网易云镜像服务、阿里云镜像库等。

Docker架构

Docker是一个CS架构的程序,由两部分组成:

  • 服务端(server’):Docker守护进程,负责处理Docker指令,管理镜像、容器等。
  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
image-20240213143900724

安装Docker

1.1.卸载(可选)

如果之前安装过旧版本的Docker,可以使用下面命令卸载:

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce

1.2.安装docker

首先需要大家虚拟机联网,安装yum工具

yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

然后更新本地镜像源:

# 设置docker镜像源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast

然后输入命令:

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

docker-ce为社区免费版本。稍等片刻,docker即可安装成功。

1.3.启动docker

Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!

启动docker前,一定要关闭防火墙后!!

启动docker前,一定要关闭防火墙后!!

启动docker前,一定要关闭防火墙后!!

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

通过命令启动docker:

systemctl start docker  # 启动docker服务

systemctl stop docker  # 停止docker服务

systemctl restart docker  # 重启docker服务

然后输入命令,可以查看docker版本:

docker -v

如图:

image-20240214192026345

1.4.配置镜像加速

docker官方镜像仓库网速较差,我们需要设置国内镜像服务:

参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

对于CentOS:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://p4nhr5yg.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Mysql部署

docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql

部署完之后,我们使用Navicat尝试连接数据库

image-20240408191220836

镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub

Docker图形化界面

在linux终端运行

docker run -d --name pointainer -p 8088:9000 \-v /var/run/docker.sock:/var/run/docker.sock --restart always portainer/portainer

命令解读

  • docker run :创建并运行一个容器,-d 是让容器在后台运行

  • –name mysql:给容器起个名字,必须唯一

  • -p 3306:3306:设置端口映射(多个实例下,前一个容器的端口不同,镜像的端口相同)

  • -e KEY=VALUE:是设置环境变量

  • mysql:指定运行的镜像的名字{

    镜像名称一般分两部分组成:[repository]:[tag]

    • 其中repository就是镜像名

    • tag是镜像的版本

      在没有指定tag时,默认是latest,代表最新版本的镜像

常见命令

docker pull 镜像名

从远程仓库拉取镜像到本地

docker images

查看本地有哪些镜像存在

docker save [options] image [image…]

将本地镜像打包成tar文件,方便其他用户安装

docker rmi 镜像名:版本(latest)

删除指定版本的镜像

docker load [-i 压缩文件地址] [-q ](-q指是否显示加载过程)

安装本地镜像

docker ps 或 docker ps --format “table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}\t{{.Names}}”

查看本地有哪些容器正在运行

-a 参数 同时展示所以已经停止的容器

docker stop 容器名

停止指定容器

docker start 容器名

启动指定容器

docker logs [-f] 容器名

查看指定容器产生的日志,-f 持续跟踪日志,一般用于调试过程

docker exec -it 容器名 bash

进入指定容器,相当于生成了一个独立的内部命令行

image-20240408201330843

image-20240705091937781

通过进入容器内部,可以实现修改服务的配置文件

使用exit命令退出

docker rm 容器名

删除指定容器,注意删除时,容器必须处于停止状态。可以通过 -f选项强制删除

Commit镜像

将容器提交,形成一个新的镜像

docker commit -m="提交的信息" -a="作者" 容器id 镜像名:[版本]

命令别名

vi ~/.bashrc

image-20240408202216535

别名设置:

alias 键=值

值是字符串类型

改完之后,需要让这个文件生效,使用命令:

source ~/.bashrc

数据卷

**数据卷(volume)**是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

一句话:容器的持久化和同步化

image-20240408203721369

当我们的数据卷形成后,假如宿主机是Linux虚拟机,那么会在其文件系统的/var/lib/docker/volume下生成对应的数据卷,并绑定到旗下的_data文件目录。一旦桥梁形成之后,双方是双向绑定的,也就是说我们不必在容器内修改静态资源了,只需要在宿主机文件系统内修改就行。

命令说明
docker volume create创建数据卷
docker volume ls查看所有数据卷
docker volume rm 数据卷名删除指定数据卷
docker volume inspect 数据卷名查看某个数据卷的详情
docker volume prune清除数据卷
  • 在执行docker run命令时,使用**-v 数据卷名或宿主机目录:容器内目录**可以完成数据卷挂载
  • 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

自定义挂载位置

  • 在执行docker run命令时,使用**-v 本地目录:容器内目录**可以完成本地目录挂载

  • 本地目录必须以“”或“”开头,如果直接以名称开头,会被识别为数据卷而非本地目录

    -v mysql:var/Iib/mysql会被识别为一个数据卷叫mysql

    -v./mysql:Nar/Iib/mysql会被识别为当前目录下的mysql目录

    扩展:

    # 通过 -v 容器内路径: ro rw 改变读写权限
    ro	readonly # 只读
    rw	readwrite # 可读可写
    
    # 一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
    docker run -d -P --name nginx02 -v juming-nginx: /etc/nginx:ro nginx
    docker run -d -P --name nginx02 -v juming-nginx: /etc/nginx:rw nginx
    
    # ro 说明只能通过宿主机操作,不能在容器内操作
    

自定义镜像

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

镜像结构

image-20240410164603043

Dockerfile

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:

指令说明示例
FROM指定基础镜像FROM centos:6
ADD添加压缩包ADD tomcat
ENV设置环境变量,可在后面指令使用ENV key value
COPY拷贝本地文件到镜像的指定目录COPY ./jrel1.tar.gz /tmp
RUN执行Linux的shell命令,一般是安装过程的命令RUN tar -zxvf /tmp/jrel1.tar.gz&EXPORTS path=/tmp/jre11:$path
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar
MAINTAINER指定镜像的作者,格式:姓名+邮箱MAINTAINER gunala3485***[email protected]
CMD指定这个容器启动时的命令,只有最后一个生效,可被督代CMD echo “start

更多语法详情可以参照:https://docs.docker.com/engine/reference/builder

例如:

#基础镜像
FROM openjdk:11.0-jre-buster
#拷贝jar包
COPY docker-demo.jar /app.jar
#入口
ENTRYPOINT ["java","-jar","/app.jar"]

当编写完Dockerfile后,使用以下命令构建镜像:

docker build -f Dockerfile文件地址 -t 镜像名[:版本] 生成的文件路径
  • -t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest
  • . :是指定Dockerfile所在目录,如果就在当前目录则指定为"."

网络

默认情况下,docker中的容器是以bridge(网桥)的方式互通的。但是当我们的服务重新启动后,我们的容器的ip地址会发生变换,可能会被其他容器占用ip地址。

docker0

1、 我们每启动一个docker 容器 , docker就会给docker容器分配一个ip ,我们只要安装了 docker ,就会有一个网卡 docker0
桥接模式 ,使用的技术是 evth-pair 技术!

通过再次测试ip addr

image-20240708101003077

当我们每次启动一个容器,虚拟网卡docker0就会给该容器分配一个新的网卡

自定义网络

自定义网络可以使docker内的容器互相访问

命令说明
docker network create创建一个网络
docker network ls查看所有网络
docker network rm删除指定网络
docker network prune清除未使用的网络
docker network connect [OPTIONS] NETWORK CONTAINER使指定容器连接加入某网络
docker network disconnect使指定容器连接离开某网络
docker network inspect查看网络详细信息

在run容器的时候,将统一项目所需的容器都放在同一network下

网络连通

docker中两个不同网段下的容器直接不能ping通,如果想要相互访问,需要将该网段下的指定勇气加入到另一个网段下

;