Docker入门看这篇就够了

此文简单记录学习Docker过程中的入门知识点和遇到的一些问题,文章以迭代的方式陆续更新,希望对大家有所帮助;

目录

问题记录

1、Xshell无法与虚拟机建立连接

2、SqlYog连接Docker数据库报错

3、使用VMware创建多台虚拟机出现IP冲突

技能点记录

Docker常用命令

1、安装Docker

2、在Docker中安装mysql容器

3、Docker run命令解析

4、Docker安装镜像流程解析

5、在Docker中安装Nginx

6、数据卷与容器挂载

7、自定义镜像


Docker 是一种开源的容器化平台,用于轻松创建、部署和管理应用程序和服务。Docker 容器化技术允许开发者将应用程序及其依赖项打包到一个独立的、可移植的容器中,该容器可以在各种环境中运行,保证了应用程序在不同环境中的一致性和可移植性。

Docker 的主要特性包括:

  1. 容器化:Docker 使用容器技术,每个容器包含应用程序、运行时环境和所有依赖项,使得应用程序与其环境隔离开来。这使得容器可以在不同的主机上以相同的方式运行,减少了部署和测试的复杂性。

  2. 轻量级:容器比传统虚拟机更轻便,因为它们共享主机操作系统的内核,而不需要额外的虚拟化层。这使得容器启动更快,占用更少的系统资源,从而提高了性能和效率。

  3. 可移植性:Docker 容器可以在不同的平台和环境中运行,包括开发、测试和生产环境。这种可移植性确保了应用程序在不同环境中的一致性,从开发到生产部署都能够保持相同的运行方式。

  4. 易于管理:Docker 提供了丰富的工具和命令行界面,使容器的创建、部署、监控和管理变得非常简单。还有众多的第三方工具和编排系统(如Docker Compose、Kubernetes)可以与Docker 集成,以简化容器集群的管理。

  5. 镜像和仓库:Docker 镜像是容器的构建模块,它包含了应用程序和其依赖的一切。Docker Hub 是一个在线仓库,存储了大量的公共 Docker 镜像,方便开发者共享和获取镜像。

  6. 自动化:Docker 支持自动化构建和部署流程,可以通过 Dockerfile 定义容器的构建规则,使得容器的创建过程可以自动化执行。

  7. 可伸缩性:Docker 容器可以根据负载自动扩展或缩小,使得应用程序能够轻松适应不同的流量需求。


问题记录

1、Xshell无法与虚拟机建立连接

问题:虚拟机正常启动,但Xshell无法与虚拟接,本地Ping虚拟机IP不通。虚拟机使用CentOS 7 64位 镜像,该镜像是一个Linux的系统,在我虚拟机安装完成并成功启动之后,尝试建立SSH连接,但是一直连接不上,或者连接成功过了没一会就断开了,之后一直连不上的问题。

原因:这是应为虚拟机动态IP导致的,这么做的目的是为了降低攻击者通过IP确定主机的位置,同时也可以避免IP冲突,一个设备中可能存在多个虚拟机,采用动态IP可以避免IP冲突,总之就提高安全性和可维护性。

解决方案:(解决方案网上有很多,我选择该成静态IP)把虚拟机中的动态IP改为静态IP

使用 vi 命令进入 ifcfg-ens33 文件修改配置

# 第一步 找到文件
vi /etc/sysconfig/network-scripts/ifcfg-ens33(网卡名称可能不同)

#第二步 将BOOTPROTO字段修改为static(静态模式)

#第三步 将ONBOOT字段为no,需要将其改为yes;该字段表示该网卡是否开机自启

提示:按i 进入编辑模式 ,修改完成按ESC退出编辑,输入:wq!保存编辑,:q!不保存

#第四步 检查网关、子网掩码等信息;这些信息与虚拟机创建时候设置网络连接的信息保持一致

#第五步 修改之后使用 systemctl restart network 重启网卡




 如图:

保存之后使用 ip addr 查看IP是否修改成功

只要ens33中的ip换成你对应的ip就说明修改成功了 ,之后ping www.baidu.com 测试一下网络,能ping通就ok了

然后在用SSH连接工具连上就搞定; 

2、SqlYog连接Docker数据库报错

问题:mysql出现2058,连接MySQL报“Error No.2058 Plugin caching_sha2_password could not be loaded”

