Docker
简介
安装
参考:
Docker仓库进行安装
CentOS
建议的安装方式直接去阿里云开发者社区中找到Docker相应的镜像网页,里面的安装方式还是很官方的。
2023-6-7:对比官方、ChatGPT提供安装方式,搜索各个包的作用后,总结以下安装流程。
参考:
必备工具安装
1 | 安装必要的一些系统工具 |
device-mapper-persistent-data:这个软件包提供了 Device Mapper 的持久数据存储库。Device Mapper 是 Linux 内核的一个框架,用于实现基于块设备的存储虚拟化。在 Docker 中,Device Mapper 可以用作存储驱动程序,用于管理 Docker 容器的文件系统。device-mapper-persistent-data 包含了一些实用程序,如 thin_check 和 thin_restore,这些实用程序用于管理和维护 Device Mapper 的持久数据存储。
lvm2:这个软件包提供了逻辑卷管理(LVM)工具。LVM 是一种用于管理磁盘空间的技术,它允许您更灵活地管理磁盘分区和存储。在 Docker 中,LVM 可以与 Device Mapper 配合使用,以便更有效地管理容器的存储需求。
添加国内Docker软件仓库
1 |
|
安装Docker
1 | dnf install docker-ce docker-ce-cli containerd.io -y |
- docker-ce-cli:这个软件包提供了 Docker 命令行界面(CLI)。Docker CLI 是一个用于与 Docker 引擎进行交互的命令行工具。它允许您执行各种操作,如运行容器、管理镜像、查看容器日志等。安装此软件包后,您可以在终端中使用 docker 命令来管理 Docker 容器和服务。
- containerd.io:这个软件包提供了 containerd 容器运行时。containerd 是一个用于管理容器生命周期的守护程序,它是 Docker 引擎的一部分。containerd 负责从镜像创建容器、启动和停止容器、管理容器的存储和网络等。安装此软件包后,Docker 将使用 containerd 作为其底层容器运行时。
Docker启动
1 | systemctl start docker |
Docker开机自启
1 | systemctl enable docker |
卸载 docker
1 | dnf remove docker-ce -y |
技巧
推荐:
Docker Hub网站是Docker官方的镜像管理网站,直接可以去网站搜索想要的镜像,大部分镜像的使用说明都可以搜索到,少走好多弯路。
创建容器,需要端口映射的主机一定要进行
-p 33060:3306
(物理机端口:虚拟机端口),详情查看常用命令 > 创建并运行容器
创建容器大佬的一个命令:
docker run --name adguardhome -v /AdguardHome:/opt/adguardhome/work -v /AdguardHome:/opt/adguardhome/conf -p 53:53/tcp -p 53:53/udp -p 67:67/udp -p 68:68/tcp -p 68:68/udp -p 80:80/tcp -p 443:443/tcp -p 853:853/tcp -p 3000:3000/tcp --restart=always -d adguard/adguardhome
可以看考一下端口映射。
常用命令
建议使用Docker,尽量还是自己敲命令行最好,虽然有图形化界面比如Portainer。
参考:
查看Docker信息
1 | docker info |
搜寻镜像
1 | docker search <镜像名> |
拉取镜像
1 | docker pull <镜像名:版本号> |
- 查询镜像建议去DockerHub寻找,版本号自己可以复制下,直接可pull想要的版本
列出镜像
1 | docker images |
更新镜像
创建镜像
删除本地镜像
1 | docker rmi <镜像名:版本号>/<IMAGE ID> |
- 删除了镜像,但如果之前用此镜像创建过容器容器不会被删除
创建(run)容器
1 | docker run -d --name <容器名> -p <系统端口:容器端口> <镜像名:版本号>/<镜像ID> |
- 创建容器前一定要下载到创建相关的镜像,命令中
--name <容器名>
-d
为后台运行并打印容器ID [Run container in background and print container ID] ,守护进程,后台运行该容器- -v 目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录>
启动容器
1 | docker start <容器ID> |
查看容器配置信息
很重要,可以查看到容器的所有配置信息,比如端口、映射文件、地址等…
1 | docker inspect <容器ID> |
查看容器日志
打印后的容器日志按照时间的顺序升序(最新在后)
1 | docker logs <container_id> |
列出容器
1 | docker ps -a #列出所有容器 |
进入容器
推荐使用这样的方式运行容器,exit后容器不退出:
1 | docker exec -it <容器ID> /bin/bash |
- 命令解释
- -i: 交互式操作
- -t: 终端
- -d:后台运行
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是
/bin/bash
,也可以bash
此方式直接就可以执行一些命令打印到宿主机:
1 | 说明可以通过宿主机无缝使用容器内的软件,使用完成执行退出软件命令即可 |
1 | docker attach |
- 这个方式会导致容器进入一次退出后直接关闭容器
运行容器状态
1 | docker stats |
- ctrl+c 退出
创建进入容器
1 | docker run -it --name <镜像名> /bin/bash |
创建容器的时候不一定就是这样的格式,比如MySQL创建命令:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
(来自DockerHub)- -d 后面的参数来自 本地/远程 镜像,使用docker images 可以列出将要使用的参数
mysql
(仓库源),tag
(标签) -e
设置环境变量
- -d 后面的参数来自 本地/远程 镜像,使用docker images 可以列出将要使用的参数
创建需要联网的容器,建议要自己指定端口映射。
- -p 0.0.0.0:33060:3306/udp(IP:物理机端口:虚拟机端口/协议),即可映射端口,可固定IP,可指定协议类型(默认TCP);
-P
让Docker随机指定映射端口;- 建议阅读简书:Docker-端口映射
1
2
3
4
5
6
7
8
9
10
11
12
13[root@VM-12-9-centos ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fac7b2a099cf mysql:8.0.29 "docker-entrypoint.s…" 37 seconds ago Up 37 seconds 33060/tcp, 0.0.0.0:33060->3306/tcp wall-mysql #箭头意思是物理端口33060映射回Docker虚拟机的3306,正确
a807ee80fd3e mysql:8.0.29 "docker-entrypoint.s…" 25 minutes ago Up 25 minutes 3306/tcp, 0.0.0.0:3306->33060/tcp mysql-wall #箭头意思是物理端口3306映射回Docker虚拟机的33060,显然错误
添加一个测试主机
[root@VM-12-9-centos ~]$ docker run --name mysql-test-port -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.0.29
[root@VM-12-9-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d682063517a1 mysql:8.0.29 "docker-entrypoint.s…" 46 seconds ago Up 44 seconds 3306/tcp, 33060/tcp mysql-test-port #新的主机,会发现和映射到物理主机的写法不一样
fac7b2a099cf mysql:8.0.29 "docker-entrypoint.s…" 41 minutes ago Up 41 minutes 33060/tcp, 0.0.0.0:33060->3306/tcp wall-mysql
a807ee80fd3e mysql:8.0.29 "docker-entrypoint.s…" About an hour ago Up About an hour 3306/tcp, 0.0.0.0:3306->33060/tcp mysql-wall设置容器自动重启状态
--restart=<状态>
- no - 容器退出时,不重启容器;
- on-failure - 只有在非0状态退出时才从新启动容器;
- always - 无论退出状态是如何,都重启容器;
修改容器配置
目前已知可修改的配置有:端口、映射文件。
参考:
CSDN-qqjtxc:正在运行的容器目录映射到宿主机的讲解
修改容器配置
容器自启
设置某容器自启
1 | docker update --restart=always <容器名|容器ID> |
查看自启配置
1 | docker inspect <容器名称或容器ID> --format='{{.HostConfig.RestartPolicy.Name}}' |
"always"
,则表示该容器已经设置为自启动。"no"
、"on-failure"
等,则表示容器不会自动重启。
内存配置
使用镜像mysql:5.7
时,意外的发现,我的Arch Linux
内存占满了,不只是前10个月运行过的容器还是新pull过来的mysql:5.7
,都会出现一样的问题,导致系统异常卡顿,于是使用如下的方法解决这个问题。
设置内存 2g,swap 2g,不能只单独设置内存,会报错,请确保新的内存交换限制大于或等于新的内存限制。
设置之后内存太小又不能使其正常运行,可能是我的Docker版本是最新的原因,果断换成mysql:8.0.33-debian
,没有出现内存占满的情况了。
1 | 修改某容器内存使用限制 |
docker update
命令只能更新一些限制,如内存、CPU等。如果你需要修改其他容器的配置,例如网络设置、环境变量等,你可能需要停止并重新启动容器,使用新的参数来运行容器。
添加容器文件映射
首先查看容器Id:
1 | docker inspect 921ea8860660 |grep Id |
根据容器Id配置容器(root):
此/var/lib/docker/containers/
目录文件包含某个容器的配置,修改其中:
hostconfig.json
1
2
3
4// /home/fuding/mysql/data-YangGuang(HOST) <= /var/lib/mysql(CONTAINER)
"Binds":[
"/home/fuding/mysql/data-YangGuang:/var/lib/mysql"
]config.v2.json
更改
hostconfig.json
后要添加以下,不然上面的新配置会被删除。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15"MountPoints":{
"/var/lib/mysql":{
"Source":"/home/fuding/mysql/data-YangGuang",
"Destination":"/var/lib/mysql",
"RW":true,"Name":"",
"Driver":"",
"Type":"bind",
"Propagation":"rprivate",
"Spec":{"Type":"bind",
"Source":"/home/fuding/mysql/data-YangGuang",
"Target":"/var/lib/mysql"
},
"SkipMountpointCreation":false
}
}
重启容器生效配置
容器文件管理
主机容器之间复制文件
打印 docker cp
命令帮助:
1 | 4429 ◯ docker cp --help |
导出/导入 容器& 保存/加载 镜像
Docker 快照:即虚拟机快照功能,相当于给虚拟机系统做一次数据备份,保存容器运行时的状态,除了镜像内已有的数据,比如系统内核(个人理解)。
导出会丢失镜像所有的历史记录和元数据,仅保存导出时的状态,无法回滚操作!!
用途:比如做一个基础镜像,此镜像将会作为基础的开发环境。
参考:
export import
导出容器快照
1
docker export <容器ID> >~/Desktop/MySql-Docker.snapshoot.tar
导入容器快照
1
2导入快照的镜像需本地已存在
cat docker/ubuntu.tar | docker import - <镜像名>:<TAG号>
load save
直接将镜像整个进行压缩导出,可将多个镜像打包为一个,不会丢失镜像的历史,可回滚到之前的层。
用途:如使用docker-compose.yml 编排的多个镜像组合,要部署的客户服务器不能连接外网,此时可以用
docker save
将用到的镜像打包,拷贝到客户的服务器使用docker load
。
保存镜像
1
2打包单个
docker save <镜像ID> > hangge_server.tar1
2打包多个
docker save -o images.tar <镜像名>:<TAG号> <镜像名>:<TAG号> ...载入镜像
1
docker load < images.tar
停止容器
1 | docker stop <容器ID> |
重启容器
1 | docker restart <容器ID> |
删除容器
1 | 需先停止容器 |
列出网络
1 | docker network ls |
查看网络详情
1 | docker network inspect <网络名|网络ID> |
查看端口映射情况
1 | docker port <容器名|容器ID> [端口号] |