Docker容器
常用的官网网址:
安装Docker Desktop on Windows
安装Docker Windows教学视频
-
- 文档: Docker 简介和安装
-
第一步:控制面板->程序->启用或关闭 windows 功能,开启 Windows 虚拟化和 Linux 子系统(WSL2)

-
第二步:直接在官网安装Docker Windows
-
第三步:我的电脑是windows家庭版,没有Hyper-V,所以要自己安装。
-
其他:win10系统 Docker 提示Docker Engine stopped解决全过程记录
- 遇到wsl没有子系统问题:
- 就需要wsl --update
- wsl --install --web-download
- 遇到wsl没有子系统问题:
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的流程:
- 配置好docker file文件,用来创建docker镜像(相当于自动化脚本。用来安装环境必须的依赖项(如:mysql、node、redis)和应用程序)
- Image/镜像(可以理解为安装包。相当于虚拟机的快照,里面包含了要部署的应用程序和所有依赖项)
- 通过镜像可以创建许多不同的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镜像文件的!命令参数脚本!
构建步骤:
- 编写一个dockerfile文件(因为网上的镜像都是最基础的,不一定使用我们自己的项目)
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库)
DockerFile构建过程
基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 从上到下依次执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交!
DockerFile指令

创建一个自己的centos

可通过命令:docker run -it mycentos:0.1 运行测试
其中WORKDIR是镜像的工作目录,用pwd命令即可看工作目录在哪个目录下
其中构建镜像时,命令后面要加上目录,当前目录就是:.
实战:Tomcat镜像
-
准备镜像文件 tomcat压缩包,jdk的压缩包!

-
编写dockerifle文件,官方命名为
Dockerfile,build会自动寻找这个文件,就不需要-f去指定了
-
构建镜像
shell
# docker build -t diytomcat .
- 启动镜像
- 访问测试
- 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了)
发布自己的镜像到DockerHub
镜像发布到dockerhub上
-
注册自己的dockerhub账号
-
登录自己的账号
SHELLdocker login -u 用户名 -
提交
SHELL#docker push 自己的镜像名:版本号 docker push kuangshen/diytomcat:1.0
镜像发布到阿里云上
直接看阿里云文档就行,很简单的。
小结

Docker网络
查看网络IP地址
SHELL
ip addr

linux可以ping通自己创建的容器。因为都在同一个网段里。
实战
-
-
若报错:docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canc 则直接再加几个配置来解决。
-
{ "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"] }
-
-
重启docker
shell#重启docker systemctl restart docker #查看镜像 docker images #查看版本号 docker -v #查看配置是否生效 docker info
卸载docker
??dockerDesktop
下载安装dockerDesktop
docker安装mysql8
-
拉取官方镜像
shelldocker pull mysql:8.0 -
运行MySQL容器--因为mysql启动必须要用密码这些配置才行。
shelldocker 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:数据持久化目录映射(建议必须配置)
-
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