原因:在Docker中安装Mysql如果不指定版本,容器会默认安装最新版,而8.0以上版本的Mysql中root用户使用的加密方式和工具中的加密方式不一样,导致会出现连接失败的问题。

解决方案:进入mysql容器中,修改root用户的加密方式。

# 1、进入mysql容器
docker exec -it mysql mysql -u root -p

# 2、查看用户信息
select Host,User,plugin from mysql.user

查询出现这个结果就是需要修改的

# <以下两种修改方式根据需求二选一>

# 3.1、在虚拟机中进入Mysql容器修改
alter user root@localhost identified with mysql_native_password by '123456'; 

FLUSH PRIVILEGES;


# 3.2、使用SSH连接工具进入mysql容器修改
alter user root@'%' identified with mysql_native_password by '123456'; 

FLUSH PRIVILEGES;

修改成功之后,重新打开SqlYog在连接数据库

3、使用VMware创建多台虚拟机出现IP冲突

在开发过程想测试Nginx负载均衡就需要创建两台或多台虚拟机,如果不通过修改虚拟机配置文件,就必然涉及虚拟机之间的IP冲突问题,下面将展示通过修改ifcfg-ens33网络配置文件的方法解决IP冲突的方法:

1、在VMware界面的菜单栏中找到 “ 编辑 ”选项,然后在 编辑选项中找到 “ 虚拟网络编辑器 ”选项,点击并进入该选项

2、然后根据虚拟机的网络类型选择,通常是NAT模式这里选择VMnet8,选中之后点击下方的
NAT设置 ,进入NET设置页面记下网关IP

3、然后退出NET设置页面,回到虚拟网络编辑器页面点击下方DHCP设置,记住起始和结束IP地址

 4、打开虚拟机修改网络配置文件

# 1、配置文件路径
cd /etc/sysconfig/network-scripts

# 2、修改配置文件
vi ifcfg-ens33 或 sudo vi ifcfg-ens33

修改内容如下:

文件里面 DNS1=你的网关 ,这里我不改是为了和最后一步做对比。 

6、修改之后保存退出进入命令执行窗口,执行 systemctl restart network 重启网关,重启之后ping 一下外部网络,比如 ping www.baidu.com 如果ping成功了那到这一步就修改成功了。

如果ping不通表示网关配置不对,此时你的虚拟机和物理机之间的通信应该是通的,但是不能访问外部网络,继续执行下面的步骤

7、修改vi /etc/resolv.conf 添加 nameserver 你的网关,我在没修改之前是192.168.231.3,和我ifcfg-ens33中的DNS1的值是一样的,后来我改成2了

修改之后:wq保存文件,保存之后再ping一下www.baidu.com ,这一套操作下来应该是能解决两台虚拟机IP冲突的问题了,并且能成功访问外部网络。

8、配置文件解读
DEVICE=ens33:
指定网络接口的设备名称,即接口的名字。

BOOTPROTO=:
指定网络接口的启动协议,可以是dhcp(动态获取IP地址)或者static(静态IP地址)。

ONBOOT=yes:
指定系统启动时是否激活该网络接口,yes表示激活,no表示不激活。

IPADDR=:
指定静态IP地址,仅当BOOTPROTO=static时使用。

NETMASK=:
指定子网掩码,用于定义网络中主机的范围,仅当BOOTPROTO=static时使用。

GATEWAY=:
指定默认网关的IP地址,用于指示数据包应该从本地网络发送到外部网络的路由器。仅当BOOTPROTO=static时使用。

DNS1=和DNS2=:
指定DNS服务器的IP地址。系统会按照顺序使用这些DNS服务器进行域名解析。通常,DNS1是主DNS服务器,DNS2是备用DNS服务器。

HWADDR=:
指定网络接口的硬件地址(MAC地址),用于唯一标识网络接口。

UUID=:
指定网络接口的唯一标识符。

4、将Nginx的静态资源与配置文件挂载到数据卷后无法访问

问题:nginx.conf配置文件挂载出现报错,提示挂载的目标路径是一个目录,而不是文件;

原因:由于-v 命令在对文件进行数据挂载时,由于该命令会判断数据卷目标路径是否存在,如果存在就直接挂载,否则创建新的文件夹。但是对配置文件进行挂载的时候,如果目标路径下没有改配置文件,那就会把这个文件当成一个目录去创建然后进行挂载,而文件与文件夹进行挂载自然就build导致报错;

