Docker
Docker
小码同学介绍
-
Docker的英文本意是“搬运工”,在程序员的世界里,Docker搬运的是集装箱(Container),集装箱里装的是任意类型的App,开发者通过Docker可以将App变成一种标准化的、可移植的、自管理的组件,可以在任何主流系统中开发、调试和运行。最重要的是,它不依赖于任何语言、框架或系统。
-
目标是实现轻量级的操作系统虚拟化解决方案
-
基础:Linux 容器( LXC)
-
Go 语言实现
Docker组成
Docker Images:Docker image 是 Docker container 最基本的模板。image 通过容器使系统和应用易于安装,Docker image 是用来运行的容器,可以在 https://hub.docker.com/找到许多 images 。
Docker Registry:Docker registry 是为 Docker images 提供的库。它提供了公共和私有库。公共 Docker 库被叫做 Docker Hub。这里我们能够上传 push 和 pull 我们自己的 images。
Docker Container:Container是在原先的Image之上新加的一层,称作Container layer,这一层是可读可写的(Image是只读的)。Docker 是一个联合的文件系统作为容器后台,容器的任何变化,都将被保存在一个基本 image 新的层上。我们安装应用程序的层就是容器。每个在主机上运行的容器都是独立的,因此,提供了一个安全的应用平台。
虚拟机和容器的区别
虚拟化
容器化技术
虚拟化技术和容器技术性能对比
特性 | 虚拟机 | 容器 |
---|---|---|
硬盘空间 | GB级别 | MB级别 |
启动 | 分钟级 | 秒级 |
资源消耗 | 很大,单机一般几十个VM,硬盘使用一般为GB | 很小,单机支持上千个容器,硬盘使用一般为MB |
隔离性 | 强 | 弱 |
镜像大小 | 几百MB到几G | 可小至几MB |
性能 | 通过对硬件层的模拟,增加了系统调用链路的环节,有性能损耗 | 共享内核,接近原生,几乎没有性能损耗 |
系统覆盖 | Linux、Windows、Mac | 内核所支持的OS |
Docker应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
CentOS 7安装Docker-CE社区版
前言
在安装 Docker 之前,先说一下配置,我这里是Centos7 Linux 内核:官方建议 3.10 以上,3.8以上貌似也可。
注意:本文的命令使用的是 root 用户登录执行,不是 root 的话所有命令前面要加 sudo
查看当前内核版本
1 | [lilbai@localhost ~]$ uname -r |
更新yum包(这个命令不是必须的)
生产环境中此步操作需慎重,看自己情况,学习的话随便搞
1 | yum -y update:升级所有包同时也升级软件和系统内核; |
卸载旧版本的docker
如果你确信你的Linux 没装过docker,那么可以不执行这条命令
1 | yum remove docker docker-common docker-selinux docker-engine |
安装docker依赖yum-utils
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 |
设置yum源(二选一)
设置一个yum源,第一个是Docker官方的yum仓库,第二个是阿里云的yum仓库
1 | yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo |
查看docker版本有那些
1 | yum list docker-ce --showduplicates | sort -r |
选择一个版本安装
1 | yum -y install docker-ce-18.03.1.ce |
安装成功
出现下入说明已经安装成功了
设置开机启动docker
刚安装完的docker是还没启动的,需要启动才能执行docker命令
1 | systemctl start docker |
设置开机不启动docker
1 | systemctl enable docker |
Ubuntu18.04安装Docker-CE社区版
本次安装环境在华为服务器Ubuntu安装Docker
因为Ubuntu官方系统里自带的Docker版本不是最新的,为了安装最新版本,我们要从官方Docker库里下载,为此,需要先添加几个包源,添加GPG公钥来确保下载和安装的有效性。
更新现有包列表
1 | sudo apt update |
安装几个依赖包,让apt可以支持HTTPS
1 | sudo apt -y install apt-transport-https ca-certificates curl software-properties-common |
将官方Docker库的GPG公钥添加到系统中
1 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - |
将Docker库添加到APT里
1 | sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" |
再次更新现有包列表
1 | sudo apt update |
查看Docker库的版本
为了确保修改生效,让新的安装从Docker库里获取,而不是从Ubuntu自己的库里获取
1 | apt-cache policy docker-ce |
可能会看到如下图的输出,各个系统的情况可能略有不同
输出显示,docker-ce(ce是社区版的意思)还没有安装
开始安装
本次实验默认安装最新版Docker,如果你想执行下载某个版本,可以通过在软件包名后面添加版本=
来指定安装版本,比如指定安装 5.20.10.6~3-0
,则安装指令为:
sudo apt -y install docker-ce=<5:20.10.7~3-0~ubuntu-focal> docker-ce-cli=<5:20.10.7~3-0~ubuntu-focal> containerd.io
1 | sudo apt -y install docker-ce docker-ce-cli containerd.io |
安装这三个程序的作用:
docker-ce
:Docker守护进程,这是执行所有管理工作的部分,在Linux上需要另外两个守护进程。docker-ce-cli
:CLI工具来控制守护程序,如果要控制远程Docker守护程序,你也可以单独安装它们。containerd.io
:守护进程与OS API连接,从本质上将Docker与OS分离,还为非Docker容器管理器提供容器服务。
查看运行状态
现在Docker应该已经安装好了,守护进程也开启了,开机启动也开启了。我们看看Docker的运行状态吧
1 | systemctl status docker |
你看到的输出应该是这样的
到这里就安装成功啦
设置开启自启Docker
docker自启动(开机自启)
1 | systemctl enable docker.service |
关闭开机自动启动
1 | systemctl disable docker.service |
查看开机启动的程序
查看开机启动的程序中是否有docker
1 | systemctl list-unit-files | grep enable |
安装docker-compose
安装环境:CentOS 7
[root@localhost]# uname -r
3.10.0-1160.el7.x86_64
方式一:官网方式
下载docker-compose
1 | sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose |
下载过程出错
如果出现以下错误,是标识连接失败的意思,重新下载即可,下载地址在GitHub
上面,国内下载是稍微有点问题。
1 | curl: (35) TCP connection reset by peer |
添加可执行权限
1 | sudo chmod +x /usr/local/bin/docker-compose |
查看版本
1 | docker-compose --version |
方式二:pip方式安装
安装pip
1 | yum -y install epel-release |
查看pip版本
1 | pip --version |
更新pip
1 | pip install --upgrade pip |
安装docker-compose
1 | pip install docker-compose |
查看docker-compose版本
1 | docker-compose version |
方式三:手动安装
下载docker-compose
1 | wget https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-aarch64 |
将文件改名为docker-compose
1 | mv docker-compose-linux-aarch64 docker-compose |
将文件移动到/usr/local/bin/
1 | mv docker-compose /usr/local/bin/ |
添加可执行权限
1 | sudo chmod +x /usr/local/bin/docker-compose |
查看docker-compose版本
1 | docker-compose -v |
首次使用
我们每次使用docker运行容器所需的镜像来源都是官方的镜像仓库,由于docker的镜像仓库在国外,可能在访问时存在网络问题,可能有时候会拉取失败,所以我们将docker镜像源设置为国内的镜像源,这样下载的成功了也会高一点。
添加镜像源
一键添加镜像源
或者你也可以按照以下步骤,在/etc/docker/daemon.json
文件添加镜像源,如果没有该文件则新建一个。
进入root管理员
1 | su root |
一键添加源
1 | mkdir -p /etc/docker/ && cd /etc/docker/ && touch daemon.json && echo {\"registry-mirrors\":[\"https://docker.mirrors.ustc.edu.cn\"]} >> daemon.json |
打开文件
1 | vim /etc/docker/daemon.json |
写入镜像源(此处用中科大源)
将以下内容写入到/etc/docker/daemon.json
文件中
1 | {"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]} |
加载配置 && 重启docker
1 | sudo systemctl daemon-reload # 重新加载配置 |
部署Docker的容器
介绍
已经安装完Docker、docker-compose了,就可以开始部署Docker服务了。这里的服务一般表示为一个软件执行生成的服务,比如运行一个mysql、frp服务,我们要运行这些服务,我们在Windows上想要运行这个服务,是不是先要下载安装包,然后安装软件,安装完后打开软件,配置软件运行参数,然后启动运行。
我们使用docker部署一个服务,也是需要下载安装包,然后设置运行参数,然后启动就好了,比在Windows上省略了一点步骤。这里的下载安装包就是在docker下载镜像,设置运行参数就是编写docker-compose.yml
文件,启动容器就是docker-compose up -d
,如果你使用docker run XXX
这种方式启动容器更快,是不是感觉使用docker运行一个服务比传统安装方式方便许多呢。
下面我们具体举例运行一个docker容器,比如,我这里安装一个Docker web控制面板portainer为例,这个portainer
服务功能就是将Docker的运行情况显示在web页面上,通过web页面鼠标点点代替命令行管理Docker容器。
每一个服务都是一个独立的容器。
使用命令行部署服务
下载portainer镜像
在运行portainer程序前,我们需要下载portainer镜像,就类似我们在使用某个APP时,要下载安装包,然后安装软件才能使用。
1 | docker pull portainer/portainer |
运行容器
运行容器,类似用安装包安装软件一样,安装完后自动启动这个portainer容器,一个容器可以当做是一个或多个服务来理解,因为有些容器里面有运行多个服务的。
1 | docker run -d --name portainerUI -p 9000:9000 -v /home/docker/portainer:/var/run/docker.sock portainer/portainer |
解释:
-d
:让该服务在后台运行--name
:给该容器起一个名字-p
:定义端口映射。主机端口:容器端口-v
:数据卷挂载。主机路径:容器路径portainer/portainer
:你要运行的镜像名。
上面这些参数一般看镜像介绍文档,看具体需要加什么参数,不加的话,对应的功能就没有办法使用,可能还会导致运行失败。
其中比较重要的参数-p
,想从外网访问该容器的服务器,就没有办法访问了,因为这个端口就类似一条通道,放开该通道给外网访问,不作端口映射,表示不添加这条通道,外网就找不到这条通道了。
-v
:数据挂载。就是将你宿主机的某个文件夹挂载到docker容器里面,这样你的docker容器里面就可以访问到你挂载的文件夹了。
在作端口映射时,记得给主机开放端口。
查看portainer安装效果
1 | http://IP:9000 |
上面我们使用命令行运行了一个Docker容器,如果你要运行其他容器,也是类似这样子,先下载镜像,然后运行容器就可以了,只有简单的两步。
当然,你也是可以选择docker-compose
这种方式部署容器,这种方式部署容器有个好处就是,方便管理,因为你这个容器的全部配置信息都可以通过这个docker-compose.yml
文件可以看到,你下一次要配置和这个一模一样的容器环境,你只需要复制这个docker-compose.yml
文件信息就可以了。
使用docker-compose创建容器
我们在安装docker时,一般都是推荐一起安装docker-compose的。
Docker Compose是一个用于定义和管理多个Docker容器的工具。Docker Compose通过定义docker-compose.yml
容器配置来生成容器,同时也可以使用docker-compose
命令管理docker-compose.yml
所定义的全部容器,比如使用docker-compose down
关闭docker-compose.yml
所定义全部容器。
使用docker-compose的好处是可以做到配置持久化,这样过一段时间再来查看该容器,可以通过查看docker-compose.yml就知道该容器的配置情况,同时,容器的可定制程度更加方便。
新建一个docker-compose.yml文件
一般建议在/home/docker/
下新建一个文件夹来存储每个Docker服务的数据。
编写docker-compose.yml
1 | version: '3.1' |
这里有个要注意的点:
- 如果你是首次启动这个
docker-compose.yml
服务,version
的版本不能大于x.1
,比如,你写3.2
,可能会导致启动失败 - 每一个容器的名字都是唯一的,容器之间的名字不能相同
要是启动容器前没有下载镜像,也是没有关系的,因为我们在docker-compose.yml指定了镜像名,在启动容器docker-compose up -d
时,docker会自动下载镜像。
启动服务
1 | docker-compose up -d |
up
:启动程序服务-d
:在后台运行
关闭服务
如果需要关闭该服务,则进入docker-compose.yml父目录下,执行docker-compose down
,
你可能会有个疑虑了,我们启动这么多容器,每一个容器里面都有一个Linux系统,会不会很占存储呢?其实占用的存储还是有的,但不是很大,相比传统的虚拟机,虚拟出一整个完整的系统,docker容器就显得很小了。
因为在docker容器中,我们首先是拉取了一个镜像,我们创建的容器都是基于这个镜像进行生成的,我们每创建一个容器,每需要添加或修改的内容都在是这个镜像上面进行叠加层,就好像叠瓦片一样,每在docker容器里面修改容器,就在原来的基础上叠一个瓦片,这样就可以做到既不对原有的镜像进行修改,又可以做到我们想要的内容。
更新docker-compose
如果在启动完服务之后有需要修改某些服务的配置时,可以直接对docker-compose.yml
修改,修改完之后,关闭服务(关闭服务,表示销毁该容器,如果容器内数据需要备份,则应先复制出来宿主机),再重新启动服务即可。
1 | docker-compose down |
down
:表示关闭该服务up
:启动docker-compose-d
:表示该docker-compose运行的容器在后台启动
如果有重要的数据在容器中,一般都是强烈建议将数据挂载到宿主机,这样可以保证数据的安全性,因为谁知道哪天docker容器出什么问题,数据就没了,一旦挂载到宿主机,数据就存在宿主机,安全性提高很多,如果这个数据还是很重要,那还是做个备份吧,备份到其他云上,比如duplicaty备份工具。
创建容器但不启动
用nginx:latest
镜像创建一个容器名为nginx-test
1 | docker create --name nginx-test nginx:latest |
create
:效果等于run
,表示创建一个新容器--name
:自定义容器名
创建容器并运行命令
OPTIONS
参数含义说明:
-a stdin
: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;-d
: 后台运行容器,并返回容器ID;-i
: 以交互模式运行容器,通常与 -t 同时使用;-P
: 随机端口映射,容器内部端口随机映射到主机的端口-p
: 指定端口映射,格式为:主机(宿主)端口:容器端口-t
: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;--name="nginx-lb"
: 为容器指定一个名称;--dns 8.8.8.8
: 指定容器使用的DNS服务器,默认和宿主一致;--dns-search example.com
: 指定容器DNS搜索域名,默认和宿主一致;-h "mars"
: 指定容器的hostname;-e username="ritchie"
: 设置环境变量;--env-file=[]
: 从指定文件读入环境变量;--cpuset="0-2" or --cpuset="0,1,2"
: 绑定容器到指定CPU运行;- **
-m
😗*设置容器使用内存最大值; --net="bridge"
: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;--link=[]
: 添加链接到另一个容器;--expose=[]
: 开放一个端口或一组端口;--volume , -v
: 绑定一个卷
1 | docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
案例
1-使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
1 | docker run --name mynginx -d nginx:latest |
2-使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
1 | docker run -P -d nginx:latest |
3-使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
1 | docker run -p 80:80 -v /data:/data -d nginx:latest |
4-绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
1 | $ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash |
5-使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
1 | runoob@runoob:~$ docker run -it nginx:latest /bin/bash |
Docker常用的指令
查看容器、镜像
由于Docker的容器ID、镜像ID比较长,我们在使用到容器ID、镜像ID时,可以输入ID的前面几位,一般大于2位以上来替代完整的ID。
查看Docker全部镜像
1 | docker images |
查看Docker已启动的服务
1 | docker ps |
查看Docker全部容器
1 | docker ps -a |
启动、停止、重启容器
启动容器是指已经创建好的容器,但已经停止该容器,还没删除的容器,此时可以重启该容器,类似手机开关机。
停止、重启容器有两个方式,一个是通过指定容器ID
,一个方式是指定容器名
,即CREATED
。
查看容器ID
1 | docker ps -a |
启动容器
启动容器可一次性启动一个容器或多个容器。
指定容器ID启动
1 | docker start 容器ID [容器ID] |
指定容器名启动
1 | docker start 容器名 [容器名] |
停止容器
指定容器ID
1 | docker stop 容器ID |
指定容器名
1 | docker stop 容器名 |
停止正在运行的全部容器
如果有需要停止全部容器的话,使用**docker stop `docker ps -a -q`**最好用
1 | docker stop `docker ps -a -q` |
重启容器
指定容器ID
1 | docker restart 容器ID |
指定容器名
1 | dockre restart 容器名 |
删除容器
删除容器三步法:
- 查看容器ID:
docker ps -a
- 停止容器:
docker stop 容器ID
- 删除容器:
docker rm 容器ID
查看容器ID
1 | docker ps -a |
停止容器
1 | docker stop 容器ID |
删除容器
1 | docker rm -f 容器ID [容器ID] |
-f
:表示停止该容器并删除容器ID
:可以输入前几位即可或者完整ID
可以一起删除多个容器,在容器ID后累加即可。
删除镜像
因为容器是基于镜像运行起来的,如果要删除镜像,表面你也不需要这个服务了,那该镜像产生的容器也应该要删除掉,这样可以减少多余的垃圾对服务器的影响。
总的来说,应先删除容器,再删除镜像。
通过ID删除镜像
1 | docker rmi IMAGEID # 使用镜像ID删除镜像 |
通过TAG删除镜像
1 | docker rmi REPOSITORY:TAG # 删除镜像样例 |
rm
参数含义
- **
-f
😗*通过SIGKILL
信号强制删除一个运行中的容器。 - **
-l
😗*移除容器间的网络连接,而非容器本身。 - **
-v
😗*删除与容器关联的卷。
删除所有已经停止的容器
谨慎操作,这是删除全部已停止的容器
1 | docker rm $(docker ps -a -q) |
进入Docker容器
我们有时候需要进去Docker容器查看什么文件,或者修改某个配置文件等等操作,我们比较常用的还是使用docker exec ....
方法一:exec(推荐)
1 | docker ps |
**区别:**进入正在运行的容器,不会新建别的容器
-i
:表示运行对容器进行交互式操作-t
:在容器中创建一个伪终端
方法二:attach
1 | docker run -it IMAGE(镜像名) /bin/bash |
**区别:**进入一个新建的容器,而不是原本已经存在的容器
run
:创建一个新的容器-i
:表示运行对容器进行交互式操作-t
:在容器中创建一个伪终端
更改镜像名
查看镜像
1 | docker images |
更改镜像名
1 | docker tag <Image ID> 新镜像名 |
容器之间通信
需求总是多变的,比如我们要部署了Nginx、MySQL、Jenkins容器,我们怎么让容器之间互相通信呢?
我们可以使用--link
指令在容器之间建立一条网络通信隧道
,就好比你和隔壁家拉一条水管,可以使用水管来传输东西。
创建httpd容器web1
1 | docker run -d -P --name web1 httpd |
创建httpd容器web2
1 | docker run -d -P --name web2 --link web1:web1 httpd |
run
:运行容器-d
:表示该容器在后台运行-P
:将容器内部使用的网络端口随机映射到我们使用的主机上--name
:给该容器命名--link
:建立通信隧道
进入容器ping测试
进入web2容器:
1 | docker exec -it web2 /bin/bash |
我这里使用的是Ubuntu系统,下面会使用ping工具,需要先安装ping
1 | apt-get -y install iputils-ping |
ping 测试
1 | ping web1 |
查看Docker容器日志
1 | docker logs [OPTIONS] CONTAINER(容器名) |
OPTIONS(可选参数):
-
--details
:显示更多的信息 -
-f
:跟踪实时日志 -
--since
:显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟) -
--tail
:从日志末尾显示多少行日志, 默认是all -
-t
:显示时间戳 -
--until
:显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
实战案例
查看指定时间后的日志,只显示最后100行
1 | docker logs -f -t --since="2022-11-06" --tail=50 容器ID |
查看最近30分钟的日志
1 | docker logs --since 30m 容器ID |
查看某时间之后的日志
1 | docker logs -t --since="2022-11-06T13:23:37" 容器ID |
查看某时间段日志
1 | docker logs -t --since="2022-11-05T13:23:37" --until "2022-11-06T12:23:37" 容器ID |
将容器资源复制到本机
从容器复制文件 到本地
1 | # 将容器nginx01 的html资源复制到本机的/home/lilbai/docker_app/nginx(当前文件夹下无html文件夹) |
将本地文件复制到容器
靠近容器ID或者容器名是容器路径
1 | # 格式 docker cp 本机路径容器名:容器路径 |
Docker容器内常见的问题
Docker内不能用vim
Docker容器内本来是非常精简的,会减少尽量不必要的程序,vi和vim编辑器都是没有的,所以需要自己在容器内安装一个vim编辑器。
用特殊方法进入容器
1 | # docker -it -u 0 容器ID或者容器名 /bin/bash |
更新包
1 | apt-get update |
安装vim
1 | apt-get install vim |
docker内不能使用ll命令
ll
指令是由ls -l
组成的,想方便使用ll
指令,则编辑bash
指令文件,添加快捷指令即可,因为需要编辑文件,需要先安装vim。
不能使用ll
1 | root@3052a7d5f95b:/app/data# ll |
编辑.bashrc
1 | vim ~/.bashrc |
添加alias
1 | alias ll='ls -l' |
加载.bashrc文件
1 | source ~/.bashrc |
docker compose 相关指令
docker compose配置文件字段
字段 | 描述 |
---|---|
build dockerfile context | 指定Dockerfile文件名构建镜像上下文路径 |
image | 指定镜像 |
command | 执行命令,覆盖默认命令 |
container name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale |
deploy | 指定部署和运行服务相关配置,只能在Swarm模式使用 |
environment | 添加环境变量 |
networks | 加入网络 |
ports | 暴露容器端口,与-p相同,但端口不能低于60 |
volumes | 挂载宿主机路径或命令卷 |
restart | 重启策略,默认no,always,no-failure,unless-stoped |
hostname | 容器主机名 |
docker compose命令
使用格式:docker-compose [options] [COMMAND] [ARGS...]
命令 | 描述 |
---|---|
build | 重新构建服务 |
ps | 列出容器 |
up | 创建和启动容器 |
exec | 在容器里面执行命令 |
scale | 指定一个服务容器启动数量 |
top | 显示容器进程 |
logs | 查看容器输出 |
down | 删除容器、网络、数据卷和镜像 |
stop/start/restart | 停止/启动/重启服务 |
Docker私有仓库
Harbor介绍
- Vmware公司开源的企业级Docker Registry项目
Harbor优势:
- 管理UI
- 基于角色的访问控制
- 基于镜像的复制策略
- AD/LDAP集成
- 审计
- RESTful API
Docker私有仓库架构拓扑
Harbor的主要组件
Proxy:通过一个前置的反向代理统一将请求转发给后端不同的服务
**Registry:**负责储存Docker镜像,并处理docker push/pull 命令
**Core services:**Harbor的核心功能,包括UI、webhook0、token 服务
**Datebase:**为core services提供数据库服务
**Log collector:**负责收集其他组件的log,供日后进行分析
安装Harbor
Github仓库地址:https://github.com/goharbor/harbor/
安装Harbor需要docker-compose,还没安装可以看文字上面安装docker-compose
下载Harbor
1 | wget -c https://github.com/goharbor/harbor/releases/download/v2.5.6/harbor-offline-installer-v2.5.6.tgz |
升级Docker版本
原因
如果你一开始安装的docker-ce
版本比较低,在后面拉取镜像可能会出现以下这种问题,找不到某些镜像,这时候升级版本可能可以解决你的问题。
卸载docker
1 | sudo yum remove docker \ |
安装Docker
然后按照文章上面的安装步骤重新安装即可。或如按照下面命令安装
1 | sudo yum install -y yum-utils device-mapper-persistent-data lvm2 |
其他问题
如果没有卸载旧版的docker会出现如下问题: