简介

安装

参考:

Docker CE是什么

菜鸟教程:Docker安装

Doker官网:Install Docker Engine on CentOS

Docker仓库进行安装

CentOS

建议的安装方式直接去阿里云开发者社区中找到Docker相应的镜像网页,里面的安装方式还是很官方的。

2023-6-7:对比官方、ChatGPT提供安装方式,搜索各个包的作用后,总结以下安装流程。

参考:

阿里云-开发者社区:Docker CE 镜像

必备工具安装

1
2
# 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  • 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
2
3
4
5
6

# 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 或者使用dnf
dnf config-manager --add-repo=http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #添加国内阿里云软件仓库

安装Docker

1
dnf install  docker-ce docker-ce-cli containerd.io -y
  1. docker-ce-cli:这个软件包提供了 Docker 命令行界面(CLI)。Docker CLI 是一个用于与 Docker 引擎进行交互的命令行工具。它允许您执行各种操作,如运行容器、管理镜像、查看容器日志等。安装此软件包后,您可以在终端中使用 docker 命令来管理 Docker 容器和服务。
  2. containerd.io:这个软件包提供了 containerd 容器运行时。containerd 是一个用于管理容器生命周期的守护程序,它是 Docker 引擎的一部分。containerd 负责从镜像创建容器、启动和停止容器、管理容器的存储和网络等。安装此软件包后,Docker 将使用 containerd 作为其底层容器运行时。

Docker启动

1
systemctl start docker

Docker开机自启

1
systemctl enable docker

卸载 docker

1
2
3
dnf remove docker-ce -y 	

rm -rf /var/lib/docker #清理数据

技巧

推荐:

DockerHub

  • 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简明教程

国光:Docker 温故知新

PHP中文网:docker怎么查看网络详情

CSDH:docker查看映射端口

简书:Docker-端口映射

腾讯云:一张脑图整理Docker常用命令

51CTO博客:实现docker容器开机自启动

查看Docker信息

1
docker info 

搜寻镜像

1
docker search <镜像名>

拉取镜像

1
docker pull <镜像名:版本号>
  • 查询镜像建议去DockerHub寻找,版本号自己可以复制下,直接可pull想要的版本

列出镜像

1
2
docker images
docker image ls

更新镜像

创建镜像

删除本地镜像

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
2
3
docker logs <container_id>
# 显示最后10行日志
docker logs -n 10 <container_id>

列出容器

1
2
docker  ps -a		#列出所有容器
docker ps #列出运行中的容器

进入容器

推荐使用这样的方式运行容器,exit后容器不退出:

1
docker exec -it  <容器ID> /bin/bash
  • 命令解释
    • -i: 交互式操作
    • -t: 终端
    • -d:后台运行
    • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash,也可以bash

此方式直接就可以执行一些命令打印到宿主机:

1
2
# 说明可以通过宿主机无缝使用容器内的软件,使用完成执行退出软件命令即可
docker exec -it 921ea8860660 ls /var/lib/mysql
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设置环境变量
  • 创建需要联网的容器,建议要自己指定端口映射。

    • -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-二月风格:docker修改容器配置文件的三种方法

CSDN-qqjtxc:正在运行的容器目录映射到宿主机的讲解

CSDN-954L(转载):运行中的Docker容器添加映射端口

CSDN-T型人小付:docker多种创建volume操作详解

修改容器配置

容器自启

设置某容器自启

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
2
# 修改某容器内存使用限制
docker update --memory <new_memory_limit> --memory-swap <new_memory_swap_limit> <container_id_or_name>

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
4429 ◯  docker cp --help                                     

Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

Copy files/folders between a container and the local filesystem

Use '-' as the source to read a tar archive from stdin
and extract it to a directory destination in a container.
Use '-' as the destination to stream a tar archive of a
container source to stdout.

Options:
-a, --archive Archive mode (copy all uid/gid information)
-L, --follow-link Always follow symbol link in SRC_PATH

导出/导入 容器& 保存/加载 镜像

Docker 快照:即虚拟机快照功能,相当于给虚拟机系统做一次数据备份,保存容器运行时的状态,除了镜像内已有的数据,比如系统内核(个人理解)。

导出会丢失镜像所有的历史记录和元数据,仅保存导出时的状态,无法回滚操作!!

用途:比如做一个基础镜像,此镜像将会作为基础的开发环境。

参考:

博客园-Ruthless:Docker导入、导出、删除容器

航歌:Docker - 实现本地镜像的导出、导入(export、import、save、load)

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.tar
    1
    2
    # 打包多个
    docker save -o images.tar <镜像名>:<TAG号> <镜像名>:<TAG号> ...
  • 载入镜像

    1
    docker load < images.tar

停止容器

1
docker stop <容器ID>

重启容器

1
docker restart <容器ID>

删除容器

1
2
3
4
# 需先停止容器
docker rm <容器ID>
# 不需要停止容器
docker rm -f <容器ID>

列出网络

1
docker network ls

查看网络详情

1
docker network inspect <网络名|网络ID>

查看端口映射情况

1
docker port <容器名|容器ID> [端口号]