docker 笔记
Windows 安装docker #docker-desktop
进入官网下载docker desktop (不太好用,最起码不如linux docker好用)
安装默认选择C盘 C:\Program Files\Docker\Docker
如果需要安装到其他盘符 使用命令安装
docker desktop 的设置有时管用,有时不管用,例如设置镜像源和设置下载镜像位置的时候
不管用只能卸载重启,或者试下到文件夹修改文件,(我测试的时候修改文件也不好使,重装了N次才好😅)
win11电脑还有可能会遇到安装新功能中没有hype-V的选项
那么手动执行下面这个.bat文件即可,需要关机重启
![[Hyper-V.bat]]
安装的必备条件
因为Windows上安装Docker实际上是基于Hyper-V或者WSL2这两项虚拟化技术,所以不管是对于系统还是硬件都有一定的要求。
1,系统要求
-
Windows 11 64 位:家庭版或专业版 21H2 或更高版本,或企业版或教育版 21H2 或更高版本。
-
Windows 10 64 位:
-
建议使用 Home 或 Pro 22H2(内部版本 19045)或更高版本,或者企业或教育版 22H2(内部版本 19045)或更高版本。
-
最低要求是 Home 或 Pro 21H2(内部版本 19044)或更高版本,或者 Enterprise 或教育版 21H2(内部版本 19044)或更高版本。
-
2,处理器开启虚拟化
🔺处理器是否开启虚拟化可以直接在“任务管理器–性能–CPU“中查看,如果虚拟化显示”已启用“就说明没问题,如果没启用就需要进主板BIOS中开启,具体开启方法可以百度自己的主板型号开启。
安装前的准备
满足以上必备条件之后,我们还需要对电脑进行必要的环境设置。
🔺电脑桌面使用快捷键 win + r
键入 OptionalFeatures
,“确定”之后打开 Windows 功能。
🔺然后在“Windows 功能”中勾选Hyper-V、Windows虚拟机监控程序平台、容器、适用于Linux的Windows子系统这四项,点“确定”。
🔺提示重启系统,点“立即重新启动”。
正式安装
🔺重启之后打开Docker官网下载Windows版本的安装程序,下载页面地址:https://www.docker.com/products/docker-desktop/
🔺下载好之后直接双击安装,安装过程中这里有两个选项,记得都勾选上。
🔺之后它就会自动下载安装必要的程序到本地,时间视自己的网络而定。
🔺出现上图界面就说明安装完成,点“Close”关闭安装界面。
初始配置
🔺电脑桌面上的“Docker Desktop”图标打开程序,这里点“Accept”接受。
🔺选择“Con…”
🔺继续选择“Skip survey”
🔺终于来到Docker Desktop页面,不过这个出现上图所示的弹窗报错。我在这里卡了很久,因为不管是主板BIOS还很设置中我都启用了虚拟化的,突然记得我之前在电脑上折腾模拟器的时候使用命令手动关闭过虚拟化技术,所以这个时候我需要再次使用命令启用它即可。
🔺启用也很简单,鼠标右键电脑底部状态栏的“开始”图标,选择“终端管理员”。
🔺然后输入命令“bcdedit /set hypervisorlaunchtype auto”并回车即可。
🔺这个时候再次打开Docker Desktop程序就没问题了。不过在“设置”里面它会提示我们没有安装WSL2发行版,这个也好解决。
🔺也是和前面一样,打开“终端管理员”,先输入命令“wsl.exe --list --online”查看当前在系统上可以安装并运行的WLS发行版列表。从列表中我们可以看到支持的有常见的Ubuntu、Debian等。(==这步不下载也可以== )
🔺这里我以安装Debian为例,输入命令“wsl.exe --install Debian”即可。
🔺安装好之后会让我们设置一个账号和密码,自己随意设置即可。
🔺 看到以上信息不报错,就说明没有问题。
🔺回到Docker Desktop,还是正在“设置”里面的WSL可以看到它这里已经有个Debian选项了,开启并保存即可。至此, 我们在Windows 11上的Docker已经可以直接使用了。
成果检验
🔺和NAS上不同的是,我们也不需要SSH终端工具,直接使用电脑自己的“终端管理员”就能使用Docker命令。比如我们使用命令“docker version”可以查询当前的Docker版本信息。
🔺或者可以直接输入命令“docker run hallo-world”命令部署一个检验容器,从下方输出看了一看出没有问题。
🔺桌面上的Docker Desktop程序也显示了刚部署好的检验容器。
拉取oracle12c镜像 并启动 #Oracle-12c
MySQL和Orac
le是开发中常用到的两个关系型数据库管理系统,接上一期内容,这一期在Docker中完成oracle-12c
的安装和配置。
安装oracle-12c
1、拉取oracle-12c镜像
启动Docker Desktop后在cmd窗口中执行docker search oracle
命令,搜索Oracle相关的镜像,可以看到搜索结果中的truevoly/oracle-12c
不指定版本则默认下载oracle-12c最新版本的镜像,Oracle的镜像文件较大,拉取镜像会久一些。
1 | # 拉取镜像(默认下载oracle-12c最新版本的镜像) |
2、创建并启动容器
cmd中执行以下命令,在docker中创建并启动一个oracle-12c容器,对物理机暴露2122、9090和1521三个端口分别映射到容器内的22、8080和1521端口,并且将容器内的oracle目录挂载到物理机的D盘中
1 | # 创建oracle-12c容器并启动 |
查看容器启动日志(看到Import finished Database ready to use. Enjoy! 即容器创建并启动完成)
1 | # 查看oracle-12c启动日志 |
若日志中出现以下报错,是因为对外暴露的端口不可用访问权限已被禁止,只要更改创建容器时对外暴露的端口即可
1 | docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:1521 -> 0.0.0.0:0: listen tcp 0.0.0.0:1521: bind: An attempt was made to access a socket in a way forbidden by its access permissions. |
可在cmd中执行以下命令查看哪些端口被禁用TCP协议
1 | # cmd命令查看哪些端口被禁用TCP协议 |
3、修改oracle账号密码设置
truevoly/oracle-12c镜像创建的容器默认有sys
和system
两个用户,密码都是oracle
,默认的一个SID/服务名是xe,Oracle的用户密码默认有效期是180天,180天后用户会自动锁住,下面进入oracle-12c容器内将密码的有效期设置为永久!
1 | # 进入oracle-12c容器内 |
4、物理机连接oracle-12c
使用PL/SQL或Navicat等工具测试连接oracle-12c
拓展
Oracle创建表空间与用户
以下创建一个ling_mf3
数据表空间
1 | -- 创建ling_mf3数据表空间 |
创建表空间成功,同时也会在挂载的目录下生成相应数据文件
以下创建一个用户ling
并授权,且设置ling_mf3
为它的默认表空间
1 | -- 创建ling用户密码为meet0and1#202302并设置ling_mf3为它的默认表空间 |
重启Oracle服务
在Docker Desktop中可以一键重启,但实际开发中一般是在Linux环境中,我这里演示用命令重启Oracle服务
1 | -- 查看监听状态 |
更多常用…
1 | -- 删除表空间 |
1 | -- 查看Oracle版本 |
Docker 修改文件大小(容器占用大小和池大小(docker_data.vhdx))
Docker默认空间大小分为两个,一个是池空间大小,另一个是容器空间大小。
池空间大小默认为:100G
容器空间大小默认为是:10G
所以修改空间大小也分为两个:
这里使用centos下的yum进行安装的Docker。
首先,修改空间大小,必需使Docker运行在daemon环境下,即先停止正在运行的docker服务:
1 | service docker stop |
一、修改池空间大小方法:
1 | dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=1000 |
上面的1000为1TB大小,即为数据池空间大小为1TB,而10则为Metadata的空间大小,10GB
从运行完后,使用命令查看docker池空间大小:
docker info
可以看到池空间已经被设置为data=1TB和metadata=10GB
二、修改容器空间大小:
1、首先先进入目录(使用yum安装docker的默认目录):
cd /dev/mapper/
2、使用命令查看容器是否正在运行。
docker ps -a
这里可以看到容器test正在运行。
3、使用命令查看容器卷:
dmsetup table
可以看到20971520,这个是卷空间值,我们需要修改的就是这里。
其它的值要记下:253:7 11
4、使用ls或ll命令查看在/dev/mapper/目录下的文件是否存在。(这步很重要,因为非正在运行的Container是不会有这个文件的)
5、使用命令修改容器空间大小:
echo 0 88080384 thin 253:7 11 | dmsetup load docker-253:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e
===这里的88080384会替换原20971520值,意思为:42GB===
计数公式为:42_1024_1024*1024/512
可以使用命令打印:
echo $((42*1024*1024*1024/512))
接着使用命令:
dmsetup resume docker-253:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e
resize2fs /dev/mapper/docker-253:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e
完成。
然后进入容器的终端,使用命令df -h即可看到修改后的容器空间:
写了个shell脚本,用于修改池、容器空间使用:
1、resize_docker.sh
1 |
|
#Stop docker service
1 | systemctl stop docker |
#Resize docker data space
1 | dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=$DATA_SIZE |
#Resize docker metadata space
1 | dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=1G count=0 seek=$METADATA_SIZE |
#Start docker service
1 | systemctl start docker |
运行脚本方法:
1 | sh resize_docker.sh 1000 10 |
将会把docker的池修改为data=1TB,metadata=10GB
2、resize_container.sh
1 |
|
运行脚本方法:
1 | sh resize_container.sh 459fd505311ad364309940ac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771 100 |
将容器459fd505311ad364309940ac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771的空间修改为100GB
注:修改空间,必需是在docker的daemon模式下进行。
docker容器默认的空间是10G,如果想指定默认容器的大小(在启动容器的时候指定),可以在docker配置文件里通过dm.basesize参数指定,比如
docker -d --storage-opt dm.basesize=20G
是指定默认的大小为20G,具体参数可以参考https://github.com/docker/docker/tree/master/daemon/graphdriver/devmapper
上面方法只是真的生成容器的时候进行的,并且修改后需要重启docker,无法做到动态给运行容器指定大小,下面我介绍一下如何动态的扩展容器空间大小。
动态扩展的优点:
1、不需要修改docker配置,并且重启docker服务;
2、可以直接对运行中的容器进行动态扩展(只能增,无法缩);
缺点:
1、docker所在宿主机分区的格式必须是ext2、ext3、ext4;
2、docker存储引擎必须是devicemapper
存储引擎查看,可以使用docker info查看
15:25:49 # docker info
Containers: 5
Images: 62
Storage Driver: devicemapper
Pool Name: docker-8:17-37748738-pool
Data file: /data1/docker/devicemapper/devicemapper/data
Metadata file: /data1/docker/devicemapper/devicemapper/metadata
Data Space Used: 21498.9 Mb
Data Space Total: 102400.0 Mb
Metadata Space Used: 13.7 Mb
Metadata Space Total: 2048.0 Mb
Execution Driver: lxc-1.0.6
Kernel Version: 3.10.0-123.el7.x86_64
从上面的Storage Driver可以看到我使用的引擎。
下面是动态扩展的例子:
1、新建立个test容器
15:23:48 # docker run --privileged -d -p 22 --name=‘test’ docker.ops-chukong.com:5000/CentOS6-http:new /usr/bin/supervisord
1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7
root@ip-10-10-27-221:/tmp
15:24:01 # docker inspect test|grep -i add
1 | "IPAddress": "172.17.0.18", |
root@ip-10-10-27-221:/tmp
15:24:08 # ssh 172.17.0.18
The authenticity of host ‘172.17.0.18 (172.17.0.18)’ can’t be established.
RSA key fingerprint is 39:7c:13:9f:d4:b0:d7:63:fc:ff:ae:e3:46:a4:bf:6b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘172.17.0.18’ (RSA) to the list of known hosts.
root@172.17.0.18’s password:
Last login: Mon Nov 17 14:10:39 2014 from 172.17.42.1
root@1716fe941926:~
15:24:13 # df -hT
Filesystem Type Size Used Avail Use% Mounted on
rootfs rootfs 9.8G 470M 8.8G 5% /
/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7
ext4 9.8G 470M 8.8G 5% /
shm tmpfs 64M 0 64M 0% /dev/shm
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /.dockerinit
/dev/sda3 ext4 518G 30G 462G 6% /etc/resolv.conf
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /etc/hostname
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /etc/hosts
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /.dockerenv
可以看到我运行test容器的根分区是ext4分区,容器是10G
2、使用我的脚本动态扩展容器空间
脚本内容
# cat dynamic_modify_docker_disk.sh
1 |
|
目前给test容器进行动态增加20G空间
1 | # sh dynamic_modify_docker_disk.sh test 20 |
dynamic container test disk to 20G is success!
root@ip-10-10-27-221:/tmp
15:24:46 # ssh 172.17.0.18
root@172.17.0.18’s password:
Last login: Tue Jan 20 15:24:13 2015 from 172.17.42.1
root@1716fe941926:~
15:24:52 # df -hT
Filesystem Type Size Used Avail Use% Mounted on
rootfs rootfs 20G 475M 19G 3% /
/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7
ext4 20G 475M 19G 3% /
shm tmpfs 64M 0 64M 0% /dev/shm
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /.dockerinit
/dev/sda3 ext4 518G 30G 462G 6% /etc/resolv.conf
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /etc/hostname
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /etc/hosts
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /.dockerenv
可以看到已经增加成功
下面在给test增加到50G
15:25:21 # sh dynamic_modify_docker_disk.sh test 50
dynamic container test disk to 50G is success!
root@ip-10-10-27-221:/tmp
15:25:24 # ssh 172.17.0.18
root@172.17.0.18’s password:
Last login: Tue Jan 20 15:24:52 2015 from 172.17.42.1
root@1716fe941926:~
15:25:27 # df -hT
Filesystem Type Size Used Avail Use% Mounted on
rootfs rootfs 50G 480M 47G 1% /
/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7
ext4 50G 480M 47G 1% /
shm tmpfs 64M 0 64M 0% /dev/shm
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /.dockerinit
/dev/sda3 ext4 518G 30G 462G 6% /etc/resolv.conf
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /etc/hostname
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /etc/hosts
/dev/sdb1 ext4 1.8T 30G 1.7T 2% /.dockerenv
也可以增加成功
但我要是像缩减到30G
15:25:45 # sh dynamic_modify_docker_disk.sh test 30
I can’t shink container test from 50G to 30G!I only modify contanier increase disk!
是无法进行缩减的,仅能进行增加操作。
至于动态增加的原理请参考http://jpetazzo.github.io/2014/01/29/docker-device-mapper-resize/
FAQ:
centos 7里使用docker的时候默认存储引擎是devicemapper
在进行动态调整docker容器磁盘空间的时候,出现
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Device or resource busy while trying to open /dev/mapper/docker-253:1-1270544-d2d2cef71c86910467c1afdeb79c1a008552f3f9ef9507bb1e04d77f2ad5eac4
Couldn’t find valid filesystem superblock.
原因是resize2fs仅能支持ext2、ext3、ext4,不支持xfs ,所以建议docker服务器的文件系统格式调整为ext4
通过命令可以观察到/var/lib/Docker目录很大,我的主机只有20G,这个目录占了18G;原因是devicemapper的空间设的太大,通过docker info打印的Data Space Total参数可以看到,默认是107.4G。
思路如下:
备份当前容器、镜像;
删除/var/lib/docker目录;
使用dd命令重设大小;
恢复容器、镜像;
工具:
需要额外空间保存备份文件,可以挂载一个u盘或者云盘。
docker save 可以导出镜像 tar文件;
docker export 可以导出容器 tar文件;
备份好之后停止docker
#/etc/init.d/docker stop
删除/var/lib/docker目录;
#mkdir -p /var/lib/docker/devicemapper/devicemapper/data
#dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1M count=0 seek=8192
建立的文件最大为 1M * 8192 = 8G
启动docker
#/etc/init.d/docker start
使用docker info看看Data Space Total,检查是否设置成功
docker load 可以导入镜像tar文件为 镜像
注意load用法为:docker load image1:new<image1.tar
docker import 可以导入容器tar文件为 镜像
注意import用法为: cat container1.tar |docker import - container1:new
安装mysql
docker pull mysql:8…15等待下载完成即可
启动命令 :
1 | # 先启动一个临时的mysql容器,将容器的配置复制到服务器 |