Docker容器的一些总结

Docker容器

Docker --- 从入门到实践文档

Docker快速入门教程文档

常用的官网网址:

  1. Docker Hub 镜像仓库
  2. Docker官方指令文档

安装Docker Desktop on Windows

安装Docker Windows教学视频

  1. 如何在Windows系统安装Docker

  2. Docker 1小时快速上手教程

    1. 文档: Docker 简介和安装
  3. 第一步:控制面板->程序->启用或关闭 windows 功能,开启 Windows 虚拟化和 Linux 子系统(WSL2)

  4. 第二步:直接在官网安装Docker Windows

  5. 第三步:我的电脑是windows家庭版,没有Hyper-V,所以要自己安装。

    1. 解决方案:Windows 11 家庭中文版 无Hyper-V
  6. 其他:win10系统 Docker 提示Docker Engine stopped解决全过程记录

    1. 遇到wsl没有子系统问题:
      1. 就需要wsl --update
      2. wsl --install --web-download
  7. 中文汉化:Windows Docker Desktop设置中文

Docker容器的理解

​ Docker 是一种容器化技术(类似宿缩小版的虚拟机的虚拟化技术,容器化技术不是模拟的完整的操作系统所以小。),能让开发者轻松地打包、运行和分享应用程序及其依赖项,而不需要考虑环境的影响。

复制代码
Docker 是一个应用打包、分发、部署的工具
你也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要,
而普通虚拟机则是一个完整而庞大的系统,包含各种不管你要不要的软件。

​ 自己的理解:

​ 以前:发布一个应用程序,必须在linux上先安装配置好node、mysql、redis等环境,应用程序才能正常运行。

​ 现在:只需在linux上安装一个docker,再根据docker容器就能完美运行应用程序了

虚拟机(操作系统)原理图:

容器原理图:

比较Docker和虚拟机技术的不同:

  • 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
  • 容器内的应用则是直接运行在宿主机里,容器本身是没有自己的内核的,也没有虚拟硬件,而是直接用的宿主机的内核,如linux的内核。所以就轻便了。
  • 每个容器是互相隔离的,且容器内都有一个属于自己的文件系统,互不影响。

镜像(image)和容器(container)和仓库(repository)的理解

  • docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器(最终服务运行或者项目运行在容器中)
    • (如tomcat镜像===>run ===>tomcat01容器 )
    • 就好比类和对象的关系,镜像是类,容器是创建的对象。
  • docker利用容器技术,能独立运行一个或一个租应用,是通过镜像来创建的。
    • 可以把容器理解为一个简易的linux系统
  • 仓库就是用来存放镜像的地方(Docker Hub)。类似于github上面放代码

docker的流程:

  1. 配置好docker file文件,用来创建docker镜像(相当于自动化脚本。用来安装环境必须的依赖项(如:mysql、node、redis)和应用程序)
  2. Image/镜像(可以理解为安装包。相当于虚拟机的快照,里面包含了要部署的应用程序和所有依赖项)
  3. 通过镜像可以创建许多不同的container/容器(就是是一台台运行起来的虚拟机,里面有应用程序,每个容器都是独立运行的)

image镜像

docker镜像的一些指令

shell 复制代码
1. docker images  			#查看所有本地主机上的镜像  参数:-a显示全部;-q纸显示镜像id
2. docker search [mysql] 	#搜索mysql镜像
3. docker pull [mysql:5.7] 	#下载拉取mysql镜像	
4. docker rmi -f [镜像id]	   #删除镜像

container容器

容器的一些指令

新建容器并启动

shell 复制代码
docker run [可选参数] image		#新建并启动容器 
#参数:  --name="Name" 自定义容器名称; 
#		-d 在后台运行; 
#		-it 使用交互式运行,进入容器里查看内容; 
#		-p 主机端口:容器端口 指定容器的端口(-p 8181:8080) 相当于在外网访问8181端口就能访问容器内的8080端口。
#		-e 环境b

列出所有运行的容器

shell 复制代码
docker ps  #列出所有运行的容器 
#参数:  -a 运行的容器+未运行的容器; 
#		-q 只显示容器的id

进入当前正在运行的容器

shell 复制代码
#容器通常都是在后台运行的,所有有时需要进入容器修改一些配置
docker exec -it 容器id bashSell #进入容器后开启一个新的终端(常用)
#例如:docker exec -it 123456 /bin/bash

docker attach 容器id 	#进入容器正在执行的终端,不会启动新的进程
#例如:docker attach 123456 

退出容器

shell 复制代码
exit		#直接停止容器并退出
Ctrl + P + Q #容器不停止推出

删除容器

shell 复制代码
docker rm 容器id		#删除指定容器,不能删除正在运行的容器,如果要强制删除要加上 rm -f
docker rm -f $(docker ps -aq)	#删除所有容器

启动和停止容器的操作

shell 复制代码
docker start 容器id		#启动容器
docker restart 容器id		#重启容器
docker stop 容器id		#停止容器
docker kill 容器id		#强制停止当前容器