-v /host/path/nginx.conf:/etc/nginx/nginx.conf;
# 如果挂载数据卷目录没有nginx.conf,通俗点说就是数据卷文件夹是空的,就会导致报错

解决方案:在对文件进行配置时,提前在数据卷目录创建一个要挂载的配置文件,或从其他地方cp一份配置文件到数据卷挂载的目录下就好了

技能点记录

Docker常用命令

        docker ps:查看启动容器。后面加上 -a 查看所有容器
        docker start :启动docker
        docker stop:停止docker
        sudo service docker restart:重启docker
        docker image rm -f image_name:强制删除镜像
        docker images:查看所有镜像
        docker rm -f container-name:强制删除容器
        docker update --restart=always container-name:设置容器在docker启动时自启
        docker logs -f container-name:查看容器实时日志
        docker build -t my-image-name:version . :执行dockerfile脚本构建自定义镜像

        docker cp 命令用于在 Docker 容器和本地文件系统之间复制文件或目录。它允许你在容器和
        本地主机之间传输文件,既可以将文件从容器复制到主机,也可以将文件从主机复制到容器
        内部。
         将容器内的文件复制到主机上:
        docker cp <container_name_or_id>:/path/to/container/file /path/to/host/destination;
        将主机上的文件复制到容器内部:
        docker cp /path/to/host/file <container_name_or_id>:/path/to/container/destination;
        <container_name_or_id> 是容器的名称或 ID。
        <source_path> 是要复制的文件或目录路径。对于从容器复制到主机的情况,它是容器内
        部的路径;对于从主机复制到容器的情况,它是主机上的路径。
        <destination_path> 是复制文件或目录的目标路径。对于从容器复制到主机的情况,它是主机
        上的路径;对于从主机复制到容器的情况,它是容器内部的路径。

        
  
       

1、安装Docker

1、 如果系统上存在旧版docker先删除

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

2、配置docker的yum库

# 首先要安装一个yum工具
yum install -y yum-utils
	
#安装成功后,执行命令,配置Docker的yum源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3、安装docker

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

4、启动和校验docker

    # 启动Docker
	systemctl start docker
	
	# 停止Docker
	systemctl stop docker
	
	# 重启
	systemctl restart docker
	
	# 设置开机自启
	systemctl enable docker
	
	# 执行docker ps命令,如果不报错,说明安装启动成功
	docker ps

5、配置镜像加速器,选用阿里云的容器镜像:https://www.aliyun.com

命令执行步骤:

# 1、创建目录
mkdir -p /etc/docker

# 复制内容,替换镜像地址
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxx.mixror.aliyuncs.com"]
}
EOF

# 2、重新加载配置
systemctl daemon-reload

# 3、重启Docker
systemctl restart docker

完成。 


 

2、在Docker中安装mysql容器

在Docker中安装mysql只需要一行命令便可完成安装

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

出现这个效果便是安装完成。

每一个应用在docker中都是以容器存在,在安装完之后首先是启动容器

# 1、 启动容器
docker start mysql

# 2 、进入容器内部
docker exec -it mysql mysql -u root -p

# 进入mysql容器成功之后,便可通过连接工具与docker中的mysql建立连接了
# 在连接中遇到问题可以参考问题记录中<连接虚拟机中的mysql报错>

安装mysql,并将数据库文件、配置文件、初始化脚本(只要在第一次启动时生效)挂载到数据卷

docker run -d \
    --name mysql \
    -p 3306:3306 \
    -e TZ=Asia/Shanghai \
    -e MYSQL_ROOT_PASSWORD=123456 \
	-v /volume/mysql/conf:/etc/mysql/conf.d \
	-v /volume/mysql/init:/docker-entrypoint-initdb.d \
	-v /volume/mysql/data:/var/lib/mysql \
mysql



3、Docker run命令解析

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

        docker:docker表示命令前缀

        run:创建一个容器并运行

        -d:表示后台运行

        --name:给容器定义别名,随便取

        -p:表示端口。容器与外部是隔离的,先要从外部访问内部容器需要用宿主机端口与容器端
        端口进行映射 3306:3306 后面的3306表示容器的实际端口,第一个3306表示宿主机使用的
        映射端口,整体含义 宿主机端口3306 映射到:容器端口3306

        -e:表示环境变量,没有可以不写

        mysql:表示容器实际名称/镜像名字


 