一些其他命令

shell 复制代码
docker [命令] --help		#用于查看这个命令能用哪些参数,怎么用
docker logs				#查看日志
docker top 容器id			#查看容器中进程信息
docker inspect 容器id		#查看镜像的元数据(基本包括了镜像的所有信息)
docker cp 容器id:容器内路径 目的的主机路径  #把容器内文件拷贝到主机上
#例子:docker cp 123456:/home/test.java /home
docker stats 	#查看docker状态,看看容器的内存占用情况

容器的数据卷volume

为什么要用数据卷?

答:就是为了容器的持久化和同步操作!容器间也是可以数据共享的。因为如果你创建一个mysql容器的话,新增的sql数据都是放进容器里的,如果删除了容器,那数据库里的数据就没了,很容易删库跑路。而数据卷就是将mysql容器里的mysql数据同步到本地的一个技术,就叫卷技术。

其实就是将容器内的目录挂载到linux上就行了。

方式一:直接使用命令挂载

shell 复制代码
docker run -it -v 主机目录:容器内目录 	#例子:docker run -it -v /home/ceshi:/home 镜像名 /bin/bash

启动后可以通过docker inspect 容器id 来查看是否挂载了。

好处:

​ 相当于两个目录是双向绑定的,挂在后修改任意一个目录里的内容,另一个目录都会同步对应的信息,所以想修改mysql里面的配置等信息的话,直接在linux上修改就行,不用跑去容器内部修改。

数据卷实战:安装Mysql

shell 复制代码
#官网的指令是:$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#稍作修改后的指令
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
#其中 -d是后台运行;-p是端口映射;-v是数据卷挂载,可多个;-e是环境配置,这里必须配置它的密码。
#这样就实现了容器的数据持久化了,删除了这个mysql容器里面的数据也会保留着。

多个mysql数据卷容器

DockerFile

dockerfile是用来构建docker镜像文件的!命令参数脚本!

构建步骤:

  1. 编写一个dockerfile文件(因为网上的镜像都是最基础的,不一定使用我们自己的项目)
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库)
DockerFile构建过程

基础知识:

  1. 每个保留关键字(指令)都必须是大写字母
  2. 从上到下依次执行
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交!

DockerFile指令

创建一个自己的centos

可通过命令:docker run -it mycentos:0.1 运行测试

其中WORKDIR是镜像的工作目录,用pwd命令即可看工作目录在哪个目录下

其中构建镜像时,命令后面要加上目录,当前目录就是:.

实战:Tomcat镜像

  1. 准备镜像文件 tomcat压缩包,jdk的压缩包!

  2. 编写dockerifle文件,官方命名为Dockerfile,build会自动寻找这个文件,就不需要-f 去指定了

  3. 构建镜像

shell 复制代码
# docker build -t diytomcat .
  1. 启动镜像
  2. 访问测试
  3. 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了)
发布自己的镜像到DockerHub

镜像发布到dockerhub上

  1. 注册自己的dockerhub账号

  2. 登录自己的账号

    SHELL 复制代码
    docker login -u 用户名
  3. 提交

    SHELL 复制代码
    #docker push 自己的镜像名:版本号
    docker push kuangshen/diytomcat:1.0

镜像发布到阿里云上

直接看阿里云文档就行,很简单的。

小结

Docker网络

查看网络IP地址

SHELL 复制代码
ip addr

linux可以ping通自己创建的容器。因为都在同一个网段里。

实战

  1. Docker配置国内Docker镜像源

    1. 若报错:docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canc 则直接再加几个配置来解决。

    2. 这个链接

      复制代码
      {
        "registry-mirrors": ["https://docker.registry.cyou",
      "https://docker-cf.registry.cyou",
      "https://dockercf.jsdelivr.fyi",
      "https://docker.jsdelivr.fyi",
      "https://dockertest.jsdelivr.fyi",
      "https://mirror.aliyuncs.com",
      "https://dockerproxy.com",
      "https://mirror.baidubce.com",
      "https://docker.m.daocloud.io",
      "https://docker.nju.edu.cn",
      "https://docker.mirrors.sjtug.sjtu.edu.cn",
      "https://docker.mirrors.ustc.edu.cn",
      "https://mirror.iscas.ac.cn",
      "https://docker.rainbond.cc"]
      }
  2. 重启docker

    shell 复制代码
    #重启docker
    systemctl restart docker
    #查看镜像
    docker images
    #查看版本号
    docker -v
    #查看配置是否生效
    docker info

卸载docker

Docker 完整卸载教程

??dockerDesktop

下载安装dockerDesktop

docker安装mysql8

  1. 拉取官方镜像

    shell 复制代码
    docker pull mysql:8.0
  2. 运行MySQL容器--因为mysql启动必须要用密码这些配置才行。

    shell 复制代码
    docker run -d \
      --name mysql8 \
      -p 3306:3306 \
      -e TZ="Asia/Shanghai"     #指定容器时区为北京时间
      --privileged=true      	#赋予容器 特权模式,允许容器内的进程访问宿主机的所有设备和资源(如直接操作内核功能、挂载设备等),绕过大部分安全限制
      -e MYSQL_ROOT_PASSWORD=your_strong_password \
      -v /my/custom/mysql/data:/var/lib/mysql \
      mysql:8.0 \
      --character-set-server=utf8mb4 \
      --collation-server=utf8mb4_unicode_ci
      
         # 示例(Windows系统):
       -v E:/Mysql8.4.2/mysql-data:/var/lib/mysql # 挂载数据目录
        -v E:/Mysql8.4.2/mysql-docker/config:/etc/mysql/conf.d `  # 挂载配置文件目录--重点:config里面的my.cnf文件权限先设置只读权限,不然里面的配置文件不生效
        -v E:/Mysql8.4.2/mysql-docker/etc/my.cnf:/etc/my.cnf #挂载主要的配置文件--这个可以先不要
       	-v E:/Mysql8.4.2/mysql-docker/backup/:/backup  #挂载备份文件
       
       #总结
    docker run -d --name mysql8 -p 3308:3306 
    	-e MYSQL_ROOT_PASSWORD=123456 
    	-e TZ="Asia/Shanghai" 
    	 --privileged=true 
    	-v E:/Mysql8.4.2/mysql-data:/var/lib/mysql 
    	-v E:/Mysql8.4.2/mysql-docker/config:/etc/mysql/conf.d #这个目录里的my.cnf文件先改成只读的
    	-v E:/Mysql8.4.2/mysql-docker/etc/my.cnf:/etc/my.cnf
    	-v E:/Mysql8.4.2/mysql-docker/backup/:/backup 
    	 mysql:8.4.2
        --character-set-server=utf8mb4 
        --collation-server=utf8mb4_unicode_ci
        
    #杰焜的命令
    docker run -d -p 3306:3306 
    	--name mysql 
    	 -e TZ="Asia/Shanghai" 
    	 --privileged=true 
    	 -v /zhhy/mysql/data/:/var/lib/mysql 
    	 -v /zhhy/mysql/config/:/etc/mysql/conf.d 
    	 -v /zhhy/mysql/backup/:/backup 
    	 -e MYSQL_ROOT_PASSWORD=zhhy5105006 
    	 mysql:8.4.2
    
    #最后执行
    docker run -d --name mysql8 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ="Asia/Shanghai"  --privileged=true -v E:/Mysql8.4.2/mysql-data:/var/lib/mysql -v E:/Mysql8.4.2/mysql-docker/config:/etc/mysql/conf.d -v E:/Mysql8.4.2/mysql-docker/backup/:/backup mysql:8.4.2 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

    参数说明:

    -d:后台运行

    --name:容器名称

    -p 3306:3306:端口映射(主机端口:容器端口)

    -e MYSQL_ROOT_PASSWORD:必须设置的root密码

    -v:数据持久化目录映射(建议必须配置)

  3. mysql8的挂载的config文件目录

    其中my.cnf文件的内容:

    注意:my.cnf文件需要改权限或为只读里面的配置才能生效

    shell 复制代码
    # For advice on how to change settings please see
    # http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
    [mysqld]
    character-set-server=utf8
    #
    log-error=/backup/error/mysql.error
    
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    #
    max_connections = 6002
    max_allowed_packet = 1024M
    port=3306
    
    
    [mysqldump]
    user=root
    password=zhhy5105006
    
    #
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    # innodb_buffer_pool_size = 128M
    #
    # Remove leading # to turn on a very important data integrity option: logging
    # changes to the binary log between backups.
    # log_bin
    #
    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M
    
    # Remove leading # to revert to previous value for default_authentication_plugin,
    # this will increase compatibility with older clients. For background, see:
    # https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
    # default-authentication-plugin=mysql_native_password
相关推荐
要站在顶端2 小时前
基于 curl 实现 Jenkins 上传制品到 JFrog Artifactory
运维·ci/cd·jenkins
杨德杰2 小时前
Ubuntu设置VNC远程桌面
linux·运维·ubuntu
❀͜͡傀儡师2 小时前
Docker一键部署Nexus Terminal,高颜值SSH新体验
docker·容器·ssh
写代码的学渣3 小时前
Ubuntu/麒麟默认锁定root账户
linux·运维·ubuntu
TH_13 小时前
腾讯云-(10)-宝塔面板-Docker下安装Elasticsearch
elasticsearch·docker·容器
刚哥的进化路4 小时前
Linux系统日志管理完全教程:从基础查看 to 集中分析(附实战命令)
运维·自动化运维
互联网小顽童4 小时前
Linux系统进阶管理教程:从基础操作到企业级运维(附实战命令)
运维·自动化运维
面对疾风叭!哈撒给4 小时前
Docker之 Portainer、Node-RED和EMQX安装与配置
运维·docker·容器
RisunJan4 小时前
Linux命令-exportfs命令(管理NFS服务器上共享文件系统)
linux·运维·服务器