4、Docker安装镜像流程解析

Docker有个全球通用的镜像地址 ,由于服务器在国外访问不一定成功,所以在安装Docker的时候使用了阿里的镜像。

1、在安装镜像前通常会到Docker镜像官网中查找

2、找到之后pull到Docker容器中

docker pull 容器名称

 3、pull完成之后查一下Docker中是否存在

# 此命令会列出所有pull的镜像
docker images

4、镜像pull成功之后就可以安装容器

docker run -d --name xxx -p xx:xx -e xxx xxx

5、安装完成之后启动容器

docker start 容器名称

以上是从镜像仓库中pull容器的步骤,下面是从外部加载镜像的步骤


 

5、在Docker中安装Nginx

首先到Docker镜像官网中查找对应容器的镜像,选择官方版的进行pull

找到之后开始通过命令安装 

# 1、从docker镜像仓库拉去nginx镜像
docker pull nginx

# 2、查看docker中已有的镜像
docker images

# 3、安装nginx
docker run -d --name nginx -p 80:80 nginx

# 4、启动容器
docker start nginx

# 5、进入容器
docker exec -it nginx bash

6、数据卷与容器挂载

在容器中,想通过 vi xxx/xxx.xxx 修改容器内的文件时,会提示 command not found 找不到命令

 虽然每个容器都模拟了一套系统运行的环境,但是Docker的容器(镜像)只具备当前容器所对应的这个应用运行的一些必备命令,因为nginx不需要vi命令所以会出现这个问题,那想要完成容器中文件的修改,就要用到诸多方法之一的数据卷与容器进行挂载。

数据卷的特性及作用:

作用:数据卷是Docker中非常重要的概念 它可以把容器和宿主机关联起来,从而可以在宿主机上访问容器内部的资源,并对这些资源进行访问和修改等操作,以及实现数据共享和数据备份等操作。

数据持久化:数据卷把数据和容器隔离开来,即使容器被删除但是数据还在,这在数据存储中是非常重要的。

数据共享:不同的容器可以访问共同的数据,比如两个不同的mysql容器,挂载的数据卷是同一个,从而实现数据共享。

支持读写操作:在容器修改文件很麻烦,但是把容器的文件和数据卷挂载之后,在数据卷中直接修改对应的文件非常灵活。

备份和迁移:因为数据卷的文件存在宿主机中,当要备份或迁移的时候可以移动整个数据卷到其他为止,这对灾难恢复和数据保护非常有用。

跨平台:数据卷可以在不同的操作系统和主机之间共享,因为它们是由Docker管理的,不依赖其他配置等。

数据卷与Nginx容器挂载:
命令:-v 数据卷名字:挂载的资源路径
如果数据卷不存在则会创建,如果存在就进行挂载,但是在数据卷挂载只能在容器创建的时候进行挂载,已经创建好的容器是无法挂载的

# 1、创建一个数据卷 
docker volume create html
#所有创建的数据卷都在宿主机的/var/lib/docker/volumes/目录下

# 2、创建容器并挂载数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

# 3、查看已有数据卷
docker volume ls
# 展示结果
DRIVER    VOLUME NAME
local     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
local     html

# 4、查看数据卷详情
docker volume inspect html
# 结果
[
    {
        "CreatedAt": "2024-05-17T19:57:08+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/html/_data",
        "Name": "html",
        "Options": null,
        "Scope": "local"
    }
]


# 5、查看数据卷命令帮助文档
docker volume --help

 数据卷挂载成功之后可以通过SSH连接工具直接进入数据卷的目录对文件进行修改。

数据卷常用命令:

docker inspect volume_name:查看数据卷是否存在

docker createvolume volume_name:创建数据卷

docker volume inspect volume_name:查看数据卷信息

docker volume rm volume_name:删除一个或多个数据卷

docker volume prune volume_name:删除单个数据卷

本地目录挂载数据卷(方法二)

只要把-v 后面的数据卷名称换成本地路径就好,但前提是本地目录需要写绝对路径,比如:

-v /etc/nginx/html:/usr/share/nginx/html 而不是 -v /etc/nginx/html:/usr/share/nginx/html

一个是以 ‘/’ 开头 一个没有,没有 '/' 开头的会被当成一个数据卷名称

7、自定义镜像

在Docker中不仅有Docker自己的镜像,还可以自己根据需求制定自己的镜像,完成应用程序和服务的要求,最常用的便是自定义镜像实现在Linux上部署应用。以SpringBoot项目为例演示自定义镜像。

要在一个新的系统上运行java,首先要想到的就是安装jdk和配置环境变量,那在Linux上安装jdk就需要用到自定义镜像,要自定义镜像首先要了解镜像的结构。

镜像的结构:
基础镜像(BaseImage):它是镜像的起点,它包含了操作系统的文件系统和基本的系统工具。基础镜像通常是从官方仓库中获取的,例如 Ubuntu、Alpine Linux、CentOS 等。这一层提供了运行容器所需的操作系统环境。

中间层 (Layers): 在基础镜像之上,Docker 镜像可以包含一或多个中间层。每一层都是一个文件系统的快照,它包含了容器的文件和配置更改。每次在容器中运行命令或应用程序时,都会创建一个新的中间层,记录文件系统的更改

入口(Entrypoint):镜像运行的入口,通常是程序的启动脚本和参数;

基于ubuntu部署java为例:

FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai

# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8

# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 指定项目监听的端口
EXPOSE 8080

# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

这样的方式自定义镜像由于步骤复杂,并且每次部署都需要执行,于是官网便对其进行了简化,把安装jdk和配置环境变量的步骤,封装成了一个基础镜像openjdk:<version>,使得自定义镜像更容易上手。

简化版:

1、首先在物理机上创建一个没有后缀且名字必须为dockerfile文本文档作为自定义镜像的执行脚本,脚本内容:

# 1、基础镜像,必要命令
FROM openjdk:11.0-jre-buster
    #openjdk:jdk的版本,目前只有11+版本


# 2、设定时区为东八区,避免系统时间不对
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone


# 3、拷贝jar包,将打包好的java.jar 复制到app.jar中
COPY my-app.jar /app.jar
    # my-app.jar:自己的代码包
    # /app.jar:目标路径


# 4、程序入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
    # java:表示这是一个可执行的java文件
    # jar:告诉java以jar包的形式运行
    # "/app.jar":jar包位置

到这dockerfile文件变创建完成,之后将dockerfile和my-app.jar 传输到docker容器中的任意目录都可以,但必须保证dockerfile脚本和jar包在同一个目录下,如图所示:

2、文件传输到docker之后,进入文件所在目录执行docker build命令构建镜像,一定要进入文件所在目录执行:

docker build -t my-image-name:version .
    # -t:表示taget
    # my-image-name:自定义一个镜像名字
    # version:自定义一个镜像版本
    # 版本号后面接一个空格加一个点.
    # .表示当前目录,这也是为什么一定要进入到文件所在目录执行命令的原因

 3、使用docker images 查看容器中的镜像:

4、执行docker run 命令启动镜像:

docker run -d --name my-app-name -p 8090:8090 my-image-name:version

 5、执行完run命令之后项目就部署完成了,可以通过docker logs 命令查看容器日志,检查项目启动情况,只要启动正常就能访问了。

8、Docker Compose 

        // TODO

9、安装RabbitMQ

 1、安装镜像

docker pull rabbitmq

# 如果需要安装其他版本在rabbitmq后面跟上版本号
# docker pull rabbitmq:版本号 -management  

2、安装RabbitMQ容器

docker run -d --hostname my-rabbit --name RabbitMQ -p 15672:15672 -p 5672:5672 rabbitmq

# --hostname 指定节点名称;
# RabbitMQ的一个非常重要的配置,它根据所谓的 “节点名称” 存储数据,默认为主机名

# 安装完成之后检查一下状态
docker ps 

3、进入容器内部,启动web管理界面

# 进入容器内部
docker exec -it 自己容器名称 bash

# 进入bin目录启动web界面插件
cd bin
rabbitmq-plugins enable rabbitmq_delayed_message_exchange

4、启动成功验证步骤和登录账号同Linux验证步骤一致

完结:Docker入门学习到此结束,内容虽然不多,但应对实际开发中的常见需求还是没问题的,有疑问可以评论或留言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值